Winapi 如何以编程方式确定字体是否为CFF?

Winapi 如何以编程方式确定字体是否为CFF?,winapi,opentype,Winapi,Opentype,好的,我保证这是我能找到的最接近我自己的代码的问题:如果这不能得到任何响应,我会咬紧牙关,构建一个OTF解析器来检查CFF表的存在 此信息在Windows字体预览“TrueType大纲”与“PostScript大纲”中可用,因此可能有一个WinAPI函数可以实现此效果,但如果我能找到它,那就该死了 有人吗 ps-如果只能检查已安装的字体,那么这不是一个交易破坏者,但最好检查文件。您的最佳选择似乎确实是直接从字体文件本身读取字体表。假设您已经熟悉字体表,本示例将为您提供一个良好的开端。如果没有,请

好的,我保证这是我能找到的最接近我自己的代码的问题:如果这不能得到任何响应,我会咬紧牙关,构建一个OTF解析器来检查CFF表的存在

此信息在Windows字体预览“TrueType大纲”与“PostScript大纲”中可用,因此可能有一个WinAPI函数可以实现此效果,但如果我能找到它,那就该死了

有人吗


ps-如果只能检查已安装的字体,那么这不是一个交易破坏者,但最好检查文件。

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

您可以使用GetFontData函数完成此操作

创建有问题的字体并将其选择到DC中,然后调用GetFontData查询字体大小。仅当字体具有PostScript轮廓时,此操作才会成功

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

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


因此,如果文件的前四个字节拼写为OTTO,它将使用PostScript大纲。能简单点吗!?到目前为止已经测试并正在运行,但我最终可能会使用GetFontData。

OpenType文件中有CFF块的前4个字节是OTTO。

问题不应该包含解决方案,所以我回到了您原来的问题。如果您觉得您的编辑添加了现有答案中未提及的内容,您可以自由选择!如果您想:您的问题的上一个版本在其编辑历史记录中仍然可用。