3

我正在尝试学习如何阅读开放式字体文件。

问题是我在阅读某些表格时遇到问题。我认为http://www.microsoft.com/typography/otspec/otff.htm提供的信息就足够了

当试图阅读我在 simple glyph description 下找到的 glyf 表时 flags[n],其中 n 是标志的数量。

问题是我不知道从哪里获得标志的数量,而且没有标志的数量读取表格似乎是不可能的。

4

3 回答 3

6

好的,我找到了问题的答案,endPtsOfContours 具有坐标列表中每个轮廓的最后一个点的位置。

我使用 TTFDUMP 来找出答案。

于 2012-04-06T20:15:59.623 回答
2

只是为了澄清如何计算标志的数量。标志的数量n, 是+ 1中的最后一个元素。endPtsOfContours

于 2014-09-27T13:24:39.470 回答
2

虽然这是一个老问题,但我觉得我需要在这个主题中添加更多信息,因为上面的答案可能会产生错误的结果。

字形中的点数等于最后一个endPtsOfContours+ 1。通常这等于标志数n,但不一定。使用标志(重复标志)中的第 3 位表示同一标志重复多次。如果设置了此标志,则标志的数量可以低于点数。

事实是,在读取标志之前,您无法知道必须读取多少字节。您将不得不继续阅读标志,直到达到点数。这是一个小的 Javascript 片段,显示了如何实现读取标志。

var pointCount; // This has to the set to the last endPtsOfContours + 1 
var flags = []; // our internal array of flags
while (flags.length < pointCount) {  
    var flag = fontReader.readByte(); // flag is a single byte
    flags.push(flag); // add flag
    if (flag & 8) {  // if bit 3 is set
        var repeats = fontReader.readByte(); // next byte indicates repeats of the flag
        for (; repeats > 0; repeats--) {
            flags.push(flag); // add same flag again
        }
    }
}

我无法告诉您是否或多久在现实世界的字体中使用重复标志(可能是上面评论中提到的两种字体 Bradley Hand ITC Regular 和 Rage Italic 使用它),但如果您想确保您阅读正确标志的数量,您将不得不考虑这一点。

于 2016-04-02T09:22:16.057 回答