From ea2a3922c947f7432169372f6c83bb1a42ee90f7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 27 May 2018 04:11:35 +0100 Subject: [PATCH] [GDIPLUS_WINETEST] Sync with Wine Staging 3.9. CORE-14656 --- .../winetests/gdiplus/customlinecap.c | 76 +++++++++++++-- modules/rostests/winetests/gdiplus/graphics.c | 92 +++++++++++++++++++ modules/rostests/winetests/gdiplus/pen.c | 32 +++++++ modules/rostests/winetests/gdiplus/region.c | 38 ++++++++ 4 files changed, 230 insertions(+), 8 deletions(-) diff --git a/modules/rostests/winetests/gdiplus/customlinecap.c b/modules/rostests/winetests/gdiplus/customlinecap.c index bac80adbdb0..e4ec329b935 100644 --- a/modules/rostests/winetests/gdiplus/customlinecap.c +++ b/modules/rostests/winetests/gdiplus/customlinecap.c @@ -17,6 +17,7 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include #include "objbase.h" #include "gdiplus.h" @@ -25,6 +26,22 @@ #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) #define expectf(expected, got) ok(got == expected, "Expected %.2f, got %.2f\n", expected, got) +static BOOL compare_float(float f, float g, unsigned int ulps) +{ + int x = *(int *)&f; + int y = *(int *)&g; + + if (x < 0) + x = INT_MIN - x; + if (y < 0) + y = INT_MIN - y; + + if (abs(x - y) > ulps) + return FALSE; + + return TRUE; +} + static void test_constructor_destructor(void) { GpCustomLineCap *custom; @@ -219,21 +236,40 @@ static void test_scale(void) static void test_create_adjustable_cap(void) { + REAL inset, scale, height, width; GpAdjustableArrowCap *cap; - REAL inset, scale; GpLineJoin join; GpStatus stat; GpLineCap base; + BOOL ret; stat = GdipCreateAdjustableArrowCap(10.0, 10.0, TRUE, NULL); -todo_wine ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat); stat = GdipCreateAdjustableArrowCap(17.0, 15.0, TRUE, &cap); -todo_wine ok(stat == Ok, "Failed to create adjustable cap, %d\n", stat); - if (stat != Ok) - return; + + stat = GdipGetAdjustableArrowCapFillState(cap, NULL); + ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat); + + ret = FALSE; + stat = GdipGetAdjustableArrowCapFillState(cap, &ret); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(ret, "Unexpected fill state %d\n", ret); + + stat = GdipGetAdjustableArrowCapHeight(cap, NULL); + ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat); + + stat = GdipGetAdjustableArrowCapHeight(cap, &height); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(height == 17.0, "Unexpected cap height %f\n", height); + + stat = GdipGetAdjustableArrowCapWidth(cap, NULL); + ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat); + + stat = GdipGetAdjustableArrowCapWidth(cap, &width); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(width == 15.0, "Unexpected cap width %f\n", width); stat = GdipGetAdjustableArrowCapMiddleInset(cap, NULL); ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat); @@ -247,14 +283,41 @@ todo_wine ok(base == LineCapTriangle, "Unexpected base cap %d\n", base); stat = GdipSetCustomLineCapBaseCap((GpCustomLineCap*)cap, LineCapSquare); +todo_wine ok(stat == Ok, "Unexpected return code, %d\n", stat); stat = GdipGetCustomLineCapBaseCap((GpCustomLineCap*)cap, &base); ok(stat == Ok, "Unexpected return code, %d\n", stat); +todo_wine ok(base == LineCapSquare, "Unexpected base cap %d\n", base); + /* Base inset */ + stat = GdipGetAdjustableArrowCapWidth(cap, &width); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + + stat = GdipGetAdjustableArrowCapHeight(cap, &height); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + + inset = 0.0; stat = GdipGetCustomLineCapBaseInset((GpCustomLineCap*)cap, &inset); ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(compare_float(inset, height / width, 1), "Unexpected inset %f\n", inset); + + stat = GdipSetAdjustableArrowCapMiddleInset(cap, 1.0); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + + inset = 0.0; + stat = GdipGetCustomLineCapBaseInset((GpCustomLineCap*)cap, &inset); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(compare_float(inset, height / width, 1), "Unexpected inset %f\n", inset); + + stat = GdipSetAdjustableArrowCapHeight(cap, 2.0 * height); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + + inset = 0.0; + stat = GdipGetCustomLineCapBaseInset((GpCustomLineCap*)cap, &inset); + ok(stat == Ok, "Unexpected return code, %d\n", stat); + ok(compare_float(inset, 2.0 * height / width, 1), "Unexpected inset %f\n", inset); stat = GdipGetCustomLineCapWidthScale((GpCustomLineCap*)cap, &scale); ok(stat == Ok, "Unexpected return code, %d\n", stat); @@ -299,10 +362,7 @@ static void test_captype(void) /* arrow cap */ stat = GdipCreateAdjustableArrowCap(17.0, 15.0, TRUE, &arrowcap); -todo_wine ok(stat == Ok, "Failed to create adjustable cap, %d\n", stat); - if (stat != Ok) - return; stat = GdipGetCustomLineCapType((GpCustomLineCap*)arrowcap, &type); ok(stat == Ok, "Failed to get cap type, %d\n", stat); diff --git a/modules/rostests/winetests/gdiplus/graphics.c b/modules/rostests/winetests/gdiplus/graphics.c index 96df1a2743e..6acc656c8f4 100644 --- a/modules/rostests/winetests/gdiplus/graphics.c +++ b/modules/rostests/winetests/gdiplus/graphics.c @@ -2060,6 +2060,97 @@ static void test_get_set_clip(void) ReleaseDC(hwnd, hdc); } +static void test_clip_xform(void) +{ + GpStatus status; + GpGraphics *graphics = NULL; + HDC hdc = GetDC( hwnd ); + GpRegion *clip; + COLORREF color; + UINT region_data_size; + struct { + DWORD size; + DWORD checksum; + DWORD magic; + DWORD num_children; + DWORD element_type; + REAL x; + REAL y; + REAL width; + REAL height; + } region_data; + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + status = GdipCreateRegion(&clip); + expect(Ok, status); + + status = GdipGraphicsClear(graphics, 0xff000000); + expect(Ok, status); + + status = GdipSetClipRect(graphics, 10, 10, -10, -10, CombineModeReplace); + expect(Ok, status); + status = GdipGetClip(graphics, clip); + expect(Ok, status); + status = GdipGetRegionData(clip, (BYTE*)®ion_data, sizeof(region_data), ®ion_data_size); + expect(Ok, status); + expect(36, region_data_size); + expect(28, region_data.size); + expect(0, region_data.num_children); + expect(0x10000000 /* RegionDataRect */, region_data.element_type); + expectf(0.0, region_data.x); + expectf(0.0, region_data.y); + expectf(10.0, region_data.width); + expectf(10.0, region_data.height); + + /* No effect with negative width/height */ + status = GdipGraphicsClear(graphics, 0xffff0000); + expect(Ok, status); + color = GetPixel(hdc, 5, 5); + expect(0, color); + + status = GdipScaleWorldTransform(graphics, 2.0, 2.0, MatrixOrderAppend); + expect(Ok, status); + + status = GdipGraphicsClear(graphics, 0xffff0000); + expect(Ok, status); + color = GetPixel(hdc, 5, 5); + expect(0, color); + + status = GdipResetClip(graphics); + expect(Ok, status); + status = GdipResetWorldTransform(graphics); + expect(Ok, status); + status = GdipGraphicsClear(graphics, 0xff000000); + expect(Ok, status); + + status = GdipScaleWorldTransform(graphics, 2.0, 2.0, MatrixOrderAppend); + expect(Ok, status); + + status = GdipSetClipRect(graphics, 5, 5, -5, -5, CombineModeReplace); + expect(Ok, status); + status = GdipGetClip(graphics, clip); + expect(Ok, status); + status = GdipGetRegionData(clip, (BYTE*)®ion_data, sizeof(region_data), ®ion_data_size); + expect(Ok, status); + expect(36, region_data_size); + expect(28, region_data.size); + expect(0, region_data.num_children); + expect(0x10000000 /* RegionDataRect */, region_data.element_type); + expectf(0.0, region_data.x); + expectf(0.0, region_data.y); + expectf(5.0, region_data.width); + expectf(5.0, region_data.height); + + status = GdipGraphicsClear(graphics, 0xffff0000); + expect(Ok, status); + color = GetPixel(hdc, 5, 5); + expect(0xff, color); + + GdipDeleteGraphics(graphics); + ReleaseDC(hwnd, hdc); +} + static void test_isempty(void) { GpStatus status; @@ -6713,6 +6804,7 @@ START_TEST(graphics) test_BeginContainer2(); test_transformpoints(); test_get_set_clip(); + test_clip_xform(); test_isempty(); test_clear(); test_textcontrast(); diff --git a/modules/rostests/winetests/gdiplus/pen.c b/modules/rostests/winetests/gdiplus/pen.c index ded6e642eb0..be3d76d6551 100644 --- a/modules/rostests/winetests/gdiplus/pen.c +++ b/modules/rostests/winetests/gdiplus/pen.c @@ -431,6 +431,38 @@ static void test_transform(void) expectf(6.0, values[4]); expectf(3.0, values[5]); + /* Translate */ + status = GdipTranslatePenTransform(NULL, 1.0, -2.0, MatrixOrderAppend); + expect(InvalidParameter, status); + + status = GdipTranslatePenTransform(pen, 1.0, -2.0, MatrixOrderAppend); + expect(Ok, status); + + status = GdipGetPenTransform(pen, matrix); + expect(Ok, status); + status = GdipGetMatrixElements(matrix, values); + expect(Ok, status); + expectf(3.0, values[0]); + expectf(-2.0, values[1]); + expectf(5.0, values[2]); + expectf(2.0, values[3]); + expectf(7.0, values[4]); + expectf(1.0, values[5]); + + status = GdipTranslatePenTransform(pen, -3.0, 5.0, MatrixOrderPrepend); + expect(Ok, status); + + status = GdipGetPenTransform(pen, matrix); + expect(Ok, status); + status = GdipGetMatrixElements(matrix, values); + expect(Ok, status); + expectf(3.0, values[0]); + expectf(-2.0, values[1]); + expectf(5.0, values[2]); + expectf(2.0, values[3]); + expectf(23.0, values[4]); + expectf(17.0, values[5]); + status = GdipResetPenTransform(pen); expect(Ok, status); diff --git a/modules/rostests/winetests/gdiplus/region.c b/modules/rostests/winetests/gdiplus/region.c index 86a2e40fa2f..c2cbff01f69 100644 --- a/modules/rostests/winetests/gdiplus/region.c +++ b/modules/rostests/winetests/gdiplus/region.c @@ -1441,6 +1441,22 @@ static void test_translate(void) ReleaseDC(0, hdc); } +static DWORD get_region_type(GpRegion *region) +{ + DWORD *data; + DWORD size; + DWORD result; + DWORD status; + status = GdipGetRegionDataSize(region, &size); + expect(Ok, status); + data = GdipAlloc(size); + status = GdipGetRegionData(region, (BYTE*)data, size, NULL); + ok(status == Ok || status == InsufficientBuffer, "unexpected status 0x%x\n", status); + result = data[4]; + GdipFree(data); + return result; +} + static void test_transform(void) { GpRegion *region, *region2; @@ -1451,6 +1467,7 @@ static void test_transform(void) GpStatus status; HDC hdc = GetDC(0); BOOL res; + DWORD type; status = GdipCreateFromHDC(hdc, &graphics); expect(Ok, status); @@ -1483,6 +1500,8 @@ static void test_transform(void) status = GdipIsEqualRegion(region, region2, graphics, &res); expect(Ok, status); ok(res, "Expected to be equal.\n"); + type = get_region_type(region); + expect(0x10000003 /* RegionDataInfiniteRect */, type); /* empty */ status = GdipSetEmpty(region); @@ -1497,6 +1516,8 @@ static void test_transform(void) status = GdipIsEqualRegion(region, region2, graphics, &res); expect(Ok, status); ok(res, "Expected to be equal.\n"); + type = get_region_type(region); + expect(0x10000002 /* RegionDataEmptyRect */, type); /* rect */ rectf.X = 10.0; @@ -1516,6 +1537,8 @@ static void test_transform(void) status = GdipIsEqualRegion(region, region2, graphics, &res); expect(Ok, status); ok(res, "Expected to be equal.\n"); + type = get_region_type(region); + expect(0x10000000 /* RegionDataRect */, type); /* path */ status = GdipAddPathEllipse(path, 0.0, 10.0, 100.0, 150.0); @@ -1534,6 +1557,21 @@ static void test_transform(void) status = GdipIsEqualRegion(region, region2, graphics, &res); expect(Ok, status); ok(res, "Expected to be equal.\n"); + type = get_region_type(region); + expect(0x10000001 /* RegionDataPath */, type); + + /* rotated rect -> path */ + rectf.X = 10.0; + rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region, &rectf, CombineModeReplace); + expect(Ok, status); + status = GdipRotateMatrix(matrix, 45.0, MatrixOrderAppend); + expect(Ok, status); + status = GdipTransformRegion(region, matrix); + expect(Ok, status); + type = get_region_type(region); + expect(0x10000001 /* RegionDataPath */, type); status = GdipDeleteRegion(region); expect(Ok, status);