【问题标题】:Microsoft OpenType specification for cmapcmap 的 Microsoft OpenType 规范
【发布时间】:2011-08-10 06:57:46
【问题描述】:

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

谁能帮我理解C表达式:

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

Here 是格式 4 cmap 子表。

【问题讨论】:

标签: truetype


【解决方案1】:

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

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

您的角色在此段内的偏移量是 c - startCount[i],因此您还需要添加它。

最终表达式是一个指针,因此您需要取消引用它才能真正获得字形的索引。

此索引随后用于 LOCA 表。

【讨论】:

  • 我离开 SO 很久了。这就是为什么我花了这么长时间才接受你的回答。
【解决方案2】:

不确定您是否仍然需要它,但我将我的发现分享给四处张望的人。

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

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

所以,找到idRangeOffset[i]的地址,添加到idRangeOffset[i]/2 + (c - startCount[i]),结果会是另一个地址。该地址的内容就是你想要的字形 id。

【讨论】:

    【解决方案3】:

    RTFM!

    "如果段的 idRangeOffset 值不为 0,则字符代码的映射依赖于 glyphIdArray。从 startCode 开始的字符代码偏移量被添加到 idRangeOffset 值。此总和用作 idRangeOffset 内当前位置的偏移量自己索引出正确的 glyphIdArray 值。这种晦涩的索引技巧很有效,因为 glyphIdArray 紧跟在字体文件中的 idRangeOffset 之后。产生字形索引的 C 表达式是:

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

    值 c 是有问题的字符代码,而 i 是 c 出现的段索引。如果索引操作得到的值不为0(表示缺少Glyph),则将idDelta[i]加到其中得到字形索引。 idDelta 算术是模 65536。"

    【讨论】:

    • 但这正是我需要了解的。我不关心公式,而是关心表格布局本身。如果 idRangeOffset[i] 是 GlyphIDArray[] 的偏移量,即段 i 中的字形所在的位置,则此公式似乎不正确。基本上,我正在寻找的是格式 4 cmap 表中数组 idDelta[] 和 idRangeOffset[] 的含义。谢谢。
    猜你喜欢
    • 2014-10-06
    • 2010-11-27
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多