1

我正在使用 DrawingContext DrawGlyphRun(GlyphRun) 函数使用https://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/中的解决方案在画布中绘制文本。

我在 FormattedText 上使用它,因为它更快,而且它也用于计算文本宽度。

除了两个问题外,这很好用:

  1. 文字模糊(见下图)。顶部的文本使用 GlyphRun 显示。底部文本使用质量更好的 FormattedText 显示。

模糊图像

  1. 无法显示日文或中文字符。

字符的问题似乎是 GlyphTypeface.CharacterToGlyphMap 找不到 jp 或 cn 字符,所以我不确定如何处理这些字符。

4

1 回答 1

1

经过一些研究,我刚刚发现了你的问题。

使用公共构造函数创建的 GlyphRun 创建对象TextFormattingMode = Ideal

所有用于渲染的 WPF 控件都使用接受 TextFormattingMode 作为参数的方法/构造函数。

GlyphRun.TryCreate()您可以通过反射调用静态方法:

internal static GlyphRun TryCreate(
        GlyphTypeface           glyphTypeface,
        int                     bidiLevel,
        bool                    isSideways,
        double                  renderingEmSize,
        IList<ushort>           glyphIndices,
        Point                   baselineOrigin,
        IList<double>           advanceWidths,
        IList<Point>            glyphOffsets,
        IList<char>             characters,
        string                  deviceFontName,
        IList<ushort>           clusterMap,
        IList<bool>             caretStops,
        XmlLanguage             language,
        TextFormattingMode      textLayout
        )

但是你需要解决的advanceWidths问题TextFormattingMode = Ideal。为此,您需要通过反射访问GlyphTypeface类提供的内部方法。

GlyphTypeface.AdvanceWidths返回具有这些宽度的字典的属性在内部调用

internal double GetAdvanceWidth(ushort glyph, TextFormattingMode textFormattingMode, bool isSideways)

当您通过索引访问字典时textFormattingMode = TextFormattingMode.Ideal

您可以下载 .Net 源代码并自行检查。

至于你的第二个问题,我认为你使用字符而不是 unicode 代码点来获取字形索引。

于 2017-03-31T07:38:42.233 回答