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