[PATCH 1/4] dwrite: Force advances to zero for isZeroWidthSpace glyphs

Nikolay Sivov nsivov at codeweavers.com
Mon Feb 15 15:59:24 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 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);
-- 
2.7.0




More information about the wine-patches mailing list