2008年8月13日星期三

FreeType2使用总结

  之前用过一段时间freetype2,其实已经过了很久了,突然想起来应该总结总结,在这里记录下来。
  freetype2是个纯c实现的字体引擎,在非标准的表面上绘制字体这是个不错的选择,它非常干净,只负责生成字形信息(灰度图或按位存放的点阵图),后面具体的绘制交给开发人员,你可以往任意的表面自己实现绘制。
  使用起来很简单,看官网的小例子学起来应该很快,就这么几步,初始化、加载字体文件、得到单字索引、得到AA(反走样图,一个点一个byte)图或Bit图(一个byte里每一位一个点,当字号小时,AA不生效,自动会变成这种模式),得到这个字形图后,就可以绘制了,描边也简单,AA图的描边可以用freetype2里的FT_Stroke,Bit图麻烦点,可以参考photoshop的效果自己写一个,也不麻烦。
  实际用起来效率是要注意的,因为生成一个字形是很慢的,需要把生成过的字形信息全cache起来,可自己写个,或者直接使用freetype2较新版本带的FTC系列函数进行处理,索引和字形图分别用FTC_CMapCache和FTC_ImageCache进行缓冲。
  另外一个麻烦点的地方就是文字排版,虽然每个字形信息上带了left和top(这个top不是传统想像中的top,是字笔画实际top到底的距离),但描边时我却没找到方法怎么得到这两个值,于是我手工扫描了字形信息,将空白的无用区域“cut”掉,其实只是在它的buffer、top、left上算一个自己的修正值,这样就能保证两张图对的上了,在这个过程中,可能会需要修改freetype2,我也懒,buffer用来做左和上的偏移,width和rows的修改没什么,只要pitch不变,也没关系,这样的好处就是不用改动它的内存管理,同时也做了自己的修正。
  freetype2源码内部的内存及对象处理都是用的结构内存技巧去做的,一开始还有点不习惯,后来感觉这样也挺清晰,还有就是c,很少实际去用c,和c++细节还是有些区别的。
  其次win32也有类似GetGlyph的函数,但没试过,不知道效率和质量怎么样,网上有个gdi++,就是用freetype2替代win32内置字体绘制。

没有评论: