gdiplus: Apply page scale to pen thickness.

This commit is contained in:
Vincent Povirk 2015-03-23 15:05:25 -05:00 committed by Alexandre Julliard
parent 792b47ad3b
commit 6ee26aca16
2 changed files with 124 additions and 0 deletions

View File

@ -251,6 +251,7 @@ static INT prepare_dc(GpGraphics *graphics, GpPen *pen)
(pt[1].Y - pt[0].Y) * (pt[1].Y - pt[0].Y)) / sqrt(2.0);
width *= units_to_pixels(pen->width, pen->unit == UnitWorld ? graphics->unit : pen->unit, graphics->xres);
width *= graphics->scale;
}
if(pen->dash == DashStyleCustom){

View File

@ -3813,6 +3813,128 @@ static void test_transform(void)
}
}
static void test_pen_thickness(void)
{
static const struct test_data
{
REAL res_x, res_y, scale;
GpUnit pen_unit, page_unit;
REAL pen_width;
INT cx, cy;
} td[] =
{
{ 10.0, 10.0, 1.0, UnitPixel, UnitPixel, 1.0, 1, 1 },
{ 10.0, 10.0, 3.0, UnitPixel, UnitPixel, 2.0, 2, 2 },
{ 10.0, 10.0, 30.0, UnitPixel, UnitInch, 1.0, 1, 1 },
{ 10.0, 10.0, 1.0, UnitWorld, UnitPixel, 1.0, 1, 1 },
{ 10.0, 10.0, 3.0, UnitWorld, UnitPixel, 2.0, 6, 6 },
{ 10.0, 10.0, 2.0, UnitWorld, UnitInch, 1.0, 20, 20 },
};
GpStatus status;
int i, j;
GpGraphics *graphics;
union
{
GpBitmap *bitmap;
GpImage *image;
} u;
GpPen *pen;
GpPointF corner;
BitmapData bd;
INT min, max, size;
for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
{
status = GdipCreateBitmapFromScan0(100, 100, 0, PixelFormat24bppRGB, NULL, &u.bitmap);
expect(Ok, status);
status = GdipBitmapSetResolution(u.bitmap, td[i].res_x, td[i].res_y);
expect(Ok, status);
status = GdipGetImageGraphicsContext(u.image, &graphics);
expect(Ok, status);
status = GdipSetPageUnit(graphics, td[i].page_unit);
expect(Ok, status);
status = GdipSetPageScale(graphics, td[i].scale);
expect(Ok, status);
status = GdipCreatePen1(0xffffffff, td[i].pen_width, td[i].pen_unit, &pen);
expect(Ok, status);
corner.X = corner.Y = 100.0;
status = GdipTransformPoints(graphics, CoordinateSpaceWorld, CoordinateSpaceDevice, &corner, 1);
expect(Ok, status);
status = GdipDrawLine(graphics, pen, corner.X/2, 0, corner.X/2, corner.Y);
expect(Ok, status);
status = GdipDrawLine(graphics, pen, 0, corner.Y/2, corner.X, corner.Y/2);
expect(Ok, status);
status = GdipBitmapLockBits(u.bitmap, NULL, ImageLockModeRead, PixelFormat24bppRGB, &bd);
expect(Ok, status);
min = -1;
max = -2;
for (j=0; j<100; j++)
{
if (((BYTE*)bd.Scan0)[j*3] == 0xff)
{
min = j;
break;
}
}
for (j=99; j>=0; j--)
{
if (((BYTE*)bd.Scan0)[j*3] == 0xff)
{
max = j;
break;
}
}
size = max-min+1;
ok(size == td[i].cx, "%u: expected %d, got %d\n", i, td[i].cx, size);
min = -1;
max = -2;
for (j=0; j<100; j++)
{
if (((BYTE*)bd.Scan0)[bd.Stride*j] == 0xff)
{
min = j;
break;
}
}
for (j=99; j>=0; j--)
{
if (((BYTE*)bd.Scan0)[bd.Stride*j] == 0xff)
{
max = j;
break;
}
}
size = max-min+1;
ok(size == td[i].cy, "%u: expected %d, got %d\n", i, td[i].cy, size);
status = GdipBitmapUnlockBits(u.bitmap, &bd);
expect(Ok, status);
GdipDeletePen(pen);
GdipDeleteGraphics(graphics);
GdipDisposeImage(u.image);
}
}
/* Many people on the net ask why there is so much difference in rendered
* text height between gdiplus and gdi32, this test suggests an answer to
* that question. Important: this test assumes that font dpi == device dpi.
@ -5728,6 +5850,7 @@ START_TEST(graphics)
test_measure_string();
test_font_height_scaling();
test_transform();
test_pen_thickness();
test_GdipMeasureString();
test_constructor_destructor();
test_save_restore();