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