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



我构建了一个文本编辑器,使用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++中提供的答案/示例。

在深入搜索了微软关于DirectWirte的文档后,我使用TextAnalyzer2找到了它的预期接口。

请注意,DirectWrite为每个新的TextAnalyzer添加了新的功能和成员。它从TextAnalyzer开始,然后是TextAnalyzer1和TextAnalyzer2。[您会在DirectWrite的其他接口上发现相同的演变]。

现在是:IDWriteTextAnalyzer2::GetTypographicFeatures

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

最新更新