Dmitry Timoshkov : gdiplus: GdipMeasureString operates internally in pixels but in/ out rectangles are in device units.

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


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

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

gdiplus: GdipMeasureString operates internally in pixels but in/out rectangles are in device units.

---

 dlls/gdiplus/graphics.c       |   35 ++++++++++++++++++++++++++++++++---
 dlls/gdiplus/tests/graphics.c |    6 ------
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 59dd77b..5dcd30a 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -4908,6 +4908,30 @@ static GpStatus measure_ranges_callback(HDC hdc,
     return stat;
 }
 
+static void rect_to_pixels(const RectF *in, const GpGraphics *graphics, RectF *out)
+{
+    REAL dpi;
+
+    GdipGetDpiX((GpGraphics *)graphics, &dpi);
+    out->X = units_to_pixels(in->X, graphics->unit, dpi);
+    out->Width = units_to_pixels(in->Width, graphics->unit, dpi);
+    GdipGetDpiY((GpGraphics *)graphics, &dpi);
+    out->Y = units_to_pixels(in->Y, graphics->unit, dpi);
+    out->Height = units_to_pixels(in->Height, graphics->unit, dpi);
+}
+
+static void rect_to_units(const RectF *in, const GpGraphics *graphics, RectF *out)
+{
+    REAL dpi;
+
+    GdipGetDpiX((GpGraphics *)graphics, &dpi);
+    out->X = pixels_to_units(in->X, graphics->unit, dpi);
+    out->Width = pixels_to_units(in->Width, graphics->unit, dpi);
+    GdipGetDpiY((GpGraphics *)graphics, &dpi);
+    out->Y = pixels_to_units(in->Y, graphics->unit, dpi);
+    out->Height = pixels_to_units(in->Height, graphics->unit, dpi);
+}
+
 GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
         GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font,
         GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat,
@@ -5011,6 +5035,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
     struct measure_string_args args;
     HDC temp_hdc=NULL, hdc;
     GpPointF pt[3];
+    RectF rect_pixels;
 
     TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics,
         debugstr_wn(string, length), length, font, debugstr_rectf(rect), format,
@@ -5048,8 +5073,10 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
     get_font_hfont(graphics, font, &gdifont);
     oldfont = SelectObject(hdc, gdifont);
 
-    bounds->X = rect->X;
-    bounds->Y = rect->Y;
+    rect_to_pixels(rect, graphics, &rect_pixels);
+
+    bounds->X = rect_pixels.X;
+    bounds->Y = rect_pixels.Y;
     bounds->Width = 0.0;
     bounds->Height = 0.0;
 
@@ -5057,9 +5084,11 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
     args.codepointsfitted = codepointsfitted;
     args.linesfilled = linesfilled;
 
-    gdip_format_string(hdc, string, length, font, rect, format,
+    gdip_format_string(hdc, string, length, font, &rect_pixels, format,
         measure_string_callback, &args);
 
+    rect_to_units(bounds, graphics, bounds);
+
     SelectObject(hdc, oldfont);
     DeleteObject(gdifont);
 
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index b1d4616..7c53ced 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -3350,9 +3350,7 @@ static void test_GdipMeasureString(void)
         expect(Ok, status);
         expectf(0.0, bounds.X);
         expectf(0.0, bounds.Y);
-todo_wine
         expectf_(102.499985, bounds.Width, 11.5);
-todo_wine
         expectf_(31.968744, bounds.Height, 3.1);
     }
     else
@@ -3372,9 +3370,7 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
     expectf_(76.875000, bounds.Width, 10.0);
-todo_wine
     expectf_(23.976563, bounds.Height, 2.1);
 
     status = GdipSetPageUnit(graphics, UnitMillimeter);
@@ -3391,9 +3387,7 @@ todo_wine
     expect(Ok, status);
     expectf(0.0, bounds.X);
     expectf(0.0, bounds.Y);
-todo_wine
     expectf_(27.119789, bounds.Width, 2.7);
-todo_wine
     expectf_(8.458398, bounds.Height, 0.8);
 
     GdipDeleteStringFormat(format);




More information about the wine-cvs mailing list