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