花费了一天的力气,终于把在m2tklib上显示汉字的坑填上了。
其中,只有一次想放弃,比以前的数次放弃有了很大进步。
根据MakerLab创客实验室的文章,可以显示中文,但是按照他的说法,将末尾的一位删掉,尽管可以持续显示后面的汉字,但实际上字会缺一小部分,而他的完整例子中的字体好像又没问题。
使用bdf2u8g生成一个汉字:
const u8g_fntpgm_uint8_t c11[47] U8G_SECTION(".progmem.c11") = {
0,13,13,255,254,0,0,0,0,0,136,136,0,11,255,0,
0,11,12,24,12,0,255,0,128,68,160,34,192,128,128,87,
224,20,32,39,224,36,32,199,224,68,32,68,32,68,224};
其数据格式,在u8g_font.c中有描述,如下:
/*
... instead the fields of the font data structure are accessed directly by offset
font information
offset
0 font format
1 FONTBOUNDINGBOX width unsigned
2 FONTBOUNDINGBOX height unsigned
3 FONTBOUNDINGBOX x-offset signed
4 FONTBOUNDINGBOX y-offset signed
5 capital A height unsigned
6 start 'A'
8 start 'a'
10 encoding start
11 encoding end
12 descent 'g' negative: below baseline
13 font max ascent
14 font min decent negative: below baseline
15 font xascent
16 font xdecent negative: below baseline
*/
这里面说明字体通用描述是17个字节。
对照生成的数据,可以得到每个字节的对应解释。
0 - format 0
13 - 字体外框宽度
13 - 字体外框高度
255 - 字体外框 x偏移 -1
254 - 字体外框 y偏移 254
...
实际上,生成字体数据的第2行,首位置的0是 第17字节数据: 字体x下降;若删掉每行的末尾数字,则 0 变成每个字的末尾像素,显示就为缺角。
第2行数据,0,11,12,24,12,0,255,0,128,68,160,34,192,128,128,87 是对字进行描述。
/*
format 0
glyph information
offset
0 BBX width unsigned
1 BBX height unsigned
2 data size unsigned (BBX width + 7)/8 * BBX height
3 DWIDTH signed
4 BBX xoffset signed
5 BBX yoffset signed
*/
很好的看到,11是字宽, 12是字高, 24是字数据的尺寸,通过 (11+7)/8×12 ≈24, 后面的数据长度与此相符。因为数是除不尽的,所以末尾224,0xe0是高字节用来表示像素。
这次遇到的问题不算太难,被一行16个数据的表现形式迷惑。当然,主要原因还是对数据组织结构不了解,不知道每行的意义。 了解以后,自然很轻松的找到解决办法。
这样,前述文章中的代码要修改为第2个字时,删掉第1位数,这里通常是0, 而后在末尾加 ',‘,免除手添之麻烦。
'
del c[0] # 删掉第1行
if not first_word:
pos_first = c[0].index(',')
c[0] = c[0][pos_first+1:] # 删掉第1个零,字体结构的第17字节
if first_word:
first_word = False
c[1] = c[1] + ',' # 补充末尾逗号
# result[w] = c
# 写出到文件
汉字显示效果,结尾的像素是完整的,而且可以连续显示:
这里是使用了firefly-sung的字体,提取尺寸12的汉字,存到bdf。(在此致谢提供fontforge使用教程的作者)
u8glib+m2tklib的文章很少,再次感射makerlab实验室,他的文章做了细致的描述,同时 还要感谢麦知club的Yang给予的Python方面支持。
总之,谢谢大家的分享,“三人行,必有我师焉;择其善者而从之,其不善者而改之。”