Module: wine Branch: master Commit: e6d5c03fdeaafb1c82f21aa77c1c38acb67dcb04 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e6d5c03fdeaafb1c82f21aa77c...
Author: Nikolay Sivov nsivov@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++) {