zoukankan      html  css  js  c++  java
  • FreeType2使用总结(转)

    一、FreeType2简介

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

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

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

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

    二、FreeType2字形约定

    2.1 基本概念

    字形:

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

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

    字符图:

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

    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_ppem: EM正方形水平像素数

      y_ppem: EM正方形垂直像素数

      ascender:  EM正方形上行距离

      descender: EM正方形下行距离

      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:  位图行数(高度)

          位图宽度

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

     
    FT_Glyph_Metrics(字形槽度量对象):

      成员:

          字符映像宽度

        height:  字符映像高度

        horiBearingX: 左跨距(水平布局)

        horiBearingY: 右跨距(水平布局)

        horiAdvance: 水平步进

        vertBearingX: 左跨距(垂直布局)

        vertBearingY: 右跨距(垂直布局)

        vertAdvance: 垂直步进

    3. 2 基本API

    FT_ErrorFT_Init_FreeType(FT_Library *alibrary):

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

      返回值:

      若实例化成功则返回0。

     
    FT_ErrorFT_Done_FreeType(FT_Library library):

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

     
    FT_ErrorFT_New_Face(FT_Library library, const char*      

          filepathname, FT_Longface_index,FT_Face*aface ):

      函数功能:

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

     
    FT_ErrorFT_Set_Char_Size(FT_Face face,

      FT_F26Dot6 char_width,  FT_F26Dot6 char_height,

      FT_UInthorz_resolution,FT_UIntvert_resolution ):

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

      输入参数:

      char_ 以1/64点为单位的字符宽度;

      char_height: 以1/64点为单位的字符高度;

      horz_resolution: 设备水平分辨率;

      vert_resolution: 设备垂直分辨率。

      注意:

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

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

     
    FT_UIntFT_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_Moderender_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. }  
  • 相关阅读:
    Linux系统运维之MYSQL数据库集群部署(主从复制)
    Linux系统运维之负载均衡Tengine
    Linux系统运维之subversionEdge部署
    Linux系统运维之Hadoop、Hive、Flume数据处理
    CoIDE在STM32系列单片机中的使用实践
    软硬件调试九法:第三条规则 不要想而要看
    《产品经理》读书笔记
    <读书笔记> 代码整洁之道
    关于鼠标手的症状和恢复方法
    <读书笔记>软件调试之道 :从大局看调试-理想的调试环境
  • 原文地址:https://www.cnblogs.com/chd-zhangbo/p/5671798.html
Copyright © 2011-2022 走看看