【问题标题】:True Type fonts. Problems with glyf tableTrue Type 字体。 glyf 表的问题
【发布时间】:2012-04-19 09:15:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: fonts truetype opentype


    【解决方案1】:

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

    我使用 TTFDUMP 来找出答案。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 找到至少两种公式不成立的字体:Bradley Hand ITC Regular 和 Rage Italic。 TTFDUMP 返回不同数量的标志。
      • @IgorBrejc 好的,什么字形显示了这个问题。旗帜的实际数量是多少? endPtsOfContours 的最后一个元素中报告了什么?如果您需要检查单个字节,请参阅 github.com/vidstige/NRasterizer 以了解 C# 中的小型实现。您还可以在评论中链接字体文件吗?
      • @IgorBrejc 请在下面查看我的答案。上面提到的两种字体可能使用了 Repeat 标志,这可能会导致标志数和点数之间存在差异。
      【解决方案3】:

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

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

      事实是,在读取标志之前,您无法知道需要读取多少字节。您将不得不继续阅读标志,直到达到点数。这是一个小的 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
              }
          }
      }
      

      我无法告诉您 Repeat 标志是否或多久用于现实世界的字体(可能是上面 cmets 中提到的两种字体 Bradley Hand ITC Regular 和 Rage Italic 使用它),但如果如果您想确保读取正确数量的标志,则必须考虑到这一点。

      【讨论】:

      • 不错!你是怎么发现的?有什么来源吗?我阅读了规范(很久以前),没有任何罚款:-/
      • @vistige 我从 microsoft.com/typography/otspec/glyf.htm 的开放类型规范中获取了它,它在 flags 表中(第 3 位是重要的)..
      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多