freetype学习笔记一

freetype介绍

freetype可以看作是一组组件,每个组件负责一部分任务,它们包括

  • 客户应⽤用程序一般会调⽤用freetype⾼高层API,它的功能都在一个组件中,叫做基础层。
  • 根据上下⽂文和环境,基础层会调⽤用一个或多个模块进⾏行行⼯工作,⼤大多数情况下,客户应⽤用 程序不不知道使⽤用那个模块。
  • 基础层还包含一组例例程来进⾏行行一些共通处理理,例例如内存分配,列列表处理理、io流解析、固 定点计算等等,这些函数可以被模块随意调⽤用,它们形成了了一个底层基础API。


    image.jpeg

基础类介绍

因为freetype支持多种字体的加载以及渲染,所有分为多个model,

FT_LibraryRec

freetype工程的library类 此类保存freetype的根数据,用FT_New_Library()创建library对象 用FT_Done_Library()方法释放对象
构造略

FT_FaceRec_

freetype工程 root类,一个face 对象代表了一个字体文件。每个Face对象拥有一个@FT_GlyphSlot 对象, 以及一个或多个@FT_Size 对象。
num_faces; //字体文件所含外观数 一些字体文件可能包含多个face
遗存:face数量可能对应truetype中的cmap表 最少truetype字体应该是如此。

typedef struct  FT_FaceRec_
  {
    FT_Long           num_faces; //字体文件所含外观数 一些字体文件可能包含多个face    
    FT_Long           face_index;//当前外观索引值
    FT_Long           face_flags;
    FT_Long           style_flags;
    FT_Long           num_glyphs;//当前外观所含字形文件数
    FT_String*        family_name;
    FT_String*        style_name;
    FT_Int            num_fixed_sizes;
    FT_Bitmap_Size*   available_sizes;
    FT_Int            num_charmaps;// 字符表数
    FT_CharMap*       charmaps;//字符表数组
    FT_Generic        generic;
    /*# The following member variables (down to `underline_thickness') */
    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */
    /*# for bitmap fonts.                                              */
    FT_BBox           bbox;
    FT_UShort         units_per_EM;
    FT_Short          ascender;
    FT_Short          descender;
    FT_Short          height;

    FT_Short          max_advance_width;
    FT_Short          max_advance_height;

    FT_Short          underline_position;
    FT_Short          underline_thickness;

    FT_GlyphSlot      glyph;// 字形槽对象
    FT_Size           size;
    FT_CharMap        charmap;//当前字符表

    /*@private begin */

    FT_Driver         driver;
    FT_Memory         memory;
    FT_Stream         stream;

    FT_ListRec        sizes_list;

    FT_Generic        autohint;
    void*             extensions;

    FT_Face_Internal  internal;

    /*@private end */

  } FT_FaceRec;

FT_CharMapRec_

character map句柄,用于转换character code 到glyph indexes ,
注意:可能一写字体可能存在多个character map

 typedef struct  FT_CharMapRec_
  {
    FT_Face      face;
    FT_Encoding  encoding;
    FT_UShort    platform_id;
    FT_UShort    encoding_id;

  } FT_CharMapRec;

FT_GlyphSlotRec_

存储Glyph对象句柄 一个slot相当于一个容器可以加载任何glyphs内容,每次使用@FT_Load_Glyph@FT_Load_Char slot容器都会被新的glyph数据重新擦除。glyph数据包括outline或者bitmap数据。例如:一个outline glyph用于TrueType 或者Type-1
通过FT_FaceRec_结构体中的num_glyphs属性可知,不同字体拥有的glyph数量不一样,参看实际字体文件可知,FT_GlyphSlotRec_存储着所有的字形数据,也是我们需要裁剪的重点。

  typedef struct  FT_GlyphSlotRec_
  {
    FT_Library        library;
    FT_Face           face; //指向父对象(FT_Face对象)
    FT_GlyphSlot      next;
    FT_UInt           reserved;       /* retained for binary compatibility */
    FT_Generic        generic;

    FT_Glyph_Metrics  metrics; //字形尺寸对象
    FT_Fixed          linearHoriAdvance;
    FT_Fixed          linearVertAdvance;
    FT_Vector         advance;// 步进对象

    FT_Glyph_Format   format;//字形槽格式

    FT_Bitmap         bitmap;//字形位图
    FT_Int            bitmap_left; //位图左行距离
    FT_Int            bitmap_top; //位图上行距离
      

    FT_Outline        outline;

    FT_UInt           num_subglyphs;
    FT_SubGlyph       subglyphs;

    void*             control_data;
    long              control_len;

    FT_Pos            lsb_delta;
    FT_Pos            rsb_delta;

    void*             other;

    FT_Slot_Internal  internal;

  } FT_GlyphSlotRec;

FT_Slot_InternalRec_

FT_GlyphSlot 的私有数据,GlyphSlot中包含的渲染字体的数据包含在其中

  typedef struct  FT_Slot_InternalRec_
  {
    FT_GlyphLoader  loader;
    FT_UInt         flags;
    FT_Bool         glyph_transformed;
    FT_Matrix       glyph_matrix;
    FT_Vector       glyph_delta;
    void*           glyph_hints;

  } FT_GlyphSlot_InternalRec;

FT_GlyphLoaderRec_

用于装载glyph FT_GlyphLoaderRec_程序实现不是高级 API 的一部分

  typedef struct  FT_GlyphLoaderRec_
  {
    FT_Memory        memory;
    FT_UInt          max_points;
    FT_UInt          max_contours;
    FT_UInt          max_subglyphs;
    FT_Bool          use_extra;

    FT_GlyphLoadRec  base;
    FT_GlyphLoadRec  current;

    void*            other;            /* for possible future extension? */

  } FT_GlyphLoaderRec;
 typedef struct  FT_GlyphLoadRec_
  {
    FT_Outline   outline;       /* outline                   */
    FT_Vector*   extra_points;  /* extra points table        */
    FT_Vector*   extra_points2; /* second extra points table */
    FT_UInt      num_subglyphs; /* number of subglyphs       */
    FT_SubGlyph  subglyphs;     /* subglyphs                 */

  } FT_GlyphLoadRec, *FT_GlyphLoad;

TrueType 字体类介绍

TrueType结构在 ttypes.h 中

TT_FaceRec_

TrueType Face类 这个对象,这些TrueType字体文件中的类模型与分辨率和与点大小无关的数据。与TrueType规范相对应。

基础方法介绍

    // 1. 初始化freetype2库
    error = FT_Init_FreeType(&library);

    // 2. 创建一个face
    error = FT_New_Face(library, "/Users/qishao/Downloads/Rough cut.ttf", 0, &face);

    // 3. 设置字体尺寸
    error = FT_Set_Char_Size(face, 16*64, 16*64, 96, 96);

    // 4. 获取字符图像索引
    charIdx = FT_Get_Char_Index(face, wch);

    // 5. 加载字符图像
    FT_Load_Glyph(face, charIdx, FT_LOAD_DEFAULT);
    if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE)
    {
        FT_Outline_Embolden(&(face->glyph->outline), 16);    // 加粗轮廓线
    }

    // 6. 获取字符位图
    if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP)
    {
        FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
    }

一篇比较全面的介绍性博客合集《FreeType Glyph Conventions》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容