cmap的Microsoft OpenType规范

时间:2011-04-21 12:30:23

标签: true-type-fonts

OpenType文件中的cmap表将字符代码转换为字形ID。

任何人都可以帮助我理解C表达式:

*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i])

Here是Format 4 cmap子表。

3 个答案:

答案 0 :(得分:5)

因此,在该表达式中i =段索引和c =字符代码。 idRangeOffset将段的偏移量转换为cmap内的glyphIdArray。在这种情况下,您实际寻找的值是glyphIdArray [something]。由于glyphIdArray紧跟在字体文件中的idRangeOffset之后,因此使用idRangeOffset作为基指针。

要到达glyphIdArray的开头,您需要添加idRangeOffset,但由于该值以字节为单位且idRangeOffset表为16位,因此需要除以2以获取字数。然后,您将获得glyphIdArray中段i的偏移量。

你的角色偏移但是在这个片段中是c - startCount [i]所以你需要添加它。

最后一个表达式是一个指针,因此您需要取消引用它以实际获取字形的索引。

然后将此索引用于LOCA表。

答案 1 :(得分:5)

不确定你是否仍然需要它,但我与周围的人分享我的发现。

&idRangeOffset[i]指的是idRangeOffset[i]的地址,或者在文档的语音中,是文件开头的偏移量。

*(x)是x地址的内容。

因此,找到idRangeOffset[i]的地址,将其添加到idRangeOffset[i]/2 + (c - startCount[i]),结果将是另一个地址。该地址的内容是您想要的字形ID。

答案 2 :(得分:-5)

RTFM!

“如果段的idRangeOffset值不为0,则字符代码的映射依赖于glyphIdArray。从startCode的字符代码偏移量被添加到idRangeOffset值。此总和用作idRangeOffset中当前位置的偏移量本身可以索引正确的glyphIdArray值。这个模糊的索引技巧有效,因为glyphIdArray紧跟在字体文件中的idRangeOffset之后。产生字形索引的C表达式是:

*(idRangeOffset [I] / 2 +(c - startCount [i]) +& idRangeOffset [i])

值c是有问题的字符代码,i是出现c的段索引。如果从索引操作获得的值不是0(表示missingGlyph),则将idDelta [i]添加到其中以获取字形索引。 idDelta算术模数为65536。“