FreeType2使用总结

转自:

http://blog.csdn.net/finewind/article/details/38009731

一、FreeType2简介

1. 是一个免费、开源、可移植且高质量的字体引擎;

2. 支持多种字体格式文件,并提供了统一的访问接口;

3. 支持单色位图、反走样位图渲染,这使字体显示质量达到Mac的水平;

4. 采用面向对象思想设计,用户可以灵活的根据需要裁剪。

 

二、FreeType2字形约定

2.1 基本概念

字形:

  字符映像叫做字形,单个字符能够有多个不同的映像,即多个字形。多个字符也可以有一个字形。

  (可以理解为一个字形就是一种书写风格)

字符图:

  字体文件包含一个或多个表,叫做字符图。用来将某种字符码转换成字形索引。一种字符编码方式(ASCIIUnicodeBig5)对应一张表。

 

2.2字形轮廓

:

  字形文本的大小通常用点(point)表示。点是一种简单的物理单位,数字印刷中,一点等于1/72英寸。

  设备的分辨率通常使用dpi(每英寸点数)表示的两个数。

  点数大小和像素数的转换公式:

  像素大数  点数*分辨率/72

轮廓线:

  字形轮廓的源格式是一组封闭的路径,称为轮廓线。每个轮廓线划定字形的外部或内部区域,它们可以是线段或者Bezier曲线。

EM正方形:

  字体在创建字形轮廓时,字体创建者所使用的假象的正方形。他可以将此想象成一个画字符的平面。它是用来将轮廓线缩放到指定文本尺寸的参考;它的尺寸越大,可以达到更大的字形分辨率。

  注意:字形可以自由的超出EM正方形。

位图渲染:

  指从字形轮廓转换成一个位图的过程。

 

2.3 字形度量

基线、笔和布局:

  基线是一个假象的线,用来在渲染文本时知道字形,它可以是水平或垂直的。而且,为了渲染文本,在基线上有一个虚拟的点,叫做笔位置或原点,它用来定位字形。每种布局使用不同的规约来放置字形:

  对水平布局,字形简单地搁在基线上;

  对于垂直布局,字形在基线上句中放置。

 

                      图1. 水平布局及其度量     


                            图2.垂直布局及其度量

 

 

重要的字体度量参数:

 上下高度 (ascent) :   从基线到放置轮廓点最高 ( ) 的距离;
 下行高度 (descent) :从基线到放置轮廓点最低 ( ) 的距离;
 左跨距 ( bearingX ) :  从当前笔位置到轮廓左边界的水平位置;
 上跨距 ( bearingY ) :  从当前笔位置到轮廓上边界的垂直位置;
 步进宽度 ( advanceX ):  相邻两个笔位置的水平距离 ( 字间距 )
 字形宽度 (width)       字形的水平长度;
 字形高度 (height) :     字形的垂直长度。

 

 

三、FreeType2基本数据结构API

3.1 基本数据结构

 

 

 

FT_Library ( 库对象 )

  FreeType库句柄对象

  (不用关心其成员)

 
FT_Face ( 外观对象 )

  成员:

  num_faces字体文件所含外观数

  face_index当前外观索引值

  num_glyphs当前外观所含字形文件数

  num_charmaps字符表数

  charmaps字符表数组

  charmap当前字符表

  glyph:  字形槽对象

  size:  字形尺寸

 
FT_Size ( 尺寸对象 )

  成员:

    face:  指向父对象(FT_Face对象)

    metrics:  字形尺寸对象

 

FT_Size_Metrics(EM度量对象)

  成员:

  x_ppemEM正方形水平像素数

  y_ppemEM正方形垂直像素数

  ascender:  EM正方形上行距离

  descenderEM正方形下行距离

  height:  EM正方形高度

  max_advance最大步进宽度

 

FT_GlyphSlot ( 字形槽对象 )

  成员:

    face:  指向父对象(FT_Face对象)

    metrics:  字形尺寸对象

    advance:  步进对象

    format:  字形槽格式

    bitmap:  字形位图

    bitmap_top位图上行距离

    bitmap_left位图左行距离

    outline:  字形轮廓线

 
FT_Vector ( 步进向量 )

  成员:

    x:  水平步进值

    y:  垂直步进值

 

FT_Bitmap ( 字形位图对象 )

  成员:

    row:  位图行数(高度)

    width:  位图宽度

    buffer:  位图数据(默认8位灰度值)

 
FT_Glyph_Metrics ( 字形槽度量对象 )

  成员:

    width:  字符映像宽度

    height:  字符映像高度

    horiBearingX左跨距(水平布局)

    horiBearingY右跨距(水平布局)

    horiAdvance水平步进

    vertBearingX左跨距(垂直布局)

    vertBearingY右跨距(垂直布局)

    vertAdvance垂直步进

 

3. 2 基本API

FT_Error FT_Init_FreeType ( FT_Library  * alibrary ):

  函数功能:
  
实例化一个FreeType库对象,并返回给alibrary

  返回值:

  若实例化成功则返回0

 
FT_Error FT_Done_FreeType ( FT_Library  library)

  函数功能:
  
销毁FreeType库对象library,包括其所有子对象;

 
FT_Error FT_New_Face ( FT_Library  library, const char*      

      filepathnameFT_Longface_index,FT_Face*aface ):

  函数功能:

  打开filepathname所指定的字体文件,加载第index个字体外观,并返回给aface指定的地址。

 
FT_Error FT_Set_Char_Size ( FT_Face  face,

  FT_F26Dot6 char_width,  FT_F26Dot6 char_height,

  FT_UInthorz_resolution,FT_UIntvert_resolution )

  函数功能:
  
设置字体大小;

  输入参数:

  char_width1/64点为单位的字符宽度;

  char_height1/64点为单位的字符高度;

  horz_resolution设备水平分辨率;

  vert_resolution设备垂直分辨率。

  注意:

  字符宽度或高度可设置为0,这意味着宽度或高度与另一个参数(高度或宽度)相同;

  水平或垂直分辨率设置为0时表示使用默认的72dpi

 
FT_UInt FT_Get_Char_Index ( FT_Face  face,

  FT_ULong charcode)

  函数功能:
  
在选定的字符表中,查找与给出的字符码对应的字形索引。

  返回值:

  如果没有字符表被选中,这个函数简单返回字符码;

  如果该字符表总没有该字符码对应的字形图像,返回0

  注意: 

  0对应特殊的字符图像,通常会显示一个框或空格;

  新建一个face时,默认是Unicode编码的字符表。

 
FT_Error    FT_Load_Glyph FT_Face  face,  FT_UInt

  glyph_index, FT_Int32load_flags)

  函数功能:

  face中装载第index个字形图像到字形槽中(face->glyph)

  输入参数:

  load_flags:装载标志,默认FT_LOAD_DEFAULT。此时优先装载嵌入位图,若无,则装载该字形的缩放后的轮廓线。

  face->glyph->format描述了字形图像的格式。若它的值是FT_GLYPH_FORMAT_OUTLINE,则可调用FT_Outline_Embolden加粗轮廓线;若它的值不是FT_GLYPH_FORMAT_BITMAP,则可通过FT_Render_Glyph把它转换成位图。


FT_Error  FT_Outline_Embolden ( FT_Outline * outline, FT_Pos  strength)

  函数功能:

  将轮廓线加粗strength(26.6像素格式)


FT_Error  FT_Render_Glyph ( FT_GlyphSlot  slot, FT_Render_Mode render_mode )

  函数功能:
  
将字形槽对象(slot)中的字形图像转换成字形位图。

  输入参数:

   render_mode:渲染模式位标志集合,默认使用

  FT_RENDER_MODE_NORMAL渲染模式,表示渲染为一个高质量的抗锯齿(256级灰度)位图。


[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int main()  
  2. {  
  3.     FT_Library  library;  
  4.     FT_Face     face;  
  5.     FT_Error    error;  
  6.     FT_UInt     charIdx;  
  7.     wchar_t     wch = 'a';  
  8.     char*       buffer;     // 用户申请的显示区域空间  
  9.     int         startX, startY; // 字符图像开始装入的位置  
  10.   
  11.     // 1. 初始化freetype2库  
  12.     error = FT_Init_FreeType(&library);  
  13.   
  14.     // 2. 创建一个face  
  15.     error = FT_New_Face(library, "C:\\windows\\font\\SURSONG.TTF", 0, &face);  
  16.   
  17.     // 3. 设置字体尺寸  
  18.     error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);  
  19.   
  20.     // 4. 获取字符图像索引  
  21.     charIdx = FT_Get_Char_Index(face, wch);  
  22.   
  23.     // 5. 加载字符图像  
  24.     FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);  
  25.     if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)  
  26.     {  
  27.         FT_Outline_Embolden(&(face->glyph->outline), 16); // 加粗轮廓线  
  28.     }  
  29.   
  30.     // 6. 获取字符位图  
  31.     if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)  
  32.     {  
  33.         FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);  
  34.     }  
  35.   
  36.     // 7. 拷贝字符位图到用户的buffer中(用户私人函数)  
  37.     // 注意左边的计算方法  
  38.     ft2CopyBitmapToBuf(buffer, startX+face->glyph->bitmap_left,  
  39.         startY+face->size->metrics.ascender/64-face->glyph->bitmap_top,  
  40.         face->glyph->bitmap);  
  41.     startX += face->glyph->advance.x/64;  
  42. }  
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值