From bb0c6f74a5ad530f8cde5b69281b4e42e21bdcc6 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 6 Jul 2015 23:08:11 +0300 Subject: [PATCH] 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 d91da0db5e4..d979307a40c 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 232f1271741..07ebaf3bfd3 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); }