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