[PATCH 2/4] dwrite: Implement centered text alignment

Nikolay Sivov nsivov at codeweavers.com
Mon Jul 6 15:08:11 CDT 2015


---

-------------- next part --------------
From 8ea5a4649c448155b7221a53efa536008e18c33d Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon, 6 Jul 2015 23:01:44 +0300
Subject: [PATCH 2/4] dwrite: Implement centered text alignment

---
 dlls/dwrite/layout.c       | 33 +++++++++++++++++++++++++++++++--
 dlls/dwrite/tests/layout.c | 30 ++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index d91da0d..d979307 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -1165,7 +1165,7 @@ static void layout_apply_trailing_alignment(struct dwrite_textlayout *layout)
         }
 
         while (inrun && inrun->line == line) {
-            erun->align_dx = shift;
+            inrun->align_dx = shift;
             inrun = layout_get_next_inline_run(layout, inrun);
         }
     }
@@ -1173,6 +1173,33 @@ static void layout_apply_trailing_alignment(struct dwrite_textlayout *layout)
     layout->metrics.left = layout->metrics.layoutWidth - layout->metrics.width;
 }
 
+static void layout_apply_centered_alignment(struct dwrite_textlayout *layout)
+{
+    struct layout_effective_inline *inrun;
+    struct layout_effective_run *erun;
+    UINT32 line;
+
+    erun = layout_get_next_erun(layout, NULL);
+    inrun = layout_get_next_inline_run(layout, NULL);
+
+    for (line = 0; line < layout->metrics.lineCount; line++) {
+        FLOAT width = layout_get_line_width(layout, erun, inrun, line);
+        FLOAT shift = (layout->metrics.layoutWidth - width) / 2.0;
+
+        while (erun && erun->line == line) {
+            erun->align_dx = shift;
+            erun = layout_get_next_erun(layout, erun);
+        }
+
+        while (inrun && inrun->line == line) {
+            inrun->align_dx = shift;
+            inrun = layout_get_next_inline_run(layout, inrun);
+        }
+    }
+
+    layout->metrics.left = (layout->metrics.layoutWidth - layout->metrics.width) / 2.0;
+}
+
 static void layout_apply_text_alignment(struct dwrite_textlayout *layout)
 {
     switch (layout->format.textalignment)
@@ -1183,8 +1210,10 @@ static void layout_apply_text_alignment(struct dwrite_textlayout *layout)
     case DWRITE_TEXT_ALIGNMENT_TRAILING:
         layout_apply_trailing_alignment(layout);
         break;
-    case DWRITE_TEXT_ALIGNMENT_JUSTIFIED:
     case DWRITE_TEXT_ALIGNMENT_CENTER:
+        layout_apply_centered_alignment(layout);
+        break;
+    case DWRITE_TEXT_ALIGNMENT_JUSTIFIED:
         FIXME("alignment %d not implemented\n", layout->format.textalignment);
         break;
     default:
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 232f127..07ebaf3 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -2889,6 +2889,7 @@ todo_wine {
 
 static void test_SetTextAlignment(void)
 {
+    static const WCHAR str2W[] = {'a','a','a','a','a',0};
     static const WCHAR strW[] = {'a',0};
     DWRITE_CLUSTER_METRICS clusters[1];
     DWRITE_TEXT_METRICS metrics;
@@ -2992,6 +2993,35 @@ static void test_SetTextAlignment(void)
     ok(metrics.lineCount == 1, "got %d\n", metrics.lineCount);
     IDWriteTextLayout_Release(layout);
 
+    /* max width less than total run width, trailing alignment */
+    hr = IDWriteTextFormat_SetWordWrapping(format, DWRITE_WORD_WRAPPING_NO_WRAP);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFactory_CreateTextLayout(factory, str2W, 5, format, 2*clusters[0].width, 100.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(metrics.left == metrics.layoutWidth - metrics.width, "got %.2f\n", metrics.left);
+todo_wine
+    ok(metrics.width == 5*clusters[0].width, "got %.2f\n", metrics.width);
+    ok(metrics.lineCount == 1, "got %d\n", metrics.lineCount);
+    IDWriteTextLayout_Release(layout);
+
+    /* maxwidth is 500, centered */
+    hr = IDWriteTextFormat_SetTextAlignment(format, DWRITE_TEXT_ALIGNMENT_CENTER);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFactory_CreateTextLayout(factory, str2W, 5, format, 500.0, 100.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteTextLayout_GetMetrics(layout, &metrics);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(metrics.left == (metrics.layoutWidth - metrics.width) / 2.0, "got %.2f\n", metrics.left);
+    ok(metrics.width == 5*clusters[0].width, "got %.2f\n", metrics.width);
+    ok(metrics.lineCount == 1, "got %d\n", metrics.lineCount);
+
+    IDWriteTextLayout_Release(layout);
+
     IDWriteTextFormat_Release(format);
     IDWriteFactory_Release(factory);
 }
-- 
2.1.4



More information about the wine-patches mailing list