【问题标题】:How to programmatically determine whether a font is CFF?如何以编程方式确定字体是否为 CFF?
【发布时间】:2016-09-16 19:34:06
【问题描述】:

好吧,我承诺这是我最接近“我的代码”的问题:) 如果这没有引起任何回应,我会咬紧牙关建立用于检查 CFF 表是否存在的 OTF 解析器。

此信息可在 Windows 字体预览中找到(“TrueType 轮廓”与“PostScript 轮廓”),所以大概有一个 WinAPI 函数可以实现此效果,但如果我能找到它,该死的。

有人想吗?

ps - 如果只能检查已安装的字体,这不是什么大问题,但最好检查文件。

【问题讨论】:

  • 问题不应该包含“解决方案”,所以我回滚到你原来的问题。如果您觉得您的编辑添加了现有答案中未提及的内容,您可以随意add an answer of your own!如果您愿意:您的问题的先前版本仍可在其编辑历史记录中找到。

标签: winapi opentype


【解决方案1】:

您最好的选择确实似乎是直接从字体文件本身读取字体表。假设您已经熟悉字体表,此示例here 将提供一个良好的开端。如果没有,请阅读文章底部参考部分中的链接。

【讨论】:

    【解决方案2】:

    您可以使用GetFontData 函数来做到这一点。

    创建有问题的字体并选择到DC中,然后调用GetFontData查询CFF table的大小。这只有在字体有 PostScript 轮廓时才会成功。

    DWORD dwSize = GetFontData(hdc, ' FFC', 0, nullptr, 0);
    if (dwSize && dwSize != GDI_ERROR)
    {
        // has PostScript outlines
    }
    

    【讨论】:

      【解决方案3】:

      OpenType spec 说:

      包含 CFF 数据的 OpenType 字体应使用标记“OTTO”作为 sfnt 版本号。

      因此,如果文件的前四个字节拼写为“OTTO”,则它使用 PostScript 轮廓。能不能简单点!?到目前为止已经过测试和工作,但我最终可能会使用 GetFontData。

      【讨论】:

        【解决方案4】:

        具有 CFF 块的 OpenType 文件的前 4 个字节是“OTTO”。

        【讨论】:

          猜你喜欢
          • 2012-02-05
          • 2012-05-28
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 2010-11-11
          • 1970-01-01
          • 2012-02-21
          • 2015-10-14
          相关资源
          最近更新 更多