[PATCH 1/2] dwrite: Use dpiX/dpiY argument in GetRecommendedRenderingMode()

Nikolay Sivov nsivov at codeweavers.com
Tue Oct 27 14:42:10 CDT 2015


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c       |  2 ++
 dlls/dwrite/tests/font.c | 80 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index b71d492..22de471 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -1068,6 +1068,8 @@ static HRESULT WINAPI dwritefontface2_GetRecommendedRenderingMode(IDWriteFontFac
     if (is_sideways)
         FIXME("sideways mode not supported\n");
 
+    emSize *= max(dpiX, dpiY) / 96.0f;
+
     *renderingmode = DWRITE_RENDERING_MODE_DEFAULT;
     *gridfitmode = DWRITE_GRID_FIT_MODE_DEFAULT;
     if (params) {
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index ae45e8b..8ec4f84 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -4439,12 +4439,11 @@ if (0) /* crashes on native */
 
     for (emsize = 1.0; emsize < 500.0; emsize += 1.0) {
         DWRITE_RENDERING_MODE expected;
+        FLOAT ppdip;
         WORD gasp;
         int i;
 
         for (i = 0; i < sizeof(recmode_tests)/sizeof(recmode_tests[0]); i++) {
-            FLOAT ppdip;
-
             ppdip = 1.0f;
             mode = 10;
             gasp = get_gasp_flags(fontface, emsize, ppdip);
@@ -4487,12 +4486,82 @@ if (0) /* crashes on native */
         /* IDWriteFontFace1 offers another variant of this method */
         if (fontface1) {
             for (i = 0; i < sizeof(recmode_tests1)/sizeof(recmode_tests1[0]); i++) {
+                FLOAT dpi;
+
+                ppdip = 1.0f;
+                dpi = 96.0f * ppdip;
                 mode = 10;
-                expected = get_expected_rendering_mode(emsize, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
-                hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, 96.0, 96.0,
+                gasp = get_gasp_flags(fontface, emsize, ppdip);
+                expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi, dpi,
                     NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
                 ok(hr == S_OK, "got 0x%08x\n", hr);
-                ok(mode == expected, "%.2f/%d: got %d, flags 0x%04x, expected %d\n", emsize, i, mode, gasp, expected);
+                ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                /* Only test larger sizes to workaround Win7 differences, where unscaled natural emsize threshold is used;
+                   Win8 and Win10 handle this as expected. */
+                if (emsize > 20.0f) {
+                    ppdip = 2.0f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi, dpi,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                    ppdip = 0.5f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi, dpi,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                    /* try different dpis for X and Y direction */
+                    ppdip = 1.0f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi * 0.5f, dpi,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                    ppdip = 1.0f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi, dpi * 0.5f,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                    ppdip = 2.0f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi * 0.5f, dpi,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+
+                    ppdip = 2.0f;
+                    dpi = 96.0f * ppdip;
+                    mode = 10;
+                    gasp = get_gasp_flags(fontface, emsize, ppdip);
+                    expected = get_expected_rendering_mode(emsize * ppdip, gasp, recmode_tests1[i].measuring, recmode_tests1[i].threshold);
+                    hr = IDWriteFontFace1_GetRecommendedRenderingMode(fontface1, emsize, dpi, dpi * 0.5f,
+                        NULL, FALSE, recmode_tests1[i].threshold, recmode_tests1[i].measuring, &mode);
+                    ok(hr == S_OK, "got 0x%08x\n", hr);
+                    ok(mode == expected, "%.2f/%d: got %d, dpi %f, flags 0x%04x, expected %d\n", emsize, i, mode, dpi, gasp, expected);
+                }
             }
         }
 
@@ -4500,6 +4569,7 @@ if (0) /* crashes on native */
         if (fontface2) {
             DWRITE_GRID_FIT_MODE gridfit, expected_gridfit;
 
+            gasp = get_gasp_flags(fontface, emsize, 1.0f);
             for (i = 0; i < sizeof(recmode_tests1)/sizeof(recmode_tests1[0]); i++) {
                 mode = 10;
                 expected = get_expected_rendering_mode(emsize, gasp, recmode_tests1[0].measuring, recmode_tests1[0].threshold);
-- 
2.6.1




More information about the wine-patches mailing list