硬汉嵌入式论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: allyzc
收起左侧

[emWin] 做了一个emWin字体生成器

  [复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2019-8-21 21:15:29 | 显示全部楼层
wx_nh8hWZct 发表于 2019-4-21 10:36
直接是双引号的,也是感到很疑惑。所以怀疑是不是emwin一次取了2个字节,判断为0x00 0x00才算结束

找到原因了,特意登陆回复一下。是在GUI_UC_EncodeNone.c这个文件里面,按照以前ucgui的方法实现的外部全字库。里面有个结构体GUI_UC_None现在的版本应该是在库里实现了,如果不调用GUI_UC_SetEncodeNone这个函数还不会报重复定义的错误,所以一直没有找到。
Snipaste_2019-08-21_21-10-27.jpg
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
发表于 2019-8-23 09:44:52 | 显示全部楼层
大赞楼主
回复

使用道具 举报

22

主题

96

回帖

162

积分

初级会员

积分
162
发表于 2019-8-23 10:00:55 | 显示全部楼层
发现了个问题,就是输入重复文字的时候,不能像emwin一样只生成一个数组,比如我输入一句“你好你好”,emwin只会生成“你好”两个文字数组,而楼主这个软件则会生成“你好你好”四个文字数组,就重复了
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2019-8-23 11:51:50 | 显示全部楼层
crazymcu 发表于 2019-8-23 10:00
发现了个问题,就是输入重复文字的时候,不能像emwin一样只生成一个数组,比如我输入一句“你好你好”,emw ...

QQ截图20190823115033.png

自己手动清除,功能已经做了
回复

使用道具 举报

4

主题

117

回帖

129

积分

初级会员

积分
129
发表于 2019-9-18 12:07:32 | 显示全部楼层
谢谢,做字库方便了许多。特别是多语言的(比如原工具用雅黑的找不到韩文,改韩文字体又大小不同)
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-5 09:23:11 | 显示全部楼层
Mark,厉害
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-5 09:45:28 | 显示全部楼层
能够自动删除重复汉字就更好了
回复

使用道具 举报

5

主题

95

回帖

110

积分

初级会员

积分
110
发表于 2019-12-5 09:45:59 | 显示全部楼层
不好意思,看到了有清除重复汉字的功能
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2020-4-3 23:14:32 | 显示全部楼层
如果里面有个转义字符就不对了,不知道修改哪里可以判断一下,修改这里发现没有什么用。
微信图片_20200403231415.png
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2020-4-4 15:26:09 | 显示全部楼层
zouw96 发表于 2020-4-3 23:14
如果里面有个转义字符就不对了,不知道修改哪里可以判断一下,修改这里发现没有什么用。

在这里加上一句判断就没问题了,GUI_FontYH_24_IsInFont不知道这个函数为什么没有调用。楼主看什么时候能更新一下就好了。
微信图片_20200404152602.png
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2020-4-4 22:12:43 | 显示全部楼层
zouw96 发表于 2020-4-4 15:26
在这里加上一句判断就没问题了,GUI_FontYH_24_IsInFont不知道这个函数为什么没有调用。楼主看什么时候能 ...

还有这个地方需要改一下,不然最后一列显示不出来。我用的是GBK抗锯齿4外部XBF。
微信图片_20200404221239.png
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2020-4-7 08:43:06 | 显示全部楼层
zouw96 发表于 2020-4-4 22:12
还有这个地方需要改一下,不然最后一列显示不出来。我用的是GBK抗锯齿4外部XBF。

你现在遇到的问题是什么?先具体描述一下。生成的XBF我也是测试过可以正常显示的。
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2020-4-8 21:41:15 | 显示全部楼层
allyzc 发表于 2020-4-7 08:43
你现在遇到的问题是什么?先具体描述一下。生成的XBF我也是测试过可以正常显示的。

一个问题是字符串中如果有转义字符显示就会有问题,因为没有这个表导致可能出错或死机。还有一个文件就是单数列字体的时候,最后一列没有显示比如17大小的字符0。我截图给出了解决办法。不知道有更合适的修改方式没。
回复

使用道具 举报

34

主题

111

回帖

213

积分

高级会员

程序小白

积分
213
QQ
发表于 2020-6-9 11:33:19 | 显示全部楼层
请问下,软件中的字模高度是什么含义?  选择字体的时候不是已经选择了字体大小了吗?
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2020-6-9 14:21:29 | 显示全部楼层
清风徐来 发表于 2020-6-9 11:33
请问下,软件中的字模高度是什么含义?  选择字体的时候不是已经选择了字体大小了吗?

这个是用来省空间用的,比如微软雅黑,上下边边有很多空白,你把字模高度设小一点,就切掉了上下的白边,我转换几次看效果就知道了。
回复

使用道具 举报

7

主题

26

回帖

47

积分

新手上路

积分
47
发表于 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全字库+所有英文代码,可参考。
  1. /*
  2. *---------------------------------------------------------------
  3. *                        emWin字体工具
  4. *
  5. * 注:支持unicode/GBK编码切换,支持抗锯齿
  6. * 注:本字体文件由emWin字体工具 V0.4 生成
  7. * 作者:阿里(qq:617622104)
  8. *---------------------------------------------------------------
  9. */


  10. #include "GUI.h"
  11. #include "GUI_Private.h"
  12. #include <string.h>


  13. static const GUI_CHARINFO GUI_FontSong12_CharInfo[] =
  14. {
  15.         {13,13,2,(const unsigned char *)0 },                /* 0:GBK全字库,0x8140-0xfefe, 其中去除低字节00-3F、FF*/
  16.         {7,7,1,(const unsigned char *)0x0008D030 },        /* 1:ASCII 0x20-0x7F */
  17. };

  18. static const GUI_FONT_PROP GUI_FontSong12_Prop2 =
  19. {
  20.         0x0020, /* start */
  21.         0x007F, /* end */
  22.         &GUI_FontSong12_CharInfo[1],
  23.         (GUI_FONT_PROP*)0,
  24. };

  25. static const GUI_FONT_PROP GUI_FontSong12_Prop1 =
  26. {
  27.         0x8140, /* start */
  28.         0xfefe, /* end */
  29.         &GUI_FontSong12_CharInfo[0],
  30.         &GUI_FontSong12_Prop2,
  31. };




  32. //用户实现函数,用来读取字模数据
  33. //offset:地址偏移
  34. //size:读取的字节大小
  35. const unsigned char *GUI_Font_getData(unsigned char *pBuf,int offset, int size)
  36. {
  37.         //字模保存在SPIFLASH示例 SPIFLASH_Read(g_font_buf,offset,size);
  38.         //字模已加载到SDRAM示例  memcpy(g_font_buf,pFontAddr+offset,size);
  39.         extern char        *ExtFontBuf;
  40.         memcpy(pBuf,ExtFontBuf+offset,size);
  41.         return pBuf;
  42. }

  43. //此函数对所有外部字体通用
  44. static const GUI_CHARINFO* GUI_FindChar(GUI_FONT_PROP const *pProp,GUI_CHARINFO *pCharInfo, U16P c)
  45. {
  46.         for (; pProp; pProp=pProp->pNext)
  47.         {
  48.                 if ((c>=pProp->First) && (c<=pProp->Last))
  49.                 {
  50.                         *pCharInfo=*pProp->paCharInfo;
  51.                         if (c<0x80)
  52.                                 pCharInfo->pData+=(c-pProp->First)*pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize;
  53.                         else
  54.                         {
  55.                                 c-=pProp->First;
  56.                                 pCharInfo->pData+=((c>>8)*191+(c&0xff))*pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize;
  57.                         }
  58.                         return pCharInfo;
  59.                 }
  60.         }

  61.         return (GUI_CHARINFO*)0;
  62. }

  63. static void GUI_FontSong12_DispChar(U16P c)
  64. {
  65.         int BytesPerLine;
  66.         unsigned char g_font_buf[24];
  67.         GUI_CHARINFO CharInfo;
  68.         GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
  69.         const GUI_CHARINFO *pCharInfo = GUI_FindChar(GUI_pContext->pAFont->p.pProp,&CharInfo, c);

  70.         if (pCharInfo)
  71.         {
  72.                 GUI_DRAWMODE OldDrawMode;
  73.                 const U8 *pData = GUI_Font_getData(g_font_buf,(int)pCharInfo->pData,pCharInfo->BytesPerLine*GUI_pContext->pAFont->YSize);
  74.                 BytesPerLine = pCharInfo->BytesPerLine;
  75.                 OldDrawMode  = LCD_SetDrawMode(DrawMode);

  76.                 LCD_DrawBitmap( GUI_pContext->DispPosX, GUI_pContext->DispPosY,
  77.                                 pCharInfo->XSize,
  78.                                 GUI_pContext->pAFont->YSize,
  79.                                 GUI_pContext->pAFont->XMag,
  80.                                 GUI_pContext->pAFont->YMag,
  81.                                 1,
  82.                                 BytesPerLine,
  83.                                 pData,
  84.                                 &LCD_BKCOLORINDEX);

  85.                 if (GUI_pContext->pAFont->YDist > GUI_pContext->pAFont->YSize)
  86.                 {
  87.                         int YMag = GUI_pContext->pAFont->YMag;
  88.                         int YDist = GUI_pContext->pAFont->YDist * YMag;
  89.                         int YSize = GUI_pContext->pAFont->YSize * YMag;
  90.                         if (DrawMode != LCD_DRAWMODE_TRANS)
  91.                         {
  92.                                 LCD_COLOR OldColor = GUI_GetColor();
  93.                                 GUI_SetColor(GUI_GetBkColor());
  94.                                 LCD_FillRect(GUI_pContext->DispPosX,
  95.                                              GUI_pContext->DispPosY + YSize,
  96.                                              GUI_pContext->DispPosX + pCharInfo->XSize,
  97.                                              GUI_pContext->DispPosY + YDist);
  98.                                 GUI_SetColor(OldColor);
  99.                         }
  100.                 }
  101.                 LCD_SetDrawMode(OldDrawMode);
  102.                 GUI_pContext->DispPosX += pCharInfo->XDist * GUI_pContext->pAFont->XMag;
  103.         }
  104. }

  105. //此函数对所有外部字体通用
  106. static int GUI_ExtFont_GetCharDistX(U16P c, int * pSizeX)
  107. {
  108.         GUI_FONT_PROP const *pProp;
  109.         for (pProp=GUI_pContext->pAFont->p.pProp; pProp; pProp=pProp->pNext)
  110.         {
  111.                 if ((c>=pProp->First) && (c<=pProp->Last))
  112.                         return pProp->paCharInfo->XSize;
  113.         }
  114.         return 0;
  115. }


  116. //字体类型:外部字体,适用于FLASH
  117. //宋体,Regular,10
  118. //字模高度:12,垂直偏移:0
  119. GUI_CONST_STORAGE GUI_FONT GUI_Ext_FontSong12 =
  120. {
  121.         GUI_FontSong12_DispChar,
  122.         GUI_ExtFont_GetCharDistX,
  123.         GUIPROP_GetFontInfo,
  124.         GUIPROP_IsInFont,
  125.         (GUI_GETCHARINFO  *)0,
  126.         &GUI_ENC_APIList_SJIS,
  127.         12, /* height of font  */
  128.         12, /* space of font y */
  129.         1,
  130.         1,
  131.         &GUI_FontSong12_Prop1,
  132. };
复制代码
这是对应字库
Ext_FontSong12.bin (565.17 KB, 下载次数: 2)
回复

使用道具 举报

7

主题

26

回帖

47

积分

新手上路

积分
47
发表于 2020-6-22 10:19:38 | 显示全部楼层
另外,生成时可以把文字框中的回车符给去掉吗
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2020-6-22 16:32:02 | 显示全部楼层
dwj00 发表于 2020-6-22 10:19
另外,生成时可以把文字框中的回车符给去掉吗

非常感谢你的详细建议,可加我QQ共同讨论学习。
1、(void*)0如果更新会改的。
2、关于变量后声明,使用C99即可,但是使用VC6.0仿真确实会报错,如更新会改。
3、关于每个字符的描述,您这使用的等宽字体是没有问题,如果是不等宽字体是没办法的,中文到是等宽,如果好做到是可以做一下。
4、对于外部FLASH使用XBF时,肯定需求是全汉字库,真正导到字符变大的是字模数据,对于描述字符的额外信息,是很小的,另XBF是空间换时间的做法,关于只生成一条字符描述信息,不等宽字体是做不了的。
5、关于只生成一条字符描述信息,不等宽字体是做不了的,如果是等宽字体,只做一条描述信息效率确实会高很多。
6、文字向下移动是不是改了字模高度,这个是省空间用的,直接设为很大如99,软件会自适应。

如果更新版本可能会参考LVGL的方式了。

回车符可以通过清除重复或是清除英文解决。
回复

使用道具 举报

7

主题

26

回帖

47

积分

新手上路

积分
47
发表于 2020-6-22 19:18:10 | 显示全部楼层
了解了, 感谢回复
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2020-7-2 15:29:53 | 显示全部楼层
1.试用了一下,发现类型为 :外部字体:适用与SDRAM   myFont_12_GetCharDistX()参数中的一直为pSizeX = 0,导致没法进去myFont_12_FindChar()函数.
static int myFont_12_GetCharDistX(U16P c, int * pSizeX) {
    static int sizeX = 0;
    if ( *pSizeX!=0 ){
        CharInfo *pInfo = myFont_12_FindChar(c);
        if ( pInfo )
        {
            sizeX += pInfo->XSize;
        }
    }
    else {
        *pSizeX = sizeX;
        sizeX = 0;
    }
    return 0;
}

2.调用代码为:
        GUI_SetFont(&myFont_12); //设置字体
        GUI_SetColor(GUI_YELLOW);//设置前景色(如文本,画线等颜色)
        GUI_DispStringHCenterAt("GUI_TM_XOR"   ,600,98);
3.有工程提供参考一下.
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

不抛弃不放弃

积分
37
发表于 2020-7-21 10:50:17 | 显示全部楼层
我想加个大字体,一加就这个错,一脸忙然
qq.jpg
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

不抛弃不放弃

积分
37
发表于 2020-7-21 10:56:41 | 显示全部楼层
tanguicaicai 发表于 2020-7-21 10:50
我想加个大字体,一加就这个错,一脸忙然

好像内部重复了
回复

使用道具 举报

2

主题

31

回帖

37

积分

新手上路

不抛弃不放弃

积分
37
发表于 2020-7-21 11:14:54 | 显示全部楼层
我要大字 数字,但是显示不全。有的字只有一部分
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2020-7-21 14:37:52 | 显示全部楼层
tanguicaicai 发表于 2020-7-21 11:14
我要大字 数字,但是显示不全。有的字只有一部分

1、如果重复文字,你就使用清除重复功能,还有如果勾了自动加入英文和数字,输入框内就不能有0x20到0x7f内码的字符。
2、字模大小是由选择字体里面的字号大小决定,字模高度那里是省空间用的,你可以写成99,软件会根据实际大小自适应,且最大的字目前只做到99*99。
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
发表于 2021-7-12 11:20:25 | 显示全部楼层
请教一下,生成字体后 这个c文件的地址是不是字体的开始地址,从norflash拷贝到sdram,使用该字体后会出现hardfault handler,用的1052+sdram。

1.png
2.png
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2021-7-13 09:39:10 | 显示全部楼层
薪火相传 发表于 2021-7-12 11:20
请教一下,生成字体后 这个c文件的地址是不是字体的开始地址,从norflash拷贝到sdram,使用该字体后会出现h ...

字模高度不会设置的话,可以设置为99,软件会自适应的;你字体是存放在哪里?0x80500000是SDRAM的地址吗,字体BIN文件是不是已经加载到这个地址了。
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2021-7-13 10:01:14 | 显示全部楼层
感谢分享!谢谢
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
发表于 2021-7-14 17:35:16 | 显示全部楼层
allyzc 发表于 2018-7-11 15:27
我模拟了下你的界面,没有问题啊

兄得你这个是什么字体
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2021-7-15 14:35:51 | 显示全部楼层
薪火相传 发表于 2021-7-14 17:35
兄得你这个是什么字体

这是微软雅黑。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-12-1 16:35:01 | 显示全部楼层
本帖最后由 jynjynjyn 于 2021-12-1 17:11 编辑

字体可以左右偏移吗?有些字体做成斜体时右上角会超出。
就像FontCvt的extended模式
回复

使用道具 举报

6

主题

16

回帖

34

积分

新手上路

积分
34
发表于 2022-5-19 20:48:54 | 显示全部楼层
你好!用了你的emWin字体生成器,生成的外部FLASH字体GB2312全字库+所有英文代码,怎么无法显示?敬请你可否生成16*16的外部FLASH字体GB2312全字库+所有英文代码,万分感谢!260096@163.com
回复

使用道具 举报

9

主题

140

回帖

187

积分

初级会员

积分
187
QQ
 楼主| 发表于 2022-5-21 15:08:37 | 显示全部楼层
zlkj 发表于 2022-5-19 20:48
你好!用了你的emWin字体生成器,生成的外部FLASH字体GB2312全字库+所有英文代码,怎么无法显示?敬请你可否 ...

外部FLASH字体,在C文件里面有一个读取函数要实现
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2023-3-24 23:00:51 | 显示全部楼层
感谢感谢,很好用
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2023-3-29 09:03:57 | 显示全部楼层
eric2013 发表于 2018-7-7 10:59
已经收到文件,明天就发一下

大佬儿,这个使用说明以及推送在哪,我需要一份
回复

使用道具 举报

91

主题

87

回帖

360

积分

高级会员

积分
360
发表于 2024-3-11 17:43:27 | 显示全部楼层
有键盘功能的,需要用到法语和西班牙语全字库的,大佬,支持么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 14:37 , Processed in 0.369225 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表