2011-04-21 56 views
5

OpenType文件中的cmap表将字符代码转换为字形标识。cmap的Microsoft OpenType规范

可以在任何一个可以帮助我了解C表达式:

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

Here是格式4子表CMAP。

+4

您可以尝试跳过Microsoft文档并转至原始Apple TrueType文档:http://developer.apple.com/fonts/ttrefman/rm06/Chap6cmap.html – ohmantics 2011-04-21 15:05:55

+0

感谢ohmantics。那太棒了 ! – Ayrosa 2011-04-26 20:30:57

回答

5

因此,在表达式中i =段索引和c =字符代码 idRangeOffset将段的偏移量获取到cmap中的glyphIdArray中。在这种情况下是glyphIdArray [东西]。由于glyphIdArray立即在字体文件如下idRangeOffset,您使用idRangeOffset作为基本指针。

要到glyphIdArray你需要添加idRangeOffset开始,但是因为该值以字节为单位,idRangeOffset表为16位,需要除以2才能得到字数。然后在glyphIdArray中获得段i的偏移量。

然而,你的角色的偏移量在c - startCount [i]中,所以你需要添加这个。

最后的表达式是一个指针,所以你需要解引用它来实际得到字形的索引。

该索引然后用于LOCA表。

+0

我很久没有离开过SO了。这就是为什么花了我很长时间来接受你的答案。 – Ayrosa 2011-11-13 16:48:33

-5

RTFM!

“如果段的idRangeOffset值不为0,则字符代码的映射依赖于glyphIdArray。将从startCode起的字符代码偏移量添加到idRangeOffset值中,该总和用作从当前位置idRangeOffset本身索引出正确glyphIdArray值这晦涩索引特技工作,因为glyphIdArray立即在字体文件如下idRangeOffset其产生的标志符号索引的C表达式是:。

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

Th e值c是所讨论的字符代码,i是c出现的片段索引。如果从索引操作获得的值不是0(表示missingGlyph),则将idDelta [i]添加到它以获取字形索引。 idDelta算术是模65536.“

+0

但这正是我需要理解的。我不关心公式,而是关于表格布局本身。如果idRangeOffset [i]是GlyphIDArray []的偏移量,其中段i中的字形所在的位置,此公式似乎不正确。基本上,我正在寻找的是格式4 cmap表格中数组idDelta []和idRangeOffset []的含义。谢谢。 – Ayrosa 2011-04-21 13:40:17

5

不知道你是否仍然需要它,但我分享我的研究结果为周围的人。

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

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

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