Nikolay Sivov : dwrite: Count last cluster length too when building a line.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 19 07:19:13 CDT 2015


Module: wine
Branch: master
Commit: b4592cbc7c0cfc718b723eb93f8e6110bed25775
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b4592cbc7c0cfc718b723eb93f8e6110bed25775

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Jun 18 16:01:34 2015 +0300

dwrite: Count last cluster length too when building a line.

---

 dlls/dwrite/layout.c       | 18 ++++++++++++------
 dlls/dwrite/tests/layout.c |  1 -
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index a8adb2a..8a5915c 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -1026,7 +1026,7 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout)
     s[0] = s[1] = layout_get_strikethrough_from_pos(layout, 0);
 
     for (i = 0, start = 0, textpos = 0, width = 0.0; i < layout->cluster_count; i++) {
-        BOOL can_wrap_after = layout->clustermetrics[i].canWrapLineAfter;
+        BOOL overflow;
 
         s[1] = layout_get_strikethrough_from_pos(layout, textpos);
 
@@ -1041,12 +1041,18 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout)
             start = i;
         }
 
-        /* check if we got new line */
-        if (((can_wrap_after && (width + layout->clustermetrics[i].width > layout->maxwidth)) ||
-              layout->clustermetrics[i].isNewline || /* always wrap on new line */
-              i == layout->cluster_count - 1)) /* end of the text */ {
+        overflow = layout->clustermetrics[i].canWrapLineAfter &&
+            (width + layout->clustermetrics[i].width > layout->maxwidth);
+        /* check if we got new */
+        if (overflow ||
+            layout->clustermetrics[i].isNewline || /* always wrap on new line */
+            i == layout->cluster_count - 1) /* end of the text */ {
 
-            UINT32 strlength = metrics.length, index = i;
+            UINT32 strlength, index = i;
+
+            if (!overflow)
+                metrics.length += layout->clustermetrics[i].length;
+            strlength = metrics.length;
 
             if (i >= start) {
                 hr = layout_add_effective_run(layout, run, start, i - start + 1, origin_x, s[0]);
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index e8450df..d1374b6 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -2745,7 +2745,6 @@ static void test_GetLineMetrics(void)
     memset(&metrics, 0, sizeof(metrics));
     hr = IDWriteTextLayout_GetLineMetrics(layout, &metrics, 1, &count);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine
     ok(metrics.length == 5, "got %u\n", metrics.length);
     ok(metrics.trailingWhitespaceLength == 1, "got %u\n", metrics.trailingWhitespaceLength);
 




More information about the wine-cvs mailing list