[PATCH 2/2] dwrite: Set runHeight attribute for underlines

Nikolay Sivov nsivov at codeweavers.com
Thu Feb 23 07:39:25 CST 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/layout.c       | 10 ++++++----
 dlls/dwrite/tests/layout.c |  2 --
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index f850c95be8..a7fff46366 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -1,7 +1,7 @@
 /*
  *    Text format and layout
  *
- * Copyright 2012, 2014-2016 Nikolay Sivov for CodeWeavers
+ * Copyright 2012, 2014-2017 Nikolay Sivov for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1662,27 +1662,29 @@ static BOOL is_same_u_splitting(struct layout_underline_splitting_params *left,
 static HRESULT layout_add_underline(struct dwrite_textlayout *layout, struct layout_effective_run *first,
     struct layout_effective_run *last)
 {
+    FLOAT thickness, offset, runheight;
     struct layout_effective_run *cur;
     DWRITE_FONT_METRICS metrics;
-    FLOAT thickness, offset;
 
     if (first == layout_get_prev_erun(layout, last)) {
         layout_get_erun_font_metrics(layout, first, &metrics);
         thickness = SCALE_FONT_METRIC(metrics.underlineThickness, first->run->u.regular.run.fontEmSize, &metrics);
         offset = SCALE_FONT_METRIC(metrics.underlinePosition, first->run->u.regular.run.fontEmSize, &metrics);
+        runheight = SCALE_FONT_METRIC(metrics.capHeight, first->run->u.regular.run.fontEmSize, &metrics);
     }
     else {
         FLOAT width = 0.0f;
 
         /* Single underline is added for consecutive underlined runs. In this case underline parameters are
            calculated as weighted average, where run width acts as a weight. */
-        thickness = offset = 0.0f;
+        thickness = offset = runheight = 0.0f;
         cur = first;
         do {
             layout_get_erun_font_metrics(layout, cur, &metrics);
 
             thickness += SCALE_FONT_METRIC(metrics.underlineThickness, cur->run->u.regular.run.fontEmSize, &metrics) * cur->width;
             offset += SCALE_FONT_METRIC(metrics.underlinePosition, cur->run->u.regular.run.fontEmSize, &metrics) * cur->width;
+            runheight = max(SCALE_FONT_METRIC(metrics.capHeight, cur->run->u.regular.run.fontEmSize, &metrics), runheight);
             width += cur->width;
 
             cur = layout_get_next_erun(layout, cur);
@@ -1721,7 +1723,7 @@ static HRESULT layout_add_underline(struct dwrite_textlayout *layout, struct lay
         /* Font metrics convention is to have it negative when below baseline, for rendering
            however Y grows from baseline down for horizontal baseline. */
         u->u.offset = -offset;
-        u->u.runHeight = 0.0f; /* FIXME */
+        u->u.runHeight = runheight;
         u->u.readingDirection = is_run_rtl(cur) ? DWRITE_READING_DIRECTION_RIGHT_TO_LEFT :
             DWRITE_READING_DIRECTION_LEFT_TO_RIGHT;
         u->u.flowDirection = layout->format.flow;
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 868a465e9b..0d737169c3 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -596,7 +596,6 @@ static HRESULT WINAPI testrenderer_DrawUnderline(IDWriteTextRenderer *iface,
     if (ctxt)
         TEST_MEASURING_MODE(ctxt, underline->measuringMode);
 
-todo_wine
     ok(underline->runHeight > 0.0f, "Expected non-zero run height\n");
     if (ctxt && ctxt->format) {
         DWRITE_FONT_METRICS metrics;
@@ -609,7 +608,6 @@ todo_wine
 
         ok(emsize == metrics.designUnitsPerEm, "Unexpected font size %f\n", emsize);
         /* Expected height is in design units, allow some absolute difference from it. Seems to only happen on Vista */
-    todo_wine
         ok(abs(metrics.capHeight - underline->runHeight) < 2.0f, "Expected runHeight %u, got %f\n",
             metrics.capHeight, underline->runHeight);
 
-- 
2.11.0




More information about the wine-patches mailing list