From wine-devel Tue Feb 09 18:13:21 2021 From: Ralf Habacker Date: Tue, 09 Feb 2021 18:13:21 +0000 To: wine-devel Subject: [PATCH v6] gdi32/tests: Add tests for the advanced graphics mode Message-Id: <20210209181321.29253-1-ralf.habacker () freenet ! de> X-MARC-Message: https://marc.info/?l=wine-devel&m=161289442307691 The tests are designed to support an automated mode and an interactive mode. In automated mode, only tests where the angle used is a multiple of pi/4 are performed to increase the chance of matching images created on Windows. In interactive test mode, an image is generated for each test for visual verification. Signed-off-by: Ralf Habacker --- - fix crash dlls/gdi32/tests/dib.c | 430 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) diff --git a/dlls/gdi32/tests/dib.c b/dlls/gdi32/tests/dib.c index bdc3d9ed55b..cb9ae61de2d 100644 --- a/dlls/gdi32/tests/dib.c +++ b/dlls/gdi32/tests/dib.c @@ -3529,11 +3529,441 @@ static void test_simple_graphics(void) DeleteDC(mem_dc); } +typedef struct { + const char *name; + double shear_x; + double angle; + const char *sha1; +} ref_hash_table_entry; + +typedef struct { + HDC dc; + BITMAPINFO *bmi; + BYTE *bits; + HBITMAP dib; + char *hash_dib; + char test_name[1024]; + char save_path[MAX_PATH]; + char hash_name[1024]; + RECT bounds; + double angle; + double shear_x; +} test_data; + +/* generated on Windows 10 */ +static const ref_hash_table_entry ref_hash_table[] = { + { "LineTo", 0.000000, 0.000000, "4fd2ef41c2dfe9e0373d5560e715adcb0996e1e8" }, + { "Rectangle", 0.000000, 0.000000, "7dfd17a8b871745eb3a9835282c4cdea05a4fdf5" }, + { "Ellipse", 0.000000, 0.000000, "7764ca19f379333b001015d2eaba1fdbc9610f91" }, + { "Arc", 0.000000, 0.000000, "fea4743713de7fe8368f037b2d466746c6f2ac08" }, + { "ArcTo", 0.000000, 0.000000, "9b852a42f2bfb034ba7cc5a7c5dee87ac95f3e1f" }, + { "Chord", 0.000000, 0.000000, "221091b6ab38d14cfa6c55723846a91e90931786" }, + { "Pie", 0.000000, 0.000000, "221091b6ab38d14cfa6c55723846a91e90931786" }, + { "FillRect", 0.000000, 0.000000, "877e47e0f729ebf3d104952b43aecf3553a5cf56" }, + { "LineTo", 0.000000, 45.000000, "80844d5f61676fb2ebb73327062a1701896936a0" }, + { "Rectangle", 0.000000, 45.000000, "5a0ae6674ee810a77e2a13cdd31c848bd22bd544" }, + { "Ellipse", 0.000000, 45.000000, "0436cc3a83510ff3225015698139b58550f8173a" }, + { "Arc", 0.000000, 45.000000, "64e2e1b3fb6193967d6b0cebc035005e31482ff0" }, + { "ArcTo", 0.000000, 45.000000, "765509b0d3eb2948695cf6943f72e748b586f82c" }, + { "Chord", 0.000000, 45.000000, "e46c2b398042b50f982d476d497b6e6df4f2e28e" }, + { "Pie", 0.000000, 45.000000, "e46c2b398042b50f982d476d497b6e6df4f2e28e" }, + { "FillRect", 0.000000, 45.000000, "037c5c46a074199cbb8a0dc437ff8070adcf0857" }, + { "LineTo", 0.000000, 135.000000, "55bbdaaa60cd5cd6060de6ae74aefce5a5905981" }, + { "Rectangle", 0.000000, 135.000000, "93076b33a2f4f4c1deb1a9cda02198256189dd26" }, + { "Ellipse", 0.000000, 135.000000, "158c242f8fd8201aea9db5d2cbbb8df66d9bb84a" }, + { "Arc", 0.000000, 135.000000, "36e4fc5f5b8ebca82ff7f1bf9e44fcca2bea2fb4" }, + { "ArcTo", 0.000000, 135.000000, "d77507e50bb8b1c9f47e2cad3c2736a86b3a1c2e" }, + { "Chord", 0.000000, 135.000000, "dd0cee27348ae37e06fee0d94210c22eae21a048" }, + { "Pie", 0.000000, 135.000000, "dd0cee27348ae37e06fee0d94210c22eae21a048" }, + { "FillRect", 0.000000, 135.000000, "bc6e6959ce46c428aaa131319a9c812e4152853a" }, + { "LineTo", 0.000000, 180.000000, "1d6de1d092eae2e7ebb258694ffb151e9d1aa7b7" }, + { "Rectangle", 0.000000, 180.000000, "df184a46b2ba9c590c87e2f714098b8900ad04d6" }, + { "Ellipse", 0.000000, 180.000000, "c3384f3878407b66e44dbc653b862717e2bf0757" }, + { "Arc", 0.000000, 180.000000, "d8973a8ad0b3addd277b1000704632df4238b947" }, + { "ArcTo", 0.000000, 180.000000, "0cdc9ec20534887fc7af2142f085d2f8b82328bc" }, + { "Chord", 0.000000, 180.000000, "fdbe8ed965ef07376481ee1eb6cfd070e851bcac" }, + { "Pie", 0.000000, 180.000000, "fdbe8ed965ef07376481ee1eb6cfd070e851bcac" }, + { "FillRect", 0.000000, 180.000000, "094f61b22c7e89588387a7c699dcc675d51b2d91" }, + + { "LineTo", 0.100000, 0.000000, "baa3c953aa781a0ae454225c56fc8f9197a9e34e" }, + { "Rectangle", 0.100000, 0.000000, "bc3eb8b8e43f53043cb906b94987702724c1d5db" }, + { "Ellipse", 0.100000, 0.000000, "8ec7278136f64b773e4796c7bc189e68e24db2e6" }, + { "Arc", 0.100000, 0.000000, "b339b7623a66268184bff55692e51308bbfa507c" }, + { "ArcTo", 0.100000, 0.000000, "15aaf44926d59ecf1da6ceb2ce09f0963c7e5390" }, + { "Chord", 0.100000, 0.000000, "a6c63982ac7344e63228c2c42d7143cdd7d8db39" }, + { "Pie", 0.100000, 0.000000, "a6c63982ac7344e63228c2c42d7143cdd7d8db39" }, + { "FillRect", 0.100000, 0.000000, "f67c061ce20cfc04f981df9741b6e3c24bae1ebf" }, + { "LineTo", 0.100000, 45.000000, "0e2445a6cbaf29d34a81ba97c830a65dc9335f23" }, + { "Rectangle", 0.100000, 45.000000, "689c1cb2bd1e6e7a5aefb07e9fabf79c10263866" }, + { "Ellipse", 0.100000, 45.000000, "393020c0a32b96a8425b0a8a1bbd232189310d45" }, + { "Arc", 0.100000, 45.000000, "e3fdaf73aa95ebcd28856d65c4e4f6238ca5a5ca" }, + { "ArcTo", 0.100000, 45.000000, "da003ea969d1bde1145605533dfd765350e68d9d" }, + { "Chord", 0.100000, 45.000000, "7919d114493f7f83e500f2866a786f6d9cdeb147" }, + { "Pie", 0.100000, 45.000000, "7919d114493f7f83e500f2866a786f6d9cdeb147" }, + { "FillRect", 0.100000, 45.000000, "41e4a69344a66012a919e2b27bd8f5d27bacab04" }, + { "LineTo", 0.100000, 90.000000, "b9877b0324c5d8d9e9a86e09c9176effd6af2e69" }, + { "Rectangle", 0.100000, 90.000000, "c9ed79cce52372b0bef9960b0069ab09c5f15379" }, + { "Ellipse", 0.100000, 90.000000, "0e3206af4e0a8793d020fbcfff5308d62d9a9bbd" }, + { "Arc", 0.100000, 90.000000, "8f63bba05d73f7659bd5d6b0197f23fa2b936296" }, + { "ArcTo", 0.100000, 90.000000, "22ca17fe3d517c2c0551e93e904a7a3aa1eb0a3a" }, + { "Chord", 0.100000, 90.000000, "a6ac92337383b50cddee9353c8e5d0180ec0b179" }, + { "Pie", 0.100000, 90.000000, "a6ac92337383b50cddee9353c8e5d0180ec0b179" }, + { "FillRect", 0.100000, 90.000000, "99f4cbdb52964d928dba5df88f99718c630d8466" }, + { "LineTo", 0.100000, 135.000000, "55bbdaaa60cd5cd6060de6ae74aefce5a5905981" }, + { "Rectangle", 0.100000, 135.000000, "c48e983ed0a1227ce0fad88eddfc006f855bd3ba" }, + { "Ellipse", 0.100000, 135.000000, "6131ee3c533de430de646cbb1ccb4d2de589bca7" }, + { "Arc", 0.100000, 135.000000, "48d7c821537f999b0262962af2d18f393fdbed22" }, + { "ArcTo", 0.100000, 135.000000, "3f2f0ab0bb18d8d69f46edf4b2aaf674cab29918" }, + { "Chord", 0.100000, 135.000000, "c565f5b7c0278fba5857440f0e1a6ee343e190ff" }, + { "Pie", 0.100000, 135.000000, "c565f5b7c0278fba5857440f0e1a6ee343e190ff" }, + { "FillRect", 0.100000, 135.000000, "3c478057a81e481615f80f065ea4a1d4f8802021" }, + { "LineTo", 0.100000, 180.000000, "22bdb237d85c07bb4562b3986b0e2ec4ad5b8a90" }, + { "Rectangle", 0.100000, 180.000000, "9ce44b82738e8a6d1953afde80236b24951678ee" }, + { "Ellipse", 0.100000, 180.000000, "5cec57ec097586fc5275fc8778fb635a4df65d32" }, + { "Arc", 0.100000, 180.000000, "993e236ffb96abcc5e0e2ce6b8eaa75e05921333" }, + { "ArcTo", 0.100000, 180.000000, "2ca8064a14bfb062fa3d4024eebcd7cc94665455" }, + { "Chord", 0.100000, 180.000000, "072c89c1a2595d8e99eefd69bf7f2c1929934c99" }, + { "Pie", 0.100000, 180.000000, "072c89c1a2595d8e99eefd69bf7f2c1929934c99" }, + { "FillRect", 0.100000, 180.000000, "9dd444be3937fcd9ff414dc2b8c9186e45697076" }, +/* interactive */ + { "LineTo", 0.000000, 30.000000, "5b114b9b7d5422dac77508cf561e9f46b779c63a" }, + { "Rectangle", 0.000000, 30.000000, "71a1ba67b6c8b96bb0785734f6e59759167f311c" }, + { "Ellipse", 0.000000, 30.000000, "095e6add22e8e850304152b009aad03070f5700c" }, + { "Arc", 0.000000, 30.000000, "8c7f9bf14d68c263fd0be427628ad5a47af5ab92" }, + { "ArcTo", 0.000000, 30.000000, "7d6b7c8589b6beee073cfc7f30ee7a66092630d0" }, + { "Chord", 0.000000, 30.000000, "b182fa35ffc3b63d415c3024333799c6b4195aaa" }, + { "Pie", 0.000000, 30.000000, "b182fa35ffc3b63d415c3024333799c6b4195aaa" }, + { "FillRect", 0.000000, 30.000000, "79f54ab207afeb8fb7ccc64dd222cae3d43c0454" }, + { "LineTo", 0.000000, 60.000000, "d59a48a4cc8b528ee23c598df4163ae451240582" }, + { "Rectangle", 0.000000, 60.000000, "8f203b915de9942751c6c7dbe64eeff9617dce6e" }, + { "Ellipse", 0.000000, 60.000000, "fdeba07d4e07787b9c014097123b19e173272564" }, + { "Arc", 0.000000, 60.000000, "1fe918dc0349de6fb8b25c7dfb453e5039868f07" }, + { "ArcTo", 0.000000, 60.000000, "490fef90e731d2745826167f851bfedfedb17c32" }, + { "Chord", 0.000000, 60.000000, "76e4c30a8031f41f5a4c4eb3025306ca72856179" }, + { "Pie", 0.000000, 60.000000, "76e4c30a8031f41f5a4c4eb3025306ca72856179" }, + { "FillRect", 0.000000, 60.000000, "a7f00485c5ca9f772b1ea6df15bfbb191e088af4" }, + { "LineTo", 0.000000, 90.000000, "d555e5a94fdb7cd438bf791bb5496660e6f5b3e4" }, + { "Rectangle", 0.000000, 90.000000, "53f1de2c148917affcffe25901427de2528d1f33" }, + { "Ellipse", 0.000000, 90.000000, "77f7068eff91ba547a277e7f1cf1c6b0c58feece" }, + { "Arc", 0.000000, 90.000000, "0100a40d978d3468c3869efb28ee78b79e9ac28c" }, + { "ArcTo", 0.000000, 90.000000, "fa33a4bf59af3fec4cf1af0caf740134e701587c" }, + { "Chord", 0.000000, 90.000000, "5f51b144f123ac82d4ceb061a763af7718d0ad57" }, + { "Pie", 0.000000, 90.000000, "5f51b144f123ac82d4ceb061a763af7718d0ad57" }, + { "FillRect", 0.000000, 90.000000, "4c97c178892098154a78749576917f1974ae0642" }, + { "LineTo", 0.000000, 120.000000, "ea59644b1f5908c44cb7cade4d474a2f714d6f2d" }, + { "Rectangle", 0.000000, 120.000000, "758787fe602d117d65cc46301b24756f1e72c4eb" }, + { "Ellipse", 0.000000, 120.000000, "47f873ebc9ca562bbf790ef338a22d4ef3849d91" }, + { "Arc", 0.000000, 120.000000, "772a592aa7e9069900de5e6e4c13c7823e4531e4" }, + { "ArcTo", 0.000000, 120.000000, "9785fdd2df63e702da0ce66a855744d82a4f7370" }, + { "Chord", 0.000000, 120.000000, "72790e3be1f5d3df5578c7451345317d766ec303" }, + { "Pie", 0.000000, 120.000000, "72790e3be1f5d3df5578c7451345317d766ec303" }, + { "FillRect", 0.000000, 120.000000, "d14f7b3ab63bf89eb2d8e0deaf103c65ad7b79a3" }, + { "LineTo", 0.000000, 150.000000, "371daccf7add2bce0de8b0ec20f1e5ac7379d4ca" }, + { "Rectangle", 0.000000, 150.000000, "cb046a9299e337e6bdc270986a1006df81608650" }, + { "Ellipse", 0.000000, 150.000000, "599a5bec049aeeb004bf1a2ccde88fc8729a2726" }, + { "Arc", 0.000000, 150.000000, "3c58506a6700bd99235a0353a35dacc7249485f0" }, + { "ArcTo", 0.000000, 150.000000, "f59ca59f92a63a97744761e1ec3717077d0f9442" }, + { "Chord", 0.000000, 150.000000, "27d2c9dbe9675d70cb0c429802da9d2e44385de0" }, + { "Pie", 0.000000, 150.000000, "27d2c9dbe9675d70cb0c429802da9d2e44385de0" }, + { "FillRect", 0.000000, 150.000000, "a807bffafaa74d092a1f23131c09b72a79c9164b" }, + { "LineTo", 0.100000, 30.000000, "5283bbbde19515586bd08d6008adedb1e391c946" }, + { "Rectangle", 0.100000, 30.000000, "9f75a948bfdad207aeaf9854298b0fbfbe017fe9" }, + { "Ellipse", 0.100000, 30.000000, "8c7a7b0c3f5c0fe5f42f25a4d78ff3525438e82b" }, + { "Arc", 0.100000, 30.000000, "70895f509313460a6641c3f25582fc68c9ba5652" }, + { "ArcTo", 0.100000, 30.000000, "f566a8ac08c9f9e36e77e16c9f952721d6822d6b" }, + { "Chord", 0.100000, 30.000000, "fc3bdc578bbc8a33ca01acb52bcb4be866d98868" }, + { "Pie", 0.100000, 30.000000, "fc3bdc578bbc8a33ca01acb52bcb4be866d98868" }, + { "FillRect", 0.100000, 30.000000, "b4fbb4d12ee61e10289082ffaa4cd58ff9271ee2" }, + { "LineTo", 0.100000, 60.000000, "3fa54cd80b94d7e61c677dcbaefb927612679c15" }, + { "Rectangle", 0.100000, 60.000000, "6415184eeeeb985db2049e4bf8be869397db26cc" }, + { "Ellipse", 0.100000, 60.000000, "007e094d6db47745d8436086a0a24e9da98b5137" }, + { "Arc", 0.100000, 60.000000, "719b81e32e2672a0f3adcf4d095d68033d60f4c1" }, + { "ArcTo", 0.100000, 60.000000, "266cdf1829837a92dc525fde5b281577f22f62d2" }, + { "Chord", 0.100000, 60.000000, "0c56b384011f96bc309a4bc1cbed08fec51b9d5a" }, + { "Pie", 0.100000, 60.000000, "0c56b384011f96bc309a4bc1cbed08fec51b9d5a" }, + { "FillRect", 0.100000, 60.000000, "e203834924cac7929a998b8ee4914943b94b8f7b" }, + { "LineTo", 0.100000, 120.000000, "5a218e4533c11f0137813a483b83469e5bc9f272" }, + { "Rectangle", 0.100000, 120.000000, "0630eb459f6c5634a96567537eb7add9c062f7ff" }, + { "Ellipse", 0.100000, 120.000000, "9823b51b405b5ae7647f2fd33491397a06a13644" }, + { "Arc", 0.100000, 120.000000, "f163d0fc823cb00dfca7e9d86ad316c3df5dc7b0" }, + { "ArcTo", 0.100000, 120.000000, "8b4a52c051b4cd36841b68ed419d0981ac214c29" }, + { "Chord", 0.100000, 120.000000, "d5c8ad44f3a4a7e37df1b58ce35565aa6fb81938" }, + { "Pie", 0.100000, 120.000000, "d5c8ad44f3a4a7e37df1b58ce35565aa6fb81938" }, + { "FillRect", 0.100000, 120.000000, "111163a546305f3dfff58f447bf763a1f8690064" }, + { "LineTo", 0.100000, 150.000000, "837dba89923d94d1a8ce3bc8fe73e6a65b058299" }, + { "Rectangle", 0.100000, 150.000000, "535fea9f81dc44394326f2e499926d9e4e5ef095" }, + { "Ellipse", 0.100000, 150.000000, "5c2d6ba0dd1e81a32fbfa07652bfd21a3b5620f7" }, + { "Arc", 0.100000, 150.000000, "fa40fec084b7c9a641a75e8c6ae2a9b74cb36adc" }, + { "ArcTo", 0.100000, 150.000000, "7a0d70cef05dfeed94f74e5cfe16f70955c3fbf5" }, + { "Chord", 0.100000, 150.000000, "ef0d60b2152b399c44bb4cb0b793799e9759c277" }, + { "Pie", 0.100000, 150.000000, "ef0d60b2152b399c44bb4cb0b793799e9759c277" }, + { "FillRect", 0.100000, 150.000000, "062ee355971a58a72746747c9fce17ef9bf24ecb" }, + { NULL, 0.0, 0.0, NULL }, +}; + +static double radians ( double d ) +{ + return d * M_PI / 180; +} + +static BOOL save_bitmap_to_file( HBITMAP handle_bitmap, LPSTR file_name ) +{ + HDC dc; + int bits; + WORD bit_count; + DWORD palette_size = 0, bm_bits_size = 0, dib_size = 0, written = 0; + BITMAP bitmap; + BITMAPFILEHEADER bitmap_file_header; + BITMAPINFOHEADER bi; + LPBITMAPINFOHEADER lpbi; + HANDLE fh, handle_pal, handle_old_pal = NULL; + + dc = CreateDCA( "DISPLAY", NULL, NULL, NULL) ; + bits = GetDeviceCaps( dc, BITSPIXEL ) * GetDeviceCaps( dc, PLANES ); + DeleteDC( dc) ; + if (bits <= 1) + bit_count = 1; + else if (bits <= 4) + bit_count = 4; + else if (bits <= 8) + bit_count = 8; + else + bit_count = 24; + GetObjectA( handle_bitmap, sizeof(bitmap), (LPSTR)&bitmap) ; + bi.biSize = sizeof(BITMAPINFOHEADER); + bi.biWidth = bitmap.bmWidth; + bi.biHeight = -bitmap.bmHeight; + bi.biPlanes = 1; + bi.biBitCount = bit_count; + bi.biCompression = BI_RGB; + bi.biSizeImage = 0; + bi.biXPelsPerMeter = 0; + bi.biYPelsPerMeter = 0; + bi.biClrImportant = 0; + bi.biClrUsed = 256; + bm_bits_size = ((bitmap.bmWidth * bit_count + 31) & ~31) / 8 * bitmap.bmHeight; + lpbi = (LPBITMAPINFOHEADER)HeapAlloc( GetProcessHeap(), 0, bm_bits_size + palette_size + sizeof(BITMAPINFOHEADER)) ; + *lpbi = bi; + + handle_pal = GetStockObject( DEFAULT_PALETTE ); + if ( handle_pal ) + { + dc = GetDC( NULL ); + handle_old_pal = SelectPalette( dc, (HPALETTE)handle_pal, FALSE ); + RealizePalette( dc ); + } + + GetDIBits( dc, handle_bitmap, 0, (UINT)bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + + palette_size, (BITMAPINFO *)lpbi, DIB_RGB_COLORS ); + + if ( handle_old_pal ) + { + SelectPalette( dc, (HPALETTE)handle_old_pal, TRUE ); + RealizePalette (dc ); + ReleaseDC( NULL, dc ); + } + + fh = CreateFileA( file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + + if ( fh == INVALID_HANDLE_VALUE ) + return FALSE; + + bitmap_file_header.bfType = 0x4D42; /* "BM" */ + dib_size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + palette_size + bm_bits_size; + bitmap_file_header.bfSize = dib_size; + bitmap_file_header.bfReserved1 = 0; + bitmap_file_header.bfReserved2 = 0; + bitmap_file_header.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + palette_size; + + WriteFile( fh, (LPSTR)&bitmap_file_header, sizeof(BITMAPFILEHEADER), &written, NULL ); + WriteFile( fh, (LPSTR)lpbi, dib_size, &written, NULL ); + + HeapFree( GetProcessHeap(), 0, lpbi ); + CloseHandle( fh ); + return TRUE; +} + +static void set_transform( HDC dc, RECT *bounds, double angle, double shear_x ) +{ + XFORM xf; + double r = radians( angle ); + xf.eM11 = cos( r ) + sin( r ) * shear_x; + xf.eM22 = cos( r ); + xf.eM12 = -sin( r ); + xf.eM21 = sin( r ) + cos( r ) * shear_x; + xf.eDx = ( bounds->right - bounds->left ) / 4; + xf.eDy = ( bounds->bottom - bounds->top ) / 4; + SetWorldTransform( dc, &xf ); +} + +static void init( test_data *td, const char *test_name ) +{ + sprintf( td->test_name, "%s", test_name ); + sprintf( td->save_path, "%s-%3.1f-%2.1f.bmp", td->test_name, td->shear_x, td->angle ); + sprintf( td->hash_name, "\"%s\", %3.1f, %2.1f", td->test_name, td->shear_x, td->angle ); + reset_bits( td->dc, td->bmi, td->bits ); + MoveToEx( td->dc, -5, 0, NULL ); + LineTo( td->dc, 5, 0 ); + MoveToEx( td->dc, 0, 5, NULL ); + LineTo( td->dc, 0, -5 ); +} + +static const char *find_hash( test_data *td ) +{ + const ref_hash_table_entry *p = ref_hash_table; + for( ; p->name != NULL; p++ ) { + if ( strcmp( p->name, td->test_name ) != 0 + || p->shear_x != td->shear_x + || p->angle != td->angle ) + continue; + return p->sha1; + } + return NULL; +} + +static void check_hash( test_data *td ) +{ + const char *hash; + if ( td->hash_dib ) + HeapFree( GetProcessHeap(), 0, td->hash_dib ); + td->hash_dib = hash_dib( td->dc, td->bmi, td->bits ); + hash = find_hash( td ); + if ( hash == NULL) + skip( "{ \"%s\", %lf, %lf, \"%s\" },\n", td->test_name, td->shear_x, td->angle, td->hash_dib ); + else if( strcmp( td->hash_dib, hash ) != 0 ) { + ok( FALSE, "%s: expected hash %s got %s\n", td->hash_name, hash, td->hash_dib ); + } + if ( winetest_interactive ) { + trace( "image saved as '%s'\n", td->save_path ); + save_bitmap_to_file( td->dib, td->save_path ); + } +} + +static void test_gdi_advanced( test_data *td, double angle, double shear_x ) +{ + char bmibuf[sizeof( BITMAPINFO ) + 256 * sizeof( RGBQUAD )]; + HBITMAP orig_bm; + HPALETTE default_palette, old_hpal; + RECT r; + + td->bmi = ( BITMAPINFO * )bmibuf; + td->dc = CreateCompatibleDC( NULL ); + td->angle = angle; + td->shear_x = shear_x; + + SetGraphicsMode( td->dc, GM_ADVANCED ); + set_transform( td->dc, &td->bounds, td->angle, td->shear_x); + + memset( td->bmi, 0, sizeof( bmibuf )); + td->bmi->bmiHeader.biSize = sizeof( td->bmi->bmiHeader ); + td->bmi->bmiHeader.biHeight = td->bounds.right; + td->bmi->bmiHeader.biWidth = td->bounds.bottom; + td->bmi->bmiHeader.biBitCount = 32; + td->bmi->bmiHeader.biPlanes = 1; + td->bmi->bmiHeader.biCompression = BI_RGB; + + td->dib = CreateDIBSection( 0, td->bmi, DIB_RGB_COLORS, ( void** )&( td->bits ), NULL, 0 ); + orig_bm = SelectObject( td->dc, td->dib ); + + default_palette = create_default_palette( 8 ); + old_hpal = SelectPalette( td->dc, default_palette, FALSE ); + + current_bounds = &td->bounds; + SetBoundsRect( td->dc, &td->bounds, DCB_SET ); + + SetRect( &r, 0, 0, 128, 128 ); + + init( td, "LineTo" ); + MoveToEx( td->dc, r.left, r.top, NULL ); + LineTo( td->dc, r.right, r.bottom ); + check_hash( td ); + + init( td, "Rectangle" ); + ok( Rectangle( td->dc, r.left, r.top, r.right, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "Ellipse" ); + ok( Ellipse( td->dc, r.left, r.top, r.right, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "Arc" ); + ok( Arc( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "ArcTo" ); + ok( ArcTo( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "Chord" ); + ok( Chord( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "Pie" ); + ok( Pie( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name ); + check_hash( td ); + + init( td, "FillRect" ); + ok( FillRect( td->dc, &r, GetStockObject( WHITE_BRUSH )), td->test_name ); + check_hash( td ); + + SelectObject( td->dc, orig_bm ); + DeleteObject( td->dib ); + SelectPalette( td->dc, old_hpal, FALSE ); + DeleteDC( td->dc ); +} + +static void test_advanced_graphics( void ) +{ + test_data _test_data; + test_data *td = &_test_data; + int save = winetest_mute_threshold; + winetest_mute_threshold = 256; + + td->bounds.left = 0; + td->bounds.top = 0; + td->bounds.right = 256; + td->bounds.bottom = 256; + + if ( !winetest_interactive ) + trace("advanced graphics mode: Use environment variable WINETEST_INTERACTIVE=1 to get images\n"); + + trace("advanced graphics mode: no shear\n"); + test_gdi_advanced( td, 0, 0.0 ); + test_gdi_advanced( td, 45, 0.0 ); + test_gdi_advanced( td, 90, 0.0 ); + test_gdi_advanced( td, 135, 0.0 ); + test_gdi_advanced( td, 180, 0.0 ); + + if ( winetest_interactive ) { + test_gdi_advanced( td, 30, 0.0 ); + test_gdi_advanced( td, 60, 0.0 ); + test_gdi_advanced( td, 120, 0.0 ); + test_gdi_advanced( td, 150, 0.0 ); + } + + trace("advanced graphics mode: with shear\n"); + test_gdi_advanced( td, 0, 0.1 ); + test_gdi_advanced( td, 45, 0.1 ); + test_gdi_advanced( td, 90, 0.1 ); + test_gdi_advanced( td, 135, 0.1 ); + test_gdi_advanced( td, 180, 0.1 ); + + if ( winetest_interactive ) { + test_gdi_advanced( td, 30, 0.1 ); + test_gdi_advanced( td, 60, 0.1 ); + test_gdi_advanced( td, 120, 0.1 ); + test_gdi_advanced( td, 150, 0.1 ); + } + winetest_mute_threshold = save; +} + START_TEST(dib) { CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); test_simple_graphics(); + test_advanced_graphics(); CryptReleaseContext(crypt_prov, 0); } -- 2.26.2