[PATCH 4/7] dwrite: Handle negative emsize in GetGdiCompatibleMetrics()
Nikolay Sivov
nsivov at codeweavers.com
Sun Jul 12 15:35:52 CDT 2015
---
-------------- next part --------------
>From 1206fd891596e763d897e6b96560d5215b01930c Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun, 12 Jul 2015 23:28:01 +0300
Subject: [PATCH 4/7] 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++)
{
--
2.1.4
More information about the wine-patches
mailing list