FreeBSD 的中文console

其实 FreeBSD 的 console 早就支持中文了,问题是默认没装中文字体,所以显示出来都是方块……
系统提供了 vtfontcvt 工具,用来转换字体到系统需要的fnt格式。它吃俩格式,bdf和hex,我只认识bdf……
于是尝试转换 wenquanyi 的位图字体。源文件是pcf的,先要找个东西转换成bdf,姑且在github找了个:
https://github.com/ganaware/pcf2bdf
(刚看了眼原来有port,当初搜pcftobdf没搜到……)

转完之后用vtfontcvt,冒出来了各种错误。先是说字符宽度不支持。
打开文件一看,这货好像对字体有很多假设,比如所有字符宽度不是目标宽度的2倍就是和目标一样(等宽字体?)。 wenquanyi 里面虽然中文都是一样的,但是其他英文什么的有各种宽度,比如10pt的字体,pixel宽度有2-13不等……
于是先修vtfontcvt才行。这个vtfontcvt问题还真不少…… 除了前面那个假设之外,他还假设每个字符都和目标一样高,是不是写的时候连bdf格式描述都没读过,拿个样例文件就开搞了…… 他还忽略了字符的偏移位置……

修完的vtfontcvt干了这么几个事情:

× 读取FONTBOUNDINGBOX信息,了解全局的基线位置

× 读取字符的BBX信息,这个包括了这个字符多大和应该放哪儿

× 干掉了那个宽度假设。当然,太宽还是不行的……

打算提交这个修改的时候,发现有个PR已经管了一部分问题:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=205707

但是这个PR修的东西略少,也没管位置偏移之类的问题,于是还是把我修的版本交了上去(一开始还弄错一个版本……)。

之后在这个PR和我的patch的基础上又搞了搞,于是支持多字体叠起来了(wenquanyi的英文太丑了,还不等宽……)。

完整版patch:http://www.henryhu.net/vtfontcvt_full.patch

最后转了个Terminus+wenquanyi的字体出来,用vidcontrol -f弄进去,现在控制台终于可以原生显示中文啦!

转完的字体(Terminus 14pt + wenquanyi 10pt): http://www.henryhu.net/ter-wqy-8×14.fnt