1. 概述
TrueType字体使用Mac轮廓字体资源的格式编码,标记名为"sfnt"。
字体目录TableDirectory包含了字体格式的版本号和几个表。
typedef struct
{
Fixed sfntversion; // 版本号. 对于Version 1.0为0x10000
USHORT numTables;
USHORT searchRange;
USHORT entrySelector;
USHORT rangeShift;
TableEntry entries[1]; // TableEntry数组,长度可变
} TableDirectory;
TrueType字体中的数据使用big-endian编码。
如果TrueType字体文件开头如下,则它的版本为1.0,有23个表。
00 01 00 00 00 17
TableDirectory中的每个表对应一个TableEntry项。TableEntry结构包含了资源标记、校验和、偏移量和每个表的长度。TalbeEntry的定义如下:
typedef struct
{
char tag[4];
ULONG checkSum;
ULONG offset;
ULONG length;
} TableEntry;
TableEntry中保存了不同类型的数据,如图元数据、字符到图元的映射、字距调整信息等。有些表是必需的,有些是可选的。
如下列出TrueType字体的常见表。
表名
功能
说明
head
字体头
字体的全局信息
name
命名表
版权说明、字体名、字体族名、风格名等
cmap
字符代码到图元的映射
将字符代码映射为图元索引
loca
位置表索引
将图元索引转换为图元位置
maxp
最大需求表
字体中所需内存分配情况的数据
mmtx
水平规格
图元的水平规格
hmtx
水平布局
字体水平布局信息:上高、下高、行间距、最大前进宽度、最小左支撑、最小右支撑
kerm
字距调整表
字距调整对的数组
fpgm
指令数据
开始访问字体时执行的指令序列
prep
指令数据
字体改变时执行的指令序列
glyf
图元数据
图元轮廓定义以及指令数据
在TableDirectory结构中,所有的TableEntry表项都必须根据预定的标记名排序。比如,cmap必须出现在head前,而head必须在glyf前。但是它们指向的表则可以以任意顺序出现在文件中。
2. 表
2.1. head
包含字体的全局信息。如:
主版本号、修订版本号
创建、修改时间
应用到整个文件的排版设置。比如字体的边界框(bounding box),字形的方向,如何在master grid(或者更老的说法是em square)中放置等。
绘制字形时,假想将它放在一个正方形的网格中。网格中单元的大小,决定网格的精确度。单元越小,则字形绘制得越细致,越清晰。这个不可见的网格就是master grid。
2.2 name
包含关于字体特性的描述信息。
版权提示
字体名、风格(style)名。以任何人类可读的语言撰写。软件会向用户展示它们。
2.3 cmap
包含从字符代码(character code)到图元(glyph indices)的索引。图元索引保存在loca表中。
选择哪种字符编码(encoding),取决于希望在哪个平台上使用该字体。如果希望跨平台使用,可能需要多种字符编码,这样cmap中就包含多个编码表(encoding table)。
2.4 loca
保存图元在glyf表中的偏移位置(offset)。
借助cmap表和loca表,可以从一个指定的字符代码,快速访问它对应的图元。
2.5 glyh
定义字形的外形(apperance)数据,包括:
字形的轮廓线,
用于填充master grid单元的指令(intruction)序列等。
TrueType字体中,字形的轮廓由直线和二次贝塞尔曲线(bézier)片段构成。
字形数据保存轮廓曲线上的若干控制点。参考这些控制点在master grid绘制轮廓,并填充其中的单元。
作为矢量字体,既要让小字体在低分辨率设备上清晰可读,也要让大字体在高分辨率设备完美显示。要让各种情况下的显示效果最小化。TrueType字体使用指令(intruction)做到这一点。解释器(interpreter)调用指令,将曲线在master grid上以恰当的方式光栅化(rasterization)。比如,
控制各部件之间的间距
避免锯齿问题,等等。
glyph表中的指令从属于它关联的字形,称为glyph program。
还有从属于整个TrueType文件的指令,有两种:font program 和 control value program。
TrueType支持简单字形 ,也支持组合字形,也就是由若干字形组合成的复合字形。下图是组合字形的若干例子。
2.6 fpgm
保存从属于文件的指令font program。
font program只在程序开始访问字体时调用一次。其中主要定义给glyph program使用的全局函数。
2.7 prep
保存从属于文件的指令cotrol value program。
control value program在字体大小改变时调用。
参考资料