我在我的场景中使用
drawingContext.DrawGlyphRun
,因为我需要在屏幕上的许多不同位置渲染大量文本时获得最佳性能。
但是,我遇到了一个小问题。我使用的字体缺少一些 Unicode 字符,例如 ✓、∞
看起来
drawingContext.DrawText
有一个非常方便的功能,在字符丢失的地方使用后备字体,这样你至少仍然可以得到一些渲染的东西。
所以现在我想知道如何在不失去切换到 DrawGlyphRun 所获得的所有性能提升的情况下实现类似的目标
看来我需要将通话分成多个部分
"My string with ∞ unsupported character"
[My string with ][∞][ unsupported character]
所以 3 个调用
drawingContext.DrawGlyphRun
,第 2 个使用不同的字体:(
然后我还需要计算位置偏移,以便全部正确对齐。
除了更改字体(我无法真正做到的事情)之外,我是否缺少一种明显的简单方法来执行此操作?
我设法通过使用
Global User Interface
字体系列来实现此功能。当在目标字体中找不到字符代码时用作后备的字体集合。
我决定缓存这些缺失字符代码的字体。
private readonly Dictionary<int, GlyphTypeface?> _fallbackGlyphMapping = [];
private bool TryGetFallbackGlyphTypeface(int code, [NotNullWhen(true)] out GlyphTypeface? glyphTypeface)
{
if (!_fallbackGlyphMapping.TryGetValue(code, out glyphTypeface))
{
_globalFontFamily ??= new FontFamily("Global User Interface");
foreach (var map in _globalFontFamily.FamilyMaps)
{
var typeface = new Typeface(new FontFamily(map.Target), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
if (typeface.TryGetGlyphTypeface(out GlyphTypeface? tempGlyphTypeface))
{
if (tempGlyphTypeface.CharacterToGlyphMap.TryGetValue(code, out var index))
{
_fallbackGlyphMapping[code] = tempGlyphTypeface;
glyphTypeface = tempGlyphTypeface;
return true;
}
}
}
// couldn't locate
_fallbackGlyphMapping[code] = null;
return false;
}
return glyphTypeface != null;
}