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