gdiplus: get_font_hfont() should ask gdi32 to match font height against the character height instead of cell height.

Dmitry Timoshkov dmitry at baikal.ru
Wed Jun 19 03:23:27 CDT 2013


This patch should fix the regression reported in the bug 33824.

This patch restores font height matching logic which was broken by
889be9d447329994f009726d4e79a2fb3772e456, makes font height handling
match other places in gdiplus code and fixes quite a bit of test failures.

Guitar Pro 5.ttf has ascent (almost) equal to descent which makes this bug
pretty visible.
---
 dlls/gdiplus/graphics.c       |  2 +-
 dlls/gdiplus/tests/font.c     | 43 +++++++++++++------------------------------
 dlls/gdiplus/tests/graphics.c |  1 -
 3 files changed, 14 insertions(+), 32 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 10a6402..dcdc29e 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -2099,7 +2099,7 @@ static void get_font_hfont(GpGraphics *graphics, GDIPCONST GpFont *font,
                       (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X));
 
     get_log_fontW(font, graphics, &lfw);
-    lfw.lfHeight = gdip_round(font_height * rel_height);
+    lfw.lfHeight = -gdip_round(font_height * rel_height);
     unscaled_font = CreateFontIndirectW(&lfw);
 
     SelectObject(hdc, unscaled_font);
diff --git a/dlls/gdiplus/tests/font.c b/dlls/gdiplus/tests/font.c
index de6d657..29d4ad5 100644
--- a/dlls/gdiplus/tests/font.c
+++ b/dlls/gdiplus/tests/font.c
@@ -877,26 +877,21 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 1.0);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, NULL, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
     expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.5);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, matrix, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
     expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.5);
 
     /* scale matrix */
     status = GdipScaleMatrix(matrix, 2.0, 3.0, MatrixOrderAppend);
@@ -926,17 +921,14 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.05);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, NULL, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
     expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.2);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, matrix, &bounds);
@@ -975,17 +967,14 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.05);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, NULL, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
     expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.2);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, matrix, &bounds);
@@ -1026,17 +1015,14 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.2);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, NULL, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
-    expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(-100.0, bounds.Y, 0.2);
+    expectf_(height, bounds.Height, 0.2);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, matrix, &bounds);
@@ -1077,17 +1063,14 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(height, bounds.Height, 0.1);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, NULL, &bounds);
     expect(Ok, status);
     expectf(0.0, bounds.X);
-todo_wine
-    expectf_(-100.0, bounds.Y, 0.05);
-todo_wine
-    expectf(height, bounds.Height);
+    expectf_(-100.0, bounds.Y, 0.2);
+    expectf_(height, bounds.Height, 0.2);
     set_rect_empty(&bounds);
     status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
                                      DriverStringOptionsCmapLookup, matrix, &bounds);
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index 5de0602..6ed1463 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -3901,7 +3901,6 @@ todo_wine
             match = fabs(1.0 - margin / rect.X) <= 0.05;
             ok(match, "Expected %f, got %f\n", margin, rect.X);
             match = fabs(1.0 - font_height / rect.Height) <= 0.1;
-todo_wine
             ok(match, "Expected %f, got %f\n", font_height, rect.Height);
             match = fabs(1.0 - bounds.Width / (rect.Width + margin * 2.0)) <= 0.05;
             ok(match, "Expected %f, got %f\n", bounds.Width, rect.Width + margin * 2.0);
-- 
1.8.3.1




More information about the wine-patches mailing list