[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