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