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