gdiplus: GdipMeasureString should apply its internal scaling factors to layout rectangle.
This commit is contained in:
parent
46bbbd2741
commit
6f4625559e
|
@ -4999,7 +4999,7 @@ static GpStatus measure_string_callback(HDC hdc,
|
||||||
REAL new_width, new_height;
|
REAL new_width, new_height;
|
||||||
|
|
||||||
new_width = bounds->Width / args->rel_width;
|
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)
|
if (new_width > args->bounds->Width)
|
||||||
args->bounds->Width = new_width;
|
args->bounds->Width = new_width;
|
||||||
|
@ -5029,6 +5029,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
|
||||||
struct measure_string_args args;
|
struct measure_string_args args;
|
||||||
HDC temp_hdc=NULL, hdc;
|
HDC temp_hdc=NULL, hdc;
|
||||||
GpPointF pt[3];
|
GpPointF pt[3];
|
||||||
|
RectF scaled_rect;
|
||||||
|
|
||||||
TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics,
|
TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics,
|
||||||
debugstr_wn(string, length), length, font, debugstr_rectf(rect), format,
|
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);
|
get_font_hfont(graphics, font, &gdifont);
|
||||||
oldfont = SelectObject(hdc, 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->X = rect->X;
|
||||||
bounds->Y = rect->Y;
|
bounds->Y = rect->Y;
|
||||||
bounds->Width = 0.0;
|
bounds->Width = 0.0;
|
||||||
|
@ -5075,7 +5081,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
|
||||||
args.codepointsfitted = codepointsfitted;
|
args.codepointsfitted = codepointsfitted;
|
||||||
args.linesfilled = linesfilled;
|
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);
|
measure_string_callback, &args);
|
||||||
|
|
||||||
SelectObject(hdc, oldfont);
|
SelectObject(hdc, oldfont);
|
||||||
|
|
|
@ -3513,13 +3513,6 @@ static void test_GdipMeasureString(void)
|
||||||
expect(Ok, status);
|
expect(Ok, status);
|
||||||
expectf(50.0, bounds.X);
|
expectf(50.0, bounds.X);
|
||||||
expectf(50.0, bounds.Y);
|
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_(height, bounds.Height, height / 100.0);
|
||||||
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
||||||
expect(7, chars);
|
expect(7, chars);
|
||||||
|
@ -3584,23 +3577,8 @@ static void test_GdipMeasureString(void)
|
||||||
base_cy = bounds.Height;
|
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.X);
|
||||||
expectf(0.0, bounds.Y);
|
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_(height, bounds.Height, height / 85.0);
|
||||||
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
||||||
expect(7, chars);
|
expect(7, chars);
|
||||||
|
@ -3617,13 +3595,6 @@ static void test_GdipMeasureString(void)
|
||||||
expect(Ok, status);
|
expect(Ok, status);
|
||||||
expectf(50.0, bounds.X);
|
expectf(50.0, bounds.X);
|
||||||
expectf(50.0, bounds.Y);
|
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_(height, bounds.Height, height / 85.0);
|
||||||
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
expectf_(bounds.Height / base_cy, bounds.Width / base_cx, 0.05);
|
||||||
expect(7, chars);
|
expect(7, chars);
|
||||||
|
@ -3635,7 +3606,7 @@ static void test_GdipMeasureString(void)
|
||||||
height *= td[i].page_scale;
|
height *= td[i].page_scale;
|
||||||
/*trace("%u: unit %u, %.1fx%.1f dpi, scale %.1f, height %f, pixels %f\n",
|
/*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);*/
|
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);
|
status = GdipDeleteGraphics(graphics);
|
||||||
expect(Ok, status);
|
expect(Ok, status);
|
||||||
|
|
Loading…
Reference in New Issue