如何在Directwrite中获取给定字体的可用OpenType功能?

时间:2018-10-29 21:17:58

标签: c# c++ directx sharpdx directwrite

我构建了一个文本编辑器,并且使用了DirectWrite,我想为用户提供对所选文本启用OpenType features的选项,但是并非每种字体都具有所有功能,而且许多字体都没有所有。我的问题是我如何知道使用DirectWrite以给定字体提供哪些OpenType功能?

我尝试了以下代码,但是res总是== S_OK,即使字体缺少该功能:

DWRITE_FONT_FEATURE fontFeature = { DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7, 1 };
HRESULT res = pTypography->AddFontFeature(fontFeature);      // res == S_OK
res = g_pFancyTextLayout->SetTypography(pTypography, range); // res == S_OK

更新:

我用SharpDx尝试了以下代码,但是list始终为空,即使使用Gabriola字体也是如此:

    public static FontFeatureTag[] GetOpenTypeFeatures(FontFace fontFace)
    {
        var list = new List<FontFeatureTag>();

        foreach (FontFeatureTag tag in System.Enum.GetValues(typeof(FontFeatureTag)))
        {
            if (fontFace.TryGetFontTable((int)tag, out DataPointer dataPointer, out IntPtr intPtr))
            {
                list.Add(tag);
            }
        }

        return list.ToArray();
    }

我正在使用SharpDX编写C#应用程序,但是我可以理解C ++中提供的答案/示例。

1 个答案:

答案 0 :(得分:2)

在深入搜索有关DirectWirte的Microsoft文档之后,我设法通过使用TextAnalyzer2找到了所需的接口。

请注意DirectWrite为每个新的TextAnalyzer添加了新功能和成员。首先是TextAnalyzer,然后是TextAnalyzer1和TextAnalyzer2。 [您将在DirectWrite的其他界面上找到相同的改进。]

所以这里是: IDWriteTextAnalyzer2 :: GetTypographicFeatures

  

使用IDWriteTextAnalyzer2接口-可以找到here。使用GetTypographicFeatures“返回可用于脚本或字体的OpenType功能的完整列表”。