[PATCH] d2d1: Support underlined text in DrawTextLayout()

Nikolay Sivov nsivov at codeweavers.com
Thu Jan 21 13:29:51 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

This only covers horizontal text, dwrite does not support
vertical case at the moment anyway.

 dlls/d2d1/render_target.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index ec2fec1..7c8a43f 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -1661,10 +1661,25 @@ static HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawGlyphRun(IDWriteTextRende
 static HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawUnderline(IDWriteTextRenderer *iface, void *ctx,
         float baseline_origin_x, float baseline_origin_y, const DWRITE_UNDERLINE *underline, IUnknown *effect)
 {
-    FIXME("iface %p, ctx %p, baseline_origin_x %.8e, baseline_origin_y %.8e, underline %p, effect %p stub!\n",
+    struct d2d_d3d_render_target *render_target = impl_from_IDWriteTextRenderer(iface);
+    const D2D1_MATRIX_3X2_F *m = &render_target->drawing_state.transform;
+    struct d2d_draw_text_layout_ctx *context = ctx;
+    float min_thickness;
+    D2D1_RECT_F rect;
+
+    TRACE("iface %p, ctx %p, baseline_origin_x %.8e, baseline_origin_y %.8e, underline %p, effect %p\n",
             iface, ctx, baseline_origin_x, baseline_origin_y, underline, effect);
 
-    return E_NOTIMPL;
+    /* minimal thickness in DIPs that will result in at least 1 pixel thick line */
+    min_thickness = 96.0f / (render_target->dpi_y * sqrtf(m->_21 * m->_21 + m->_22 * m->_22));
+
+    rect.left   = baseline_origin_x;
+    rect.top    = baseline_origin_y + underline->offset;
+    rect.right  = baseline_origin_x + underline->width;
+    rect.bottom = baseline_origin_y + underline->offset + max(underline->thickness, min_thickness);
+
+    ID2D1RenderTarget_FillRectangle(&render_target->ID2D1RenderTarget_iface, &rect, context->brush);
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawStrikethrough(IDWriteTextRenderer *iface, void *ctx,
-- 
2.7.0.rc3




More information about the wine-patches mailing list