Dmitry Timoshkov : gdiplus: GdipGetFontHeight should convert height from font to device units.

Alexandre Julliard julliard at winehq.org
Wed Jul 18 12:44:41 CDT 2012


Module: wine
Branch: master
Commit: 9288acda1db67c5cc3a80760d0dce34dd2c71cdb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9288acda1db67c5cc3a80760d0dce34dd2c71cdb

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Jul 16 14:57:32 2012 +0900

gdiplus: GdipGetFontHeight should convert height from font to device units.

---

 dlls/gdiplus/font.c            |   23 +++++++++++++++++------
 dlls/gdiplus/gdiplus.c         |   24 ++++++++++++++++++++++++
 dlls/gdiplus/gdiplus_private.h |    1 +
 dlls/gdiplus/tests/graphics.c  |    2 --
 4 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c
index 26cd49d..9d545e0 100644
--- a/dlls/gdiplus/font.c
+++ b/dlls/gdiplus/font.c
@@ -523,18 +523,29 @@ GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont *font,
 {
     REAL dpi;
     GpStatus stat;
+    REAL font_height;
 
     TRACE("%p %p %p\n", font, graphics, height);
 
-    if (graphics)
+    stat = GdipGetFontHeightGivenDPI(font, font->family->dpi, &font_height);
+    if (stat != Ok) return stat;
+
+    if (!graphics)
     {
-        stat = GdipGetDpiY((GpGraphics*)graphics, &dpi);
-        if (stat != Ok) return stat;
+        *height = font_height;
+        TRACE("%s,%d => %f\n",
+              debugstr_w(font->family->FamilyName), font->otm.otmTextMetrics.tmHeight, *height);
+        return Ok;
     }
-    else
-        dpi = font->family->dpi;
 
-    return GdipGetFontHeightGivenDPI(font, dpi, height);
+    stat = GdipGetDpiY((GpGraphics *)graphics, &dpi);
+    if (stat != Ok) return stat;
+
+    *height = pixels_to_units(font_height, graphics->unit, dpi);
+
+    TRACE("%s,%d(unit %d) => %f\n",
+          debugstr_w(font->family->FamilyName), font->otm.otmTextMetrics.tmHeight, graphics->unit, *height);
+    return Ok;
 }
 
 /*******************************************************************************
diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c
index d27924b..9b43cd6 100644
--- a/dlls/gdiplus/gdiplus.c
+++ b/dlls/gdiplus/gdiplus.c
@@ -366,6 +366,30 @@ REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi)
     }
 }
 
+/* converts value in pixels to a given unit */
+REAL pixels_to_units(REAL pixels, GpUnit unit, REAL dpi)
+{
+    switch (unit)
+    {
+    case UnitPixel:
+    case UnitWorld:
+    case UnitDisplay:
+        return pixels;
+    case UnitPoint:
+        return pixels / dpi / inch_per_point;
+    case UnitInch:
+        return pixels / dpi;
+        break;
+    case UnitDocument:
+        return pixels * 300.0 / dpi;
+    case UnitMillimeter:
+        return pixels * mm_per_inch / dpi;
+    default:
+        FIXME("Unhandled unit type: %d\n", unit);
+        return 0;
+    }
+}
+
 /* Calculates Bezier points from cardinal spline points. */
 void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
     REAL *y1, REAL *x2, REAL *y2)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index c1d19d2..5d1c685 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -50,6 +50,7 @@ extern REAL gdiplus_atan2(REAL dy, REAL dx) DECLSPEC_HIDDEN;
 extern GpStatus hresult_to_status(HRESULT res) DECLSPEC_HIDDEN;
 extern REAL convert_unit(REAL logpixels, GpUnit unit) DECLSPEC_HIDDEN;
 extern REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi) DECLSPEC_HIDDEN;
+extern REAL pixels_to_units(REAL pixels, GpUnit unit, REAL dpi) DECLSPEC_HIDDEN;
 
 extern GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics) DECLSPEC_HIDDEN;
 
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index f19dd9e..b1d4616 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -3363,7 +3363,6 @@ todo_wine
 
     status = GdipGetFontHeight(font, graphics, &rval);
     expect(Ok, status);
-todo_wine
     expectf(21.726563, rval);
     status = GdipGetFontSize(font, &rval);
     expect(Ok, status);
@@ -3383,7 +3382,6 @@ todo_wine
 
     status = GdipGetFontHeight(font, graphics, &rval);
     expect(Ok, status);
-todo_wine
     expectf(7.664648, rval);
     status = GdipGetFontSize(font, &rval);
     expect(Ok, status);




More information about the wine-cvs mailing list