diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 41034e59163..16e1bc00fb7 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -4999,7 +4999,7 @@ static GpStatus measure_string_callback(HDC hdc, REAL new_width, new_height; new_width = bounds->Width / args->rel_width; - new_height = (bounds->Height + bounds->Y - args->bounds->Y) / args->rel_height; + new_height = (bounds->Height + bounds->Y) / args->rel_height - args->bounds->Y; if (new_width > args->bounds->Width) args->bounds->Width = new_width; @@ -5029,6 +5029,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, struct measure_string_args args; HDC temp_hdc=NULL, hdc; GpPointF pt[3]; + RectF scaled_rect; TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, @@ -5066,6 +5067,11 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, get_font_hfont(graphics, font, &gdifont); oldfont = SelectObject(hdc, gdifont); + scaled_rect.X = rect->X * args.rel_width; + scaled_rect.Y = rect->Y * args.rel_height; + scaled_rect.Width = rect->Width * args.rel_width; + scaled_rect.Height = rect->Height * args.rel_height; + bounds->X = rect->X; bounds->Y = rect->Y; bounds->Width = 0.0; @@ -5075,7 +5081,7 @@ 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, &scaled_rect, format, measure_string_callback, &args); SelectObject(hdc, oldfont); diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index fb0c1cdad95..647c26ab940 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -3513,13 +3513,6 @@ static void test_GdipMeasureString(void) expect(Ok, status); expectf(50.0, bounds.X); expectf(50.0, bounds.Y); - /* FIXME: remove once Wine is fixed */ - if (fabs(height - bounds.Height) > height / 100.0) - { - /* further testing is useless */ - GdipDeleteGraphics(graphics); - continue; - } expectf_(height, bounds.Height, height / 100.0); expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05); expect(7, chars); @@ -3584,23 +3577,8 @@ static void test_GdipMeasureString(void) base_cy = bounds.Height; } - /* FIXME: remove once Wine is fixed */ - if (fabs(height - bounds.Height) > height / 85.0) - { - /* further testing is useless */ - GdipDeleteGraphics(graphics); - continue; - } - expectf(0.0, bounds.X); expectf(0.0, bounds.Y); - /* FIXME: remove once Wine is fixed */ - if (fabs(height - bounds.Height) > height / 85.0) - { - /* further testing is useless */ - GdipDeleteGraphics(graphics); - continue; - } expectf_(height, bounds.Height, height / 85.0); expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05); expect(7, chars); @@ -3617,13 +3595,6 @@ static void test_GdipMeasureString(void) expect(Ok, status); expectf(50.0, bounds.X); expectf(50.0, bounds.Y); - /* FIXME: remove once Wine is fixed */ - if (fabs(height - bounds.Height) > height / 85.0) - { - /* further testing is useless */ - GdipDeleteGraphics(graphics); - continue; - } expectf_(height, bounds.Height, height / 85.0); expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05); expect(7, chars); @@ -3635,7 +3606,7 @@ static void test_GdipMeasureString(void) height *= td[i].page_scale; /*trace("%u: unit %u, %.1fx%.1f dpi, scale %.1f, height %f, pixels %f\n", i, td[i].unit, td[i].res_x, td[i].res_y, td[i].page_scale, bounds.Height, height);*/ - expectf_(100.0, height, 1.0); + expectf_(100.0, height, 1.1); status = GdipDeleteGraphics(graphics); expect(Ok, status);