gdi32/tests: Add tests for SetPixel.
[wine] / dlls / gdi32 / tests / dib.c
1 /*
2  * DIB driver tests.
3  *
4  * Copyright 2011 Huw Davies
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <math.h>
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wingdi.h"
28 #include "winuser.h"
29 #include "wincrypt.h"
30 #include "mmsystem.h" /* DIBINDEX */
31
32 #include "wine/test.h"
33
34 static HCRYPTPROV crypt_prov;
35 static BOOL (WINAPI *pGdiAlphaBlend)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
36 static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
37
38 static const DWORD rop3[256] =
39 {
40     0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
41     0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
42     0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
43     0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
44     0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
45     0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
46     0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
47     0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
48     0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
49     0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
50     0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
51     0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
52     0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
53     0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
54     0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
55     0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
56     0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
57     0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
58     0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
59     0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
60     0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
61     0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
62     0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
63     0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
64     0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
65     0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
66     0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
67     0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
68     0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
69     0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
70     0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
71     0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
72 };
73
74 static inline BOOL rop_uses_src(DWORD rop)
75 {
76     return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
77 }
78
79 static const char *sha1_graphics_a8r8g8b8[] =
80 {
81     "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
82     "2426172d9e8fec27d9228088f382ef3c93717da9",
83     "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
84     "664fac17803859a4015c6ae29e5538e314d5c827",
85     "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
86     "fe6cc678fb13a3ead67839481bf22348adc69f52",
87     "d51bd330cec510cdccf5394328bd8e5411901e9e",
88     "df4aebf98d91f11be560dd232123b3ae327303d7",
89     "f2af53dd073a09b1031d0032d28da35c82adc566",
90     "eb5a963a6f7b25533ddfb8915e70865d037bd156",
91     "c387917268455017aa0b28bed73aa6554044bbb3",
92     "dcae44fee010dbf7a107797a503923fd8b1abe2e",
93     "6c530622a025d872a642e8f950867884d7b136cb",
94     "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
95     "b2261353decda2712b83538ab434a49ce21f3172",
96     "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
97     "9b9874c1c1d92afa554137e191d34ea33acc322f",
98     "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
99     "d7398de15b2837a58a62a701ca1b3384625afec4",
100     "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
101     "5246ef357e7317b9d141a3294d300c195da76cb7",
102     "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
103     "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
104     "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
105     "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
106     "e358efb1c11172e40855de620bdb8a8e545cd790",
107     "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
108     "58806549380c964e7a53ad54821d2eb86fa5b9ce",
109     "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
110     "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
111     "8a010d4c5af51fcc34d51be3197878782bdf63e7",
112     "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
113     "41bcc1f57c60bdec3c4d1e749084a12867f91224",
114     "94645300d6eb51020a7ef8261dee2941cd51b5df",
115     "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
116     "21cdfde38ac7edbb241ec83d82f31286e90c4629",
117     "1fd2f4dcb62f8522171872e43fd4a35041d68100",
118     "68c18db6abfda626cab12d198298d4c39264bfbc",
119     "6b59ae6c20749020ad43175e05110dc33b6a59b5",
120     "39c31de73aafcfcadf0bf414da4495be9de54417",
121     "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
122     "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
123     "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
124     "e71d6bb9bd38eea5719f8ba57177997910e2d841",
125     "3d2ccbe51408232a04769546b1bdd74f84558a41",
126     "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
127     "d7085333becdec7759a5229e5fe9ba1e11db0c22",
128     "aaf62842bb98d8a2945c4f643baf50afaeea9307",
129     "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
130     "d7dd4700f49808541bba99244b7eb5840e0a2439",
131     "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
132     "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
133     "257d114354a93e681225072bcde756f155b70496",
134     "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
135     NULL
136 };
137
138 static const char *sha1_graphics_a8b8g8r8[] =
139 {
140     "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
141     "e0bc877697093ed440e125154e247ca9d65e933c",
142     "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
143     "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
144     "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
145     "b91c8f21cc4d7994abc551feff5b6927d267a9db",
146     "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
147     "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
148     "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
149     "b753ebb39d90210cc717f57b53dd439f7de6b077",
150     "38c017dd1fff26b492a57e09f3ce2c4370faf225",
151     "94368cea5033b435454daa56d55546310675131e",
152     "bf57a6a37fb107d29ed3d45695919887abcb7902",
153     "3db0f8bcca3d94920aa57be6321202b8c3c08822",
154     "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
155     "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
156     "b0178632775d29bec2b16de7b9b8287115c40d0f",
157     "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
158     "3369889a67d6c79a24ee15f7d14374f9995215e4",
159     "473a1fd07df800c87a5d3286b642ace10c61c6af",
160     "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
161     "b8951d2b20518fd129e5113a5f429626893913bf",
162     "4851c5b7d5bc18590e787c0c218a592ef504e738",
163     "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
164     "abdf003699364fe45fab7dc61e67c606d0063b40",
165     "89abaadff4e68c738cf9251c51e3609564843381",
166     "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
167     "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
168     "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
169     "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
170     "71b9756fdfeedce1e6db201176d21a981b881662",
171     "5319528d9af750c172ae62ee85ddb2eaef73b193",
172     "b7ce8aa3c328eedaed7306234ed9bae67708e627",
173     "19b32a0daa91201725b5e13820c343d0a84ff698",
174     "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
175     "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
176     "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
177     "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
178     "8566c1110ab5cb8f754787b47923c8bff38f790c",
179     "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
180     "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
181     "d01071c44259adc94b89978b7d51a058b6dad665",
182     "e6d33b106bcda374e662d338c57a457dbcaa108a",
183     "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
184     "339908a568f384e1f384a3e1b0dd415779203b02",
185     "88fd743d00bd37d2ed722092146795b044d08a6e",
186     "c0537ec24147e74939219213d864ee113cad9967",
187     "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
188     "7cb51f6c5f1dae926601986c934533df5f8baa9f",
189     "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
190     "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
191     "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
192     "2c4f116451b571106beba8b85da8e4b923937246",
193     "9c8f3063504a81bbbfa8558e111c63d8bc36dbbf",
194     NULL
195 };
196
197 static const char *sha1_graphics_r10g10b10[] =
198 {
199     "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
200     "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
201     "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
202     "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
203     "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
204     "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
205     "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
206     "0ad27de0c916c073d0d18484fff899bbdb258db7",
207     "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
208     "b00f0b4448be722d1a19ffe33aaaac4df848d397",
209     "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
210     "2986b431a0022153e5f875da77cc792e3825ebd5",
211     "ca4b25a5459885ce1e0a36844612087893d425b1",
212     "181bd4616796d89174cedc0332fb320b65aeb0e2",
213     "6c417b1798ee319eeb404efe4aa136ed7ed37966",
214     "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
215     "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
216     "536eaaa901d652805a8977ecb2dc73f651094c5b",
217     "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
218     "92cddcabf5365eef1e037f488af52b31669d987f",
219     "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
220     "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
221     "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
222     "d578210815e27fe210eb678a71e6d22ba4b4c196",
223     "c7a027c7079dfcc831ca8bc134a509958273073c",
224     "19cf978596195b848df8709aaf637f83f92b8336",
225     "798a835fe50156eeb478c0a6085b088f53409d52",
226     "86ddf268d854f37e5b478c48792b551b57635db6",
227     "8259d388e02542207b6a08d65d553871ce1c4a09",
228     "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
229     "66f8d78d4971934794478afee28b3a50e97f1b82",
230     "b8f16334bdced439e1c6fc69704bc95f7b46b147",
231     "63798fb175afef78fa8fe8133d9de97a0cc80651",
232     "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
233     "1ceb85697f649a62b1753438daa14944af7f450c",
234     "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
235     "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
236     "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
237     "63c1c6c63e82f3b8bd977a1381b248e05321394d",
238     "ada202d2f526f6995f83412479891c1764b66e5a",
239     "68348e8f54883f4fe295354b024e291c85f1038f",
240     "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
241     "e9167564031ead3459eee6a3ebb2f58f100d931f",
242     "d39315a1399639f6d4305a342c9ccf02a463b0dd",
243     "46196f50297260df2863e2fa76d2dfcf72006c23",
244     "0790585dfaef94f912b1ee81477d4ac448708708",
245     "589fb8a85d924ad19ed78409ae89475ba479c30a",
246     "43d67bc61ef54014b022891e5c024fc24b1fe797",
247     "e8783644428b637adbe80bcd084a33428cb69983",
248     "fc0c32afb719295f28bcfef22803bef94f798e20",
249     "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
250     "d3f08946300e1700865042aed121870e292d1095",
251     "abb56db94becb64d663b51f0ea6b4bd535a88ba0",
252     "3a81fe558c69ca0aea7e7191771ed86cf4321a5a",
253     NULL
254 };
255
256 static const char *sha1_graphics_r6g6b6[] =
257 {
258     "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
259     "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
260     "5b9dab3d8411afb25fbbeba0313db526815ac189",
261     "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
262     "2028d1b0d1acef35dc07027135023f35fb9746b9",
263     "378713720dcb5aadb730435ad0989a68ab189114",
264     "084152773feb01a85df6006f2f4f288a1442d37a",
265     "97b824953f60fc9a91028045baacbe7b7dc82b14",
266     "f33b1931f392bd09b3494efc23cf7d0ed3071014",
267     "287d755448e72e29e4812193e2b6f8098a214d82",
268     "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
269     "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
270     "e51bcf80211cd06e7d10225534b7a79b5454be27",
271     "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
272     "0b94e0a5b739ab0020130646522e53da35a149ad",
273     "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
274     "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
275     "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
276     "084607a5c99a84140d93db57d1b0f3a0f51afdac",
277     "2128157e601ef0d6b3636b7387d3b28e876de728",
278     "8bdcdcd463f0052279d070ac763757f4db975483",
279     "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
280     "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
281     "66b130f83381957cfc4763558c5f5cddf2e3b564",
282     "d548135ce2320499277ce12b80bc35004f8a9787",
283     "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
284     "1906ddfd829e735af49245171f8eb7673295d399",
285     "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
286     "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
287     "defd95a10d44cad6e736542920b74efd53e9e7eb",
288     "eaccd012c0fc46e79cae1997ef101979e5654d8d",
289     "3f11a735e52030aa3d0f024d83803698293d10e5",
290     "82f45c5a34fbb9e36d947a876834d33a1f69719c",
291     "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
292     "3231c4d87faefb7ec5bd377613969c05b70343fc",
293     "00394e438e9edde978e88602c9ad2a572e965bf6",
294     "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
295     "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
296     "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
297     "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
298     "3d6cf3753390a05504b1f50302f767df443f0f40",
299     "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
300     "da9e896a3a98b330980152b2e4a43cb6e686c730",
301     "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
302     "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
303     "47499ad13b719de18c59c2bc9b38ed578db50b95",
304     "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
305     "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
306     "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
307     "49341c297a887186bd47d7465d827ab3147f05e3",
308     "325279e76367200d3fd7194d81c09fd139988ece",
309     "c3def160a1e847605ff0fc7edd30397fa90635a0",
310     "50acb1597c4d53ad63225376d2aa36f64e8a229d",
311     "796fd861474aa7861bd0384127df755458757ec3",
312     NULL
313 };
314
315 static const char *sha1_graphics_24[] =
316 {
317     "e993b15c9bd14fb45a15310450b7083c44e42665",
318     "edbd7bab3d957fbc85e89612197cf918f5f5af20",
319     "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
320     "236eb5ca9da70ec7cc719cd2fd291bab14000257",
321     "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
322     "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
323     "fd4be592483623dbc800fe28210a1f0daa71999b",
324     "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
325     "a8772e6c44ba633fb384a7c4b50b435f1406107e",
326     "883bc8f305c602edca785e21cd00f488583fb13f",
327     "3bac4e80993f49dc3926e30524115fca9d7a8026",
328     "91369e35be29059a0665782541db4c8b324c6bb2",
329     "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
330     "593d694cdcc8349b3bfc8257041dbcb27e61da45",
331     "1036b91d93e31cd1d4740d0c8642e115e5a38188",
332     "1898073cdb35ca4d2b21bba933ac16a0b4297317",
333     "5068bff794553cf5a3145ae407c9a2984357844c",
334     "413a7989969c229dee4ab1798362f32f96cf0a10",
335     "0bb222e540b82720d4971e4a2fc626899af03e03",
336     "adc20832d8c43f1cf372d8392535492013cd2306",
337     "45649794dcbcabda487f66f7a80fc1bec79047a1",
338     "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
339     "b4df692ac70a5f9f303270df4641ab014c6cbf46",
340     "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
341     "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
342     "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
343     "92a1ab214dd8027c407814420449119466c92840",
344     "b58f19c1800344a2b8e017eb784705bdb2bd8450",
345     "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
346     "955390669afed2369b15b32fa519f2f921cdf1a0",
347     "201906f7d763b930a98c97f8eeab417f2b65e723",
348     "5313357d50c40c05a3b3a83d0d2013a138c955a1",
349     "701c5af1d0c28294ce7d804b5697643c430d22a0",
350     "b0a959745b2db1d9f449e68e4479a4f36301879c",
351     "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
352     "e171f6ec77bca91d6b8559911bce296c0bac469e",
353     "9725669042ef68acb408404d196496d10340bb5a",
354     "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
355     "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
356     "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
357     "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
358     "0f79500eda467cd3cbc220abdd37b5dba695d654",
359     "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
360     "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
361     "7d479beeb6758c164566638b5c873c188d6a91e7",
362     "80086808fca03e757d812e31d1ae576bf90dac9d",
363     "9560096f1b85ae6d939d736165c44df00a47c424",
364     "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
365     "93e1aec608e037af3bfb7bd32dde446abe4eea11",
366     "b25ba91487ec945410deb2b51bc1156890c032a8",
367     "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
368     "ee315634ed92da3a32c2675ecd1b369471c60936",
369     "3491e2bd81e70dd203c8551cc2d39b19401caafe",
370     "826de85271b67a11e7bd1a6596b58a045a96b69e",
371     NULL
372 };
373
374 static const char *sha1_graphics_r5g5b5[] =
375 {
376     "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
377     "847005cf7371f511bcc837251cde07b1796f6113",
378     "a8f75743a930843ec14d516cd048b6e0468e5d89",
379     "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
380     "cf3928e240c9149788e1635b115a4e5baea0dd8f",
381     "a9034a905daa91757b4f63345c0e40638cd53ca8",
382     "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
383     "99474fecf11df7b7035c35be6b8b697be9889418",
384     "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
385     "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
386     "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
387     "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
388     "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
389     "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
390     "449092689226a1172b6086ba1181d6b6d6499f26",
391     "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
392     "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
393     "897d16f4d6a6ddad685d23ed7828d4f676539b75",
394     "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
395     "6daaf945a955928c5c124c880522ca4634fb2343",
396     "12a288390d16e1efa99d4185301de48a4d433b14",
397     "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
398     "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
399     "d7d97e28ed316f6596c737eb83baa5948d86b673",
400     "ecc2991277d7314f55b00e0f284ae3703aeef81e",
401     "656bf3b7121bcd620a0a3ad488f0d66604824577",
402     "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
403     "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
404     "a49530722328ae88fd765792ac0c657efbcce75d",
405     "aa46aa2226e3121eaefa9d0836418e0b69262d69",
406     "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
407     "a6fd83542c3826132e88d3f5e304d604c0056fad",
408     "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
409     "e428d213ad02651287894f093413949dcb369208",
410     "7df915bedcc5951a1b6f828490f7dbb93212e835",
411     "645dc251d205139282b17eb7bece1055fff3bcd0",
412     "76215275593631f5900aad3616d725733dc39493",
413     "81655a550703849a616d4a16504bb9c6f999285f",
414     "573d65665d20f00d36d9782ae2b89772140524ab",
415     "619414c1b33ac60cb0c0de61df86245d472259b0",
416     "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
417     "2a66dae03890ff791eabb982949435adb19af02b",
418     "24ac219478ba406f30794550690486b14cbac5e8",
419     "2b28d20690dc92374ebecb5508f8fdc6c7581790",
420     "db8c34882ddd46716d14bbf569d530f80db65ed4",
421     "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
422     "9b02173f424c098ea0f4cc5db9eb65f69263d127",
423     "a92942269911a88793b3460b6f2a2cd56e48eec1",
424     "059db9f0426b371e464ef3d30f1a4f4aa599e101",
425     "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
426     "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
427     "585061e403d9cac1603a38af420efe87338f381a",
428     "8f447a3820c83662086dfa836da2205b0130fd5f",
429     "3772003c7fb420003512d0c437b3659d96d89ce4",
430     "dab47c9dc149e570045d699598b14a613bf319b3",
431     "2daca4d26a086ed34894693be0b0374402232809",
432     "bf0e0b74ce5686b73c527843e0d0df0cd10efefe",
433     "517e32a8c0312b5676d498583ea092b0f198f2bc",
434     NULL
435 };
436
437 static const char *sha1_graphics_r4g4b4[] =
438 {
439     "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
440     "cfa0ab83ee93283ad914c3748f0532da1697af1d",
441     "8bd18697d1ef27492805667a0bc956343ac08667",
442     "e8501c830321584474654f90e40eaf27dc21e6a8",
443     "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
444     "821177710961d2cb5f7e7dfc0e06e767b6042753",
445     "667124365ffadeea1d8791bedda77a0c7b898de8",
446     "c9f23e684b600dea17575b4b17175fbd9106c3a9",
447     "7678876e50eae35d1eaa096aae25afaa0b864bf3",
448     "fb52b0c373a5f2a60b981604b120962942d2447a",
449     "5ab8dd07436681d762fa04ad7c6d71291c488924",
450     "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
451     "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
452     "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
453     "25fcb75aa687aac35b8f72640889fe92413e00c5",
454     "3bddf9d53e89560b083302b146cd33791b13d941",
455     "a81504498c7a7bb46340ce74476a42f70f2730b1",
456     "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
457     "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
458     "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
459     "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
460     "57ebf8becac1524543da120e88e9cc57ecfdec49",
461     "d591232bbc2592462c819a9486750f64180518fd",
462     "0e183a4c30b3da345129cffe33fe0fc593d8666b",
463     "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
464     "8933450132bf949ba4bc28626968425b5ed2867d",
465     "9928a8f28a66c00069a124f7171b248817005763",
466     "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
467     "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
468     "233e588cf660e2c9b552cf02065cf63fa6655864",
469     "0740ff74dcd259d9a644ba51ad77ff0d40348951",
470     "a3345acaf272f2e288626906e3056cd0ced70499",
471     "957a86fbe8a96dd068db65e4e624a52bcc84af46",
472     "13b0f240054dc57ba0e2dfde74048496304a2c7f",
473     "51ef267eb9c15487c9430f505e8a6c929eb2170c",
474     "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
475     "9dd123938b0a02601d8d458ecbd6535ddefea724",
476     "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
477     "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
478     "b89ae8de2d975b8adb263ace66fd953d29165a8b",
479     "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
480     "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
481     "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
482     "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
483     "8c40d6d8e0c696c31f04c896e492a2a38703d870",
484     "e13c821c236ea0b67cca64c9da7be15e88fc712f",
485     "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
486     "e4731b63d41f6b51e30752ea52d85c4a2938731b",
487     "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
488     "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
489     "f7900e60347029876ba55e8f0c4c02e89deb36b6",
490     "734d4a7836891d729f4a9ec6916ead78eecb2596",
491     "d8ba2e556fd64c9c2f1746496e6e7dd7a487cd6d",
492     NULL
493 };
494
495 static const char *sha1_graphics_8_color[] =
496 {
497     "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
498     "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
499     "49024d6cbdf1614327dfda9eda17675e76805f7e",
500     "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
501     "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
502     "84d85009d35ae10abbc435f3913422544105cea2",
503     "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
504     "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
505     "f3aa8d89430748178952de56643069d80b40aad6",
506     "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
507     "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
508     "52b1363e821bf604d9df260bfa97e26d428c33fd",
509     "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
510     "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
511     "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
512     "89711289be6d5c55734878410e4923d5cca9aca9",
513     "8355caf57d51ad4e14275943088392e37dc75d33",
514     "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
515     "6f0570da9dea7f043f678088f8362ee458cd79fa",
516     "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
517     "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
518     "5092b22af85a08f10a2899888bb9d552f25f828e",
519     "e91973be2651eeef568700463652838d8cbba976",
520     "1df851515ecf46df5c2d3279535c1763f72353dd",
521     "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
522     "359bd76088a965bb0cee7c44800bc46b2638807e",
523     "e14e5734b33057b890368f3e9d482d9e5a0358c5",
524     "64205ccaa277e64eeea0c20e99900ac79858ca2c",
525     "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
526     "91f988f575338505ba8a40727865a8d3f2298624",
527     "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
528     "421e8b608378e4f17774dd32ea6446fa0fa16f91",
529     "3b7488731da48635d86be551ab7c8c0f91c78219",
530     "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
531     "e15a355fc09bfd22267917898e2266168ff410e3",
532     "b9688566bddf18586787c00e68724e51e97dfb72",
533     "5e38e03310f1c66f2052af2a745d8c60515707c5",
534     "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
535     "3a71ad6fef147067641e49a5f69b2454e3a5010d",
536     "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
537     "6376234f542467e5887adfece62f753e998dc19d",
538     "add949d009217ef2b847e34772ba363e4be7b1b8",
539     "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
540     "0b58666deb3615e912896a764e5c6475989e95e4",
541     "bf460cc44c0edee851d72587c8425c3f06a62c55",
542     "ea74c00c45569007383b632d7f1d2adc82645717",
543     "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
544     "284abed096637c80bb50844e393da9dd4b3f19ac",
545     "9dc776c5ab8256b1301c7d1da60544a9410e6715",
546     "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
547     "46f772c2832b3aad584674db666bd63e48b4f338",
548     "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
549     "f3dc739da41fb299637c8660e8c46917ddcf87a8",
550     "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
551     "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
552     "678979a45126a76eb629992cd64734862f53a555",
553     "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
554     "0204f06422a01787f7379d0edb51104bb023758a",
555     "1f9a21eba2f2ce87768a5618d9cfefa7e48fb386",
556     NULL
557 };
558
559 static const char *sha1_graphics_8_grayscale[] =
560 {
561     "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
562     "df35491dd5038187c05bac06921402ba6d7773a8",
563     "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
564     "66a686ac22cd0ec326f2c97ef473781cabe9690b",
565     "9bddef7b97b8b03569f07011e66ddd67fe82d787",
566     "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
567     "0a87689ca33f888f05dbfa21ddec11c069990d8b",
568     "8d0a92e6333e1b99591962e2def9bc9121111cf5",
569     "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
570     "1fbc234c28a8140965ad0fe30b4b799f6681e864",
571     "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
572     "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
573     "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
574     "114bb377b4e78a1978e1ac09388c48861b5223a3",
575     "8d0a92e6333e1b99591962e2def9bc9121111cf5",
576     "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
577     "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
578     "216388ddf6b563dd2058a9df65b40b6f72df1715",
579     "ad11e4b6979cf055e3bf1868112a7bef207385a4",
580     "47f72be971bd2d3399dabd018201f4f5075e96fe",
581     "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
582     "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
583     "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
584     "15b991814d84d6aa252696dd0c6150ef88a8db3f",
585     "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
586     "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
587     "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
588     "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
589     "a895daf1f20371d4d1c3f93c070124cc13e341c3",
590     "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
591     "0000000000000000000000000000000000000000",
592     "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
593     "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
594     "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
595     "6d41e6168662e75baacf74d911d7419d54c8d73c",
596     "2404952157ba1519094a2da6bfbf2b0f1356432d",
597     "24caede65b40815a60b83c4edfa06bdc542388cd",
598     "650a51bedd1af92469d2950eb95220db35f95c6e",
599     "3f43aa11e6fccb747cc13224583fb2f951fee08c",
600     "04cea9753b575ecce8e55357eddfcec10ddfbbea",
601     "6b6f4b97f05e015eb37a5f6aff637235feacd030",
602     "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
603     "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
604     "85425940daf119125deb52421b2057acebe6d1cf",
605     "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
606     "9869b6f088822fb423996f9968e5a931301fc2c3",
607     "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
608     "a7f81cf3326fa3608acc13cfce2f573912e9d745",
609     "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
610     "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
611     "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
612     "f543efc84e638afbaa456e629100f0274de1a35b",
613     "1bd2587399006eed0d46beff397d32081f6bc58e",
614     "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
615     "640a49455acabca6954a7fbb6af4e872af342d11",
616     "589e7911e09332ee090371deae17b0120ff990b5",
617     "a1a941fa270cda48c648553ed4b427e16e96f8e0",
618     "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
619     "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
620     "3685c9ae95118a83db3569832c29753276fa1264",
621     "09640bad951c33e7d70a1fced83b1869f65b3fc5",
622     "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
623     "a05e05b2e6e515baa59ea032d063ca11e70a72b5",
624     "d908c86b7301666a8d7999b831841115a4938181",
625     NULL
626 };
627
628 static const char *sha1_graphics_8[] =
629 {
630     "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
631     "512246d4886ab889a090b167ba194577cb95272e",
632     "921e852d4564cb9e5ac15ff68b5207bebea871d1",
633     "9636b0ebefc443ea11949ccd28f6ca454277dd41",
634     "aa9050da55e6b6957c60b7d603fce539cb5c0048",
635     "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
636     "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
637     "390b2bf70daba36310683f46af9cd50b9a061396",
638     "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
639     "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
640     "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
641     "da1cc34a9d9b779fc7849e03e214096026506464",
642     "5ba8f99ca034666effa556748c49a0f5a015125f",
643     "b67ba2f55659c75ac72c1112494461bb3086e1a4",
644     "73e2859ce849f756f954718ce3c90f02e31712b6",
645     "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
646     "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
647     "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
648     "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
649     "7262364067e03c7fa498af1d59d228d6c63b460e",
650     "5241241a355a667ef0834049adf4218e8b3f16b8",
651     "db22d666690948eb966f75b796c72c7150a5c4b9",
652     "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
653     "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
654     "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
655     "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
656     "bdc0a354635b879871077c5b712570e469863c99",
657     "d599bf210423fe3adbb4f1de87d9360de97827d0",
658     "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
659     "cc01f17928f7780cefd423ea653b072eea723a1b",
660     "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
661     "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
662     "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
663     "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
664     "f4a334e69535de74ee5ed54be93a75120a66e54a",
665     "559fd1d15447745527c61fe43a94c6708bff3e39",
666     "995f77f2f53398399f09d1365cb4dfd105764e5c",
667     "61907a6685bba93077da40cfb28cf2ab74552fd2",
668     "122015e5e17c1c317c6e51c0e207826b606a4077",
669     "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
670     "8c609921d4a3ed89a994a75482b27496bf103cf5",
671     "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
672     "66493ee117719e172f327a426af601996025f28c",
673     "acead2745fec0b6c817fa601353bdf2d197b64f7",
674     "a6b858b2d125c159529d3f3ec45b31925a79acff",
675     "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
676     "d83adc669c0dea0dc4812b93f998514b6f02d805",
677     "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
678     "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
679     "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
680     "7d1bfff706b0713e53209407889f83a0da26a81d",
681     "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
682     "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
683     "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
684     "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
685     "963d1fa8608c8b743e972eb9a4e9f3fc53c6c7e8",
686     "ba49de83c4668fb08956221f465b93e7dd6a3383",
687     NULL
688 };
689
690 static const char *sha1_graphics_4[] =
691 {
692     "fa867e2976a549ecd3b1fa67df54963232fcef8c",
693     "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
694     "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
695     "9401799e6116c35e5f0e5bdca07ea25316757a72",
696     "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
697     "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
698     "2505598845fa026ea7187582461efbf06cb6904f",
699     "3981a19363beca8f28d32a5928ac296fd22a5296",
700     "01404024ebb2c266d17d734059524d874491650f",
701     "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
702     "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
703     "46e94a55f5f58a6b915078d8ffdc725f53aab516",
704     "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
705     "1f26a01730f67d40ea711a50d9d801bac15a642e",
706     "3b53d24178cfacba53103a44dfd5d072b15a6781",
707     "c52cfd57f26037723d37192722fc3a217f280c9e",
708     "e34da6500cf2e424d980714d92737cf6c31a7bda",
709     "d17f4358ae529f920960ed89e535902ee13b0033",
710     "0f44e12ecd1ea7e39433890443626d4fc35204a4",
711     "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
712     "73bbc83f88f1aaa6df0158b63e70bb3165163163",
713     "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
714     "39c16648cf6c261be71a33cec41867f28e119b94",
715     "26ad5116562e7b58c76a26eaf521e2e40899e944",
716     "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
717     "4f827ca6927f15191588456f985bf29d2a3b3c24",
718     "e7de769c3d12ea9dd223bef4881c578823bec67e",
719     "6fb102d020e5554116feefc8482104f3ae2036d2",
720     "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
721     "20c9eb3276c08fdce35755e349bec94b04929812",
722     "628d837163a25c6520f19c0602383176dbad528e",
723     "b5a12cff7100290ad43f5ed17a321b42de048893",
724     "b672afbeeafb44194a821f0def81a8892872937e",
725     "db0124045882b598feea192186cf7eb7a0387866",
726     "602d91471378fe24a2d0248bd8a92b624f099fea",
727     "e772873b87a0f55ea51a3da323f64bf8814c6703",
728     "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
729     "1a579cd280422131c35e907a023ee0e80749b5a4",
730     "bbf027f506cbb80d359bf4892fcb75f816f2e446",
731     "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
732     "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
733     "e2a21a965dfd0bd09f9270917f681610efc18ce7",
734     "3e411b004a5be84451860c6da6a4a1a482b77862",
735     "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
736     "7811c536a6527112b438a6413f3927f2c79086a7",
737     "525ef3615040225752a2fe646ab99ee64e360630",
738     "46760975993f9881b7bbe94123173e6a683d3f25",
739     "df5feb905a31c288008cf5e82d73ac818a160d82",
740     "df5feb905a31c288008cf5e82d73ac818a160d82",
741     "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
742     "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
743     "da401c745421f6bdfaefd590ab99dee948dce412",
744     "38a3b6edcba2a1fba6064f0b4d771aedae7f4673",
745     NULL
746 };
747
748 static const char *sha1_graphics_4_grayscale[] =
749 {
750     "fa867e2976a549ecd3b1fa67df54963232fcef8c",
751     "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
752     "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
753     "1c201d149c0bd886ff8a427ad513f15a70991174",
754     "44646e67842a4d055bea1fad0434e6e4a0eb5465",
755     "315189097a02024d2eae61d524c4de07a396aee7",
756     "73ac786015dea36ac466a6524dba757d5d238ece",
757     "6e328cc4d53627f034b23706d8bf26afe18512ae",
758     "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
759     "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
760     "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
761     "6448226859cab61a61c95d3ed5ed5f216b1bb120",
762     "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
763     "ec3879342b5a44f6de6efe946243ae5ade00980d",
764     "6e328cc4d53627f034b23706d8bf26afe18512ae",
765     "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
766     "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
767     "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
768     "b2bda683edef912957845a33edc055902a801fed",
769     "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
770     "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
771     "43ee3e187dda14b86aef12371041ae70313b5a65",
772     "d4930552a7845111ffd9db57260be1ab97967c06",
773     "afdf41fca7951c6dd6193320de1295f2c68fe52a",
774     "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
775     "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
776     "0000000000000000000000000000000000000000",
777     "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
778     "9b7d6b12385bb9e1cd881758aff342bd5427432b",
779     "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
780     "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
781     "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
782     "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
783     "f8224430462f6a93f85ef33b8aa7299525990708",
784     "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
785     "d58b8760ef01c12e691651c932d683c66fde3654",
786     "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
787     "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
788     "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
789     "8cd7b0ba8426db344b4cb8820890603020ed65e9",
790     "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
791     "027b05bc82ce4f897c4bf812610a641547368939",
792     "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
793     "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
794     "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
795     "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
796     "5eeb56afea8040a8fb18c11f29931b836474126d",
797     "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
798     "f8681c09f1abfc38d31e47622cb8798cd896a00e",
799     "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
800     "d374d4d92c940ae42a9b42c14d744341b68a8c14",
801     "25ec9fd2eeb1514ba4e0458a444149a5456cf63a",
802     "2e4dc1e859350289575ffc2a47cd0033efca6c32",
803     NULL
804 };
805
806 static const char *sha1_graphics_1[] =
807 {
808     "23366004515f3bc46796ea505d748f8d0f97fbe1",
809     "ad674a4104c6a1eacaee8f20effdfe31775b4409",
810     "a7cc69f957d7b533a0a330859a143d701daac73c",
811     "a955bf088c5edb129289ce65caace48ec95632e4",
812     "5316d3c558c254479883133cf58cd07ab521d3f0",
813     "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
814     "2c140b39cc8d21358fded8959cd655f03d7f0f89",
815     "121423a38b4ac4743bd516e0a7e88a3863796313",
816     "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
817     "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
818     "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
819     "39ff81f77ef4ee772367ed1a63785987c060126e",
820     "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
821     "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
822     "7ddf19df5bbdf4475b6ec1bc042425e382502864",
823     "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
824     "c5ffc59048bf786b5646ad6226cd8633965de9ef",
825     "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
826     "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
827     "0ff4b49797e30e3555aab45219adf449a9a560ff",
828     "280327328ca940c212ce24fe72e0b00014072767",
829     "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
830     "b85463875f755b85f1464b1b6275912bcbad6c9f",
831     "816f200969feecc788b61dfeecf05b1790984401",
832     "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
833     "a5d204cc7342d40b765ca042f8668e22601c4ff9",
834     "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
835     "0a76e0121facb103857130bc6e12185ad77fc3fa",
836     "02aede714773d654d0fc2f640afaa133ec718ad5",
837     "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
838     "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
839     "b26699f62661e16a1dc452d24c88ce363a1f2998",
840     "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
841     "c14832e69ec3585c15987b3d69d5007236fa9814",
842     "e44ea620b0c47125a34193537ab9d219a52ad028",
843     "d1e6091caa4482d3142df3b958606c41ebf4698e",
844     "07c1116d8286fb665a1005de220eadc3d5999aaf",
845     "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
846     "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
847     "ffc78c075d4be66806f6c59180772d5eed963dc0",
848     "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
849     "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
850     "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
851     "b71ca46be287598f716bb04fac0a52ad139c70db",
852     "6589e48498e30ab036fbfe94d73427b2b1238a69",
853     "4dce919117d2e41df9f5d4d0de14f97ae650046d",
854     "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
855     "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
856     "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
857     "18f4497e43903e8df5b27da4ceebf62b15550a87",
858     "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
859     "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
860     "655cfadeb157233c804d42b58195569c8846e3c1",
861     "65c8811c609203fd424f5ed5f92ca2268a1dca54",
862     "a45b297d709e297584eb0f2985294ec0ab53d8ad",
863     "0d180c37bc26d83a1a11f66168757f3de2493243",
864     "b362ba4790def178c236c0ae7b0093dbba47cf24",
865     "d1d2ecf71a37d9eda58fa09454aa871971428ace",
866     "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
867     "ee22f43ea867228c6ff937d39e1826e285a107e8",
868     "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
869     "a2a928de9007d765da496abec8c21b23601f8c45",
870     "28ded40e72d4327b9413571476b167fb28a1f420",
871     "23366004515f3bc46796ea505d748f8d0f97fbe1",
872     "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
873     "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
874     "6b2cb2346b5820bdd0251cd6a4aeb5c22ee82e85",
875     "6c4640b17e072efc682044c499e5a4f3481b7c87",
876     NULL
877 };
878
879 static const char *dst_format;
880
881 static inline DWORD get_stride(BITMAPINFO *bmi)
882 {
883     return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
884 }
885
886 static inline DWORD get_dib_size(BITMAPINFO *bmi)
887 {
888     return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
889 }
890
891 static char *hash_dib(BITMAPINFO *bmi, void *bits)
892 {
893     DWORD dib_size = get_dib_size(bmi);
894     HCRYPTHASH hash;
895     char *buf;
896     BYTE hash_buf[20];
897     DWORD hash_size = sizeof(hash_buf);
898     int i;
899     static const char *hex = "0123456789abcdef";
900
901     if(!crypt_prov) return NULL;
902
903     if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
904
905     CryptHashData(hash, bits, dib_size, 0);
906
907     CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
908     if(hash_size != sizeof(hash_buf)) return NULL;
909
910     CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
911     CryptDestroyHash(hash);
912
913     buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
914
915     for(i = 0; i < hash_size; i++)
916     {
917         buf[i * 2] = hex[hash_buf[i] >> 4];
918         buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
919     }
920     buf[i * 2] = '\0';
921
922     return buf;
923 }
924
925 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
926 {
927     char *hash = hash_dib(bmi, bits);
928     BOOL ok_cond;
929     int i;
930
931     if(!hash)
932     {
933         skip("SHA1 hashing unavailable on this platform\n");
934         return;
935     }
936
937     for(i = 0; i <= num_broken; i++)
938     {
939         if((*sha1)[i] == NULL)
940         {
941             ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
942             return;
943         }
944     }
945
946     ok_cond = !strcmp(hash, **sha1);
947
948     for(i = 1; i <= num_broken; i++)
949         ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
950
951     if(todo)
952         todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
953                       dst_format, info, **sha1, hash );
954     else
955         ok( ok_cond, "%s: %s: expected hash %s got %s\n",
956             dst_format, info, **sha1, hash );
957
958     *sha1 += num_broken + 1;
959
960     HeapFree(GetProcessHeap(), 0, hash);
961 }
962
963 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
964 {
965     compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
966 }
967
968 static const RECT bias_check[] =
969 {
970     {100, 100, 200, 150},
971     {100, 100, 150, 200},
972     {100, 100,  50, 200},
973     {100, 100,   0, 150},
974     {100, 100,   0,  50},
975     {100, 100,  50,   0},
976     {100, 100, 150,   0},
977     {100, 100, 200,  50}
978 };
979
980 static const RECT hline_clips[] =
981 {
982     {120, 120, 140, 120}, /* unclipped */
983     {100, 122, 140, 122}, /* l edgecase */
984     { 99, 124, 140, 124}, /* l edgecase clipped */
985     {120, 126, 200, 126}, /* r edgecase */
986     {120, 128, 201, 128}, /* r edgecase clipped */
987     { 99, 130, 201, 130}, /* l and r clipped */
988     {120, 100, 140, 100}, /* t edgecase */
989     {120,  99, 140,  99}, /* t edgecase clipped */
990     {120, 199, 140, 199}, /* b edgecase */
991     {120, 200, 140, 200}, /* b edgecase clipped */
992     {120, 132, 310, 132}, /* inside two clip rects */
993     { 10, 134, 101, 134}, /* r end on l edgecase */
994     { 10, 136, 100, 136}, /* r end on l edgecase clipped */
995     {199, 138, 220, 138}, /* l end on r edgecase */
996     {200, 140, 220, 140}  /* l end on r edgecase clipped */
997 };
998
999 static const RECT vline_clips[] =
1000 {
1001     {120, 120, 120, 140}, /* unclipped */
1002     {100, 120, 100, 140}, /* l edgecase */
1003     { 99, 120,  99, 140}, /* l edgecase clipped */
1004     {199, 120, 199, 140}, /* r edgecase */
1005     {200, 120, 200, 140}, /* r edgecase clipped */
1006     {122,  99, 122, 201}, /* t and b clipped */
1007     {124, 100, 124, 140}, /* t edgecase */
1008     {126,  99, 126, 140}, /* t edgecase clipped */
1009     {128, 120, 128, 200}, /* b edgecase */
1010     {130, 120, 130, 201}, /* b edgecase clipped */
1011     {132,  12, 132, 140}, /* inside two clip rects */
1012     {134,  90, 134, 101}, /* b end on t edgecase */
1013     {136,  90, 136, 100}, /* b end on t edgecase clipped */
1014     {138, 199, 138, 220}, /* t end on b edgecase */
1015     {140, 200, 140, 220}  /* t end on b edgecase clipped */
1016 };
1017
1018 static const RECT line_clips[] =
1019 {
1020     { 90, 110, 310, 120},
1021     { 90, 120, 295, 130},
1022     { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1023     { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1024     { 90, 132, 101, 137}, /* end pt just inside l edge */
1025     {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1026     {199, 142, 210, 143}  /* start pt just inside r edge */
1027 };
1028
1029 static const RECT patblt_clips[] =
1030 {
1031     {120, 120, 140, 126}, /* unclipped */
1032     {100, 130, 140, 136}, /* l edgecase */
1033     { 99, 140, 140, 146}, /* l edgecase clipped */
1034     {180, 130, 200, 136}, /* r edgecase */
1035     {180, 140, 201, 146}, /* r edgecase clipped */
1036     {120, 100, 130, 110}, /* t edgecase */
1037     {140,  99, 150, 110}, /* t edgecase clipped */
1038     {120, 180, 130, 200}, /* b edgecase */
1039     {140, 180, 150, 201}, /* b edgecase */
1040     {199, 150, 210, 156}, /* l edge on r edgecase */
1041     {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1042     { 90, 150, 101, 156}, /* r edge on l edgecase */
1043     { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1044     {160,  90, 166, 101}, /* b edge on t edgecase */
1045     {170,  90, 176, 101}, /* b edge on t edgecase clipped */
1046     {160, 199, 166, 210}, /* t edge on b edgecase */
1047     {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1048 };
1049
1050 static const RECT rectangles[] =
1051 {
1052     {10,   11, 100, 101},
1053     {250, 100, 350,  10},
1054     {120,  10, 120,  20}, /* zero width */
1055     {120,  10, 130,  10}, /* zero height */
1056     {120,  40, 121,  41}, /* 1 x 1 */
1057     {130,  50, 132,  52}, /* 2 x 2 */
1058     {140,  60, 143,  63}, /* 3 x 3 */
1059     {150,  70, 154,  74}, /* 4 x 4 */
1060     {120,  20, 121,  30}, /* width == 1 */
1061     {130,  20, 132,  30}, /* width == 2 */
1062     {140,  20, 143,  30}, /* width == 3 */
1063     {200,  20, 210,  21}, /* height == 1 */
1064     {200,  30, 210,  32}, /* height == 2 */
1065     {200,  40, 210,  43}  /* height == 3 */
1066 };
1067
1068 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1069 static const BITMAPINFOHEADER dib_brush_header_24   = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1070 static const BITMAPINFOHEADER dib_brush_header_555  = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1071 static const BITMAPINFOHEADER dib_brush_header_8    = {sizeof(BITMAPINFOHEADER), 16, -16, 1,  8, BI_RGB, 0, 0, 0, 0, 0};
1072 static const BITMAPINFOHEADER dib_brush_header_4    = {sizeof(BITMAPINFOHEADER), 16, -16, 1,  4, BI_RGB, 0, 0, 0, 0, 0};
1073 static const BITMAPINFOHEADER dib_brush_header_1    = {sizeof(BITMAPINFOHEADER), 16, -16, 1,  1, BI_RGB, 0, 0, 0, 0, 0};
1074
1075 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00,     /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1076                                     0x00, 0x03, 0x04, 0x05, 0x06, 0x00,     /* 4, 5, 6, <pad> */
1077                                     0x00, 0x02, 0x01, 0x02, 0x05, 0x80,     /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1078                                     0x00, 0x01 };                           /* <eod> */
1079
1080 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1081                                              0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1082                                              0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1083                                              0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1084
1085 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1086 {
1087     HBRUSH brush = CreateSolidBrush( color );
1088     brush = SelectObject( hdc, brush );
1089     PatBlt( hdc, x, y, width, height, PATCOPY );
1090     DeleteObject( SelectObject( hdc, brush ) );
1091 }
1092
1093 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1094 {
1095     DWORD dib_size = get_dib_size(bmi);
1096     HPEN solid_pen, dashed_pen, orig_pen;
1097     HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1098     HBITMAP bmp;
1099     INT i, x, y, hatch_style;
1100     HDC src_dc;
1101     HRGN hrgn, hrgn2;
1102     BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1103     BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1104     BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1105     BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1106     BYTE *brush_bits, *src_bits;
1107     BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1108     BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1109     BLENDFUNCTION blend;
1110
1111     blend.BlendOp = AC_SRC_OVER;
1112     blend.BlendFlags = 0;
1113
1114     memset(bits, 0xcc, dib_size);
1115     compare_hash(bmi, bits, sha1, "empty");
1116
1117     src_dc = CreateCompatibleDC( 0 );
1118     solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1119     orig_pen = SelectObject(hdc, solid_pen);
1120     SetBrushOrgEx(hdc, 0, 0, NULL);
1121
1122     /* horizontal and vertical lines */
1123     for(i = 1; i <= 16; i++)
1124     {
1125         SetROP2(hdc, i);
1126         MoveToEx(hdc, 10, i * 3, NULL);
1127         LineTo(hdc, 100, i * 3); /* l -> r */
1128         MoveToEx(hdc, 100, 50 + i * 3, NULL);
1129         LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1130         MoveToEx(hdc, 120 + i * 3, 10, NULL);
1131         LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1132         MoveToEx(hdc, 170 + i * 3, 100, NULL);
1133         LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1134     }
1135     compare_hash(bmi, bits, sha1, "h and v solid lines");
1136     memset(bits, 0xcc, dib_size);
1137
1138     /* diagonal lines */
1139     SetROP2(hdc, R2_COPYPEN);
1140     for(i = 0; i < 16; i++)
1141     {
1142         double s = sin(M_PI * i / 8.0);
1143         double c = cos(M_PI * i / 8.0);
1144
1145         MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1146         LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1147     }
1148     compare_hash(bmi, bits, sha1, "diagonal solid lines");
1149     memset(bits, 0xcc, dib_size);
1150
1151     for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1152     {
1153         MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1154         LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1155     }
1156     compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1157     memset(bits, 0xcc, dib_size);
1158
1159     /* solid brush PatBlt */
1160     solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1161     orig_brush = SelectObject(hdc, solid_brush);
1162
1163     for(i = 0, y = 10; i < 256; i++)
1164     {
1165         ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1166
1167         if(rop_uses_src(rop3[i]))
1168             ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1169         else
1170         {
1171             ok(ret, "got FALSE for %x\n", rop3[i]);
1172             y += 20;
1173         }
1174
1175     }
1176     compare_hash(bmi, bits, sha1, "solid patblt");
1177     memset(bits, 0xcc, dib_size);
1178
1179     /* clipped lines */
1180     hrgn = CreateRectRgn(10, 10, 200, 20);
1181     hrgn2 = CreateRectRgn(100, 100, 200, 200);
1182     CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1183     SetRectRgn(hrgn2, 290, 100, 300, 200);
1184     CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1185     ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1186     DeleteObject(hrgn2);
1187
1188     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1189     {
1190         MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1191         LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1192     }
1193     compare_hash(bmi, bits, sha1, "clipped solid hlines");
1194     memset(bits, 0xcc, dib_size);
1195
1196     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1197     {
1198         MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1199         LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1200     }
1201     compare_hash(bmi, bits, sha1, "clipped solid vlines");
1202     memset(bits, 0xcc, dib_size);
1203
1204     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1205     {
1206         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1207         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1208     }
1209     compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1210     memset(bits, 0xcc, dib_size);
1211
1212     /* clipped PatBlt */
1213     for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1214     {
1215         PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1216                patblt_clips[i].right - patblt_clips[i].left,
1217                patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1218     }
1219     compare_hash(bmi, bits, sha1, "clipped patblt");
1220     memset(bits, 0xcc, dib_size);
1221
1222     /* clipped dashed lines */
1223     dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1224     SelectObject(hdc, dashed_pen);
1225     SetBkMode(hdc, TRANSPARENT);
1226     SetBkColor(hdc, RGB(0, 0xff, 0));
1227
1228     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1229     {
1230         MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1231         LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1232     }
1233     compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1234     memset(bits, 0xcc, dib_size);
1235
1236     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1237     {
1238         MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1239         LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1240     }
1241     compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1242     memset(bits, 0xcc, dib_size);
1243
1244     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1245     {
1246         MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1247         LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1248     }
1249     compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1250     memset(bits, 0xcc, dib_size);
1251
1252     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1253     {
1254         MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1255         LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1256     }
1257     compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1258     memset(bits, 0xcc, dib_size);
1259
1260     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1261     {
1262         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1263         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1264     }
1265     compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1266     memset(bits, 0xcc, dib_size);
1267
1268     SetBkMode(hdc, OPAQUE);
1269
1270     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1271     {
1272         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1273         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1274     }
1275     compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1276     memset(bits, 0xcc, dib_size);
1277
1278     ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1279
1280     /* 8888 DIB pattern brush */
1281
1282     brush_bi->bmiHeader = dib_brush_header_8888;
1283     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1284     memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1285     brush_bits[2] = 0xff;
1286     brush_bits[6] = 0xff;
1287     brush_bits[14] = 0xff;
1288     brush_bits[65] = 0xff;
1289     brush_bits[69] = 0xff;
1290     brush_bits[72] = 0xff;
1291
1292     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1293
1294     SelectObject(hdc, dib_brush);
1295     SetBrushOrgEx(hdc, 1, 1, NULL);
1296
1297     for(i = 0, y = 10; i < 256; i++)
1298     {
1299         if(!rop_uses_src(rop3[i]))
1300         {
1301             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1302             ok(ret, "got FALSE for %x\n", rop3[i]);
1303             y += 25;
1304         }
1305     }
1306     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1307         compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1308     else
1309         compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1310     memset(bits, 0xcc, dib_size);
1311
1312     SelectObject(hdc, orig_brush);
1313     DeleteObject(dib_brush);
1314
1315     /* 8888 bottom-up DIB pattern brush */
1316
1317     brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1318
1319     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1320
1321     SelectObject(hdc, dib_brush);
1322
1323     /* This used to set the x origin to 100 as well, but
1324        there's a Windows bug for 24 bpp where the brush's x offset
1325        is incorrectly calculated for rops that involve both D and P */
1326     SetBrushOrgEx(hdc, 4, 100, NULL);
1327
1328     for(i = 0, y = 10; i < 256; i++)
1329     {
1330         if(!rop_uses_src(rop3[i]))
1331         {
1332             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1333             ok(ret, "got FALSE for %x\n", rop3[i]);
1334             y += 25;
1335         }
1336     }
1337     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1338         compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1339     else
1340         compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1341     memset(bits, 0xcc, dib_size);
1342
1343     SelectObject(hdc, orig_brush);
1344     DeleteObject(dib_brush);
1345
1346     /* 24 bpp dib pattern brush */
1347
1348     brush_bi->bmiHeader = dib_brush_header_24;
1349     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1350     memset(brush_bits, 0, 16 * 16 * 3);
1351     brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1352     brush_bits[49] = brush_bits[52] = 0xff;
1353
1354     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1355
1356     SelectObject(hdc, dib_brush);
1357     SetBrushOrgEx(hdc, 1, 1, NULL);
1358
1359     for(i = 0, y = 10; i < 256; i++)
1360     {
1361         if(!rop_uses_src(rop3[i]))
1362         {
1363             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1364             ok(ret, "got FALSE for %x\n", rop3[i]);
1365             y += 25;
1366         }
1367     }
1368     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1369         compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1370     else
1371         compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1372     memset(bits, 0xcc, dib_size);
1373
1374     SelectObject(hdc, orig_brush);
1375     DeleteObject(dib_brush);
1376
1377     /* 555 dib pattern brush */
1378
1379     brush_bi->bmiHeader = dib_brush_header_555;
1380     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1381     memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1382     brush_bits[0] = brush_bits[1] = 0xff;
1383     brush_bits[32] = brush_bits[34] = 0x7c;
1384
1385     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1386
1387     SelectObject(hdc, dib_brush);
1388     SetBrushOrgEx(hdc, 1, 1, NULL);
1389
1390     for(i = 0, y = 10; i < 256; i++)
1391     {
1392         if(!rop_uses_src(rop3[i]))
1393         {
1394             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1395             ok(ret, "got FALSE for %x\n", rop3[i]);
1396             y += 25;
1397         }
1398     }
1399     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1400         compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1401     else
1402         compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1403     memset(bits, 0xcc, dib_size);
1404
1405     SelectObject(hdc, orig_brush);
1406     DeleteObject(dib_brush);
1407
1408     SetBrushOrgEx(hdc, 0, 0, NULL);
1409
1410     /* 8 bpp dib pattern brush */
1411
1412     brush_bi->bmiHeader = dib_brush_header_8;
1413     brush_bi->bmiHeader.biClrUsed = 3;
1414     memset(brush_bi->bmiColors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1415     brush_bi->bmiColors[0].rgbRed = 0xff;
1416     brush_bi->bmiColors[1].rgbRed = 0xff;
1417     brush_bi->bmiColors[1].rgbGreen = 0xff;
1418     brush_bi->bmiColors[1].rgbBlue = 0xff;
1419
1420     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1421     memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1422     brush_bits[0] = brush_bits[1] = 1;
1423     brush_bits[16] = brush_bits[17] = 2;
1424     brush_bits[32] = brush_bits[33] = 6;
1425
1426     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1427
1428     SelectObject(hdc, dib_brush);
1429     SetBrushOrgEx(hdc, 1, 1, NULL);
1430
1431     for(i = 0, y = 10; i < 256; i++)
1432     {
1433         if(!rop_uses_src(rop3[i]))
1434         {
1435             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1436             ok(ret, "got FALSE for %x\n", rop3[i]);
1437             y += 25;
1438         }
1439     }
1440     compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1441     memset(bits, 0xcc, dib_size);
1442
1443     SelectObject(hdc, orig_brush);
1444     DeleteObject(dib_brush);
1445
1446     /* 4 bpp dib pattern brush */
1447
1448     brush_bi->bmiHeader = dib_brush_header_4;
1449     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1450
1451     SelectObject(hdc, dib_brush);
1452     SetBrushOrgEx(hdc, 1, 1, NULL);
1453
1454     for(i = 0, y = 10; i < 256; i++)
1455     {
1456         if(!rop_uses_src(rop3[i]))
1457         {
1458             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1459             ok(ret, "got FALSE for %x\n", rop3[i]);
1460             y += 25;
1461         }
1462     }
1463     compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1464     memset(bits, 0xcc, dib_size);
1465
1466     SelectObject(hdc, orig_brush);
1467     DeleteObject(dib_brush);
1468
1469     /* 1 bpp dib pattern brush */
1470
1471     brush_bi->bmiHeader = dib_brush_header_1;
1472     brush_bi->bmiHeader.biClrUsed = 2;
1473     memset(brush_bits, 0, 16 * 4);
1474     brush_bits[0] = 0xf0;
1475     brush_bits[4] = 0xf0;
1476     brush_bits[8] = 0xf0;
1477
1478     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1479     SelectObject(hdc, dib_brush);
1480     for(i = 0, y = 10; i < 256; i++)
1481     {
1482         if(!rop_uses_src(rop3[i]))
1483         {
1484             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1485             ok(ret, "got FALSE for %x\n", rop3[i]);
1486             y += 25;
1487         }
1488     }
1489
1490     compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1491     memset(bits, 0xcc, dib_size);
1492
1493     SelectObject(hdc, orig_brush);
1494     SetBrushOrgEx(hdc, 0, 0, NULL);
1495
1496     /* Rectangle */
1497
1498     SelectObject(hdc, solid_pen);
1499     SelectObject(hdc, solid_brush);
1500
1501     for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1502     {
1503         Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1504     }
1505
1506     SelectObject(hdc, dashed_pen);
1507     for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1508     {
1509         Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1510     }
1511
1512     compare_hash(bmi, bits, sha1, "rectangles");
1513     memset(bits, 0xcc, dib_size);
1514     SelectObject(hdc, solid_pen);
1515
1516     /* PaintRgn */
1517
1518     PaintRgn(hdc, hrgn);
1519     compare_hash(bmi, bits, sha1, "PaintRgn");
1520     memset(bits, 0xcc, dib_size);
1521
1522     /* RTL rectangles */
1523
1524     if( !pSetLayout )
1525     {
1526         win_skip("Don't have SetLayout\n");
1527         (*sha1)++;
1528     }
1529     else
1530     {
1531         pSetLayout(hdc, LAYOUT_RTL);
1532         PaintRgn(hdc, hrgn);
1533         PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1534         Rectangle(hdc, 100, 250, 110, 260);
1535         compare_hash(bmi, bits, sha1, "rtl");
1536         memset(bits, 0xcc, dib_size);
1537
1538         pSetLayout(hdc, LAYOUT_LTR);
1539     }
1540
1541     for(i = 0, y = 10; i < 256; i++)
1542     {
1543         if(!rop_uses_src(rop3[i]))
1544         {
1545             for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1546             {
1547                 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1548                 SelectObject(hdc, hatch_brush);
1549                 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1550                 ok(ret, "got FALSE for %x\n", rop3[i]);
1551                 SelectObject(hdc, orig_brush);
1552                 DeleteObject(hatch_brush);
1553             }
1554             y += 25;
1555         }
1556     }
1557
1558     compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1559     memset(bits, 0xcc, dib_size);
1560
1561     /* overlapping blits */
1562
1563     orig_brush = SelectObject(hdc, solid_brush);
1564
1565     Rectangle(hdc, 10, 10, 100, 100);
1566     Rectangle(hdc, 20, 15, 30, 40);
1567     Rectangle(hdc, 15, 15, 20, 20);
1568     Rectangle(hdc, 15, 20, 50, 45);
1569     BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1570     compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1571     memset(bits, 0xcc, dib_size);
1572
1573     Rectangle(hdc, 10, 10, 100, 100);
1574     Rectangle(hdc, 20, 15, 30, 40);
1575     Rectangle(hdc, 15, 15, 20, 20);
1576     Rectangle(hdc, 15, 20, 50, 45);
1577     BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1578     if (bmi->bmiHeader.biBitCount == 1)  /* Windows gets this one wrong */
1579         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1580     else
1581         compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1582     memset(bits, 0xcc, dib_size);
1583
1584     Rectangle(hdc, 10, 10, 100, 100);
1585     Rectangle(hdc, 20, 15, 30, 40);
1586     Rectangle(hdc, 15, 15, 20, 20);
1587     Rectangle(hdc, 15, 20, 50, 45);
1588     BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1589     compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1590     memset(bits, 0xcc, dib_size);
1591
1592     Rectangle(hdc, 10, 10, 100, 100);
1593     Rectangle(hdc, 20, 15, 30, 40);
1594     Rectangle(hdc, 15, 15, 20, 20);
1595     Rectangle(hdc, 15, 20, 50, 45);
1596     BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1597     if (bmi->bmiHeader.biBitCount == 1)  /* Windows gets this one wrong */
1598         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1599     else
1600         compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1601     memset(bits, 0xcc, dib_size);
1602
1603     Rectangle(hdc, 10, 10, 100, 100);
1604     Rectangle(hdc, 20, 15, 30, 40);
1605     Rectangle(hdc, 15, 15, 20, 20);
1606     Rectangle(hdc, 15, 20, 50, 45);
1607     BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1608     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1609     memset(bits, 0xcc, dib_size);
1610
1611     Rectangle(hdc, 10, 10, 100, 100);
1612     Rectangle(hdc, 20, 15, 30, 40);
1613     Rectangle(hdc, 15, 15, 20, 20);
1614     Rectangle(hdc, 15, 20, 50, 45);
1615     BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1616     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1617     memset(bits, 0xcc, dib_size);
1618
1619     Rectangle(hdc, 10, 10, 100, 100);
1620     Rectangle(hdc, 20, 15, 30, 40);
1621     Rectangle(hdc, 15, 15, 20, 20);
1622     Rectangle(hdc, 15, 20, 50, 45);
1623     BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1624     if (bmi->bmiHeader.biBitCount >= 24)  /* Windows gets this one wrong */
1625         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1626     else
1627         compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1628     memset(bits, 0xcc, dib_size);
1629
1630     Rectangle(hdc, 10, 10, 100, 100);
1631     Rectangle(hdc, 20, 15, 30, 40);
1632     Rectangle(hdc, 15, 15, 20, 20);
1633     Rectangle(hdc, 15, 20, 50, 45);
1634     BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1635     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1636     memset(bits, 0xcc, dib_size);
1637
1638     /* blitting with 32-bpp BI_RGB source */
1639
1640     memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1641     src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1642     src_bi->bmiHeader.biHeight = 256;
1643     src_bi->bmiHeader.biWidth = 256;
1644     src_bi->bmiHeader.biBitCount = 32;
1645     src_bi->bmiHeader.biPlanes = 1;
1646     src_bi->bmiHeader.biCompression = BI_RGB;
1647     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1648     SelectObject( src_dc, bmp );
1649     for (y = 0; y < 256; y++)
1650         for (x = 0; x < 256; x++)
1651         {
1652             BYTE a = (x + y) * 2;
1653             BYTE r = (BYTE)(y + 2 * x) * a / 255;
1654             BYTE g = (BYTE)(x + y / 3) * a / 255;
1655             BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1656             ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1657         }
1658
1659     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1660     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1661         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1662     else
1663         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1664     memset(bits, 0xcc, dib_size);
1665
1666     blend.SourceConstantAlpha = 0xd0;
1667     blend.AlphaFormat = 0;
1668     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1669     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1670     {
1671         if (!pGdiAlphaBlend) (*sha1) += 2;
1672         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1673     }
1674     else
1675     {
1676         if (!pGdiAlphaBlend) (*sha1)++;
1677         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1678     }
1679     memset(bits, 0xcc, dib_size);
1680
1681     blend.SourceConstantAlpha = 0xb0;
1682     blend.AlphaFormat = AC_SRC_ALPHA;
1683     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1684     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1685     {
1686         if (!pGdiAlphaBlend) (*sha1) += 2;
1687         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1688     }
1689     else
1690     {
1691         if (!pGdiAlphaBlend) (*sha1)++;
1692         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1693     }
1694     memset(bits, 0xcc, dib_size);
1695
1696     /* blitting with 32-bpp r10g10b10 source */
1697
1698     src_bi->bmiHeader.biBitCount = 32;
1699     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1700     ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1701     ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1702     ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1703     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1704     SelectObject( src_dc, bmp );
1705     for (y = 0; y < 256; y++)
1706         for (x = 0; x < 256; x++)
1707         {
1708             WORD r = (7 * x + 3 * y) % 1024;
1709             WORD g = (11 * x + y / 3) % 1024;
1710             WORD b = (x / 3 + 9 * y) % 1024;
1711             ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1712         }
1713
1714     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1715     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1716         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1717     else
1718         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1719     memset(bits, 0xcc, dib_size);
1720
1721     /* blitting with 32-bpp b6g6r6 source */
1722
1723     src_bi->bmiHeader.biBitCount = 32;
1724     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1725     ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1726     ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1727     ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1728     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1729     SelectObject( src_dc, bmp );
1730     for (y = 0; y < 256; y++)
1731         for (x = 0; x < 256; x++)
1732         {
1733             BYTE r = (y + 2 * x) % 64;
1734             BYTE g = (x + y / 3) % 64;
1735             BYTE b = (x / 3 + 2 * y) % 64;
1736             ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1737         }
1738
1739     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1740     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1741         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1742     else
1743         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1744     memset(bits, 0xcc, dib_size);
1745
1746     /* blitting with 24-bpp source */
1747
1748     src_bi->bmiHeader.biBitCount = 24;
1749     src_bi->bmiHeader.biCompression = BI_RGB;
1750     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1751     DeleteObject( SelectObject( src_dc, bmp ) );
1752     for (y = 0; y < 256; y++)
1753         for (x = 0; x < 256; x++)
1754         {
1755             src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1756             src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1757             src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1758         }
1759
1760     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1761     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1762         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1763     else
1764         compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1765     memset(bits, 0xcc, dib_size);
1766
1767     blend.SourceConstantAlpha = 0xe0;
1768     blend.AlphaFormat = 0;
1769     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1770     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1771     {
1772         if (!pGdiAlphaBlend) (*sha1) += 2;
1773         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1774     }
1775     else
1776     {
1777         if (!pGdiAlphaBlend) (*sha1)++;
1778         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1779     }
1780     memset(bits, 0xcc, dib_size);
1781
1782     /* blitting with 16-bpp BI_RGB source */
1783
1784     src_bi->bmiHeader.biBitCount = 16;
1785     src_bi->bmiHeader.biCompression = BI_RGB;
1786     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1787     DeleteObject( SelectObject( src_dc, bmp ) );
1788     for (y = 0; y < 256; y++)
1789         for (x = 0; x < 256; x++)
1790             ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1791
1792     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1793     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5)  /* broken on NT4 */
1794         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1795     else
1796         compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1797     memset(bits, 0xcc, dib_size);
1798
1799     /* blitting with 16-bpp b4g4r4 source */
1800
1801     src_bi->bmiHeader.biBitCount = 16;
1802     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1803     ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1804     ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1805     ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1806     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1807     DeleteObject( SelectObject( src_dc, bmp ) );
1808     for (y = 0; y < 256; y++)
1809         for (x = 0; x < 256; x++)
1810             ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1811
1812     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1813     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5)  /* broken on NT4 */
1814         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1815     else
1816         compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1817     memset(bits, 0xcc, dib_size);
1818
1819     /* blitting with 8-bpp source */
1820
1821     src_bi->bmiHeader.biBitCount = 8;
1822     src_bi->bmiHeader.biCompression = BI_RGB;
1823     src_bi->bmiHeader.biClrUsed = 160;
1824     for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1825     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1826     DeleteObject( SelectObject( src_dc, bmp ) );
1827     for (y = 0; y < 256; y++)
1828         for (x = 0; x < 256; x++)
1829             src_bits[y * 256 + x] = 3 * x + 5 * y;
1830
1831     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1832     compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1833     memset(bits, 0xcc, dib_size);
1834
1835     blend.SourceConstantAlpha = 0xd0;
1836     blend.AlphaFormat = 0;
1837     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1838     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1839     {
1840         if (!pGdiAlphaBlend) (*sha1) += 2;
1841         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1842     }
1843     else
1844     {
1845         if (!pGdiAlphaBlend) (*sha1)++;
1846         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1847     }
1848     memset(bits, 0xcc, dib_size);
1849
1850     /* blitting with 4-bpp source */
1851
1852     src_bi->bmiHeader.biBitCount = 4;
1853     src_bi->bmiHeader.biClrUsed = 12;
1854     for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
1855     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1856     DeleteObject( SelectObject( src_dc, bmp ) );
1857     for (y = 0; y < 256; y++)
1858         for (x = 0; x < 256; x += 2)
1859             src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
1860
1861     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1862     compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
1863     memset(bits, 0xcc, dib_size);
1864
1865     /* blitting with 1-bpp source */
1866
1867     src_bi->bmiHeader.biBitCount = 1;
1868     src_bi->bmiHeader.biClrUsed = 0;
1869     for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
1870     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1871     DeleteObject( SelectObject( src_dc, bmp ) );
1872     for (y = 0; y < 256; y++)
1873         for (x = 0; x < 256; x += 8)
1874             src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
1875
1876     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1877     compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
1878     memset(bits, 0xcc, dib_size);
1879
1880     blend.SourceConstantAlpha = 0x90;
1881     blend.AlphaFormat = 0;
1882     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1883     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1884     {
1885         if (!pGdiAlphaBlend) (*sha1) += 2;
1886         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
1887     }
1888     else
1889     {
1890         if (!pGdiAlphaBlend) (*sha1)++;
1891         else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
1892     }
1893     memset(bits, 0xcc, dib_size);
1894
1895     DeleteDC( src_dc );
1896     DeleteObject( bmp );
1897
1898     /* RLE StretchDIBits */
1899     src_bi->bmiHeader.biSize        = sizeof(src_bi->bmiHeader);
1900     src_bi->bmiHeader.biWidth       = 8;
1901     src_bi->bmiHeader.biHeight      = 8;
1902     src_bi->bmiHeader.biPlanes      = 1;
1903     src_bi->bmiHeader.biBitCount    = 8;
1904     src_bi->bmiHeader.biCompression = BI_RLE8;
1905     src_bi->bmiHeader.biClrUsed     = 0;
1906     src_bi->bmiHeader.biSizeImage   = sizeof(rle8_data);
1907
1908     for (i = 0; i < 256; i++)
1909     {
1910         src_bi->bmiColors[i].rgbRed      = i;
1911         src_bi->bmiColors[i].rgbGreen    = i;
1912         src_bi->bmiColors[i].rgbBlue     = i;
1913         src_bi->bmiColors[i].rgbReserved = 0;
1914     }
1915
1916     StretchDIBits( hdc,  10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1917     StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
1918     StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1919     StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1920     StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1921     compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
1922     memset(bits, 0xcc, dib_size);
1923
1924     /* 32 bpp StretchDIBits */
1925
1926     src_bi->bmiHeader.biWidth       = 4;
1927     src_bi->bmiHeader.biHeight      = 4;
1928     src_bi->bmiHeader.biPlanes      = 1;
1929     src_bi->bmiHeader.biBitCount    = 32;
1930     src_bi->bmiHeader.biCompression = BI_RGB;
1931     src_bi->bmiHeader.biClrUsed     = 0;
1932     src_bi->bmiHeader.biSizeImage   = 0;
1933
1934     ret = StretchDIBits( hdc,  10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1935     ok(ret == 4, "got %d\n", ret);
1936     ret = StretchDIBits( hdc,  20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1937     ok(ret == 4, "got %d\n", ret);
1938     ret = StretchDIBits( hdc,  30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1939     ok(ret == 4, "got %d\n", ret);
1940     ret = StretchDIBits( hdc,  40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1941     ok(ret == 4, "got %d\n", ret);
1942     ret = StretchDIBits( hdc,  50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1943     ok(ret == 4, "got %d\n", ret);
1944     ret = StretchDIBits( hdc,  60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1945     ok(ret == 4, "got %d\n", ret);
1946
1947     src_bi->bmiHeader.biHeight = -4;
1948
1949     ret = StretchDIBits( hdc,  10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1950     ok(ret == 4, "got %d\n", ret);
1951     ret = StretchDIBits( hdc,  20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1952     ok(ret == -4, "got %d\n", ret);
1953     ret = StretchDIBits( hdc,  30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1954     ok(ret == 4, "got %d\n", ret);
1955     ret = StretchDIBits( hdc,  40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1956     ok(ret == -4, "got %d\n", ret);
1957     ret = StretchDIBits( hdc,  50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1958     ok(ret == 4, "got %d\n", ret);
1959     ret = StretchDIBits( hdc,  60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1960     ok(ret == -4, "got %d\n", ret);
1961
1962     compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
1963     memset(bits, 0xcc, dib_size);
1964
1965     /* Solid colors */
1966     for (i = 0; i < 256; i++)
1967     {
1968         solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
1969         solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
1970         solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1971         solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1972     }
1973
1974     /* A few extra colors that are interesting in the 1bpp case */
1975
1976     /* bk color */
1977     solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
1978     solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
1979
1980     /* color 0 */
1981     solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
1982     solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
1983
1984     /* color 1 */
1985     solid_patblt( hdc,  8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
1986     solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
1987
1988     compare_hash(bmi, bits, sha1, "Colors");
1989     memset(bits, 0xcc, dib_size);
1990
1991     for (i = 0; i < 256; i++)
1992     {
1993         COLORREF s;
1994         s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
1995         s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
1996         s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1997         s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1998     }
1999
2000     compare_hash(bmi, bits, sha1, "SetPixel");
2001     memset(bits, 0xcc, dib_size);
2002
2003     SelectObject(hdc, orig_brush);
2004     SelectObject(hdc, orig_pen);
2005     DeleteObject(hrgn);
2006     DeleteObject(dib_brush);
2007     DeleteObject(dashed_pen);
2008     DeleteObject(solid_brush);
2009     DeleteObject(solid_pen);
2010 }
2011
2012 static void test_simple_graphics(void)
2013 {
2014     char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2015     BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2016     DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2017     HDC mem_dc;
2018     BYTE *bits;
2019     HBITMAP dib, orig_bm;
2020     const char **sha1;
2021     DIBSECTION ds;
2022     int i;
2023
2024     mem_dc = CreateCompatibleDC(NULL);
2025
2026     /* a8r8g8b8 */
2027     trace("8888\n");
2028     memset(bmi, 0, sizeof(bmibuf));
2029     bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2030     bmi->bmiHeader.biHeight = 512;
2031     bmi->bmiHeader.biWidth = 512;
2032     bmi->bmiHeader.biBitCount = 32;
2033     bmi->bmiHeader.biPlanes = 1;
2034     bmi->bmiHeader.biCompression = BI_RGB;
2035
2036     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2037     ok(dib != NULL, "ret NULL\n");
2038     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2039     ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2040     ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2041     ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2042     ok(ds.dsBmih.biCompression == BI_RGB ||
2043        broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2044        "got %x\n", ds.dsBmih.biCompression);
2045
2046     orig_bm = SelectObject(mem_dc, dib);
2047
2048     dst_format = "8888";
2049     sha1 = sha1_graphics_a8r8g8b8;
2050     draw_graphics(mem_dc, bmi, bits, &sha1);
2051
2052     SelectObject(mem_dc, orig_bm);
2053     DeleteObject(dib);
2054
2055     /* a8r8g8b8 - bitfields.  Should be the same as the regular 32 bit case.*/
2056     trace("8888 - bitfields\n");
2057     bmi->bmiHeader.biBitCount = 32;
2058     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2059     bit_fields[0] = 0xff0000;
2060     bit_fields[1] = 0x00ff00;
2061     bit_fields[2] = 0x0000ff;
2062
2063     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2064     ok(dib != NULL, "ret NULL\n");
2065     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2066     ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2067     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2068     ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2069     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2070
2071     orig_bm = SelectObject(mem_dc, dib);
2072
2073     dst_format = "8888 - bitfields";
2074     sha1 = sha1_graphics_a8r8g8b8;
2075     draw_graphics(mem_dc, bmi, bits, &sha1);
2076
2077     SelectObject(mem_dc, orig_bm);
2078     DeleteObject(dib);
2079
2080     /* a8b8g8r8. */
2081     trace("a8b8g8r8\n");
2082     bmi->bmiHeader.biBitCount = 32;
2083     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2084     bit_fields[0] = 0x0000ff;
2085     bit_fields[1] = 0x00ff00;
2086     bit_fields[2] = 0xff0000;
2087
2088     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2089     ok(dib != NULL, "ret NULL\n");
2090     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2091     ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2092     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2093     ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2094     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2095
2096     orig_bm = SelectObject(mem_dc, dib);
2097
2098     dst_format = "a8b8g8r8";
2099     sha1 = sha1_graphics_a8b8g8r8;
2100     draw_graphics(mem_dc, bmi, bits, &sha1);
2101
2102     SelectObject(mem_dc, orig_bm);
2103     DeleteObject(dib);
2104
2105     /* r10g10b10. */
2106     trace("r10g10b10\n");
2107     bmi->bmiHeader.biBitCount = 32;
2108     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2109     bit_fields[0] = 0x3ff00000;
2110     bit_fields[1] = 0x000ffc00;
2111     bit_fields[2] = 0x000003ff;
2112
2113     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2114     ok(dib != NULL, "ret NULL\n");
2115     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2116     ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2117     ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2118     ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2119     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2120
2121     orig_bm = SelectObject(mem_dc, dib);
2122
2123     dst_format = "r10g10b10";
2124     sha1 = sha1_graphics_r10g10b10;
2125     draw_graphics(mem_dc, bmi, bits, &sha1);
2126
2127     SelectObject(mem_dc, orig_bm);
2128     DeleteObject(dib);
2129
2130     /* r6g6b6. */
2131     trace("r6g6b6\n");
2132     bmi->bmiHeader.biBitCount = 32;
2133     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2134     bit_fields[0] = 0x0003f000;
2135     bit_fields[1] = 0x00000fc0;
2136     bit_fields[2] = 0x0000003f;
2137
2138     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2139     ok(dib != NULL, "ret NULL\n");
2140     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2141     ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2142     ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2143     ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2144     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2145
2146     orig_bm = SelectObject(mem_dc, dib);
2147
2148     dst_format = "r6g6b6";
2149     sha1 = sha1_graphics_r6g6b6;
2150     draw_graphics(mem_dc, bmi, bits, &sha1);
2151
2152     SelectObject(mem_dc, orig_bm);
2153     DeleteObject(dib);
2154
2155     /* 24 */
2156     trace("24\n");
2157     bmi->bmiHeader.biBitCount = 24;
2158     bmi->bmiHeader.biCompression = BI_RGB;
2159
2160     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2161     ok(dib != NULL, "ret NULL\n");
2162     orig_bm = SelectObject(mem_dc, dib);
2163
2164     dst_format = "24";
2165     sha1 = sha1_graphics_24;
2166     draw_graphics(mem_dc, bmi, bits, &sha1);
2167
2168     SelectObject(mem_dc, orig_bm);
2169     DeleteObject(dib);
2170
2171     /* r5g5b5 */
2172     trace("555\n");
2173     bmi->bmiHeader.biBitCount = 16;
2174     bmi->bmiHeader.biCompression = BI_RGB;
2175
2176     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2177     ok(dib != NULL, "ret NULL\n");
2178     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2179     ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2180     ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2181     ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2182     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2183
2184     orig_bm = SelectObject(mem_dc, dib);
2185
2186     dst_format = "r5g5b5";
2187     sha1 = sha1_graphics_r5g5b5;
2188     draw_graphics(mem_dc, bmi, bits, &sha1);
2189
2190     SelectObject(mem_dc, orig_bm);
2191     DeleteObject(dib);
2192
2193     /* r4g4b4 */
2194     trace("444\n");
2195     bmi->bmiHeader.biBitCount = 16;
2196     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2197     bit_fields[0] = 0x0f00;
2198     bit_fields[1] = 0x00f0;
2199     bit_fields[2] = 0x000f;
2200     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2201     ok(dib != NULL, "ret NULL\n");
2202     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2203     ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2204     ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2205     ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2206     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2207
2208     orig_bm = SelectObject(mem_dc, dib);
2209
2210     dst_format = "r4g4b4";
2211     sha1 = sha1_graphics_r4g4b4;
2212     draw_graphics(mem_dc, bmi, bits, &sha1);
2213
2214     SelectObject(mem_dc, orig_bm);
2215     DeleteObject(dib);
2216
2217     /* 8 color */
2218     trace("8 color\n");
2219     bmi->bmiHeader.biBitCount = 8;
2220     bmi->bmiHeader.biCompression = BI_RGB;
2221     bmi->bmiHeader.biClrUsed = 236;
2222     for (i = 0; i < 236; i++)
2223     {
2224         bmi->bmiColors[i].rgbRed   = (i & 0x07) << 5;
2225         bmi->bmiColors[i].rgbGreen = (i & 0x38) << 2;
2226         bmi->bmiColors[i].rgbBlue  =  i & 0xc0;
2227     }
2228     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2229     ok(dib != NULL, "ret NULL\n");
2230
2231     orig_bm = SelectObject(mem_dc, dib);
2232
2233     dst_format = "8 color";
2234     sha1 = sha1_graphics_8_color;
2235     draw_graphics(mem_dc, bmi, bits, &sha1);
2236
2237     SelectObject(mem_dc, orig_bm);
2238     DeleteObject(dib);
2239
2240     /* 8 grayscale */
2241     trace("8 grayscale\n");
2242     bmi->bmiHeader.biBitCount = 8;
2243     bmi->bmiHeader.biCompression = BI_RGB;
2244     bmi->bmiHeader.biClrUsed = 256;
2245     for (i = 0; i < 256; i++)
2246         bmi->bmiColors[i].rgbRed = bmi->bmiColors[i].rgbGreen = bmi->bmiColors[i].rgbBlue = i;
2247
2248     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2249     ok(dib != NULL, "ret NULL\n");
2250
2251     orig_bm = SelectObject(mem_dc, dib);
2252
2253     dst_format = "8 grayscale";
2254     sha1 = sha1_graphics_8_grayscale;
2255     draw_graphics(mem_dc, bmi, bits, &sha1);
2256
2257     SelectObject(mem_dc, orig_bm);
2258     DeleteObject(dib);
2259
2260     /* 8 */
2261     trace("8\n");
2262     bmi->bmiHeader.biBitCount = 8;
2263     bmi->bmiHeader.biCompression = BI_RGB;
2264     bmi->bmiHeader.biClrUsed = 5;
2265     bmi->bmiColors[0].rgbRed = 0xff;
2266     bmi->bmiColors[0].rgbGreen = 0xff;
2267     bmi->bmiColors[0].rgbBlue = 0xff;
2268     bmi->bmiColors[1].rgbRed = 0;
2269     bmi->bmiColors[1].rgbGreen = 0;
2270     bmi->bmiColors[1].rgbBlue = 0;
2271     bmi->bmiColors[2].rgbRed = 0xff;
2272     bmi->bmiColors[2].rgbGreen = 0;
2273     bmi->bmiColors[2].rgbBlue = 0;
2274     bmi->bmiColors[3].rgbRed = 0;
2275     bmi->bmiColors[3].rgbGreen = 0xff;
2276     bmi->bmiColors[3].rgbBlue = 0;
2277     bmi->bmiColors[4].rgbRed = 0;
2278     bmi->bmiColors[4].rgbGreen = 0;
2279     bmi->bmiColors[4].rgbBlue = 0xff;
2280
2281     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2282     ok(dib != NULL, "ret NULL\n");
2283
2284     orig_bm = SelectObject(mem_dc, dib);
2285
2286     dst_format = "8";
2287     sha1 = sha1_graphics_8;
2288     draw_graphics(mem_dc, bmi, bits, &sha1);
2289
2290     SelectObject(mem_dc, orig_bm);
2291     DeleteObject(dib);
2292
2293     /* 4 */
2294     trace("4\n");
2295     bmi->bmiHeader.biBitCount = 4;
2296
2297     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2298     ok(dib != NULL, "ret NULL\n");
2299
2300     orig_bm = SelectObject(mem_dc, dib);
2301
2302     dst_format = "4";
2303     sha1 = sha1_graphics_4;
2304     draw_graphics(mem_dc, bmi, bits, &sha1);
2305
2306     SelectObject(mem_dc, orig_bm);
2307     DeleteObject(dib);
2308
2309     /* 4 grayscale */
2310     trace("4 grayscale\n");
2311     bmi->bmiHeader.biClrUsed = 16;
2312     for (i = 0; i < 16; i++)
2313         bmi->bmiColors[i].rgbRed = bmi->bmiColors[i].rgbGreen = bmi->bmiColors[i].rgbBlue = i * 17;
2314
2315     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2316     ok(dib != NULL, "ret NULL\n");
2317
2318     orig_bm = SelectObject(mem_dc, dib);
2319
2320     dst_format = "4 grayscale";
2321     sha1 = sha1_graphics_4_grayscale;
2322     draw_graphics(mem_dc, bmi, bits, &sha1);
2323
2324     SelectObject(mem_dc, orig_bm);
2325     DeleteObject(dib);
2326
2327     /* 1 */
2328     trace("1\n");
2329     bmi->bmiHeader.biBitCount = 1;
2330     bmi->bmiHeader.biClrUsed = 2;
2331
2332     bmi->bmiColors[0].rgbRed = 0x00;
2333     bmi->bmiColors[0].rgbGreen = 0x01;
2334     bmi->bmiColors[0].rgbBlue = 0xff;
2335     bmi->bmiColors[1].rgbRed = 0xff;
2336     bmi->bmiColors[1].rgbGreen = 0x00;
2337     bmi->bmiColors[1].rgbBlue = 0x00;
2338
2339     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2340     ok(dib != NULL, "ret NULL\n");
2341
2342     orig_bm = SelectObject(mem_dc, dib);
2343
2344     dst_format = "1";
2345     sha1 = sha1_graphics_1;
2346     draw_graphics(mem_dc, bmi, bits, &sha1);
2347
2348     SelectObject(mem_dc, orig_bm);
2349     DeleteObject(dib);
2350
2351     DeleteDC(mem_dc);
2352 }
2353
2354 START_TEST(dib)
2355 {
2356     HMODULE mod = GetModuleHandleA("gdi32.dll");
2357     pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2358     pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2359
2360     CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2361
2362     test_simple_graphics();
2363
2364     CryptReleaseContext(crypt_prov, 0);
2365 }