[PATCH 2/3] dwrite: Fix alignment shifts in RTL case

Nikolay Sivov nsivov at codeweavers.com
Thu Jul 9 04:26:23 CDT 2015


---

-------------- next part --------------
>From 9d92b8c913c63119ca0bd0ee3458ab374b9f9569 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu, 9 Jul 2015 00:35:43 +0300
Subject: [PATCH 2/3] dwrite: Fix alignment shifts in RTL case

---
 dlls/dwrite/layout.c       | 17 ++++++++++++++---
 dlls/dwrite/tests/layout.c |  2 --
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 507ad01..c9c35cc 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -1137,6 +1137,7 @@ static FLOAT layout_get_line_width(struct dwrite_textlayout *layout,
 
 static void layout_apply_leading_alignment(struct dwrite_textlayout *layout)
 {
+    BOOL is_rtl = layout->format.readingdir == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT;
     struct layout_effective_inline *inrun;
     struct layout_effective_run *erun;
 
@@ -1153,11 +1154,12 @@ static void layout_apply_leading_alignment(struct dwrite_textlayout *layout)
         inrun = layout_get_next_inline_run(layout, inrun);
     }
 
-    layout->metrics.left = 0;
+    layout->metrics.left = is_rtl ? layout->metrics.layoutWidth - layout->metrics.width : 0.0;
 }
 
 static void layout_apply_trailing_alignment(struct dwrite_textlayout *layout)
 {
+    BOOL is_rtl = layout->format.readingdir == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT;
     struct layout_effective_inline *inrun;
     struct layout_effective_run *erun;
     UINT32 line;
@@ -1169,6 +1171,9 @@ static void layout_apply_trailing_alignment(struct dwrite_textlayout *layout)
         FLOAT width = layout_get_line_width(layout, erun, inrun, line);
         FLOAT shift = layout->metrics.layoutWidth - width;
 
+        if (is_rtl)
+            shift *= -1.0;
+
         while (erun && erun->line == line) {
             erun->align_dx = shift;
             erun = layout_get_next_erun(layout, erun);
@@ -1180,11 +1185,12 @@ static void layout_apply_trailing_alignment(struct dwrite_textlayout *layout)
         }
     }
 
-    layout->metrics.left = layout->metrics.layoutWidth - layout->metrics.width;
+    layout->metrics.left = is_rtl ? 0.0 : layout->metrics.layoutWidth - layout->metrics.width;
 }
 
 static void layout_apply_centered_alignment(struct dwrite_textlayout *layout)
 {
+    BOOL is_rtl = layout->format.readingdir == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT;
     struct layout_effective_inline *inrun;
     struct layout_effective_run *erun;
     UINT32 line;
@@ -1196,6 +1202,9 @@ static void layout_apply_centered_alignment(struct dwrite_textlayout *layout)
         FLOAT width = layout_get_line_width(layout, erun, inrun, line);
         FLOAT shift = (layout->metrics.layoutWidth - width) / 2.0;
 
+        if (is_rtl)
+            shift *= -1.0;
+
         while (erun && erun->line == line) {
             erun->align_dx = shift;
             erun = layout_get_next_erun(layout, erun);
@@ -1277,6 +1286,7 @@ static void layout_apply_par_alignment(struct dwrite_textlayout *layout)
 
 static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout)
 {
+    BOOL is_rtl = layout->format.readingdir == DWRITE_READING_DIRECTION_RIGHT_TO_LEFT;
     struct layout_effective_inline *inrun;
     struct layout_effective_run *erun;
     const struct layout_run *run;
@@ -1411,7 +1421,8 @@ static HRESULT layout_compute_effective_runs(struct dwrite_textlayout *layout)
         textpos += layout->clustermetrics[i].length;
     }
 
-    layout->metrics.left = layout->metrics.top = 0.0;
+    layout->metrics.left = is_rtl ? layout->metrics.layoutWidth - layout->metrics.width : 0;
+    layout->metrics.top = 0.0;
     layout->metrics.maxBidiReorderingDepth = 1; /* FIXME */
     layout->metrics.height = 0.0;
 
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 70908d2..0fc101b 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -3168,7 +3168,6 @@ static void test_SetReadingDirection(void)
     hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-todo_wine
     ok(metrics.left == metrics.layoutWidth - clusters[0].width, "got %.2f\n", metrics.left);
     ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
     ok(metrics.width == clusters[0].width, "got %.2f\n", metrics.width);
@@ -3184,7 +3183,6 @@ todo_wine
     hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 
-todo_wine
     ok(metrics.left == 0.0, "got %.2f\n", metrics.left);
     ok(metrics.top == 0.0, "got %.2f\n", metrics.top);
     ok(metrics.width == clusters[0].width, "got %.2f\n", metrics.width);
-- 
2.1.4



More information about the wine-patches mailing list