|
发表于 2020-6-22 10:16:44
|
显示全部楼层
你好, 我用了你的这个软件,非常不错,但我有几个建议,不知道你能否改进一下
1. 关于最后一个GUI_FONT_PROP结构体中的pNext, 你用的是(void*)0。这对于MDK可能没有问题,但我用IAR C++的时候,会出现类型不类的错误。建议改成(GUI_FONT_PROP*)0, 这样都不会有问题。
2. 当生成外部字体,类似XBF的字体时, 很多变量是在使用的时候才声明的,同样对于高版本的C没有问题,但标准C中确不行,WIN32仿真时也不行。建议事先声明一下。
3. 对于全局变量g_font_buf, 不建议声明为全局变量,采用局部变量+参数传递的方式会更好。
3. 还是建议对连续的字符合并GUI_CHARINFO和GUI_FONT_PROP, 虽然对离散的汉字作用不大, 但对于加入全部英文或生成全字符时作用非常大。此功能虽然看到你回复坛友有修改,但我测试还是没有合并。
如加入全部英文时只要加入一条GUI_CHARINFO {7,7,1,(const unsigned char *)0} 和一条GUI_FONT_PROP {0x0020, /* start */ 0x007F, /* end */ &GUI_FontSong12_CharInfo[1], (GUI_FONT_PROP*)0,};
4. 建议将 加入常用汉字和加入所有汉字 替换为生成GB2312字库和生成GBK字库,并可选加入所有英文功能。理由如下:
当生成所有汉字时,如果使用外部FLASH方式,内部的表格会非常大。而生成外部字体,类似XBF时,文件中多了很多额外的信息,导致字库尺寸变的很大。而且读取一个字符时,要有至少三次读字库信息的过程,这对于读取外部数据比较慢时,严重影响系统的速度。
当生成成有汉字时, 可假设汉字编码都是连续的,中间断开的部分可不考虑(如GB2312的低字节00-A0,GBK的低字节00-3F)。因此只要生成一条GUI_CHARINFO和GUI_FONT_PROP 即可,这个表可以放在内部,类似外部FLASH方式。这样读外部字库只要读一次即可,而且外部字库没有额外的信息,减少尺寸,并且字库可通用。
5. 另外还可以实现多个外部全字库功能,只要对每种字体单独声明GUI_FONT、GUI_FONT_PROP和GUI_CHARINFO即可,由于GUI_FONT_PROP和GUI_CHARINFO是合并的,可以只有一两条即可。而其它函数都可以通用。另外需要将读取外部数据函数采用回调函数的形式,但这个我没想好怎么做
6. 另外单选框显示汉字GBK方式文字会向下移动,不知道你有没有这个现象,UN方式没有试
以上是我的建议,望采纳。
以下是我在你生成的外部FLASH字体的基础上修改而成的 GBK全字库+所有英文代码,可参考。
- /*
- *---------------------------------------------------------------
- * emWin字体工具
- *
- * 注:支持unicode/GBK编码切换,支持抗锯齿
- * 注:本字体文件由emWin字体工具 V0.4 生成
- * 作者:阿里(qq:617622104)
- *---------------------------------------------------------------
- */
- #include "GUI.h"
- #include "GUI_Private.h"
- #include <string.h>
- static const GUI_CHARINFO GUI_FontSong12_CharInfo[] =
- {
- {13,13,2,(const unsigned char *)0 }, /* 0:GBK全字库,0x8140-0xfefe, 其中去除低字节00-3F、FF*/
- {7,7,1,(const unsigned char *)0x0008D030 }, /* 1:ASCII 0x20-0x7F */
- };
- static const GUI_FONT_PROP GUI_FontSong12_Prop2 =
- {
- 0x0020, /* start */
- 0x007F, /* end */
- &GUI_FontSong12_CharInfo[1],
- (GUI_FONT_PROP*)0,
- };
- static const GUI_FONT_PROP GUI_FontSong12_Prop1 =
- {
- 0x8140, /* start */
- 0xfefe, /* end */
- &GUI_FontSong12_CharInfo[0],
- &GUI_FontSong12_Prop2,
- };
- //用户实现函数,用来读取字模数据
- //offset:地址偏移
- //size:读取的字节大小
- const unsigned char *GUI_Font_getData(unsigned char *pBuf,int offset, int size)
- {
- //字模保存在SPIFLASH示例 SPIFLASH_Read(g_font_buf,offset,size);
- //字模已加载到SDRAM示例 memcpy(g_font_buf,pFontAddr+offset,size);
- extern char *ExtFontBuf;
- memcpy(pBuf,ExtFontBuf+offset,size);
- return pBuf;
- }
- //此函数对所有外部字体通用
- static const GUI_CHARINFO* GUI_FindChar(GUI_FONT_PROP const *pProp,GUI_CHARINFO *pCharInfo, U16P c)
- {
- for (; pProp; pProp=pProp->pNext)
- {
- if ((c>=pProp->First) && (c<=pProp->Last))
- {
- *pCharInfo=*pProp->paCharInfo;
- if (c<0x80)
- pCharInfo->pData+=(c-pProp->First)*pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize;
- else
- {
- c-=pProp->First;
- pCharInfo->pData+=((c>>8)*191+(c&0xff))*pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize;
- }
- return pCharInfo;
- }
- }
- return (GUI_CHARINFO*)0;
- }
- static void GUI_FontSong12_DispChar(U16P c)
- {
- int BytesPerLine;
- unsigned char g_font_buf[24];
- GUI_CHARINFO CharInfo;
- GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
- const GUI_CHARINFO *pCharInfo = GUI_FindChar(GUI_pContext->pAFont->p.pProp,&CharInfo, c);
- if (pCharInfo)
- {
- GUI_DRAWMODE OldDrawMode;
- const U8 *pData = GUI_Font_getData(g_font_buf,(int)pCharInfo->pData,pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize);
- BytesPerLine = pCharInfo->BytesPerLine;
- OldDrawMode = LCD_SetDrawMode(DrawMode);
- LCD_DrawBitmap( GUI_pContext->DispPosX, GUI_pContext->DispPosY,
- pCharInfo->XSize,
- GUI_pContext->pAFont->YSize,
- GUI_pContext->pAFont->XMag,
- GUI_pContext->pAFont->YMag,
- 1,
- BytesPerLine,
- pData,
- &LCD_BKCOLORINDEX);
- 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);
- GUI_pContext->DispPosX += pCharInfo->XDist * GUI_pContext->pAFont->XMag;
- }
- }
- //此函数对所有外部字体通用
- static int GUI_ExtFont_GetCharDistX(U16P c, int * pSizeX)
- {
- GUI_FONT_PROP const *pProp;
- for (pProp=GUI_pContext->pAFont->p.pProp; pProp; pProp=pProp->pNext)
- {
- if ((c>=pProp->First) && (c<=pProp->Last))
- return pProp->paCharInfo->XSize;
- }
- return 0;
- }
- //字体类型:外部字体,适用于FLASH
- //宋体,Regular,10
- //字模高度:12,垂直偏移:0
- GUI_CONST_STORAGE GUI_FONT GUI_Ext_FontSong12 =
- {
- GUI_FontSong12_DispChar,
- GUI_ExtFont_GetCharDistX,
- GUIPROP_GetFontInfo,
- GUIPROP_IsInFont,
- (GUI_GETCHARINFO *)0,
- &GUI_ENC_APIList_SJIS,
- 12, /* height of font */
- 12, /* space of font y */
- 1,
- 1,
- &GUI_FontSong12_Prop1,
- };
复制代码 这是对应字库
Ext_FontSong12.bin
(565.17 KB, 下载次数: 3)
|
|