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