Posted on 2007-06-21 00:15
vcommon 阅读(3062)
评论(0) 编辑 收藏 引用
矢量字体相当美观和便于移植
根据microsoft的samples glyph.exe,我们可以很容易的自己去画矢量图形。
根据microsoft ttf的spec,我们可以创建自己的矢量字体。
微软为了使小字体清晰,是做了相当大的工作的,包括小字体即使矢量字体也内嵌大量位图。
具体说来,ttf spec定义了字体的间距等,我们可以根据间距定位从某一点开始,然后利用画线或者画多边形的API,将矢量字体画出来。GetGlyphOutline,但不幸的是它和HDC是相关的。
linux freetype用来显示字体,反走样后的小字对简单的字符会好看些,但对中文矢量字体就会边缘灰度过多而模糊发虚。而且hinting是有专利费的,而且对汉字而言,对每个字都微调太过耗时,所以linux下的字体比较难看。
所以对于单片机或其他处理能力不强的嵌入式,都会选择使用点阵字体。
相比来说,如果点阵字体对大屏幕略显难看,可以配台PC通过矢量字体实时生成点阵。
无论Photoshop,coreldraw还是其他软件,字体都是特例,编辑的时候就成了位图似的表示。
而大部分程序,包括UI的,3D游戏的,都会先将字体转变成为一个位图,再显示出来。
linux的xft就是用来光栅化和渲染用的,可以起到相当大的美化效果。
在了解了一般矢量画法之后(见openVG的流程),下边讲诉freetype的字体绘制过程。
FT_Init_FreeType FT_New_Face FT_Set_Char_Size FT_Set_Transform
FT_Load_Glyph FT_Get_Glyph FT_Render_Glyph FT_Glyph_To_Bitmap
FT_Done_Face FT_Done_FreeType
FT_Render_Glyph的作用就是遍历所有的点,使用合适的render画上去。
在<freetype/config/ftmodule.h>里有很多render在使用
.......
FT_USE_MODULE(ft_raster1_renderer_class)//黑白色的位图
.......
ft_raster1_render,ft_standard_raster,ft_black_render,Render_Glyph,Render_Single_Pass,Convert_Glyph
Decompose_Curve ,Conic_To,Line_To这些函数都会访问全局的TRaster_Instance的ras.
对所有的y形成一个buffer,保存所有X的值。4096
1:对一条scanline,x1 x2 x3 x4,所以,x1,x2之间是span的,x3,x4之间是span的
2:垂直或斜的不改变方向的成为profile,或叫边,所以一个字是由多个边组成。
3:最后形成这样一个内存结构,边id,边的信息,