Module: wine Branch: master Commit: 8201fa14c9db6e84a4b483d7ee25c72a1c50821b URL: http://source.winehq.org/git/wine.git/?a=commit;h=8201fa14c9db6e84a4b483d7ee...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Jul 9 12:26:23 2015 +0300
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);