freetype显示仿宋_GB2312 的探索历程

CuteDeviceOpenGL 原先采用的文字绘制方法是借助CDC作出文字的位图,然后用 OpenGL Textuer 贴上去。OpenGL 干活巨快,CDC处理位图却慢得要死。最终不得不放弃这种方法。

然后,上 qq群 1490198(OpenGL专业群)询问,有牛人大呼用freetype,同时还有有经验人士对freetype的溢美之辞,不禁令我蠢蠢欲动。经过较为周详的讨论,最终决定尝试使用freetype+FTGL。 FTGL 就是 free type OpenGL。一个利用 freetype 在 OpenGL 上画字的库。传说速度巨快,牛人曰:“CDC不会比他快”。

接着,下载了 freetype,FTGL 还有一些 demo。之后遇到的一大堆编译错误就不提了(freetype 和 FTGL都是提供源代码的)。最后终于编译通过一个demo,文字也出来了。但是中文出来的是乱码。询问有经验人士,他说要采用 Render(L"中文") 才行。 ~~~哦!步就是unicode嘛,这个我明白。遂调用 Render(L"中文") ~~ 大呼“中文出来啦!中文出来啦!!”惊动了四座!

总觉得传送 unicode 进去有些不妥,因为现在的 Solid2000 采用 MBCS,所以决定考察一下 FTGL/freetype 能不能接受 MBCS。最后发现它能够设置 CodeMap->gb2312 哦~~~这个不错,赶紧试一试~~结果~~失败!!总是返回失败,唉,还是算了。这回有经验人士也称不知此事。于是我只好调用 MultiByteToWideChar() 转换成 unicode。这个函数还是以前在 ImportDWG 中搞定的。技术积累还是很有用的呀。这下全解决了。

解下来解决了文字高度、文字颜色、文字宽度等问题。字体选择对话框无疑需要保留原来的。这就产生了一个问题,字体选择对话框里面的字体名字是 font face name,但是 freetype 接受的是字体文件名。显然我们需要一个 face name -> file name 的对应关系。查阅 MS 的 API 一无所获之后,不得不求助于 freetype 中的函数。许久看不到半点可用函数的影子。这下难办了。我想,freetype 这么多人用,肯定会有很多人遇到过这个问题,于是我就在古今中外的各大论坛上发帖子。但是得到的结果总是答者寥寥或者答非所问

http://www.codeguru.com/forum/showthread.php?s=&threadid=273682&highlight=freetype+face+name

最后请出强有力的四大名捕 Google ,一声令下 “给我搜!!” 搜到的全是一些没用的东西。最后,最后的最后,搜索新闻组,这是很专业的地方,嘿嘿~~再搜新闻组~~终于看到了很多人关系这个文,居然有人在 2000 年就问过这个问题,然后有人拿 1977 年的程序来搞。经过10分钟在新闻组上的拼杀,找到了不少有用的资料。还有好多现成的程序。于是就拿下来编译一下看看。

~~恩~ 不错,face name 都出来了。不过~~face name 都是英文的,比如 FangSong_GB2312

怎么办?Windows的字体对话框显示的可是 “仿宋_GB2312”,是操作系统做的转换?不太像。还是字体文件中存储了这个?用十六进制观察字体文件,FangSong_GB2312 看到了,但是 仿宋_GB2312 却没看到。于是对 down 下来的程序进行高强度的 TRACE 跟踪。最后发现,从TTF文件中除了读出来 FangSong_GB2312 之外,还有其他一些乱糟糟的东西。用十六进制方式看内存发现里面有英文部分

._.G.B.2.3.1.2

非常像 unicode 的编码。于是把这一串内存编辑形成一个 .txt 文件,形成 unicode txt 格式:

FF FE XX XX XX XX 00 XX 00 XX 00 XX

却没发现中文。最后看到 unicode 的习惯,英文字母是由 XX 00 组成的,而不是 00 XX。于是我干脆把里面的字节序调过来,按照每两个字节一个单元,调换字节序,最后久违了的 仿宋_GB2312 终于出现了(ttf 里面采用的是 motolora 的字节序)。后来研究了一下 ttf 里面的数据,中文部分的数据都对应标识 language ID = 1032。而英文的数据则对应的标识为 2308。奥秘就在这里。


最后,还有一个问题,ttc 文件也是一种 ttf,但是我下载的程序却不支持,这是一个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值