|
发表于 2013-8-6 00:11:37
|
显示全部楼层
用它原来的算法移植字库太大了,浪费好多空间。
我把上面的函数移植了一下,debug发现根本就不能进入
/*********************************************************************
*
* GUIGB2312_FindChar
*/
static const GUI_FONT_PROP GUI_UNI_PTR * GUIGB2312_FindChar(const GUI_FONT_PROP GUI_UNI_PTR* pProp, U16P c) {
const GUI_FONT_PROP GUI_UNI_PTR * ret = 0;
for (; pProp; pProp = pProp->pNext) {
if ((c>=pProp->First) && (c<=pProp->Last))
break;
}
if( pProp )
{
if( c >= 0x20 && c < 0x80 )
ret = pProp;
else if( (c&0xFF)>=0xA1 && (c&0xFF)<=0xFE && (c>>8)>=0xA1 && (c>>8)<=0xF7 )
ret = pProp;
}
return ret;
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUIGB2312_DispChar
*
* Purpose:
* This is the routine that displays a character. It is used by all
* other routines which display characters as a subroutine.
*/
void GUIGB2312_DispChar(U16P c) {
int BytesPerLine;
GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
const GUI_FONT_PROP* pProp = GUIGB2312_FindChar(GUI_pContext->pAFont->p.pProp, c);
U32 oft; //字库的起始地址和偏移量
int BytesPerFont;
if (pProp) {
GUI_DRAWMODE OldDrawMode;
const GUI_CHARINFO* pCharInfo = pProp->paCharInfo;
BytesPerLine = pCharInfo->BytesPerLine;
OldDrawMode = LCD_SetDrawMode(DrawMode);
BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数
if (c < 0x80) //英文字符地址偏移算法
{
oft = (c - 0x20) * BytesPerFont; //计算出字码在flash中的偏移地址
}
else //中文字符地址偏移算法
{
oft = (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont;
}
LCD_DrawBitmap( GUI_pContext->DispPosX, GUI_pContext->DispPosY,
pCharInfo->XSize,
GUI_pContext->pAFont->YSize,
GUI_pContext->pAFont->XMag,
GUI_pContext->pAFont->YMag,
1, /* Bits per Pixel */
BytesPerLine,
(U8 const *)pCharInfo->pData + oft,
NULL /* no palette means default palette */
);
/* Fill empty pixel lines */
if (GUI_pContext->pAFont->YDist > GUI_pContext->pAFont->YSize) {
int YMag = GUI_pContext->pAFont->YMag;
int YDist = GUI_pContext->pAFont->YDist * YMag;
int YSize = GUI_pContext->pAFont->YSize * YMag;
if (DrawMode != LCD_DRAWMODE_TRANS) {
LCD_COLOR OldColor = GUI_GetColor();
GUI_SetColor(GUI_GetBkColor());
LCD_FillRect(GUI_pContext->DispPosX,
GUI_pContext->DispPosY + YSize,
GUI_pContext->DispPosX + pCharInfo->XSize,
GUI_pContext->DispPosY + YDist);
GUI_SetColor(OldColor);
}
}
LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
GUI_pContext->DispPosX += pCharInfo->XDist;
}
}
/*********************************************************************
*
* GUIGB2312_GetCharDistX
*/
int GUIGB2312_GetCharDistX(U16P c, int * pSizeX) {
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIGB2312_FindChar(GUI_pContext->pAFont->p.pProp, c);
return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_pContext->pAFont->XMag : 0;
}
/*********************************************************************
*
* GUIGB2312_GetFontInfo
*/
void GUIGB2312_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO* pfi) {
GUI_USE_PARA(pFont);
pfi->Flags = GUI_FONTINFO_FLAG_PROP;
}
/*********************************************************************
*
* GUIGB2312_IsInFont
*/
char GUIGB2312_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) {
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIGB2312_FindChar(pFont->p.pProp, c);
return (pProp==NULL) ? 0 : 1;
}
/*************************** End of file ****************************/
字库中的定义
DECLARE_FONT(GB2312);
GUI_CONST_STORAGE GUI_FONT GUI_FontGB2312HZ12 = {
GUIGB2312_DispChar,
GUIGB2312_GetCharDistX,
GUIGB2312_GetFontInfo,
GUIGB2312_IsInFont,
(GUI_GETCHARINFO *)0,
(tGUI_ENC_APIList*)0,
16,
16,
1,
1,
(void GUI_FLASH *)&GUI_FontHZ12_Prop0020
};
|
|