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