[GDI32_WINETEST] Sync with Wine Staging 1.9.14.
[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 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
140 "50a09678c49c208f71d40452daca5411279aa674",
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 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
213 "50a09678c49c208f71d40452daca5411279aa674",
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 "849d4abf4b690128a5f70e9b8ac78f20c437de06",
286 "e768fc9f3167ef3144a4cfb1e20126a577f7dd5b",
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 "4782df8e24127e66a434b4e839adebf2dbb223fb",
359 "739707cc85ca63e0580c79618dc0bb8a4a338d95",
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 "2b3e87e0b705b03c7c08f403409ab82cce095ba1",
432 "45c08e11fffc78b2a3574263419e0cb7f8cd9b45",
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 "099c688a920f606655b485e8f0a433dc811bc976",
505 "9c044a733335bca43766bda2b317249309155079",
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 "904f1d82159bcf5485f323bd12b859dc5e83f8eb",
582 "5bd29f94844351e9a5bd01f25d85608b9b0701b2",
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 "f373a5f37b82e7523c64c08eb509b6191e49b173",
654 "9f0760a05190c9edf9ce2e8be6aaa5557601fe91",
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 "52e7c2f8b01592898c13f1e7633881e350244209",
732 "d9d5556b77301952b4caf113337720966bc8e1f5",
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 "5eb00252664ec39e61359adb1dade4906a87a248",
814 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854",
815 "dcad1a146c1d0ec2c4cc7f64bd4f45c57a604bfe",
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 "0025a440866a404523a8a20e79a8891e45a2ff56",
891 "c04d335933895f836f0a28c1e3f7f444352c3b8e",
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 "ccf8d11b1e81895e9781f17c227c821228d8714b",
963 "f751e26578193afe6a727ee2a52318c404c56555",
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 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f",
1035 "c47c2dc806b6b8ff28f300949695d013a46c0083",
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 "61ade9054d4477fb89cf830539a5e8b4e45f0688",
1056 "ac530c5dbaf837e15b2337347e974184fad73643",
1057 "95fdcda26262d5948a9ade77d83fd698e0031050",
1058 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13",
1059 "f6b61ecf03ad11752775faca1d4404c6bb5065f5",
1060 "d7ad44d6f377598268e9968333ae2cf23a0715ca",
1061 "5871339cd7e6cee12d4dc45934a89071c73efe6b",
1062 "69e9b85b34caf736069ba91e57a5c3fa7c891653",
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 "17468a3789f0a6d65c302bda735a01dc2c1a74d9",
1126 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1127 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1128 "55c26d22f11d80b73383fa57d0fac552d705b092",
1129 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1130 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1131 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1132 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1133 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1134 "74d01690e344bc22e7a0478e7a09ccd92354c486",
1135 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1136 "128eefd2ee043d59dc37918065f687e378e5ca95",
1137 "d7e2daab98ce1f698c4bfedfc01c0d79fcb76b8e",
1138 "8d34215487088b5d4ef63062270ce25c2862643d",
1139 "826562eb11a0d0bba77fa21245f7406a194e9225",
1140 "bbae6f0659e095a42b420082079663f937065813",
1141 "bbabe686a6955402c90530e7c67f1428868369b3",
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(const BITMAPINFO *bmi)
1218 {
1219 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1220 }
1221
1222 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1223 {
1224 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1225 }
1226
1227 static char *hash_dib(const BITMAPINFO *bmi, const 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 %s,\n", wine_dbgstr_rect( &rect ));
1279 return;
1280 }
1281
1282 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1283 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect ));
1284 current_bounds++;
1285 }
1286
1287 static void skip_compare( int count )
1288 {
1289 current_sha1 += count;
1290 current_bounds++;
1291 }
1292
1293 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1294 {
1295 char *hash = hash_dib(bmi, bits);
1296 BOOL ok_cond;
1297 int i;
1298
1299 /* reset the bits for the next test */
1300 memset( bits, 0xcc, get_dib_size(bmi) );
1301
1302 if(!hash)
1303 {
1304 skip("SHA1 hashing unavailable on this platform\n");
1305 return;
1306 }
1307
1308 for(i = 0; i <= num_broken; i++)
1309 {
1310 if(current_sha1[i] == NULL)
1311 {
1312 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1313 HeapFree(GetProcessHeap(), 0, hash);
1314 return;
1315 }
1316 }
1317
1318 ok_cond = !strcmp(hash, *current_sha1);
1319
1320 for(i = 1; i <= num_broken; i++)
1321 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1322
1323 todo_wine_if(todo)
1324 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1325 dst_format, info, *current_sha1, hash );
1326
1327 current_sha1 += num_broken + 1;
1328
1329 HeapFree(GetProcessHeap(), 0, hash);
1330
1331 compare_bounds( hdc, info );
1332 }
1333
1334 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1335 {
1336 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1337 }
1338
1339 static const RECT bias_check[] =
1340 {
1341 {100, 100, 200, 150},
1342 {100, 100, 150, 200},
1343 {100, 100, 50, 200},
1344 {100, 100, 0, 150},
1345 {100, 100, 0, 50},
1346 {100, 100, 50, 0},
1347 {100, 100, 150, 0},
1348 {100, 100, 200, 50}
1349 };
1350
1351 static const RECT hline_clips[] =
1352 {
1353 {120, 120, 140, 120}, /* unclipped */
1354 {100, 122, 140, 122}, /* l edgecase */
1355 { 99, 124, 140, 124}, /* l edgecase clipped */
1356 {120, 126, 200, 126}, /* r edgecase */
1357 {120, 128, 201, 128}, /* r edgecase clipped */
1358 { 99, 130, 201, 130}, /* l and r clipped */
1359 {120, 100, 140, 100}, /* t edgecase */
1360 {120, 99, 140, 99}, /* t edgecase clipped */
1361 {120, 199, 140, 199}, /* b edgecase */
1362 {120, 200, 140, 200}, /* b edgecase clipped */
1363 {120, 132, 310, 132}, /* inside two clip rects */
1364 { 10, 134, 101, 134}, /* r end on l edgecase */
1365 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1366 {199, 138, 220, 138}, /* l end on r edgecase */
1367 {200, 140, 220, 140} /* l end on r edgecase clipped */
1368 };
1369
1370 static const RECT vline_clips[] =
1371 {
1372 {120, 120, 120, 140}, /* unclipped */
1373 {100, 120, 100, 140}, /* l edgecase */
1374 { 99, 120, 99, 140}, /* l edgecase clipped */
1375 {199, 120, 199, 140}, /* r edgecase */
1376 {200, 120, 200, 140}, /* r edgecase clipped */
1377 {122, 99, 122, 201}, /* t and b clipped */
1378 {124, 100, 124, 140}, /* t edgecase */
1379 {126, 99, 126, 140}, /* t edgecase clipped */
1380 {128, 120, 128, 200}, /* b edgecase */
1381 {130, 120, 130, 201}, /* b edgecase clipped */
1382 {132, 12, 132, 140}, /* inside two clip rects */
1383 {134, 90, 134, 101}, /* b end on t edgecase */
1384 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1385 {138, 199, 138, 220}, /* t end on b edgecase */
1386 {140, 200, 140, 220} /* t end on b edgecase clipped */
1387 };
1388
1389 static const RECT line_clips[] =
1390 {
1391 { 90, 110, 310, 120},
1392 { 90, 120, 295, 130},
1393 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1394 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1395 { 90, 132, 101, 137}, /* end pt just inside l edge */
1396 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1397 {199, 142, 210, 143} /* start pt just inside r edge */
1398 };
1399
1400 static const RECT wide_lines[] =
1401 {
1402 {100, 10, 200, 10},
1403 {100, 21, 200, 21},
1404 {200, 40, 100, 40},
1405 {200, 61, 100, 61},
1406 { 10, 100, 10, 200},
1407 { 21, 100, 21, 200},
1408 { 40, 200, 40, 100},
1409 { 61, 200, 61, 100},
1410 };
1411
1412 static const POINT poly_lines[] =
1413 {
1414 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1415 };
1416
1417 static const POINT polypoly_lines[] =
1418 {
1419 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1420 };
1421
1422 static const DWORD polypoly_counts[] =
1423 {
1424 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1425 };
1426
1427 static const RECT patblt_clips[] =
1428 {
1429 {120, 120, 140, 126}, /* unclipped */
1430 {100, 130, 140, 136}, /* l edgecase */
1431 { 99, 140, 140, 146}, /* l edgecase clipped */
1432 {180, 130, 200, 136}, /* r edgecase */
1433 {180, 140, 201, 146}, /* r edgecase clipped */
1434 {120, 100, 130, 110}, /* t edgecase */
1435 {140, 99, 150, 110}, /* t edgecase clipped */
1436 {120, 180, 130, 200}, /* b edgecase */
1437 {140, 180, 150, 201}, /* b edgecase */
1438 {199, 150, 210, 156}, /* l edge on r edgecase */
1439 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1440 { 90, 150, 101, 156}, /* r edge on l edgecase */
1441 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1442 {160, 90, 166, 101}, /* b edge on t edgecase */
1443 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1444 {160, 199, 166, 210}, /* t edge on b edgecase */
1445 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1446 };
1447
1448 static const RECT rectangles[] =
1449 {
1450 {10, 11, 100, 101},
1451 {250, 100, 350, 10},
1452 {120, 10, 120, 20}, /* zero width */
1453 {120, 10, 130, 10}, /* zero height */
1454 {120, 40, 121, 41}, /* 1 x 1 */
1455 {130, 50, 132, 52}, /* 2 x 2 */
1456 {140, 60, 143, 63}, /* 3 x 3 */
1457 {150, 70, 154, 74}, /* 4 x 4 */
1458 {120, 20, 121, 30}, /* width == 1 */
1459 {130, 20, 132, 30}, /* width == 2 */
1460 {140, 20, 143, 30}, /* width == 3 */
1461 {200, 20, 210, 21}, /* height == 1 */
1462 {200, 30, 210, 32}, /* height == 2 */
1463 {200, 40, 210, 43} /* height == 3 */
1464 };
1465
1466 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1467 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1468 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1469 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1470 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1471 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1472
1473 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1474 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1475 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1476 0x00, 0x01 }; /* <eod> */
1477
1478 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1479 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1480 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1481 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1482
1483 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1484 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1485
1486 static const RGBQUAD default_palette_1[2] =
1487 {
1488 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1489 };
1490
1491 static const RGBQUAD default_palette_4[16] =
1492 {
1493 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1494 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1495 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1496 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1497 };
1498
1499 static const RGBQUAD default_palette_8[256] =
1500 {
1501 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1502 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1503 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1504 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1505 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1506 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1507 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1508 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1509 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1510 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1511 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1512 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1513 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1514 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1515 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1516 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1517 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1518 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1519 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1520 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1521 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1522 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1523 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1524 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1525 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1526 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1527 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1528 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1529 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1530 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1531 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1532 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1533 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1534 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1535 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1536 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1537 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1538 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1539 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1540 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1541 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1542 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1543 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1544 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1545 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1546 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1547 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1548 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1549 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1550 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1551 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1552 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1553 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1554 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1555 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1556 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1557 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1558 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1559 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1560 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1561 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1562 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1563 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1564 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1565 };
1566
1567 static HPALETTE create_default_palette( int bpp )
1568 {
1569 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1570 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1571 PALETTEENTRY *entries = pal->palPalEntry;
1572 int i;
1573
1574 pal->palVersion = 0x300;
1575 pal->palNumEntries = 1 << bpp;
1576 switch (bpp)
1577 {
1578 case 1:
1579 for (i = 0; i < 2; i++)
1580 {
1581 entries[i].peRed = default_palette_1[i].rgbRed;
1582 entries[i].peGreen = default_palette_1[i].rgbGreen;
1583 entries[i].peBlue = default_palette_1[i].rgbBlue;
1584 entries[i].peFlags = 0;
1585 }
1586 break;
1587 case 4:
1588 for (i = 0; i < 16; i++)
1589 {
1590 entries[i].peRed = default_palette_4[i].rgbRed;
1591 entries[i].peGreen = default_palette_4[i].rgbGreen;
1592 entries[i].peBlue = default_palette_4[i].rgbBlue;
1593 entries[i].peFlags = 0;
1594 }
1595 break;
1596 case 8:
1597 for (i = 0; i < 256; i++)
1598 {
1599 entries[i].peRed = default_palette_8[i].rgbRed;
1600 entries[i].peGreen = default_palette_8[i].rgbGreen;
1601 entries[i].peBlue = default_palette_8[i].rgbBlue;
1602 entries[i].peFlags = 0;
1603 }
1604 break;
1605 }
1606 return CreatePalette( pal );
1607 }
1608
1609 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1610 {
1611 HBRUSH brush = CreateSolidBrush( color );
1612 brush = SelectObject( hdc, brush );
1613 PatBlt( hdc, x, y, width, height, PATCOPY );
1614 DeleteObject( SelectObject( hdc, brush ) );
1615 }
1616
1617 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1618 {
1619 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1620 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1621 PALETTEENTRY *entries = pal->palPalEntry;
1622 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1623 LOGBRUSH log_brush;
1624 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1625 HBITMAP bmp;
1626 INT i, j, x, y, hatch_style;
1627 HDC src_dc;
1628 HRGN hrgn, hrgn2;
1629 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1630 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1631 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1632 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1633 RGBQUAD *brush_colors = brush_bi->bmiColors;
1634 BYTE *brush_bits, *src_bits;
1635 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1636 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1637 BLENDFUNCTION blend;
1638 COLORREF old_text, old_bkgnd;
1639 HPALETTE hpal, old_hpal;
1640
1641 blend.BlendOp = AC_SRC_OVER;
1642 blend.BlendFlags = 0;
1643
1644 reset_bounds( hdc );
1645
1646 memset(bits, 0xcc, get_dib_size(bmi));
1647 compare_hash(hdc, bmi, bits, "empty");
1648
1649 src_dc = CreateCompatibleDC( 0 );
1650 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1651 orig_pen = SelectObject(hdc, solid_pen);
1652 SetBrushOrgEx(hdc, 0, 0, NULL);
1653
1654 /* horizontal and vertical lines */
1655 for(i = 1; i <= 16; i++)
1656 {
1657 SetROP2(hdc, i);
1658 MoveToEx(hdc, 10, i * 3, NULL);
1659 LineTo(hdc, 100, i * 3); /* l -> r */
1660 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1661 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1662 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1663 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1664 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1665 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1666 }
1667 compare_hash(hdc, bmi, bits, "h and v solid lines");
1668
1669 /* diagonal lines */
1670 SetROP2(hdc, R2_COPYPEN);
1671 for(i = 0; i < 16; i++)
1672 {
1673 double s = sin(M_PI * i / 8.0);
1674 double c = cos(M_PI * i / 8.0);
1675
1676 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1677 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1678 }
1679 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1680
1681 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1682 {
1683 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1684 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1685 }
1686 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1687
1688 /* solid brush PatBlt */
1689 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1690 orig_brush = SelectObject(hdc, solid_brush);
1691
1692 for(i = 0, y = 10; i < 256; i++)
1693 {
1694 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1695
1696 if(rop_uses_src(rop3[i]))
1697 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1698 else
1699 {
1700 ok(ret, "got FALSE for %x\n", rop3[i]);
1701 y += 20;
1702 }
1703
1704 }
1705 compare_hash(hdc, bmi, bits, "solid patblt");
1706
1707 /* clipped lines */
1708 hrgn = CreateRectRgn(10, 10, 200, 20);
1709 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1710 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1711 SetRectRgn(hrgn2, 290, 100, 300, 200);
1712 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1713 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1714 DeleteObject(hrgn2);
1715
1716 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1717 {
1718 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1719 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1720 }
1721 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1722
1723 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1724 {
1725 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1726 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1727 }
1728 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1729
1730 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1731 {
1732 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1733 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1734 }
1735 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1736
1737 /* clipped PatBlt */
1738 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1739 {
1740 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1741 patblt_clips[i].right - patblt_clips[i].left,
1742 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1743 }
1744 compare_hash(hdc, bmi, bits, "clipped patblt");
1745
1746 /* clipped dashed lines */
1747 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1748 SelectObject(hdc, dashed_pen);
1749 SetBkMode(hdc, TRANSPARENT);
1750 SetBkColor(hdc, RGB(0, 0xff, 0));
1751
1752 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1753 {
1754 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1755 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1756 }
1757 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1758
1759 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1760 {
1761 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1762 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1763 }
1764 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1765
1766 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1767 {
1768 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1769 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1770 }
1771 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1772
1773 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1774 {
1775 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1776 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1777 }
1778 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1779
1780 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1781 {
1782 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1783 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1784 }
1785 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1786
1787 SetBkMode(hdc, OPAQUE);
1788
1789 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1790 {
1791 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1792 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1793 }
1794 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1795
1796 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1797
1798 /* 8888 DIB pattern brush */
1799
1800 brush_bi->bmiHeader = dib_brush_header_8888;
1801 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1802 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1803 brush_bits[2] = 0xff;
1804 brush_bits[6] = 0xff;
1805 brush_bits[14] = 0xff;
1806 brush_bits[65] = 0xff;
1807 brush_bits[69] = 0xff;
1808 brush_bits[72] = 0xff;
1809
1810 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1811
1812 SelectObject(hdc, dib_brush);
1813 SetBrushOrgEx(hdc, 1, 1, NULL);
1814
1815 for(i = 0, y = 10; i < 256; i++)
1816 {
1817 if(!rop_uses_src(rop3[i]))
1818 {
1819 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1820 ok(ret, "got FALSE for %x\n", rop3[i]);
1821 y += 25;
1822 }
1823 }
1824 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1825 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1826 else
1827 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1828
1829 SelectObject(hdc, orig_brush);
1830 DeleteObject(dib_brush);
1831
1832 /* 8888 bottom-up DIB pattern brush */
1833
1834 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1835
1836 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1837
1838 SelectObject(hdc, dib_brush);
1839
1840 /* This used to set the x origin to 100 as well, but
1841 there's a Windows bug for 24 bpp where the brush's x offset
1842 is incorrectly calculated for rops that involve both D and P */
1843 SetBrushOrgEx(hdc, 4, 100, NULL);
1844
1845 for(i = 0, y = 10; i < 256; i++)
1846 {
1847 if(!rop_uses_src(rop3[i]))
1848 {
1849 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1850 ok(ret, "got FALSE for %x\n", rop3[i]);
1851 y += 25;
1852 }
1853 }
1854 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1855 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1856 else
1857 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1858
1859 SelectObject(hdc, orig_brush);
1860 DeleteObject(dib_brush);
1861
1862 /* 24 bpp dib pattern brush */
1863
1864 brush_bi->bmiHeader = dib_brush_header_24;
1865 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1866 memset(brush_bits, 0, 16 * 16 * 3);
1867 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1868 brush_bits[49] = brush_bits[52] = 0xff;
1869
1870 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1871
1872 SelectObject(hdc, dib_brush);
1873 SetBrushOrgEx(hdc, 1, 1, NULL);
1874
1875 for(i = 0, y = 10; i < 256; i++)
1876 {
1877 if(!rop_uses_src(rop3[i]))
1878 {
1879 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1880 ok(ret, "got FALSE for %x\n", rop3[i]);
1881 y += 25;
1882 }
1883 }
1884 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1885 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1886 else
1887 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1888
1889 SelectObject(hdc, orig_brush);
1890 DeleteObject(dib_brush);
1891
1892 /* 555 dib pattern brush */
1893
1894 brush_bi->bmiHeader = dib_brush_header_555;
1895 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1896 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1897 brush_bits[0] = brush_bits[1] = 0xff;
1898 brush_bits[32] = brush_bits[34] = 0x7c;
1899
1900 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1901
1902 SelectObject(hdc, dib_brush);
1903 SetBrushOrgEx(hdc, 1, 1, NULL);
1904
1905 for(i = 0, y = 10; i < 256; i++)
1906 {
1907 if(!rop_uses_src(rop3[i]))
1908 {
1909 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1910 ok(ret, "got FALSE for %x\n", rop3[i]);
1911 y += 25;
1912 }
1913 }
1914 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1915 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1916 else
1917 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1918
1919 SelectObject(hdc, orig_brush);
1920 DeleteObject(dib_brush);
1921
1922 SetBrushOrgEx(hdc, 0, 0, NULL);
1923
1924 /* 8 bpp dib pattern brush */
1925
1926 brush_bi->bmiHeader = dib_brush_header_8;
1927 brush_bi->bmiHeader.biClrUsed = 3;
1928 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1929 brush_colors[0].rgbRed = 0xff;
1930 brush_colors[1].rgbRed = 0xff;
1931 brush_colors[1].rgbGreen = 0xff;
1932 brush_colors[1].rgbBlue = 0xff;
1933
1934 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1935 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1936 brush_bits[0] = brush_bits[1] = 1;
1937 brush_bits[16] = brush_bits[17] = 2;
1938 brush_bits[32] = brush_bits[33] = 6;
1939
1940 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1941
1942 SelectObject(hdc, dib_brush);
1943 SetBrushOrgEx(hdc, 1, 1, NULL);
1944
1945 for(i = 0, y = 10; i < 256; i++)
1946 {
1947 if(!rop_uses_src(rop3[i]))
1948 {
1949 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1950 ok(ret, "got FALSE for %x\n", rop3[i]);
1951 y += 25;
1952 }
1953 }
1954 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1955
1956 SelectObject(hdc, orig_brush);
1957 DeleteObject(dib_brush);
1958
1959 /* 4 bpp dib pattern brush */
1960
1961 brush_bi->bmiHeader = dib_brush_header_4;
1962 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1963
1964 SelectObject(hdc, dib_brush);
1965 SetBrushOrgEx(hdc, 1, 1, NULL);
1966
1967 for(i = 0, y = 10; i < 256; i++)
1968 {
1969 if(!rop_uses_src(rop3[i]))
1970 {
1971 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1972 ok(ret, "got FALSE for %x\n", rop3[i]);
1973 y += 25;
1974 }
1975 }
1976 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1977
1978 SelectObject(hdc, orig_brush);
1979 DeleteObject(dib_brush);
1980
1981 /* 1 bpp dib pattern brush */
1982
1983 brush_bi->bmiHeader = dib_brush_header_1;
1984 brush_bi->bmiHeader.biClrUsed = 2;
1985 memset(brush_bits, 0, 16 * 4);
1986 brush_bits[0] = 0xf0;
1987 brush_bits[4] = 0xf0;
1988 brush_bits[8] = 0xf0;
1989
1990 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1991 SelectObject(hdc, dib_brush);
1992 for(i = 0, y = 10; i < 256; i++)
1993 {
1994 if(!rop_uses_src(rop3[i]))
1995 {
1996 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1997 ok(ret, "got FALSE for %x\n", rop3[i]);
1998 y += 25;
1999 }
2000 }
2001
2002 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
2003
2004 SelectObject(hdc, orig_brush);
2005 DeleteObject(dib_brush);
2006
2007 /* 1 bpp ddb pattern brush */
2008
2009 old_text = GetTextColor( hdc );
2010 old_bkgnd = GetBkColor( hdc );
2011 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2012 dib_brush = CreatePatternBrush( bmp );
2013 SelectObject(hdc, dib_brush);
2014 for(i = 0, y = 10; i < 256; i++)
2015 {
2016 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2017 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2018 if(!rop_uses_src(rop3[i]))
2019 {
2020 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2021 ok(ret, "got FALSE for %x\n", rop3[i]);
2022 y += 25;
2023 }
2024 }
2025
2026 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
2027
2028 DeleteObject(bmp);
2029 SelectObject(hdc, orig_brush);
2030 DeleteObject( dib_brush );
2031 SetBrushOrgEx(hdc, 0, 0, NULL);
2032 SetTextColor(hdc, old_text);
2033 SetBkColor(hdc, old_bkgnd);
2034
2035 /* Rectangle */
2036
2037 SelectObject(hdc, solid_pen);
2038 SelectObject(hdc, solid_brush);
2039
2040 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2041 {
2042 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
2043 }
2044
2045 SelectObject(hdc, dashed_pen);
2046 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2047 {
2048 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
2049 }
2050
2051 compare_hash(hdc, bmi, bits, "rectangles");
2052 SelectObject(hdc, solid_pen);
2053
2054 /* PaintRgn */
2055
2056 PaintRgn(hdc, hrgn);
2057 compare_hash(hdc, bmi, bits, "PaintRgn");
2058
2059 /* RTL rectangles */
2060
2061 if( !pSetLayout )
2062 {
2063 win_skip("Don't have SetLayout\n");
2064 skip_compare(1);
2065 }
2066 else
2067 {
2068 pSetLayout(hdc, LAYOUT_RTL);
2069 PaintRgn(hdc, hrgn);
2070 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
2071 Rectangle(hdc, 100, 250, 110, 260);
2072 compare_hash(hdc, bmi, bits, "rtl");
2073
2074 pSetLayout(hdc, LAYOUT_LTR);
2075 }
2076 DeleteObject( hrgn );
2077
2078 for(i = 0, y = 10; i < 256; i++)
2079 {
2080 if(!rop_uses_src(rop3[i]))
2081 {
2082 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
2083 {
2084 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
2085 SelectObject(hdc, hatch_brush);
2086 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
2087 ok(ret, "got FALSE for %x\n", rop3[i]);
2088 SelectObject(hdc, orig_brush);
2089 DeleteObject(hatch_brush);
2090 }
2091 y += 25;
2092 }
2093 }
2094
2095 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
2096
2097 /* overlapping blits */
2098
2099 orig_brush = SelectObject(hdc, solid_brush);
2100
2101 Rectangle(hdc, 10, 10, 100, 100);
2102 Rectangle(hdc, 20, 15, 30, 40);
2103 Rectangle(hdc, 15, 15, 20, 20);
2104 Rectangle(hdc, 15, 20, 50, 45);
2105 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2106 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
2107
2108 Rectangle(hdc, 10, 10, 100, 100);
2109 Rectangle(hdc, 20, 15, 30, 40);
2110 Rectangle(hdc, 15, 15, 20, 20);
2111 Rectangle(hdc, 15, 20, 50, 45);
2112 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2113 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2114 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
2115 else
2116 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2117
2118 Rectangle(hdc, 10, 10, 100, 100);
2119 Rectangle(hdc, 20, 15, 30, 40);
2120 Rectangle(hdc, 15, 15, 20, 20);
2121 Rectangle(hdc, 15, 20, 50, 45);
2122 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2123 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2124
2125 Rectangle(hdc, 10, 10, 100, 100);
2126 Rectangle(hdc, 20, 15, 30, 40);
2127 Rectangle(hdc, 15, 15, 20, 20);
2128 Rectangle(hdc, 15, 20, 50, 45);
2129 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2130 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2131 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2132 else
2133 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2134
2135 Rectangle(hdc, 10, 10, 100, 100);
2136 Rectangle(hdc, 20, 15, 30, 40);
2137 Rectangle(hdc, 15, 15, 20, 20);
2138 Rectangle(hdc, 15, 20, 50, 45);
2139 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2140 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2141
2142 Rectangle(hdc, 10, 10, 100, 100);
2143 Rectangle(hdc, 20, 15, 30, 40);
2144 Rectangle(hdc, 15, 15, 20, 20);
2145 Rectangle(hdc, 15, 20, 50, 45);
2146 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2147 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2148
2149 Rectangle(hdc, 10, 10, 100, 100);
2150 Rectangle(hdc, 20, 15, 30, 40);
2151 Rectangle(hdc, 15, 15, 20, 20);
2152 Rectangle(hdc, 15, 20, 50, 45);
2153 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2154 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2155 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2156 else
2157 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2158
2159 Rectangle(hdc, 10, 10, 100, 100);
2160 Rectangle(hdc, 20, 15, 30, 40);
2161 Rectangle(hdc, 15, 15, 20, 20);
2162 Rectangle(hdc, 15, 20, 50, 45);
2163 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2164 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2165
2166 /* blitting with 32-bpp BI_RGB source */
2167
2168 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2169 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2170 src_bi->bmiHeader.biHeight = 256;
2171 src_bi->bmiHeader.biWidth = 256;
2172 src_bi->bmiHeader.biBitCount = 32;
2173 src_bi->bmiHeader.biPlanes = 1;
2174 src_bi->bmiHeader.biCompression = BI_RGB;
2175 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2176 SelectObject( src_dc, bmp );
2177 for (y = 0; y < 256; y++)
2178 for (x = 0; x < 256; x++)
2179 {
2180 BYTE a = (x + y) * 2;
2181 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2182 BYTE g = (BYTE)(x + y / 3) * a / 255;
2183 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2184 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2185 }
2186
2187 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2188 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2189 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2190 else
2191 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2192
2193 blend.SourceConstantAlpha = 0xd0;
2194 blend.AlphaFormat = 0;
2195 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2196 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2197 {
2198 if (!pGdiAlphaBlend) skip_compare(2);
2199 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2200 }
2201 else
2202 {
2203 if (!pGdiAlphaBlend) skip_compare(1);
2204 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2205 }
2206
2207 blend.SourceConstantAlpha = 0xb0;
2208 blend.AlphaFormat = AC_SRC_ALPHA;
2209 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2210 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2211 {
2212 if (!pGdiAlphaBlend) skip_compare(2);
2213 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2214 }
2215 else
2216 {
2217 if (!pGdiAlphaBlend) skip_compare(1);
2218 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2219 }
2220
2221 /* blitting with 32-bpp r10g10b10 source */
2222
2223 src_bi->bmiHeader.biBitCount = 32;
2224 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2225 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2226 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2227 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2228 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2229 SelectObject( src_dc, bmp );
2230 for (y = 0; y < 256; y++)
2231 for (x = 0; x < 256; x++)
2232 {
2233 WORD r = (7 * x + 3 * y) % 1024;
2234 WORD g = (11 * x + y / 3) % 1024;
2235 WORD b = (x / 3 + 9 * y) % 1024;
2236 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2237 }
2238
2239 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2240 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2241 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2242 else
2243 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2244
2245 /* blitting with 32-bpp b6g6r6 source */
2246
2247 src_bi->bmiHeader.biBitCount = 32;
2248 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2249 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2250 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2251 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2252 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2253 SelectObject( src_dc, bmp );
2254 for (y = 0; y < 256; y++)
2255 for (x = 0; x < 256; x++)
2256 {
2257 BYTE r = (y + 2 * x) % 64;
2258 BYTE g = (x + y / 3) % 64;
2259 BYTE b = (x / 3 + 2 * y) % 64;
2260 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2261 }
2262
2263 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2264 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2265 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2266 else
2267 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2268
2269 /* blitting with 24-bpp source */
2270
2271 src_bi->bmiHeader.biBitCount = 24;
2272 src_bi->bmiHeader.biCompression = BI_RGB;
2273 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2274 DeleteObject( SelectObject( src_dc, bmp ) );
2275 for (y = 0; y < 256; y++)
2276 for (x = 0; x < 256; x++)
2277 {
2278 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2279 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2280 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2281 }
2282
2283 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2284 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2285 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2286 else
2287 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2288
2289 blend.SourceConstantAlpha = 0xe0;
2290 blend.AlphaFormat = 0;
2291 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2292 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2293 {
2294 if (!pGdiAlphaBlend) skip_compare(2);
2295 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2296 }
2297 else
2298 {
2299 if (!pGdiAlphaBlend) skip_compare(1);
2300 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2301 }
2302
2303 /* blitting with 16-bpp BI_RGB source */
2304
2305 src_bi->bmiHeader.biBitCount = 16;
2306 src_bi->bmiHeader.biCompression = BI_RGB;
2307 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2308 DeleteObject( SelectObject( src_dc, bmp ) );
2309 for (y = 0; y < 256; y++)
2310 for (x = 0; x < 256; x++)
2311 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2312
2313 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2314 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2315 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2316 else
2317 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2318
2319 /* blitting with 16-bpp b4g4r4 source */
2320
2321 src_bi->bmiHeader.biBitCount = 16;
2322 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2323 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2324 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2325 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2326 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2327 DeleteObject( SelectObject( src_dc, bmp ) );
2328 for (y = 0; y < 256; y++)
2329 for (x = 0; x < 256; x++)
2330 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2331
2332 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2333 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2334 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2335 else
2336 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2337
2338 /* blitting with 8-bpp source */
2339
2340 src_bi->bmiHeader.biBitCount = 8;
2341 src_bi->bmiHeader.biCompression = BI_RGB;
2342 src_bi->bmiHeader.biClrUsed = 160;
2343 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2344 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2345 DeleteObject( SelectObject( src_dc, bmp ) );
2346 for (y = 0; y < 256; y++)
2347 for (x = 0; x < 256; x++)
2348 src_bits[y * 256 + x] = 3 * x + 5 * y;
2349
2350 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2351 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2352
2353 blend.SourceConstantAlpha = 0xd0;
2354 blend.AlphaFormat = 0;
2355 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2356 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2357 {
2358 if (!pGdiAlphaBlend) skip_compare(2);
2359 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2360 }
2361 else
2362 {
2363 if (!pGdiAlphaBlend) skip_compare(1);
2364 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2365 }
2366
2367 /* blitting with 4-bpp source */
2368
2369 src_bi->bmiHeader.biBitCount = 4;
2370 src_bi->bmiHeader.biClrUsed = 12;
2371 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2372 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2373 DeleteObject( SelectObject( src_dc, bmp ) );
2374 for (y = 0; y < 256; y++)
2375 for (x = 0; x < 256; x += 2)
2376 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2377
2378 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2379 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2380
2381 /* blitting with 1-bpp source */
2382
2383 src_bi->bmiHeader.biBitCount = 1;
2384 src_bi->bmiHeader.biClrUsed = 0;
2385 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2386 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2387 DeleteObject( SelectObject( src_dc, bmp ) );
2388 for (y = 0; y < 256; y++)
2389 for (x = 0; x < 256; x += 8)
2390 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2391
2392 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2393 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2394
2395 blend.SourceConstantAlpha = 0x90;
2396 blend.AlphaFormat = 0;
2397 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2398 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2399 {
2400 if (!pGdiAlphaBlend) skip_compare(2);
2401 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2402 }
2403 else
2404 {
2405 if (!pGdiAlphaBlend) skip_compare(1);
2406 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2407 }
2408
2409 DeleteDC( src_dc );
2410 DeleteObject( bmp );
2411
2412 /* RLE StretchDIBits */
2413 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2414 src_bi->bmiHeader.biWidth = 8;
2415 src_bi->bmiHeader.biHeight = 8;
2416 src_bi->bmiHeader.biPlanes = 1;
2417 src_bi->bmiHeader.biBitCount = 8;
2418 src_bi->bmiHeader.biCompression = BI_RLE8;
2419 src_bi->bmiHeader.biClrUsed = 0;
2420 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2421
2422 for (i = 0; i < 256; i++)
2423 {
2424 src_bi->bmiColors[i].rgbRed = i;
2425 src_bi->bmiColors[i].rgbGreen = i;
2426 src_bi->bmiColors[i].rgbBlue = i;
2427 src_bi->bmiColors[i].rgbReserved = 0;
2428 }
2429
2430 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2431 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2432 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2433 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2434 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2435 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2436
2437 /* 32 bpp StretchDIBits */
2438
2439 src_bi->bmiHeader.biWidth = 4;
2440 src_bi->bmiHeader.biHeight = 4;
2441 src_bi->bmiHeader.biPlanes = 1;
2442 src_bi->bmiHeader.biBitCount = 32;
2443 src_bi->bmiHeader.biCompression = BI_RGB;
2444 src_bi->bmiHeader.biClrUsed = 0;
2445 src_bi->bmiHeader.biSizeImage = 0;
2446
2447 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2448 ok(ret == 4, "got %d\n", ret);
2449 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2450 ok(ret == 4, "got %d\n", ret);
2451 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2452 ok(ret == 4, "got %d\n", ret);
2453 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2454 ok(ret == 4, "got %d\n", ret);
2455 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2456 ok(ret == 4, "got %d\n", ret);
2457 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2458 ok(ret == 4, "got %d\n", ret);
2459
2460 src_bi->bmiHeader.biHeight = -4;
2461
2462 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2463 ok(ret == 4, "got %d\n", ret);
2464 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2465 ok(ret == -4, "got %d\n", ret);
2466 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2467 ok(ret == 4, "got %d\n", ret);
2468 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2469 ok(ret == -4, "got %d\n", ret);
2470 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2471 ok(ret == 4, "got %d\n", ret);
2472 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2473 ok(ret == -4, "got %d\n", ret);
2474
2475 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2476
2477 /* Solid colors */
2478 for (i = 0; i < 256; i++)
2479 {
2480 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2481 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2482 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2483 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2484 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2485 }
2486
2487 /* A few extra colors that are interesting in the 1bpp case */
2488
2489 /* bk color */
2490 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2491 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2492
2493 /* color 0 */
2494 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2495 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2496
2497 /* color 1 */
2498 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2499 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2500
2501 compare_hash(hdc, bmi, bits, "Colors");
2502
2503 for (i = 0; i < 256; i++)
2504 {
2505 COLORREF s, g;
2506 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2507 g = GetPixel( hdc, i * 2, 10 );
2508 ok( s == g, "got %08x and %08x\n", s, g );
2509
2510 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2511 g = GetPixel( hdc, i * 2, 20 );
2512 ok( s == g, "got %08x and %08x\n", s, g );
2513
2514 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2515 g = GetPixel( hdc, i * 2, 30 );
2516 ok( s == g, "got %08x and %08x\n", s, g );
2517
2518 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2519 g = GetPixel( hdc, i * 2, 40 );
2520 ok( s == g, "got %08x and %08x\n", s, g );
2521
2522 for (j = 0; j < 256; j++)
2523 {
2524 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2525 g = GetPixel( hdc, i * 2, 50+j );
2526 ok( s == g, "got %08x and %08x\n", s, g );
2527
2528 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2529 g = GetPixel( hdc, i * 2 + 1, 50+j );
2530 ok( s == g, "got %08x and %08x\n", s, g );
2531 }
2532 }
2533
2534 compare_hash(hdc, bmi, bits, "SetPixel");
2535
2536 /* gradients */
2537
2538 if (pGdiGradientFill)
2539 {
2540 TRIVERTEX vrect[] =
2541 {
2542 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2543 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2544 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2545 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2546 };
2547 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2548
2549 TRIVERTEX vtri[] =
2550 {
2551 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2552 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2553 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2554
2555 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2556 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2557 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2558
2559 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2560 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2561 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2562
2563 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2564 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2565 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2566
2567 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2568 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2569 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2570
2571 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2572 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2573 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2574
2575 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2576 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2577 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2578 };
2579 GRADIENT_TRIANGLE tri[] =
2580 {
2581 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2582 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2583 };
2584
2585 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2586 for (i = 0; i < 4