Module: wine Branch: master Commit: 297b3d080adf8b154b71031697d5c1764dccef16 URL: http://source.winehq.org/git/wine.git/?a=commit;h=297b3d080adf8b154b71031697...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Feb 16 00:59:24 2016 +0300
dwrite: Force advances to zero for isZeroWidthSpace glyphs.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/analyzer.c | 15 +++++++++------ dlls/dwrite/tests/analyzer.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c index 66fa29c..1b52eb7 100644 --- a/dlls/dwrite/analyzer.c +++ b/dlls/dwrite/analyzer.c @@ -1089,13 +1089,16 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
IDWriteFontFace_GetMetrics(fontface, &metrics); for (i = 0; i < glyph_count; i++) { - INT32 a; - - hr = IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, &glyphs[i], &a, is_sideways); - if (FAILED(hr)) - a = 0; + if (glyph_props[i].isZeroWidthSpace) + advances[i] = 0.0f; + else { + INT32 a;
- advances[i] = get_scaled_advance_width(a, emSize, &metrics); + hr = IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, &glyphs[i], &a, is_sideways); + if (FAILED(hr)) + a = 0; + advances[i] = get_scaled_advance_width(a, emSize, &metrics); + } offsets[i].advanceOffset = 0.0f; offsets[i].ascenderOffset = 0.0f; } diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c index b5437c5..07e00af 100644 --- a/dlls/dwrite/tests/analyzer.c +++ b/dlls/dwrite/tests/analyzer.c @@ -1393,6 +1393,18 @@ if (0) { ok(advances[0] == advances2[0], "got %.2f, expected %.2f\n", advances[0], advances2[0]); ok(advances[1] == advances2[1], "got %.2f, expected %.2f\n", advances[1], advances2[1]);
+ /* DWRITE_SCRIPT_SHAPES_NO_VISUAL run */ + maxglyphcount = 10; + actual_count = 0; + sa.script = 0; + sa.shapes = DWRITE_SCRIPT_SHAPES_NO_VISUAL; + hr = IDWriteTextAnalyzer_GetGlyphs(analyzer, test1W, lstrlenW(test1W), fontface, FALSE, FALSE, &sa, NULL, + NULL, NULL, NULL, 0, maxglyphcount, clustermap, props, glyphs1, shapingprops, &actual_count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(actual_count == 4, "got %d\n", actual_count); + ok(sa.script == 0, "got %u\n", sa.script); + ok(!shapingprops[0].isZeroWidthSpace, "got %d\n", shapingprops[0].isZeroWidthSpace); + IDWriteTextAnalyzer_Release(analyzer); IDWriteFontFace_Release(fontface); } @@ -1582,6 +1594,33 @@ static void test_GetGlyphPlacements(void) ok(offsets[0].advanceOffset == 0.0 && offsets[0].ascenderOffset == 0.0, "got %.2f,%.2f\n", offsets[0].advanceOffset, offsets[0].ascenderOffset);
+ /* DWRITE_SCRIPT_SHAPES_NO_VISUAL has no effect on placement */ + sa.shapes = DWRITE_SCRIPT_SHAPES_NO_VISUAL; + advances[0] = advances[1] = 1.0f; + memset(offsets, 0xcc, sizeof(offsets)); + hr = IDWriteTextAnalyzer_GetGlyphPlacements(analyzer, aW, clustermap, textprops, + len, glyphs, glyphprops, len, fontface, 2048.0f, FALSE, FALSE, &sa, NULL, NULL, + NULL, 0, advances, offsets); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(advances[0] == 1000.0f, "got %.2f\n", advances[0]); + ok(advances[1] == 1000.0f, "got %.2f\n", advances[1]); + ok(offsets[0].advanceOffset == 0.0f && offsets[0].ascenderOffset == 0.0f, "got %.2f,%.2f\n", + offsets[0].advanceOffset, offsets[0].ascenderOffset); + + /* isZeroWidthSpace */ + sa.shapes = DWRITE_SCRIPT_SHAPES_DEFAULT; + advances[0] = advances[1] = 1.0f; + memset(offsets, 0xcc, sizeof(offsets)); + glyphprops[0].isZeroWidthSpace = 1; + hr = IDWriteTextAnalyzer_GetGlyphPlacements(analyzer, aW, clustermap, textprops, + len, glyphs, glyphprops, len, fontface, 2048.0f, FALSE, FALSE, &sa, NULL, NULL, + NULL, 0, advances, offsets); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(advances[0] == 0.0f, "got %.2f\n", advances[0]); + ok(advances[1] == 1000.0f, "got %.2f\n", advances[1]); + ok(offsets[0].advanceOffset == 0.0f && offsets[0].ascenderOffset == 0.0f, "got %.2f,%.2f\n", + offsets[0].advanceOffset, offsets[0].ascenderOffset); + IDWriteTextAnalyzer_Release(analyzer); IDWriteFontFace_Release(fontface); DELETE_FONTFILE(path);