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