|
首先感谢大家的支持,开源墨水屏有了良好的生态应用。
前几天刚入手墨水屏的时候,版主有提到抬头标题栏(日期/版本/名称/电压)使用 12px 字体有问题,
表现为:标题栏字体显示残缺,字母笔划不全。
今天尝试折腾一下,不想竟然修复了这个 BUG,特来分享。
【原理】
研究墨水屏源码可知,屏显字体采用 ROM 表格的方式进行存储。具体字体文件:
fontcn8.bin : 应该是某 8px 高字体,具体用处没细看;
fontcn12.bin : 高 12px 的 Unicode 字体,用于抬头标题栏显示;
fontcn16.bin : 高 16px 的 Unicode 字体,用于显示中文及正文数字;
fontnum48.bin: 高 48px 的数字字体,用于显示时钟,已经折腾了一圈了。
抬头标题栏笔划缺失,应该和 fontcn12.bin 字模有关系,需要首先了解字模存储格式。
研究源码可知,fontcn12.bin 当中存储的是 12px*12px 的 Unicode 字符字模,
在 1bpp 颜色位深度下,12px*12px 所需存储空间在字节对齐后需要:2Byte*12= 24Byte,
进一步查看 fontcn12.bin 文件尺寸:1,572,864 Byte = 65536 * 24 Byte.
很显然版主并没有刻意给字模文件做压缩编码,这个字模文件刚好对应 Unicode(2Byte) 下的 65536 个字符。
这一点在 Arduino 的 u8g2 库中就很蛋疼,字模数据都压缩了,想改基本需要重新编译。
WinHex 扣出 fontcn12.bin : 1*24Byte 位置的编码,共 24 字节,人肉在记事本上画一画字模:
很显然就是这么回事,这相当于 Unicode(0x0001) 位置的不可打印字符方块而已。至此可以确认:
a. fontcn12.bin 存储了 65536 个 12px*12px (24Byte) 的字模文件,顺序应该与 Unicode 码一致;
b. fontcn12.bin 存储 '0'-'9' 的起始位置为: 24 * 0x30 = 0x480
c. fontcn12.bin 存储 'A'-'Z' 的起始位置为: 24 * 0x41 = 0x618
d. fontcn12.bin 存储 'a'-'z' 的起始位置为: 24 * 0x61 = 0x918、
【症结】
至于为何显示的字形不全,仔细研究代码发现:
打印 fontcn12.bin 字体时,如果遇到了 ASCII 字符,则水平方向字符间距为 6px,其他 Unicode 则是 12px.
这个逻辑类似于非等宽字体,应该是用于节省屏幕空间。
但由于 fontcn12.bin 是 12px*12px 取模的缘故,一旦字形笔划位于 12px 右半侧,就会被相邻字符遮挡,造成笔划缺失。
如下图所示,ch2 字形遮挡了 ch1 字形的右半边:
【手绘】
既然已经确认问题症结,接下来任务就是制作一系列字模,使数字、字母都填进 6px*12px 区域,并封装成 12px*12px 字模数据。
由于分辨率并不高,这里选择拿记事本手绘。使用两个全角字符方块表示像素,绘制了如下的 ASCII 字模:
取模软件不想找了,这几个字模口算就是了,在 WinHex 当中直接编辑计算好的位置,得到了最终的字体文件。
【工具】
在绘制的过程中,因为是口算字模,难免会有出错的情况。于是和之前折腾时钟一样,需要一套 12px 字体预览工具。
拿之前的 VS 代码改一改,显示 12px 字体当中的 0-9, A-Z, a-z 即可,尺寸为 6px*12px,其余字形不关心。
工具APP 和源码发来:
最终修复好的字体文件也发来:
【效果】
在预览器中对比修复前后的字形,可以看到修复前大多数 ASCII 都超过了 6px 的限制,导致显示残缺。
修复后的字体都能正确挤进左侧 6px 空间,确保显示不重叠。
接下来实地烧录。由于已知字体烧录位置,直接在下载工具中指定修复好的字体、烧录位置进行烧录:
运行效果如下,上图为修复前缺笔画,下图为修复后,基本清晰:
----------------------------------------------------------------------------------------
以上,给开源墨水屏修复了抬头字体,不再缺少笔划;并更新了字体预览工具(12px版本),分享来供大家参考。
最后祝大家折腾愉快!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|