ttf字体格式
1 ttf是什么
TTF全称TrueType Font,是由苹果和微软为 PostScript 而开发的字体格式,是一种使用比较广泛的字体格式。
其它的字体格式:
- OTF:OpenType Font。OTF 字体格式更具可扩展性,并扩展了数字排版的 TTF 格式的现有功能。 OTF 由 Microsoft 和 Adobe 开发,结合了 PostScript 和 TrueType 字体格式的功能。这使得 OTF 格式可以适应大多数书写系统,这就是它在主要计算机平台上统一使用的原因。(可以理解为ttf的超集)。
- WOFF:Web Open Font Format,网页开放字体格式。是由 Mozilla 与 Type Supply、LettError 及其他组织协同开发的一种新的网页字体格式。它使用了与 TrueType、OpenType、Open Font 所采用的
sfnt结构类似的压缩算法,不过还添加了元数据(metadata)及用户私有数据结构,其中包括了自定义空间,允许厂家和经销商在需要时提供许可证。字体采用压缩格式,相对于使用不压缩的 TrueType, OpenType 的网站,将占用更少的带宽,获得更快的加载速度。 - WOFF2:WOFF的高级版本,两者最大的差别体现在使用的压缩算法上。
2 ttf文件结构
ttf文件结构可主要分为:
- 目录 Font Directory
- 正文 Tables
2.1 目录
ttf文件有类似目录功能的结构Font Directory,其主要内容就是ttf文件正文有多少部分,每个部分的位置。目录的内容大致如下:
| 类型 | 名称 | 说明 |
|---|---|---|
| uint32 | scaler type | 用于表示文件类型。0x74727565(true)或者0x00010000都是ttf格式。 |
| uint16 | numTables | tables的数量 |
| uint16 | searchRange | (maximum power of 2 <= numTables) * 16 |
| uint16 | entrySelector | log_2(maximum power of 2 <= numTables) |
| uint16 | rangeShift | numTables * 16 - searchRange |
接下来是tables的信息,个数就是numTables的值。每个table的数据结构如下:
| 类型 | 名称 | 说明 |
|---|---|---|
| uint32 | tag | 标识 |
| uint32 | checkSum | 校验和 |
| uint32 | offset | 偏移量 |
| uint32 | length | 总长度 |
举个例子:
- tag:0x44534947 = DSIG
- checksum: 0x7232A231
- offset: 0x000BA844 = 763972
- length: 0x00002430 = 9264
也就是说DSIG这个table的内容从763932这个位置开始,总长度是9264,但是里面的内容具体怎么解析就需要根据DSIG这个table的规则来解析了。
2.2 正文
正文即为全部的table。每一个table都有自己的作用,很多table也很复杂,详情见
[官方文档] developer.apple.com/fonts/TrueT…
,这里就列举几个比较重要的table:
glyf
glyf表包含定义字体中字形外观的数据。这包括描述构成字形轮廓的点,绘制线形的方法(主要是直线和bizer曲线)。glyf表支持简单字形和复合字形(由其他字形组成的字形)的定义。
cmap
字母的映射(char map),用于存储字母对应glyf表的位置。
(glyf表是以数组形式进行存储的,cmap给定字母对应的数组下标)
local
有了glyf的下标后,我们就需要知道它的内容偏移信息,这个就是存在local里面的,所以理论上local数组的长度和glyf数组的长度是一致的。
head
head表包含字体的全局信息。它记录了字体版本号、创建和修改日期、修订号以及适用于整个字体的基本排版数据等数据。这包括字体边界框(box bounding)的定义、字体字形最可能书写的方向以及有关字形在em正方形中的位置的其他信息。校验和(checksum)用于验证字体中数据的完整性,它也可以用来区分两种相似的字体。
hhea
水平排版的字体信息,包括ascent、descent、lineGap
3 补充
3.1 字体样式
从上面的介绍中,我们可以知道一个ttf文件只能表示一种样式的字体,如果想要对字体进行加粗、斜体等操作,则需要通过引入额外的ttf文件来实现。
3.2 解析工具
[opentype.js] github.com/opentypejs/…