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