硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2449|回复: 12
收起左侧

[emWin] 关于矢量小字库制作的分享与矢量汉字的显示问题

[复制链接]

11

主题

104

回帖

137

积分

初级会员

积分
137
发表于 2017-8-4 10:45:20 | 显示全部楼层 |阅读模式
大家都知道矢量汉字是非常消耗内存的,稍小的幼圆占用的内存为6.38M,仿宋占用的内存为10MB,计算机常用的默认字体微软雅黑占用的内存为22.5MB。要在单片机上实现矢量汉字的显示对于单片机这种资源比较紧张的事物来说是得不偿失的,所以制作矢量小字库就有其必要性了。本次的分享想法其实由来已久,原本是希望完全做完矢量汉字再一次性分享,但是在开发板显示过程中发生了一些奇怪的问题而我确实无法解决,就提前分享顺带着问下发生的问题。
矢量小字库的制作其原理是对计算机自带的矢量字库进行裁剪,只取出其中常用的汉字来显示,其目的是在加载进入SDRAM的时候能尽量少的占用内存空间。实际测试发现一个汉字“鸟”占用的内存大小为5KB。
想要制作矢量小字库需要用到Font Creator这个软件。
软件安装等操作我就不再赘述了,主要讲下具体怎么制作小字库的事情。以下为小字库制作的步骤:
1.在打开软件前需要将“仿宋”从Windows-Fonts文件下中复制出来粘贴到桌面或者随便一个可以正常访问的文件夹中,我这边是放在了文档-Fonts文件下面。
2.打开Font Creator,点击文件-打开,选择文档-Fonts-simfang.ttf-打开,也就是将那个复制出来的字库文件打开。
3.会看到打开了一个选项卡,大家将选项卡最大化,以便我们能同步进行。在选项卡的上面能看到一行字“字形,28562个项目”。这表示,整个仿宋字库一共有字28562个。
4.在Font Creator软件中使用快捷键“ctrl+F”启动查找,点击“区分大小写”,搜索“鸟”,记下“鸟”字上方的代码“uni9E1F”。
5.在左侧标签栏拖动滚轴找到“Unicode”并双击,在出现的标签中拖动滚轴按照每个汉字上方的代码找到“uni9E1F”也就是“鸟”。
6.使用快捷键“ctrl+A”选中所有汉字,按住“ctrl”,鼠标左键点击“鸟”,将其取消选定,按下键盘上的“delete”,删除所有除了鸟字外的所有字。
7.点击左侧标签栏中的“字形”,删除除“鸟”外的所有字。
8.此时保存一下工程,随便在桌面新建一个名叫“Font”的文件夹,将工程保存在那边。
9.依次点击“文件-导出字体-导出TrueType/OpenType字体”,在弹出的窗口中选择保存类型为“TrueType/OpenType”,并将导出的字体也保存在“桌面-Font”文件夹下面。
此时,我们已经制作完成了一个矢量汉字“鸟”,接着我们将导出的字体文件放入SD卡中。系统在初始化的时候会自动将其加载到SDRAM中(在底层配置完成的情况下可以直接显示)。
我现在发现的问题是:在制作完全部的数字、字母以及部分汉字的情况下进行显示时,可以显示字母+数字+空格,但是我无法显示汉字(我估计直接显示了字库的第一个“空格”)。当我将字库的数字、字母、空格全删除只剩下汉字,那么我只能显示字库中的第一个字“上”,且其余的字母、汉字全都显示成这个字。
在汉字文件加载时我在debug中观察以下代码:
  1. Data.pData = _acBuffer;
  2. Data.NumBytes = fp.fsize;
复制代码
发现pData代表的SDRAM起始地址是在SDRAM的允许范围内,NumBytes代表的文件大小是66KB,也是符合的。但是就是不能显示其他汉字。
哪位好汉知道这个问题出在哪里呢?先谢过了!
FontCreator:http://www.ddooo.com/softdown/77364.htm
我所使用汉字字库: simfang.zip (45 KB, 下载次数: 50)
现象:

上*n现象

上*n现象
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2017-8-4 11:12:34 | 显示全部楼层
是否看过我们新版emWin教程中矢量字库章节,可以先看下。emWin移植的矢量库的动态内存是通过malloc和free实现动态的申请和释放的,而这两个函数所使用的堆空间是来自启动代码,即.s文件中的heap大小,这个申请的一定要够大,可以先分配个2MB的空间:
QQ截图20170804110902.png
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-8-4 11:19:14 | 显示全部楼层

回 eric2013 的帖子

eric2013:
是否看过我们新版emWin教程中矢量字库章节,可以先看下。emWin移植的矢量库的动态内存是通过malloc和free实现动态的申请和释放的,而这两个函数所使用的堆空间是来自启动代码,即.s文件中的heap大小,这个申请的一定要够大,可以先分配个2MB的空间:


教程已经对照着看了几遍,启动文件已经修改了。在工程的其他地方我也用到了malloc跟free,所以有点担心会超范围。
但在之前如果堆栈爆掉的话,系统将不在正常运行,其具体表现为板载的LED灯将不再闪烁、触摸屏将不再支持触摸。在本次实验中没有发生这个现象。
启动文件修改如下:

启动文件修改

启动文件修改
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2017-8-4 11:25:19 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:教程已经对照着看了几遍,启动文件已经修改了。在工程的其他地方我也用到了malloc跟free,所以有点担心会超范围。
但在之前如果堆栈爆掉的话,系统将不在正常运行,其具体表现为板载的LED灯将不再闪烁、触摸屏将不再支持触摸。在本次实验中没有发生这个现象。
启动文件修改如下: .. (2017-08-04 11:19) 
分配还是小,改用我们教程中那样的,使用外部SDRAM往这里分配,分配个2MB
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-8-4 11:30:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:分配还是小,改用我们教程中那样的,使用外部SDRAM往这里分配,分配个2MB (2017-08-04 11:25) 
emwin在申请动态内存的时候使用了malloc跟free,这个申请的过程应该是在封装好的函数里面操作的吧?
之前使用外部SDRAM的方式做,没有做成功。对照着教程来的话,也是修改了启动文件以及sdram跟emwin的起始地址。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2017-8-4 11:33:54 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:emwin在申请动态内存的时候使用了malloc跟free,这个申请的过程应该是在封装好的函数里面操作的吧?
之前使用外部SDRAM的方式做,没有做成功。对照着教程来的话,也是修改了启动文件以及sdram跟emwin的起始地址。 (2017-08-04 11:30) 
动态内存小,汉字是显示不了的,之前遇到过这个问题,所以务必要加大。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-8-4 14:12:53 | 显示全部楼层

回 eric2013 的帖子

eric2013:动态内存小,汉字是显示不了的,之前遇到过这个问题,所以务必要加大。 (2017-08-04 11:33) 
当时硬汉哥遇到的时候系统还能正常运行吗?我指的是系统有没有死掉进硬件错误呢?实际上我看论坛有一个网友也碰到这个问题,就是英文、数字能显示,但是汉字不能显示。链接如下:
http://www.armbbs.cn/forum.php?m ... mp;amp;page=1#31678
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2017-8-5 10:53:14 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:当时硬汉哥遇到的时候系统还能正常运行吗?我指的是系统有没有死掉进硬件错误呢?实际上我看论坛有一个网友也碰到这个问题,就是英文、数字能显示,但是汉字不能显示。链接如下:
http://www.armbbs.cn/forum.php?m ... mp;amp;page=1#31678 (2017-08-04 14:12) 
遇到过中文无法显示的情况,早期我们的V5板子就是,因为F407没法用SDRAM,容量小,所有矢量字体章节就仅仅显示了下数字和字母。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-8-7 09:48:26 | 显示全部楼层

回 eric2013 的帖子

eric2013:

遇到过中文无法显示的情况,早期我们的V5板子就是,因为F407没法用SDRAM,容量小,所有矢量字体章节就仅仅显示了下数字和字母。
谢谢硬汉哥,问题已经解决了,堆栈没有问题呢,是字库的问题。
不过后期还是会做成外部SDRAM提供堆栈的,因为其他地方也用到了堆栈,设置成外部方便些。
字库现在删减到2MB了,后期还能继续变小的。

矢量小字库的仿宋显示

矢量小字库的仿宋显示
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2017-8-8 01:30:47 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:谢谢硬汉哥,问题已经解决了,堆栈没有问题呢,是字库的问题。
不过后期还是会做成外部SDRAM提供堆栈的,因为其他地方也用到了堆栈,设置成外部方便些。
字库现在删减到2MB了,后期还能继续变小的。

....... (2017-08-07 09:48) 
[s:130]

不错,真不赖
回复

使用道具 举报

2

主题

134

回帖

140

积分

初级会员

积分
140
发表于 2017-8-16 20:55:16 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:谢谢硬汉哥,问题已经解决了,堆栈没有问题呢,是字库的问题。
不过后期还是会做成外部SDRAM提供堆栈的,因为其他地方也用到了堆栈,设置成外部方便些。
字库现在删减到2MB了,后期还能继续变小的。

....... (2017-08-07 09:48)
大牛  更分享以下您的源码吗   或者核心方法也行  谢谢
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2022-9-16 09:07:03 | 显示全部楼层
请问硬汉哥能出个LVGL的矢量字库教程嘛,非常感谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106910
QQ
发表于 2022-9-16 10:12:40 | 显示全部楼层
appleddd 发表于 2022-9-16 09:07
请问硬汉哥能出个LVGL的矢量字库教程嘛,非常感谢

不了解这个。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 15:14 , Processed in 0.375410 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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