【问题标题】:Missing pieces for TTF font building from SpecSpec中缺少TTF字体构建的部分
【发布时间】:2019-06-06 16:34:39
【问题描述】:

我在解决这些关于 TTF 规范的问题时遇到了问题。

  1. “head”中的“计算校验和”。
  2. “头”中的“xMin”、“yMin”等
  3. “maxp”中的 maxPoints、maxContours、maxComponentPoints、maxComponentContours、maxTwilightPoints
  4. uint8 flags[variable] Array of flags 在“glyf”中

我想知道是否有人可以澄清这些问题。

1

对于 (1) it says 这个:

checkSumAdjustment 计算:将其设置为 0,计算“head”表的校验和并将其放在表目录中,将整个字体求和为 uint32_t,然后存储 0xB1B0AFBA - sum。 (结果,'head' 表的校验和会出错。没关系;不要重置它。),

我找到了他们引用的两个校验和实现:

// https://docs.microsoft.com/en-us/typography/opentype/spec/otff

uint32
CalcTableChecksum(uint32 *Table, uint32 Length)
{
uint32 Sum = 0L;
uint32 *Endptr = Table+((Length+3) & ~3) / sizeof(uint32);
while (Table < EndPtr)
    Sum += *Table++;
return Sum;
}

uint32 CalcTableChecksum(uint32 *table, uint32 numberOfBytesInTable)
    {
    uint32 sum = 0;
    uint32 nLongs = (numberOfBytesInTable + 3) / 4;
    while (nLongs-- > 0)
        sum += *table++;
    return sum;
    }

这是简单的实现。我的问题是,校验和 value 的内容是什么。所以看起来是这样的:

  1. 计算头表的校验和。
  2. "sum the entire font as a" 不知道这是什么意思
  3. 也不知道这一切意味着什么(“然后存储 0xB1B0AFBA - 总和。(结果,'head' 表的校验和将是错误的。没关系;不要重置它。)”)李>

2

对于 (2),我不确定如何计算。看来我只是将所有字形捆绑成一个精灵图,然后计算最终大小。但它说我认为不要考虑字形的边界框,所以不能确切确定它的含义。

3

对于 (3),没有找到任何关于这些变量含义的文档。

4

对于(4),我不知道这是什么意思“uint8 flags[variable] Array of flags”。他们有下表,但我不确定它是 per contour 还是 per glyph 还是 per point

如果你知道的话,我还有一个关于理解复合字形的相关问题here

【问题讨论】:

    标签: fonts specifications truetype


    【解决方案1】:

    一般来说,您可能会发现 current OpenType specification 很有帮助,因为它包含许多 Apple 版本中没有的更新、说明和更正。

    关于您的具体问题:

    1head.checksumAdj计算

    这些说明相当清楚,尽管将所有字体数据(表格、目录等)组装成最终形式和顺序隐含了“步骤零”。一旦你有了:

    1. head表中checkSumAdj的值设置为零

    2. 仅计算head表的校验和并将其存储在字体表目录中的相应字段中(其中存储了字体中包含的所有表的tag/checksum/offset/length)

    3. 计算整个字体的总和(所有 uint32 的总和,就像表校验和一样),包括步骤 1 和 2 中的修改。

    4. 0xB1B0AFBA 减去步骤 3 中的值存储在 head.checkSumAdj 中。就这样!关于头校验和出现错误的措辞意味着,如果您要在存储最终值之后head 表运行校验和计算,则会出现错误。但这没关系,因为它是这样定义的:基本上对于head 表的校验和,您必须首先忽略(设置为0)checkSumAdj 值。

    2 head xMin, xMax, yMin, yMax

    这只是所有字形的 xMin、xMax、yMin 和 yMax。每个 glyph xMin、xMax 等都是所有点的“最小(最大)X (Y) 坐标”(对于复合字形,您可以在 之后获取该结果> 组成字形,即在复合字形定义中应用任何移位、缩放或其他转换之后)。在head 表和字形数据中,边界框都是一个16 位有符号整数数组。因此,通常该过程将遍历每个字形,获取计算出的边界框,并在执行此操作时(独立地)跟踪 X/Y 最小值/最大值。完成循环后,您将获得 head 表的值,该表本质上是一个矩形,包含字体中每个字形的每个坐标。

    3 maxp

    这些在maxp table definition 中有相当明确的定义:

    • maxPoints 是任何单个非复合(“简单”)字形的最大点数

    • maxContours 同样是任何单个非复合字形

    • 的最大轮廓数
    • maxComponentPoints复合字形中的最大点数(即所有组件字形的点的总和)

    • maxComponentContours 同样是复合字形

    • 中的最大轮廓数
    • maxTwilightPoints 指的是 TrueType 指令的 Zone 0 中使用的“twilight”点的最大数量。如果您的字体不使用 TrueType 指令,则可以将此(以及其他与指令相关的字段)设置为零。如果您不熟悉 TrueType 指令(通常称为“提示”)以及它们如何存储在字形数据中,您可能需要查看 OpenType 规范的“Instructing TrueType Glyphs”和“TrueType Instruction Set”部分。

    4 glyf 表简单字形标志

    uint8 flags[variable] 表示flags 数组的长度是可变的。其原因在specification(“简单字形标志”)中进行了讨论:

    在逻辑上,有一个标志字节元素,一个x坐标, 每个点都有一个 y 坐标。 但请注意,该标志 字节元素和坐标数组使用打包表示。在 如果是标志元素的逻辑序列或 x- 的序列,则特别 或 y 坐标重复,然后是实际的标志字节元素或 坐标值可以在单个条目中给出,带有特殊标志 用于指示该值对于后续逻辑重复 条目。

    换句话说,flags数组的元素,展开时是按坐标的,但实际存储作为一个uint8的数组不一定(与坐标数据本身的存储一样)。这在很大程度上取决于每个字形中的坐标排列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-03
      • 2013-08-04
      • 1970-01-01
      • 2021-10-15
      • 2019-01-16
      • 2019-04-15
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多