如何以编程方式确定字体是不是为 CFF?
Posted
技术标签:
【中文标题】如何以编程方式确定字体是不是为 CFF?【英文标题】: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!如果您愿意:您的问题的先前版本仍可在其编辑历史记录中找到。 【参考方案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”。
【讨论】:
以上是关于如何以编程方式确定字体是不是为 CFF?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法以编程方式确定字体文件是不是具有特定的 Unicode 字形?
如何以编程方式确定用户是不是从 iOS 中的 Adwords 转换而来,或者是不是可以将此数据转换为用户属性?