Module: wine Branch: master Commit: b20a1f56b0c915b24f70b8be83fbf76ea7378123 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b20a1f56b0c915b24f70b8be83... Author: Dmitry Timoshkov <dmitry(a)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);