没有合适的资源?快使用搜索试试~ 我知道了~
首页Freetype 字体引擎分析与指南
Freetype 字体引擎分析与指南
4星 · 超过85%的资源 需积分: 49 37 下载量 144 浏览量
更新于2023-03-16
评论 4
收藏 121KB DOC 举报
这份文档提供了FreeType 2函数库设计与实现的细节。本文档的目标是让开发人员更好的理解FreeType 2是如何组织的,并让他们扩充、定制和调试它。 首先,我们先了解这个库的目的,也就是说,为什么会写这个库: * 它让客户应用程序方便的访问字体文件,无论字体文件存储在哪里,并且与字体格式无关。 * 方便的提取全局字体数据,这些数据在平常的字体格式中普遍存在。(例如:全局度量标准,字符编码/字符映射表,等等) * 方便的提取某个字符的字形数据(度量标准,图像,名字,其他任何东西) * 访问字体格式特定的功能(例如,SFNT表,多重控制,OpenType轮廓表) Freetype 2的设计也受如下要求很大的影响: * 高可移植性。这个库必须可以运行在任何环境中。这个要求引入了一些非常激烈的选择,这些是FreeType2的低级系统界面的一部分。 * 可扩展性。新特性应该可以在极少改动库基础代码的前提下添加。这个要求引入了非常简单的设计:几乎所有操作都是以模块的形式提供的。 * 可定制。它应该能够很容易建立一个只包含某个特定项目所需的特性的版本。当你需要集成它到一个嵌入式图形库的字体服务器中时,这是非常重要的。 * 简洁高效。这个库的主要目标是只有很少cpu和内存资源的嵌入式系统。 这份文档的其他部分分为几个部分。首先,一些章节介绍了库的基本设计以及Freetype 2内部对象/数据的管理。 接下来的章节专注于库的定制和与这个话题相关的系统特定的界面,如何写你自己的模块和如何按需裁减库初始化和编译。
资源详情
资源评论
资源推荐
《The design of FreeType 2》中译版
介绍
这份文档提供了 FreeType 2 函数库设计与实现的细节。本文档的目标是让开发人员更好的
理解 FreeType 2 是如何组织的,并让他们扩充、定制和调试它。
首先,我们先了解这个库的目的,也就是说,为什么会写这个库:
* 它让客户应用程序方便的访问字体文件,无论字体文件存储在哪里,并且与字体格式无
关。
* 方便的提取全局字体数据,这些数据在平常的字体格式中普遍存在。(例如:全局度量
标准,字符编码/字符映射表,等等)
* 方便的提取某个字符的字形数据(度量标准,图像,名字,其他任何东西)
* 访问字体格式特定的功能(例如,SFNT 表,多重控制,OpenType 轮廓表)
Freetype 2 的设计也受如下要求很大的影响:
* 高可移植性。这个库必须可以运行在任何环境中。这个要求引入了一些非常激烈的选择,
这些是 FreeType2 的低级系统界面的一部分。
* 可扩展性。新特性应该可以在极少改动库基础代码的前提下添加。这个要求引入了非常
简单的设计:几乎所有操作都是以模块的形式提供的。
* 可定制。它应该能够很容易建立一个只包含某个特定项目所需的特性的版本。当你需要
集成它到一个嵌入式图形库的字体服务器中时,这是非常重要的。
* 简洁高效。这个库的主要目标是只有很少 cpu 和内存资源的嵌入式系统。
这份文档的其他部分分为几个部分。首先,一些章节介绍了库的基本设计以及 Freetype 2
内部对象/数据的管理。
接下来的章节专注于库的定制和与这个话题相关的系统特定的界面,如何写你自己的模块
和如何按需裁减库初始化和编译。
一、组件和 API
FT 可以看作是一组组件,每个组件负责一部分任务,它们包括
* 客户应用程序一般会调用 FT 高层 API,它的功能都在一个组件中,叫做基础层。
* 根据上下文和环境,基础层会调用一个或多个模块进行工作,大多数情况下,客户应用
程序不知道使用那个模块。
* 基础层还包含一组例程来进行一些共通处理,例如内存分配,列表处理、io 流解析、固
定点计算等等,这些函数可以被模块随意调用,它们形成了一个底层基础 API。
如下图,表明它们的关系:
另外,
* 为了一些特殊的构建,基础层的有些部分可以替换掉,也可以看作组件。例如 ftsystem 组
件,负责实现内存管理和输入流访问,还有 ftinit,负责库初始化。
* FT 还有一些可选的组件,可以根据客户端应用灵活使用,例如 ftglyph 组件提供一个简单
的 API 来管理字形映象,而不依赖它们内部表示法。或者是访问特定格式的特性,例如
ftmm 组件用来访问和管理 Type1 字体中 Multiple Masters 数据。
* 最后,一个模块可以调用其他模块提供的函数,这对在多个字体驱动模块中共享代码和
表非常有用,例如 truetype 和 cff 模块都使用 sfnt 模块提供的函数。
见下图,是对上图的一个细化。
请注意一些要点:
* 一个可选的组件可以用在高层 API,也可以用在底层 API,例如上面的 ftglyph;
* 有些可选组件使用模块特定的接口,而不是基础层的接口,上例中,ftmm 直接访问
Type1 模块来访问数据;
* 一个可替代的组件能够提供一个高层 API 的函数,例如,ftinit 提供 FT_Init_FreeType()
二、公共对象和类
1、FT 中的面向对象
虽然 FT 是使用 ANSI C 编写,但是采用面向对象的思想,是这个库非常容易扩展,因此,
下面有一些代码规约。
1. 每个对象类型/类都有一个对应的结构类型和一个对应的结构指针类型,后者称为类型/类
的句柄类型
设想我们需要管理 FT 中一个 foo 类的对象,可以定义如下
typedef struct FT_FooRec_* FT_Foo;
typedef struct FT_FooRec_
{
// fields for the foo class
…
}FT_FooRec;
依照规约,句柄类型使用简单而有含义的标识符,并以 FT_开始,如 FT_Foo,而结构体使
用相同的名称但是加上 Rec 后缀。Rec 是记录的缩写。每个类类型都有对应的句柄类型;
2. 类继承通过将基类包装到一个新类中实现,例如,我们定义一个 foobar 类,从 foo 类继
承,可以实现为
typedef struct FT_FooBarRec_ * FT_FooBar;
typedef struct FT_FooBarRec_
{
FT_FooRec root; //基类
}FT_FooBarRec;
可以看到,将一个 FT_FooRec 放在 FT_FooBarRec 定义的开始,并约定名为 root,可以确
保一个 foobar 对象也是一个 foo 对象。
在实际使用中,可以进行类型转换。
后面
2、FT_Library 类
这个类型对应一个库的单一实例句柄,没有定义相应的 FT_LibraryRec,使客户应用无
法访问它的内部属性。
库对象是所有 FT 其他对象的父亲,你需要在做任何事情前创建一个新的库实例,销
毁它时会自动销毁他所有的孩子,如 face 和 module 等。
通常客户程序应该调用 FT_Init_FreeType()来创建新的库对象,准备作其他操作时使用。
另一个方式是通过调用函数 FT_New_Library()来创建一个新的库对象,它在<freetype/
ftmodule.h>中定义,这个函数返回一个空的库,没有任何模块注册,你可以通过调用
FT_Add_Module()来安装模块。
调用 FT_Init_FreeType()更方便一些,因为他会缺省地注册一些模块。这个方式中,模
块 列 表 在 构 建 时 动 态 计 算 , 并 依 赖 ftinit 部 件 的 内 容 。 ( 见 ftinit.c[l73] 行 , include
FT_CONFIG_MODULES_H,其实就是包含 ftmodule.h,在 ftmodule.h 中定义缺省的模块,
所以模块数组 ft_default_modules 的大小是在编译时动态确定的。)
3、FT_Face 类
一个外观对象对应单个字体外观,即一个特定风格的特定外观类型,例如 Arial 和
Arial Italic 是两个不同的外观。
一 个外 观 对 象 通 常 使 用 FT_New_Face() 来 创 建 , 这 个函 数 接 受 如 下 参 数 : 一个
FT_Library 句柄,一个表示字体文件的 C 文件路径名,一个决定从文件中装载外观的索引
(一个文件中可能有不同的外观),和 FT_Face 句柄的地址,它返回一个错误码。
FT_Error FT_New_Face( FT_Library library,
const char* filepathname,
FT_Long face_index,
FT_Face* face);
函数调用成功,返回 0,face 参数将被设置成一个非 NULL 值。
外观对象包含一些用来描述全局字体数据的属性,可以被客户程序直接访问。例如外
观中字形的数量、外观家族的名称、风格名称、EM 大小等,详见 FT_FaceRec 定义。
4、FT_Size 类
每个 FT_Face 对象都有一个或多个 FT_Size 对象,一个尺寸对象用来存放指定字符宽
度和高度的特定数据,每个新创建的外观对象有一个尺寸,可以通过 face->size 直接访问。
尺寸对象的内容可以通过调用 FT_Set_Pixel_Sizes()或 FT_Set_Char_Size()来改变。
一个新的尺寸对象可以通过 FT_New_Size()创建,通过 FT_Done_Size()销毁,一般客
户程序无需做这一步,它们通常可以使用每个 FT_Face 缺省提供的尺寸对象。
FT_Size 公共属性定义在 FT_SizeRec 中,但是需要注意的是有些字体驱动定义它们自
己的 FT_Size 的子类,以存储重要的内部数据,在每次字符大小改变时计算。大多数情况
下,它们是尺寸特定的字体 hint。例如,TrueType 驱动存储 CVT 表,通过 cvt 程序执行将
结果放入 TT_Size 结构体中,而 Type1 驱动将 scaled global metrics 放在 T1_Size 对象中。
5、FT_GlyphSlot 类
字形槽的目的是提供一个地方,可以很容易地一个个地装入字形映象,而不管它的格
式(位图、向量轮廓或其他)。理想的,一旦一个字形槽创建了,任何字形映象可以装入
无需其他的内存分配。在实际中,只对于特定格式才如此,像 TrueType,它显式地提供数
据来计算一个槽地最大尺寸。
另一个字形槽地原因是他用来为指定字形保存格式特定的 hint,以及其他为正确装入
字形的必要数据。
基本的 FT_GlyphSlotRec 结构体只向客户程序展现了字形 metics 和映象,而真正的实
现包含更多的数据。
例如,TrueType 特定的 TT_GlyphSlotRec 结构包含附加的属性,存放字形特定的字节
码、在 hint 过程中暂时的轮廓和其他一些东西。
最后,每个外观对象有一个单一字形槽,可以用 face->glyph 直接访问。
6、FT_CharMap 类
FT_CharMap 类型用来作为一个字符地图对象的句柄,一个字符图是一种表或字典,
用来将字符码从某种编码转换成字体的字形索引。
单 个 外 观 可 能 包 含 若 干 字 符 图 , 每 个 对 应 一 个 指 定 的 字 符 指 令 系 统 , 例 如
Unicode、Apple Roman、Windows codepages 等等。
剩余22页未读,继续阅读
范佩佩东
- 粉丝: 2
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2