4

我正在尝试解析 truetype 字体以构建和存储每个字体大小的升序、降序,我正在使用http://nodebox.github.io/opentype.js/,它做了一个了不起的工作,但我不明白如何计算返回值。

示例字体 Blackoak (adobe) 我有 [Ascender, Descender] = 1900 和 -5OO

我假设这些数字表示在 em 空间中与基线的距离,但我是否需要其他元信息来计算这些值?

4

1 回答 1

4

如果您想以像素为单位计算特定字体大小的上升/下降,那么您需要查找OS/2sTypoAscendersTypoDescender值(按照W3C的指示)。表的ascenderdescenderhhea仅标记字体设计者的意图不一定对应于实际计算值。关于值类型,你是对的,升序和降序以 UPM 为单位,负数表示低于基线。

为了将这些数字转换为特定字体大小的像素,您还需要提取字体中每个 em 的单位数。您可以通过从表中读取unitsPerEm值来做到这一点。head通常,对于 OTF,其 1000 UPM,对于 TTF - 1024 或 2048 UPM。sTypoAscender和的绝对值sTypoDescender应该加起来就是unitsPerEm值。然后它只是一个比例问题。

例如,让我们看一下 opentype.js字体检查器并假设字体大小为 16px。值为unitsPerEm2048 UPM,sTypoAscender分别sTypoDescender为 1536 和 -512 (1536 + 512 = 2048):

 Ascender = 16 * 1536/2048 = 12px  (above baseline)
Descender = 16 * -512/2048 = -4px  (below baseline)
于 2016-07-08T16:37:36.953 回答