为什么在SharpDX中DrawTextLayout会忽略SetDrawingEffect中的画笔?

本文关键字:SetDrawingEffect 画笔 SharpDX DrawTextLayout 为什么 | 更新日期: 2023-09-27 18:10:10

我的目标是在单个布局中绘制具有一定范围,不同大小和不透明度的文本。ID2D1RenderTarget::DrawTextLayout方法似乎是可行的。

defaultForegroundBrush参数的文档:

画笔用于绘制textLayout中尚未绘制的文本将画笔作为绘图效果与之关联(由IDWriteTextLayout: SetDrawingEffect方法).

根据IDWriteTextLayout::SetDrawingEffect法的备注部分,

ID2D1Brush(如颜色或渐变刷)可以设置为如果你使用的是ID2D1RenderTarget::DrawTextLayout来绘制文本,该笔刷将用于绘制指定的范围文本。

此绘图效果与指定的范围相关联,并且将被通过回调的方式传递回应用程序时,范围在绘图时绘制。

听起来ID2D1RenderTarget::DrawTextLayout肯定会使用IDWriteTextLayout::SetDrawingEffect设置的任何笔刷。这个非托管c++的答案似乎证实了这个想法。

然而,在实践中,DrawTextLayout忽略了我使用SetDrawingEffect设置的任何SolidColorBrush。我在适当的范围内获得样式和大小,但所有内容都是使用默认画笔绘制的。

我通过实现一个自定义文本渲染器(gist)来解决这个问题,这非常简单,并且根据文档准确地绘制了我对ID2D1RenderTarget::DrawTextLayout的期望。我会很满意,但TextRendererBaseDrawGlyphRun的性能比ID2D1RenderTarget::DrawTextLayout慢25%以上。

是什么导致了这个问题?

为什么在SharpDX中DrawTextLayout会忽略SetDrawingEffect中的画笔?

我可以像文档建议的那样使用颜色而仍然使用ID2D1RenderTarget::DrawTextLayout吗?

代替:

layout.SetDrawingEffect(myBrush, new TextRange(1, 5));

这样写:

layout.SetDrawingEffect(myBrush.NativePointer, new TextRange(1, 5));
相关文章:
  • 没有找到相关文章