本帖最后由 nicholasldf 于 2016-1-13 14:41 编辑
GUI_Type.h和GUI.h定义了多个结构体,基于这些结构体,实现了各种字体的框架。 结构体GUI_FONT定义了整个字体的信息以及接口函数指针,如字体高度、宽度、显示该字体的接口函数、计算该字体字符串长度宽度的函数、判断某个字符是否属于该字体等等。当YDist>YSize时,相当于上下行字符之间插入间隔。 struct GUI_FONT { GUI_DISPCHAR* pfDispChar;//显示该字体单个字符的接口函数 GUI_GETCHARDISTX*pfGetCharDistX;//计算该字体单个字符的像素宽度 GUI_GETFONTINFO* pfGetFontInfo;//获取该字体的信息 GUI_ISINFONT* pfIsInFont;//判断某个字符是否属于该字体 GUI_GETCHARINFO * pfGetCharInfo; //获取该字体单个字符信息 const tGUI_ENC_APIList* pafEncode;//该字体字符串操作接口 U8 YSize; //该字体的Y轴高度,指的是显示信息高度 U8 YDist; //该字体的Y轴距离,指的是字体占用高度,YDist>=YSize char XMag; //该字体的X轴放大 char YMag; //该字体的Y轴放大 union { constvoid GUI_UNI_PTR * pFontData; constGUI_FONT_MONO GUI_UNI_PTR * pMono; constGUI_FONT_PROP GUI_UNI_PTR * pProp; } p; //多功能指针 U8 Baseline; //该字体Y轴行数? U8 LHeight; /* height of a small lower case character(a,x) */ U8 CHeight; /* height of a small upper case character(A,X) */ };
下面定义了GUI_FONT结构体里面的函数指针类型。 typedefvoid GUI_DISPCHAR (U16 c); typedefint GUI_GETCHARDISTX(U16P c, int * pSizeX); typedefvoid GUI_GETFONTINFO (const GUI_FONT * pFont, GUI_FONTINFO * pfi); typedefchar GUI_ISINFONT (const GUI_FONT *pFont, U16 c); typedefint GUI_GETCHARINFO (U16P c,GUI_CHARINFO_EXT * pInfo); 结构体GUI_FONTINFO定义了字体信息,其中Baseline,LHeight,CHeight在GUI_FONT结构体里面也有对应的成员。 typedefstruct { U16Flags; U8Baseline; //字体高度 U8LHeight; /* height of a small lowercase character (a,x) */ U8CHeight; /* height of a small uppercase character (A,X) */ } GUI_FONTINFO; 结构体GUI_CHARINFO定义了字符信息,当XDist>XSize时,相当于相邻字符之间插入间隔。 typedefstruct { U8XSize; //字体X轴宽度,指的是显示信息宽度 U8XDist; //字体X轴距离,指的是字体占用宽度,XDist>=XSize U8BytesPerLine; //字体X轴字节数 constunsigned char * pData; } GUI_CHARINFO; 结构体GUI_CHARINFO_EXT定义了字符扩展信息,作为GUI_GETCHARINFO函数指针所指向的函数参数。 typedefstruct { U8XSize; U8YSize; I8XPos; I8YPos; U8XDist; constunsigned char * pData; } GUI_CHARINFO_EXT; 结构体tGUI_ENC_APIList定义了该字体字符串操作函数指针。 typedefint tGUI_GetLineDistX(const char * s,int Len); typedefint tGUI_GetLineLen (const char * s, int MaxLen); typedefvoid tGL_DispLine (const char * s,int Len); typedefstruct { tGUI_GetLineDistX* pfGetLineDistX; //获取该字体字符串X轴占用的像素点数 tGUI_GetLineLen * pfGetLineLen; //获取该字体字符串的长度 tGL_DispLine * pfDispLine; //显示该字体字符串 } tGUI_ENC_APIList; 结构体GUI_FONT_PROP定义了字体多个编码区域的地址和信息,因为一个字体可能存在多个编码区域,每个区域都有各自的信息,字体高度宽区可能都不一样。 typedefstruct GUI_FONT_PROP { U16PFirst; //区域第一个字符的编码 U16PLast; //区域最好一个字符的编码 constGUI_CHARINFO * paCharInfo; //属于该区域字符的字体信息 conststruct GUI_FONT_PROP * pNext; //指向字体下一个编码区域 } GUI_FONT_PROP; 基于上述这些结构体,我们开始实现中文汉字支持功能,字体名字为CNHZK。由于没有emWin源代码,这里参照了uCGUI的核心源码,如参照GUIEncSJ.C文件的GetLineDistX、_GetLineLen_SJIS、_DispLine_SJIS函数实现。此外还参照了GUI_SIF_Prop.c、GUI_GetFontInfo.C、GUIAAChar4.c、F16_HK.C等文件。 目前支持12、16、24三种大小,将HZK12,HZK16, HZK24字库文件放置在SDCard或者外置SpiFlash等存储介质。按照类似的方法,可以扩展支持其他各种各样的字体。
首先在GUIType.h增加下列声明和宏定义。 externconst tGUI_ENC_APIList GUI_ENC_APIList_CNHZK;// /*HZK12, HZK16, HZK24 : chinese 16x12, 16x16, 24x24 fonts */ #defineGUI_FONTTYPE_CNHZK \ GUICNHZK_DispChar, \ GUICNHZK_GetCharDistX, \ GUICNHZK_GetFontInfo, \ GUICNHZK_IsInFont, \ GUICNHZK_GetCharInfo, \ &GUI_ENC_APIList_CNHZK 其次在GUI.h添加下列字体声明和宏定义。 externGUI_CONST_STORAGE GUI_FONT GUI_Font16x12_CNHZK;// externGUI_CONST_STORAGE GUI_FONT GUI_Font16x16_CNHZK;// externGUI_CONST_STORAGE GUI_FONT GUI_Font24x24_CNHZK;// #defineGUI_FONT_16x12_CNHZK &GUI_Font16x12_CNHZK// #defineGUI_FONT_16x16_CNHZK &GUI_Font16x16_CNHZK// #defineGUI_FONT_24x24_CNHZK &GUI_Font24x24_CNHZK// 定义GUI_Font16x12_CNHZK字体的相关信息。 ///////////////////Chinese_Font_16x12Define Start/////////////////////// 省略 ////////////////////Chinese_Font_16x12Define End//////////////////// 定义GUI_Font16x16_CNHZK字体的相关信息。 ///////////////////Chinese_Font_16x16Define Start/////////////////// GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16x16_CNHZK_CharInfo[2] = { {16, 16, 2, (void*)0},//ASCII 16x16,X轴宽度为16,2字节,Y轴高度为16 {16, 16, 2, (void*)0},//CHINESE 16x16,X轴宽度为16,2字节,Y轴高度为16 };
GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16x16_CNHZK_PropHZK = { 0xA1A1, //HZK16字库第一个字符的编码 0xFFFF, //HZK16字库最后一个字符的编码 &GUI_Font16x16_CNHZK_CharInfo[1], //HZK16字库字体信息 (void *)0, };
GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16x16_CNHZK_PropASC = { 0x0000, //ASCII16字库第一个字符的编码 0x007F, //ASCII16字库最后一个字符的编码 &GUI_Font16x16_CNHZK_CharInfo[0], //ASCII16字库字体信息 (void GUI_CONST_STORAGE*)&GUI_Font16x16_CNHZK_PropHZK, //指向HZK16字库 };
GUI_CONST_STORAGE GUI_FONT GUI_Font16x16_CNHZK = { GUI_FONTTYPE_CNHZK,//接口函数指针列表 16, //字体Y轴高度 16, //字体Y轴距离 1, //字体X轴放大 1, //字体Y轴放大 (void GUI_CONST_STORAGE*)&GUI_Font16x16_CNHZK_PropASC //指向Prop列表 }; //////////////////////Chinese_Font_16x16Define End////////////////////// 定义GUI_Font24x24_CNHZK字体的相关信息。 /////////////////////Chinese_Font_24x24Define Start///////////////////// 省略.. //////////////////////Chinese_Font_24x24Define End////////////////////// 从存储介质获取字体数据的接口函数,如果是ASCII字符(小于等于127),则从Font12.c、Font16.c、Font24.c三个文件获取字体数字,如果是汉字,则从外部存储介质读取字体数据。 //getdata from file named of HZK12, HZK16, HZK24 staticvoid GUI_GetChineseFontData(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c) 显示中文字体单个字符的接口函数。 voidGUICNHZK_DispChar(U16 c) 获取中文字体单个字符的X轴宽度,还有乘以放大系数(一般为1)。 intGUICNHZK_GetCharDistX(U16P c, int *pSizeX) *pSizeX = (pProp->paCharInfo)->XSize *GUI_pContext->pAFont->XMag; 获取中文字体信息, voidGUICNHZK_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO * pfi) 判断字符c是否属于中文字体,根据GUI_FONT_PROP结构体的First和Last判断。 charGUICNHZK_IsInFont(const GUI_FONT * pFont, U16 c) if((c >= pProp->First) && (c <= pProp->Last) ) 这个函数暂时没有实现。 intGUICNHZK_GetCharInfo(U16P c, GUI_CHARINFO_EXT * pInfo) 获取中文字体字符串的像素总长度,其内部进一步调用GUICNHZK_GetCharDistX获取每一个字符的像素宽度,需要注意的是ASCII字符占用1个字节,中文占用2个字节。 intGUICNHZK_GetLineDistX(const char * s, int Len) 获取中文字体字符串的长度,需要注意,ASCII字符占用1字节,中文占用2字节。 intGUICNHZK_GetLineLen(const char * s, int MaxLen)
显示中文字体字符串。 voidGUICNHZK_DispLine(const char * s, int Len)
中文字体字符串操作函数指针结构体。 consttGUI_ENC_APIList GUI_ENC_APIList_CNHZK ={ GUICNHZK_GetLineDistX, GUICNHZK_GetLineLen, GUICNHZK_DispLine, };
|