gdiplus: Apply page scale to pen thickness.
Vincent Povirk
madewokherd at gmail.com
Mon Mar 23 15:10:05 CDT 2015
-------------- next part --------------
From 944631f50a66462c9814571fe6a05f7e09fa8f5f Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
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 7485a3c..34022cb 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 f237090..3ee3363 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();
--
2.1.0
More information about the wine-patches
mailing list