【问题标题】:Detect whether a font supports variants (like superscript and subscript)检测字体是否支持变体(如上标和下标)
【发布时间】:2009-08-11 06:15:15
【问题描述】:

WPF 具有Typography.Variants 附加属性,可让您执行上标和下标。但是,它仅适用于某些字体。对于其他字体,变体被完全忽略,文本正常显示。 (代码示例和截图here)

由于它默默地退回到无操作状态,我不知道出了什么问题;但我的用户会看到糟糕的行为。

有什么方法可以通过编程检测给定字体是否支持 Typography.Variants? 如果是这样,如果用户选择了不支持变体的字体,我可以提供更有意义的行为需要上标/下标。

我查看了GlyphTypeface,因为它是您用来查询是否可以嵌入字体的那个,但我没有看到任何关于变体的信息。我在FontFamily 上也没有看到任何明显的东西,而我在Typography 上唯一能找到的是 Variants 附加属性本身(以及它的 getter 和 setter)。

【问题讨论】:

    标签: wpf fonts


    【解决方案1】:

    据我所知,WPF 没有提供有关可用 GSUB 表的信息(它会告诉您这些信息)。一切都隐藏在 PresentationCore 的私有类中。

    一种方法是使用 WPF 的高级文本服务创建一个TextFormatter,然后检索由一段文本创建的GlyphRuns,其中一个变体打开,一个变体关闭,然后比较使用的字形索引。

    另一种方法是通过GlyphTypeFace.GetFontStream() 物理检查字体数据。 TrueType 字体格式不是很复杂,所以你可能会在网上找到一些关于如何解析二进制字体数据以找到 GSUB 表的信息。

    请注意,简单地询问 wither 是否支持变体也有点模棱两可。字体可以说它支持变体,但没有什么要求它实际提供任何有意义的替换。大多数 Adob​​e 字体只为诸如上标和下标之类的东西提供了几个小写字母(请注意,甚至不是整个拉丁字母)。恕我直言,这是非常没用的,因为您不能要求 WPF 像 Word 和其他文字处理器那样伪造下标或上标。

    不过,如果你能简单地问TypeFace.GetSupportedOpenTypeFeatures(),那就太好了。

    【讨论】:

    • 哇。所以变体实际上导致我的“2”(或“th”或其他任何东西)被相同字体的不同字符替换?文档甚至没有暗示它是如何工作的。
    • 是的,这就是适合您的 OpenType。让所有(上下文!)替换工作是一项非常复杂的工作。下标通常通过用手工设计的超级/下标替换普通字母来工作,这些字母隐藏在字体字形表的某个位置。 (如果您使用字体编辑器打开字体,您会看到它们,并且某些字体还将它们分配到字体的私人使用区域,这是 Unicode 频谱的高端。)
    猜你喜欢
    • 2013-01-07
    • 2012-02-14
    • 1970-01-01
    • 2014-06-01
    • 2019-09-07
    • 2018-06-05
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多