True Type字体。 glyf表的问题

时间:2012-04-05 15:52:25

标签: fonts true-type-fonts opentype

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

问题是我在阅读一些桌子时遇到了问题。我认为在http://www.microsoft.com/typography/otspec/otff.htm

提供的信息就足够了

在尝试读取我在简单字形描述下找到的glyf表时 flags[n],其中n是标志数。

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

3 个答案:

答案 0 :(得分:4)

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

我使用TTFDUMP找出答案是什么。

答案 1 :(得分:1)

只是为了澄清如何计算标志的数量。标记n的数量是endPtsOfContours + 1中的 last 元素。

答案 2 :(得分:1)

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

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

事实是,在阅读标志之前,您无法知道需要读取多少字节。你必须继续阅读旗帜,直到达到分数。这是一个小的Javascript snipplet,它显示了如何实现读取标志。

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
        }
    }
}

我不能告诉你在真实世界的字体中是否或经常使用 Repeat 标志(可能是上面评论中提到的两种字体Bradley Hand ITC Regular和Rage Italic使用它),但是如果你想确保你读取正确数量的标志,你必须考虑到这一点。