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