Module: wine Branch: master Commit: 0695368406b54c97e6f6d3b32601910042384424 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0695368406b54c97e6f6d3b326...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Aug 9 16:59:33 2016 +0300
usp10: Better implementation for ScriptGetLogicalWidths().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Aric Stewart aric@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/usp10/tests/usp10.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ dlls/usp10/usp10.c | 27 +++++++++++++++++++----- 2 files changed, 75 insertions(+), 5 deletions(-)
diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c index aed0620..e77f90e 100644 --- a/dlls/usp10/tests/usp10.c +++ b/dlls/usp10/tests/usp10.c @@ -3610,6 +3610,58 @@ static void test_ScriptGetFontFunctions(HDC hdc) } }
+struct logical_width_test +{ + int char_count; + int glyph_count; + int advances[3]; + WORD map[3]; + int widths[3]; + BOOL clusterstart[3]; + BOOL diacritic[3]; + BOOL zerowidth[3]; + BOOL todo; +}; + +static const struct logical_width_test logical_width_tests[] = +{ + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 6, 9, 12 }, { 1, 1, 1 } }, + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 6, 9, 12 }, { 1, 1, 1 }, { 1, 0, 0 } }, + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 6, 9, 12 }, { 1, 1, 1 }, { 0 }, { 1, 1, 1 } }, + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 27, 21, 12 }, { 0, 0, 0 }, { 0 }, { 0 }, TRUE }, + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 6, 21, 12 }, { 0, 1, 0 }, { 0 }, { 0 }, TRUE }, + { 3, 3, { 6, 9, 12 }, { 0, 1, 2 }, { 6, 21, 12 }, { 1, 1, 0 }, { 0 }, { 0 }, TRUE }, + { 3, 3, { 6, 9, 12 }, { 0, 2, 2 }, { 15, 6, 6 }, { 1, 0, 1 } }, +}; + +static void test_ScriptGetLogicalWidths(void) +{ + SCRIPT_ANALYSIS sa = { 0 }; + unsigned int i, j; + + for (i = 0; i < sizeof(logical_width_tests)/sizeof(logical_width_tests[0]); i++) + { + const struct logical_width_test *ptr = logical_width_tests + i; + SCRIPT_VISATTR attrs[3]; + int widths[3]; + HRESULT hr; + + memset(attrs, 0, sizeof(attrs)); + for (j = 0; j < ptr->glyph_count; j++) + { + attrs[j].fClusterStart = ptr->clusterstart[j]; + attrs[j].fDiacritic = ptr->diacritic[j]; + attrs[j].fZeroWidth = ptr->zerowidth[j]; + } + + hr = ScriptGetLogicalWidths(&sa, ptr->char_count, ptr->glyph_count, ptr->advances, ptr->map, attrs, widths); + ok(hr == S_OK, "got 0x%08x\n", hr); + + todo_wine_if(ptr->todo) + ok(!memcmp(ptr->widths, widths, sizeof(widths)), "test %u: got wrong widths\n", i); + } +} + START_TEST(usp10) { HWND hwnd; @@ -3663,6 +3715,7 @@ START_TEST(usp10) test_newlines();
test_ScriptGetFontFunctions(hdc); + test_ScriptGetLogicalWidths();
ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index f5eba8d..dc1cc06 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -3890,16 +3890,33 @@ HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order) * Failure: a non-zero HRESULT. */ HRESULT WINAPI ScriptGetLogicalWidths(const SCRIPT_ANALYSIS *sa, int nbchars, int nbglyphs, - const int *glyph_width, const WORD *log_clust, + const int *advances, const WORD *log_clust, const SCRIPT_VISATTR *sva, int *widths) { - int i; + int i, next = 0, direction;
TRACE("(%p, %d, %d, %p, %p, %p, %p)\n", - sa, nbchars, nbglyphs, glyph_width, log_clust, sva, widths); + sa, nbchars, nbglyphs, advances, log_clust, sva, widths); + + if (sa->fRTL && !sa->fLogicalOrder) + direction = -1; + else + direction = 1; + + for (i = 0; i < nbchars; i++) + { + int clust_size = get_cluster_size(log_clust, nbchars, i, direction, NULL, NULL); + int advance = get_glyph_cluster_advance(advances, sva, log_clust, nbglyphs, nbchars, log_clust[i], direction); + int j; + + for (j = 0; j < clust_size; j++) + { + widths[next] = advance / clust_size; + next++; + if (j) i++; + } + }
- /* FIXME */ - for (i = 0; i < nbchars; i++) widths[i] = glyph_width[i]; return S_OK; }