From 43664072457b16e7351f6599200a6b7c12cc8875 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 21 Jan 2016 22:29:51 +0300 Subject: [PATCH] d2d1: Support underlined text in DrawTextLayout(). Signed-off-by: Nikolay Sivov Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- 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 ec2fec10197..7c8a43f5750 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,