如何使用像素捕捉绘制 GlyphRun?

How to draw GlyphRun with pixel snapping?

我使用 ID2D1RenderTarget::DrawGlyphRun 方法渲染文本,但它变得有点模糊。但是,如果我使用 ID2D1RenderTarget::DrawTextLayout 方法,文本会非常清晰地显示出来,因为 DirectWrite 执行 PixelSnapping.

所以我的问题是如何在使用 ID2D1RenderTarget::DrawGlyphRun 方法时进行像素捕捉?

我试过圆坐标:

(int)(baselineOrigin.Y + 0.5f)

但它只在某些情况下有所帮助。

在使用 Direct2D 呈现文本之前舍入坐标的正确方法是什么?

非常感谢,如有任何帮助,我们将不胜感激。

简而言之,您不能用 DrawGlyphRun() 做到这一点。像素捕捉模式通过 Direct2D 实现的 IDWriteTextRenderer 传送到 IDWriteTextLayout::Draw()DrawGlyphRun() 不对布局进行操作,所以你没有相同的方法来控制它。

关于坐标舍入,您可能希望水平方向舍入以进行水平布局,而您的示例没有这样做。

为了避免文本模糊,字形的Y 位置应该被四舍五入。和你一样:

(int)(baselineOrigin.Y + 0.5f)

但是,您还应该考虑 ID2D1RenderTarget::GetTransform。 如果 Transform 导致比例不是 1 或导致垂直偏移,则需要计算字形出现的实际位置,然后才舍入。