posts - 36, comments - 30, trackbacks - 0, articles - 0

矢量字体的画法

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,边的信息,



 

只有注册用户登录后才能发表评论。