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