Nikolay Sivov : dwrite: Handle negative emsize in GetGdiCompatibleMetrics( ).

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 13 09:30:03 CDT 2015


Module: wine
Branch: master
Commit: e6d5c03fdeaafb1c82f21aa77c1c38acb67dcb04
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e6d5c03fdeaafb1c82f21aa77c1c38acb67dcb04

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jul 12 23:35:52 2015 +0300

dwrite: Handle negative emsize in GetGdiCompatibleMetrics().

---

 dlls/dwrite/font.c       |  2 +-
 dlls/dwrite/tests/font.c | 82 +++++++++++++++++++++++++++++-------------------
 2 files changed, 50 insertions(+), 34 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 13d3ff5..41b0250 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -632,7 +632,7 @@ static HRESULT WINAPI dwritefontface1_GetGdiCompatibleMetrics(IDWriteFontFace2 *
 
     TRACE("(%p)->(%.2f %.2f %p %p)\n", This, em_size, pixels_per_dip, m, metrics);
 
-    if (pixels_per_dip <= 0.0) {
+    if (em_size <= 0.0 || pixels_per_dip <= 0.0) {
         memset(metrics, 0, sizeof(*metrics));
         return E_INVALIDARG;
     }
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 9e33a1a..9524d6a 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3602,6 +3602,33 @@ if (0)
            emsize, metrics->hasTypographicMetrics, expected->hasTypographicMetrics);
 }
 
+struct compatmetrics_test {
+    DWRITE_MATRIX m;
+    FLOAT ppdip;
+    FLOAT emsize;
+};
+
+static struct compatmetrics_test compatmetrics_tests[] = {
+    { { 0.0, 0.0, 0.0,  1.0, 0.0, 0.0 }, 1.0, 5.0 },
+    { { 0.0, 0.0, 0.0, -1.0, 0.0, 0.0 }, 1.0, 5.0 },
+    { { 0.0, 0.0, 0.0, -1.0, 0.0, 0.0 }, 2.0, 5.0 },
+    { { 0.0, 0.0, 0.0,  3.0, 0.0, 0.0 }, 2.0, 5.0 },
+    { { 0.0, 0.0, 0.0, -3.0, 0.0, 0.0 }, 2.0, 5.0 },
+    { { 1.0, 0.0, 0.0,  1.0, 0.0, 0.0 }, 2.0, 5.0 },
+    { { 1.0, 0.0, 0.0,  1.0, 5.0, 0.0 }, 2.0, 5.0 },
+    { { 1.0, 0.0, 0.0,  1.0, 0.0, 5.0 }, 2.0, 5.0 },
+};
+
+static void get_expected_metrics(IDWriteFontFace *fontface, struct compatmetrics_test *ptr,
+    DWRITE_FONT_METRICS *expected)
+{
+    HRESULT hr;
+
+    memset(expected, 0, sizeof(*expected));
+    hr = IDWriteFontFace_GetGdiCompatibleMetrics(fontface, ptr->ppdip * fabsf(ptr->m.m22) * ptr->emsize, 1.0, NULL, expected);
+    ok(hr == S_OK, "got %08x\n", hr);
+}
+
 static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
 {
     IDWriteFontFace1 *fontface1 = NULL;
@@ -3615,7 +3642,7 @@ static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
     void *vdmx_ctx;
     BOOL exists;
     const struct VDMX_group *vdmx_group = NULL;
-    DWRITE_MATRIX m;
+    int i;
 
     hr = IDWriteFontFace_QueryInterface(face, &IID_IDWriteFontFace1, (void**)&fontface1);
     if (hr != S_OK)
@@ -3635,6 +3662,20 @@ static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
     else
         vdmx_group = find_vdmx_group(vdmx);
 
+    /* negative emsize */
+    memset(&comp_metrics, 0xcc, sizeof(comp_metrics));
+    memset(&expected, 0, sizeof(expected));
+    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, -10.0, 1.0, NULL, &comp_metrics);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+    test_metrics_cmp(0.0, &comp_metrics, &expected);
+
+    /* zero emsize */
+    memset(&comp_metrics, 0xcc, sizeof(comp_metrics));
+    memset(&expected, 0, sizeof(expected));
+    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 0.0, 1.0, NULL, &comp_metrics);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+    test_metrics_cmp(0.0, &comp_metrics, &expected);
+
     /* zero pixels per dip */
     memset(&comp_metrics, 0xcc, sizeof(comp_metrics));
     memset(&expected, 0, sizeof(expected));
@@ -3647,39 +3688,14 @@ static void test_GetGdiCompatibleMetrics_face(IDWriteFontFace *face)
     ok(hr == E_INVALIDARG, "got %08x\n", hr);
     test_metrics_cmp(5.0, &comp_metrics, &expected);
 
-    memset(&m, 0, sizeof(m));
-    /* zero matrix m22 */
-    m.m22 = 1.0;
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 1.0, NULL, (DWRITE_FONT_METRICS*)&expected);
-    ok(hr == S_OK, "got %08x\n", hr);
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 1.0, &m, &comp_metrics);
-    ok(hr == S_OK, "got %08x\n", hr);
-    test_metrics_cmp(5.0, &comp_metrics, &expected);
-
-    m.m22 = -1.0;
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 1.0, &m, &comp_metrics);
-    ok(hr == S_OK, "got %08x\n", hr);
-    test_metrics_cmp(5.0, &comp_metrics, &expected);
+    for (i = 0; i < sizeof(compatmetrics_tests)/sizeof(compatmetrics_tests[0]); i++) {
+        struct compatmetrics_test *ptr = &compatmetrics_tests[i];
 
-    /* pixels per dip == 2 */
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 10.0, 1.0, NULL, (DWRITE_FONT_METRICS*)&expected);
-    ok(hr == S_OK, "got %08x\n", hr);
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 2.0, NULL, &comp_metrics);
-    ok(hr == S_OK, "got %08x\n", hr);
-    test_metrics_cmp(5.0, &comp_metrics, &expected);
-
-    /* pixels per dip == 2, m22 == 3.0 */
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 30.0, 1.0, NULL, (DWRITE_FONT_METRICS*)&expected);
-    ok(hr == S_OK, "got %08x\n", hr);
-
-    m.m22 = 3.0;
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 2.0, &m, &comp_metrics);
-    ok(hr == S_OK, "got %08x\n", hr);
-    test_metrics_cmp(5.0, &comp_metrics, &expected);
-    m.m22 = -3.0;
-    hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, 5.0, 2.0, &m, &comp_metrics);
-    ok(hr == S_OK, "got %08x\n", hr);
-    test_metrics_cmp(5.0, &comp_metrics, &expected);
+        get_expected_metrics(face, ptr, (DWRITE_FONT_METRICS*)&expected);
+        hr = IDWriteFontFace_GetGdiCompatibleMetrics(face, ptr->emsize, ptr->ppdip, &ptr->m, &comp_metrics);
+        ok(hr == S_OK, "got %08x\n", hr);
+        test_metrics_cmp(ptr->emsize, &comp_metrics, &expected);
+    }
 
     for (emsize = 5; emsize <= design_metrics.designUnitsPerEm; emsize++)
     {




More information about the wine-cvs mailing list