ttf字体格式解析

5,941 阅读4分钟

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文件正文有多少部分,每个部分的位置。目录的内容大致如下:

类型名称说明
uint32scaler type用于表示文件类型。0x74727565(true)或者0x00010000都是ttf格式。
uint16numTablestables的数量
uint16searchRange(maximum power of 2 <= numTables) * 16
uint16entrySelectorlog_2(maximum power of 2 <= numTables)
uint16rangeShiftnumTables * 16 - searchRange

接下来是tables的信息,个数就是numTables的值。每个table的数据结构如下:

类型名称说明
uint32tag标识
uint32checkSum校验和
uint32offset偏移量
uint32length总长度

举个例子:

  • 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/…