Как нарисовать GlyphRun с привязкой к пикселям? - PullRequest
4 голосов
/ 05 июля 2019

Я использую ID2D1RenderTarget::DrawGlyphRun метод для рендеринга текста, но он становится немного размытым. Однако, если я использую метод ID2D1RenderTarget::DrawTextLayout, текст получается очень четко, потому что DirectWrite выполняет PixelSnapping.

Итак, мой вопрос, как я могу сделать Pixel Snapping, даже когда я использую метод ID2D1RenderTarget::DrawGlyphRun?

Я пытался округлить координаты:

(int)(baselineOrigin.Y + 0.5f)

Но это помогло только в некоторых ситуациях.

Как правильно округлить координаты перед рендерингом текста в Direct2D?

Большое спасибо, любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 23 июля 2019

Чтобы избежать размытия текста, позиция глифов Y должна быть округлена.И, как вы сделали:

(int)(baselineOrigin.Y + 0.5f)

Но вы также должны принять во внимание ID2D1RenderTarget::GetTransform.Если преобразование вызывает масштаб, отличный от 1, или вызывает вертикальный сдвиг, вам необходимо вычислить фактическое местоположение, где будет отображаться глиф, и только затем округлять.

1 голос
/ 05 июля 2019

Короткий ответ: вы не можете сделать это с DrawGlyphRun(). Режим привязки к пикселям передается от IDWriteTextLayout::Draw() до IDWriteTextRenderer, которые реализует Direct2D. DrawGlyphRun() не работает с макетом, поэтому у вас нет такого способа управления им.

Что касается округления координат, вы, вероятно, хотите округлить в горизонтальном направлении для горизонтального размещения, и ваш пример этого не делает.

...