[PATCH 4/4] dwrite/tests: Extend GetGdiCompatibleMetrics() test to test DWRITE_FONT_METRICS1 as well

Nikolay Sivov nsivov at codeweavers.com
Mon Jul 6 15:08:59 CDT 2015


---

-------------- next part --------------
From 2af948395510d99eed4e03cd8de49383f7f7458c Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon, 6 Jul 2015 23:04:24 +0300
Subject: [PATCH 4/4] dwrite/tests: Extend GetGdiCompatibleMetrics() to test
 DWRITE_FONT_METRICS1 as well

---
 dlls/dwrite/tests/font.c | 185 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 141 insertions(+), 44 deletions(-)

diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index ae25b6c..7f8619e 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3525,19 +3525,107 @@ static BOOL get_vdmx_size(const struct VDMX_group *group, int emsize, int *a, in
     return FALSE;
 }
 
+static void test_metrics_cmp(FLOAT emsize, const DWRITE_FONT_METRICS *metrics, const DWRITE_FONT_METRICS1 *expected)
+{
+    ok(metrics->designUnitsPerEm == expected->designUnitsPerEm, "%.2f: emsize: got %u expect %u\n",
+           emsize, metrics->designUnitsPerEm, expected->designUnitsPerEm);
+    ok(metrics->ascent == expected->ascent, "%.2f a: got %u expect %u\n",
+           emsize, metrics->ascent, expected->ascent);
+    ok(metrics->descent == expected->descent, "%.2f d: got %u expect %u\n",
+           emsize, metrics->descent, expected->descent);
+    ok(metrics->lineGap == expected->lineGap, "%.2f lg: got %d expect %d\n",
+           emsize, metrics->lineGap, expected->lineGap);
+    ok(metrics->capHeight == expected->capHeight, "%.2f capH: got %u expect %u\n",
+           emsize, metrics->capHeight, expected->capHeight);
+    ok(metrics->xHeight == expected->xHeight, "%.2f xH: got %u expect %u\n",
+           emsize, metrics->xHeight, expected->xHeight);
+    ok(metrics->underlinePosition == expected->underlinePosition, "%.2f ulP: got %d expect %d\n",
+            emsize, metrics->underlinePosition, expected->underlinePosition);
+    ok(metrics->underlineThickness == expected->underlineThickness, "%.2f ulTh: got %u expect %u\n",
+           emsize, metrics->underlineThickness, expected->underlineThickness);
+    ok(metrics->strikethroughPosition == expected->strikethroughPosition, "%.2f stP: got %d expect %d\n",
+           emsize, metrics->strikethroughPosition, expected->strikethroughPosition);
+    ok(metrics->strikethroughThickness == expected->strikethroughThickness, "%.2f stTh: got %u expect %u\n",
+           emsize, metrics->strikethroughThickness, expected->strikethroughThickness);
+}
+
+static void test_metrics1_cmp(FLOAT emsize, const DWRITE_FONT_METRICS1 *metrics, const DWRITE_FONT_METRICS1 *expected)
+{
+    ok(metrics->designUnitsPerEm == expected->designUnitsPerEm, "%.2f: emsize: got %u expect %u\n",
+           emsize, metrics->designUnitsPerEm, expected->designUnitsPerEm);
+    ok(metrics->ascent == expected->ascent, "%.2f a: got %u expect %u\n",
+           emsize, metrics->ascent, expected->ascent);
+    ok(metrics->descent == expected->descent, "%.2f d: got %u expect %u\n",
+           emsize, metrics->descent, expected->descent);
+    ok(metrics->lineGap == expected->lineGap, "%.2f lg: got %d expect %d\n",
+           emsize, metrics->lineGap, expected->lineGap);
+    ok(metrics->capHeight == expected->capHeight, "%.2f capH: got %u expect %u\n",
+           emsize, metrics->capHeight, expected->capHeight);
+    ok(metrics->xHeight == expected->xHeight, "%.2f xH: got %u expect %u\n",
+           emsize, metrics->xHeight, expected->xHeight);
+    ok(metrics->underlinePosition == expected->underlinePosition, "%.2f ulP: got %d expect %d\n",
+            emsize, metrics->underlinePosition, expected->underlinePosition);
+    ok(metrics->underlineThickness == expected->underlineThickness, "%.2f ulTh: got %u expect %u\n",
+           emsize, metrics->underlineThickness, expected->underlineThickness);
+    ok(metrics->strikethroughPosition == expected->strikethroughPosition, "%.2f stP: got %d expect %d\n",
+           emsize, metrics->strikethroughPosition, expected->strikethroughPosition);
+    ok(metrics->strikethroughThickness == expected->strikethroughThickness, "%.2f stTh: got %u expect %u\n",
+           emsize, metrics->strikethroughThickness, expected->strikethroughThickness);
+    ok(metrics->glyphBoxLeft == expected->glyphBoxLeft, "%.2f box left: got %d expect %d\n",
+           emsize, metrics->glyphBoxLeft, expected->glyphBoxLeft);
+if (0) { /* this is not consistent */
+    ok(metrics->glyphBoxTop == expected->glyphBoxTop, "%.2f box top: got %d expect %d\n",
+           emsize, metrics->glyphBoxTop, expected->glyphBoxTop);
+    ok(metrics->glyphBoxRight == expected->glyphBoxRight, "%.2f box right: got %d expect %d\n",
+           emsize, metrics->glyphBoxRight, expected->glyphBoxRight);
+}
+    ok(metrics->glyphBoxBottom == expected->glyphBoxBottom, "%.2f box bottom: got %d expect %d\n",
+           emsize, metrics->glyphBoxBottom, expected->glyphBoxBottom);
+    ok(metrics->subscriptPositionX == expected->subscriptPositionX, "%.2f subX: got %d expect %d\n",
+           emsize, metrics->subscriptPositionX, expected->subscriptPositionX);
+    ok(metrics->subscriptPositionY == expected->subscriptPositionY, "%.2f subY: got %d expect %d\n",
+           emsize, metrics->subscriptPositionY, expected->subscriptPositionY);
+    ok(metrics->subscriptSizeX == expected->subscriptSizeX, "%.2f subsizeX: got %d expect %d\n",
+           emsize, metrics->subscriptSizeX, expected->subscriptSizeX);
+    ok(metrics->subscriptPositionY == expected->subscriptPositionY, "%.2f subsizeY: got %d expect %d\n",
+           emsize, metrics->subscriptSizeY, expected->subscriptSizeY);
+    ok(metrics->superscriptPositionX == expected->superscriptPositionX, "%.2f supX: got %d expect %d\n",
+           emsize, metrics->superscriptPositionX, expected->superscriptPositionX);
+if (0)
+    ok(metrics->superscriptPositionY == expected->superscriptPositionY, "%.2f supY: got %d expect %d\n",
+           emsize, metrics->superscriptPositionY, expected->superscriptPositionY);
+    ok(metrics->superscriptSizeX == expected->superscriptSizeX, "%.2f supsizeX: got %d expect %d\n",
+           emsize, metrics->superscriptSizeX, expected->superscriptSizeX);
+    ok(metrics->superscriptSizeY == expected->superscriptSizeY, "%.2f supsizeY: got %d expect %d\n",
+           emsize, metrics->superscriptSizeY, expected->superscriptSizeY);
+    ok(metrics->hasTypographicMetrics == expected->hasTypographicMetrics, "%.2f hastypo: got %d expect %d\n",
+           emsize, metrics->hasTypographicMetrics, expected->hasTypographicMetrics);
+}
+
 static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
 {
+    IDWriteFontFace1 *fontface1 = NULL;
     HRESULT hr;
-    DWRITE_FONT_METRICS design_metrics, comp_metrics;
+    DWRITE_FONT_METRICS design_metrics;
+    DWRITE_FONT_METRICS1 design_metrics1;
     FLOAT emsize, scale;
-    int ascent, descent, expect;
+    int ascent, descent;
     const struct VDMX_Header *vdmx;
     UINT32 vdmx_len;
     void *vdmx_ctx;
     BOOL exists;
     const struct VDMX_group *vdmx_group = NULL;
 
-    IDWriteFontFace_GetMetrics(face, &design_metrics);
+    hr = IDWriteFontFace_QueryInterface(face, &IID_IDWriteFontFace1, (void**)&fontface1);
+    if (hr != S_OK)
+        win_skip("gdi compatible DWRITE_FONT_METRICS1 are not supported.\n");
+
+    if (fontface1) {
+        IDWriteFontFace1_GetMetrics(fontface1, &design_metrics1);
+        memcpy(&design_metrics, &design_metrics1, sizeof(design_metrics));
+    }
+    else
+        IDWriteFontFace_GetMetrics(face, &design_metrics);
 
     hr = IDWriteFontFace_TryGetFontTable(face, MS_VDMX_TAG, (const void **)&vdmx,
                                          &vdmx_len, &vdmx_ctx, &exists);
@@ -3548,57 +3636,66 @@ static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
 
     for (emsize = 5; emsize <= design_metrics.designUnitsPerEm; emsize++)
     {
-        scale = emsize / design_metrics.designUnitsPerEm;
-        hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, emsize, 1.0, NULL, &comp_metrics);
-todo_wine
-        ok(hr == S_OK, "got %08x\n", hr);
-        if (hr != S_OK) return;
+        DWRITE_FONT_METRICS1 comp_metrics1, expected;
+        DWRITE_FONT_METRICS comp_metrics;
+
+        if (fontface1) {
+            hr = IDWriteFontFace1_GetGdiCompatibleMetrics(fontface1, emsize, 1.0, NULL, &comp_metrics1);
+        todo_wine
+            ok(hr == S_OK, "got %08x\n", hr);
+            if (hr != S_OK) return;
+        }
+        else {
+            hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, emsize, 1.0, NULL, &comp_metrics);
+            ok(hr == S_OK, "got %08x\n", hr);
+        }
 
+        scale = emsize / design_metrics.designUnitsPerEm;
         if (!get_vdmx_size(vdmx_group, emsize, &ascent, &descent))
         {
             ascent = round(design_metrics.ascent * scale);
             descent = round(design_metrics.descent * scale);
         }
 
-        ok(comp_metrics.designUnitsPerEm == design_metrics.designUnitsPerEm,
-           "%.2f: emsize: got %d expect %d\n",
-           emsize, comp_metrics.designUnitsPerEm, design_metrics.designUnitsPerEm);
-
-        ok(comp_metrics.ascent == round(ascent / scale), "%.2f a: got %d expect %d\n",
-           emsize, comp_metrics.ascent, round(ascent / scale));
-
-        ok(comp_metrics.descent == round(descent / scale), "%.2f d: got %d expect %d\n",
-           emsize, comp_metrics.descent, round(descent / scale));
-
-        expect = round(round(design_metrics.lineGap * scale) / scale);
-        ok(comp_metrics.lineGap == expect, "%.2f lg: got %d expect %d\n",
-           emsize, comp_metrics.lineGap, expect);
-
-        expect = round(round(design_metrics.capHeight * scale) / scale);
-        ok(comp_metrics.capHeight == expect, "%.2f capH: got %d expect %d\n",
-           emsize, comp_metrics.capHeight, expect);
-
-        expect = round(round(design_metrics.xHeight * scale) / scale);
-        ok(comp_metrics.xHeight == expect, "%.2f xH: got %d expect %d\n",
-           emsize, comp_metrics.xHeight, expect);
-
-        expect = round(round(design_metrics.underlinePosition * scale) / scale);
-        ok(comp_metrics.underlinePosition == expect, "%.2f ulP: got %d expect %d\n",
-            emsize, comp_metrics.underlinePosition, expect);
-
-        expect = round(round(design_metrics.underlineThickness * scale) / scale);
-        ok(comp_metrics.underlineThickness == expect, "%.2f ulTh: got %d expect %d\n",
-           emsize, comp_metrics.underlineThickness, expect);
-
-        expect = round(round(design_metrics.strikethroughPosition * scale) / scale);
-        ok(comp_metrics.strikethroughPosition == expect, "%.2f stP: got %d expect %d\n",
-           emsize, comp_metrics.strikethroughPosition, expect);
+        expected.designUnitsPerEm = design_metrics.designUnitsPerEm;
+        expected.ascent = round(ascent / scale );
+        expected.descent = round(descent / scale );
+        expected.lineGap = round(round(design_metrics.lineGap * scale) / scale);
+        expected.capHeight = round(round(design_metrics.capHeight * scale) / scale);
+        expected.xHeight = round(round(design_metrics.xHeight * scale) / scale);
+        expected.underlinePosition = round(round(design_metrics.underlinePosition * scale) / scale);
+        expected.underlineThickness = round(round(design_metrics.underlineThickness * scale) / scale);
+        expected.strikethroughPosition = round(round(design_metrics.strikethroughPosition * scale) / scale);
+        expected.strikethroughThickness = round(round(design_metrics.strikethroughThickness * scale) / scale);
+
+        if (fontface1) {
+            expected.glyphBoxLeft = round(round(design_metrics1.glyphBoxLeft * scale) / scale);
+
+        if (0) { /* those two fail on Tahoma and Win7 */
+            expected.glyphBoxTop = round(round(design_metrics1.glyphBoxTop * scale) / scale);
+            expected.glyphBoxRight = round(round(design_metrics1.glyphBoxRight * scale) / scale);
+        }
+            expected.glyphBoxBottom = round(round(design_metrics1.glyphBoxBottom * scale) / scale);
+            expected.subscriptPositionX = round(round(design_metrics1.subscriptPositionX * scale) / scale);
+            expected.subscriptPositionY = round(round(design_metrics1.subscriptPositionY * scale) / scale);
+            expected.subscriptSizeX = round(round(design_metrics1.subscriptSizeX * scale) / scale);
+            expected.subscriptSizeY = round(round(design_metrics1.subscriptSizeY * scale) / scale);
+            expected.superscriptPositionX = round(round(design_metrics1.superscriptPositionX * scale) / scale);
+        if (0) /* this fails for 3 emsizes, Tahoma from [5, 2048] range */
+            expected.superscriptPositionY = round(round(design_metrics1.superscriptPositionY * scale) / scale);
+            expected.superscriptSizeX = round(round(design_metrics1.superscriptSizeX * scale) / scale);
+            expected.superscriptSizeY = round(round(design_metrics1.superscriptSizeY * scale) / scale);
+            expected.hasTypographicMetrics = design_metrics1.hasTypographicMetrics;
+
+            test_metrics1_cmp(emsize, &comp_metrics1, &expected);
+        }
+        else
+            test_metrics_cmp(emsize, &comp_metrics, &expected);
 
-        expect = round(round(design_metrics.strikethroughThickness * scale) / scale);
-        ok(comp_metrics.strikethroughThickness == expect, "%.2f stTh: got %d expect %d\n",
-           emsize, comp_metrics.strikethroughThickness, expect);
     }
 
+    if (fontface1)
+        IDWriteFontFace1_Release(fontface1);
     if (vdmx) IDWriteFontFace_ReleaseFontTable(face, vdmx_ctx);
 }
 
-- 
2.1.4



More information about the wine-patches mailing list