From 6ee26aca16cdfdfa175108d28b49aca6aba7e1e0 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 23 Mar 2015 15:05:25 -0500 Subject: [PATCH] gdiplus: Apply page scale to pen thickness. --- dlls/gdiplus/graphics.c | 1 + dlls/gdiplus/tests/graphics.c | 123 ++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 7485a3c401f..34022cb9533 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -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){ diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index f237090192d..3ee3363d017 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -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();