原创
ucGUI 驱动\中文支持\可裁剪字库的实现
移植及修改内容: 1. LCD驱动 2. GB2312编码(非UNICODE)的中文汉字支持以及自定义可裁剪的中文汉字库 说明: 本文所述移植过程是ucGUI3.90在单显示设备\不支持MEMDEV的情况下完成的 所有 对GUI内核修改及中文显示r的实现方式仅供参考 有关GB2312编码的知识请参考:http://zh.wikipedia.org/zh/GB_2312 一. LCD驱动 要实现的函数: void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex); unsigned int LCD_L0_GetPixelIndex(int x, int y); void LCD_L0_XorPixel(int x, int y); void LCD_L0_DrawHLine (int x0, int y, int x1); void LCD_L0_DrawVLine (int x , int y0, int y1); void LCD_L0_FillRect (int x0, int y0, int x1, int y1); void LCD_L0_SetOrg(int x, int y) {}; int LCD_L0_Init(void); void LCD_L0_On(void); void LCD_L0_Off(void); void LCD_L0_SetLUTEntry (U8 Pos, LCD_COLOR color){}; void LCD_L0_DrawBitmap(int x0, int y0,int xsize, int ysize,int BitsPerPixel, int BytesPerLine,const U8 GUI_UNI_PTR * pData, int Diff,const LCD_PIXELINDEX* pTrans); 其中直接以";"号结束的函数为必须实现函数, 其它函数可以为空函数. 实现以上函数上, 要关注core文件夹中以LCD开关的C或h文件, 这些文件与驱动密切相关, 驱动函数的结构定义在LCD_API.c中. 二. 添加GB2312编码的支持 ucGUI支持UNICODE字符, 但要显示中文字符, 需要调用GUI_UC_DispString.而常用WIDGET的默认的PAINT功能是不能显示UNICODE中文字符的. 对于MDK编译器时, 默认的中文编码为GB2312, 为更好支持该编译器, 编码改用为GB2312而不采用UNICODE. 另外, GUI的内核及窗口控件中调用 了strlen函数, 如果使用unicode, 将导致strlen函数出错. 综上, 修改GUI内核实现GB2312编码的中文字符的显示是最佳选择. 另有, 中文字库数据量相当大, 而程序中要用的中文字符却相当有限, 沿用ucGUI的字库, 将会浪费大量的存储空间. 为此, 需要字库可裁剪, 根据需要添加对应字符的点阵数据. 所以, 对于中文字符的支持, 可分两步完成, 其一为创建新的字库, 其二为添加GB2312编码的识别及字库调用 (一). 创建新的字符. a. 定义新的字库结构 在GUI_Type.h中添加自定义字体结构 typedef struct{ U16P Count; //字符个数 U8 XSize; //字符宽度 U8 BytesPerLine; //每行的字节数 const unsigned char GUI_UNI_PTR * pIndex; //索引指针 const unsigned char GUI_UNI_PTR * pData; //段码指针 }GUI_USERCHARINFO; typedef struct GUI_FONT_USER { GUI_USERCHARINFO ASC; GUI_USERCHARINFO CHN; } GUI_FONT_USER; 按照显示习惯, ASCII字符依然显示为半角, 所以要独立定义它的字体信息. b. 在GUI_Type.h中的DECLARE_FONT段添加字体函数申明 //自定义字体 DECLARE_FONT(USER); #define GUI_FONTTYPE_USER \ GUIUSER_DispChar, \ GUIUSER_GetCharDistX, \ GUIUSER_GetFontInfo, \ GUIUSER_IsInFont, \ (tGUI_ENC_APIList*)0 c. 定义字库文件 字库文件结构如下: GUI_CONST_STORAGE unsigned char sFont16x16CHN_Data[] = {//段码数组 } GUI_CONST_STORAGE unsigned char sFont16x16ASC_Data[] = {//段码数组 } GUI_CONST_STORAGE unsigned char sFont16x16CHN_Index[] = { "阿爱安" }; GUI_CONST_STORAGE unsigned char sFont16x16ASC_Index[] = { 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127 }; GUI_CONST_STORAGE GUI_FONT_USER GUI_FontCHN16x16User = { { 96 ,8 ,1 ,&sFont16x16ASC_Index[0] ,&sFont16x16ASC_Data[0]} ,{ 3 ,16 ,2 ,(U8 *)&sFont16x16CHN_Index[0] ,&sFont16x16CHN_Data[0] } }; GUI_CONST_STORAGE GUI_FONT GUI_Font16x16_USER = { GUI_FONTTYPE_USER /* type of font */ ,16 /* height of font */ ,16 /* space of font y */ ,1 /* magnification x */ ,1 /* magnification y */ ,{&GUI_FontCHN16x16User} , 16, 16, 16 }; d. 完成DECLARE_FONT中定义的几个函数 GUIUSER_DispChar, GUIUSER_GetCharDistX, GUIUSER_GetFontInfo, GUIUSER_IsInFont, 参考GUICharP.c和GUICharM.c生成GUICharU.c 至些, 单个中文字符可以显示了, 但还缺乏由字符串中分解中文字符串与ASCII字符的函数. 继续修改内核 e. 编码字符识别函数 参照GUI_UC_EncodeNone.c和GUI_UC_EncodeUTF8.c文件生成GUI_UC_EncodeCHN.c文件, 完成后的文件内容如下: static U16 _GetCharCode(const char GUI_UNI_PTR * s) { if((*s) > 0xA0) { return *(const U16 GUI_UNI_PTR *)s; } return *(const U8 GUI_UNI_PTR *)s; } static int _GetCharSize(const char GUI_UNI_PTR * s) { GUI_USE_PARA(s); if((*s) > 0xA0) { return 2; } return 1; } static int _CalcSizeOfChar(U16 Char) { GUI_USE_PARA(Char); if(Char > 0xA0A0) { return 2; } return 1; } static int _Encode(char *s, U16 Char) { if(Char > 0xA0A0) { *((U16 *)s) = (U16)(Char); return 2; } *s = (U8)(Char); return 1; } const GUI_UC_ENC_APILIST GUI__API_TableCHN = { _GetCharCode, /* return character code as U16 */ _GetCharSize, /* return size of character: 1 */ _CalcSizeOfChar, /* return size of character: 1 */ _Encode /* Encode character */ }; void GUI_UC_SetEncodeCHN(void) { GUI_LOCK(); GUI_Context.pUC_API = &GUI__API_TableCHN; GUI_UNLOCK(); } //********************************************************************************** 至此, 在GUI_Init时调用 GUI_UC_SetEncodeCHN()函数并配置对应的字体. 中英文字符都可以正常显示了.
文章评论(0条评论)
登录后参与讨论