处理 DrawGlyphRun WPF 中缺失的字符

问题描述 投票:0回答:1

我在我的场景中使用

drawingContext.DrawGlyphRun
,因为我需要在屏幕上的许多不同位置渲染大量文本时获得最佳性能。

但是,我遇到了一个小问题。我使用的字体缺少一些 Unicode 字符,例如 ✓、∞

看起来

drawingContext.DrawText
有一个非常方便的功能,在字符丢失的地方使用后备字体,这样你至少仍然可以得到一些渲染的东西。

所以现在我想知道如何在不失去切换到 DrawGlyphRun 所获得的所有性能提升的情况下实现类似的目标

看来我需要将通话分成多个部分

"My string with ∞ unsupported character"

[My string with ][∞][ unsupported character]

所以 3 个调用

drawingContext.DrawGlyphRun
,第 2 个使用不同的字体:(

然后我还需要计算位置偏移,以便全部正确对齐。

除了更改字体(我无法真正做到的事情)之外,我是否缺少一种明显的简单方法来执行此操作?

wpf text text-rendering glyph drawingcontext
1个回答
0
投票

我设法通过使用

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.