wow64: In wow64_NtSetInformationToken forward TokenIntegrityLevel.
[wine.git] / dlls / gdi32 / tests / dib.c
blob14e8a9b384f7fd953ce84e9cf790660b718b303a
1 /*
2 * DIB driver tests.
4 * Copyright 2011 Huw Davies
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.
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.
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
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <math.h>
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wingdi.h"
28 #include "winuser.h"
29 #include "wincrypt.h"
30 #include "mmsystem.h" /* DIBINDEX */
32 #include "wine/test.h"
34 static HCRYPTPROV crypt_prov;
36 static const DWORD rop3[256] =
38 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
39 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
40 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
41 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
42 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
43 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
44 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
45 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
46 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
47 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
48 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
49 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
50 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
51 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
52 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
53 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
54 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
55 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
56 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
57 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
58 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
59 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
60 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
61 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
62 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
63 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
64 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
65 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
66 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
67 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
68 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
69 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
72 static inline BOOL rop_uses_src(DWORD rop)
74 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
77 static const char *sha1_graphics_a8r8g8b8[] =
79 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
80 "2426172d9e8fec27d9228088f382ef3c93717da9",
81 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
82 "664fac17803859a4015c6ae29e5538e314d5c827",
83 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
84 "fe6cc678fb13a3ead67839481bf22348adc69f52",
85 "d51bd330cec510cdccf5394328bd8e5411901e9e",
86 "df4aebf98d91f11be560dd232123b3ae327303d7",
87 "f2af53dd073a09b1031d0032d28da35c82adc566",
88 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
89 "c387917268455017aa0b28bed73aa6554044bbb3",
90 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
91 "6c530622a025d872a642e8f950867884d7b136cb",
92 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
93 "b2261353decda2712b83538ab434a49ce21f3172",
94 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
95 "9b9874c1c1d92afa554137e191d34ea33acc322f",
96 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
97 "d7398de15b2837a58a62a701ca1b3384625afec4",
98 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
99 "5246ef357e7317b9d141a3294d300c195da76cb7",
100 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
101 "3d8244b665ecdb104087bad171b0b0f83545133c",
102 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
103 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
104 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
105 "e358efb1c11172e40855de620bdb8a8e545cd790",
106 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
107 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
108 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
109 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
110 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
111 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
112 "94645300d6eb51020a7ef8261dee2941cd51b5df",
113 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
114 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
115 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
116 "68c18db6abfda626cab12d198298d4c39264bfbc",
117 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
118 "39c31de73aafcfcadf0bf414da4495be9de54417",
119 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
120 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
121 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
122 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
123 "3d2ccbe51408232a04769546b1bdd74f84558a41",
124 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
125 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
126 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
127 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
128 "d7dd4700f49808541bba99244b7eb5840e0a2439",
129 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
130 "8eb1f99d21a84153e88e7958707049d517ab7641",
131 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
132 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
133 "fd5b4569f2a1e42b2804c5baf93d95c9963cf608",
134 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
135 "d08f2c4e2b30131450328ed6be0efb9966a890de",
136 "e462052a03dbe4ec3814db7700e166d00d4d686f",
137 "a27917d4db49ce77989fae246015aeb2a28520ee",
138 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
139 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
140 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
141 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
142 "2b3198bd5c0a87db5dab13df8bbe14363d02acec",
143 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
144 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
145 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
146 NULL
149 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
151 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
152 "2426172d9e8fec27d9228088f382ef3c93717da9",
153 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
154 "664fac17803859a4015c6ae29e5538e314d5c827",
155 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
156 "fe6cc678fb13a3ead67839481bf22348adc69f52",
157 "d51bd330cec510cdccf5394328bd8e5411901e9e",
158 "df4aebf98d91f11be560dd232123b3ae327303d7",
159 "f2af53dd073a09b1031d0032d28da35c82adc566",
160 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
161 "c387917268455017aa0b28bed73aa6554044bbb3",
162 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
163 "6c530622a025d872a642e8f950867884d7b136cb",
164 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
165 "b2261353decda2712b83538ab434a49ce21f3172",
166 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
167 "9b9874c1c1d92afa554137e191d34ea33acc322f",
168 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
169 "d7398de15b2837a58a62a701ca1b3384625afec4",
170 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
171 "5246ef357e7317b9d141a3294d300c195da76cb7",
172 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
173 "3d8244b665ecdb104087bad171b0b0f83545133c",
174 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
175 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
176 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
177 "e358efb1c11172e40855de620bdb8a8e545cd790",
178 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
179 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
180 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
181 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
182 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
183 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
184 "94645300d6eb51020a7ef8261dee2941cd51b5df",
185 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
186 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
187 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
188 "68c18db6abfda626cab12d198298d4c39264bfbc",
189 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
190 "39c31de73aafcfcadf0bf414da4495be9de54417",
191 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
192 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
193 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
194 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
195 "3d2ccbe51408232a04769546b1bdd74f84558a41",
196 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
197 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
198 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
199 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
200 "d7dd4700f49808541bba99244b7eb5840e0a2439",
201 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
202 "8eb1f99d21a84153e88e7958707049d517ab7641",
203 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
204 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
205 "fd5b4569f2a1e42b2804c5baf93d95c9963cf608",
206 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
207 "d08f2c4e2b30131450328ed6be0efb9966a890de",
208 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
209 "b2c8e1ebb9435031fe068442f479d1304096e79f",
210 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
211 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
212 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
213 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
214 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
215 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
216 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
217 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
218 NULL
221 static const char *sha1_graphics_a8b8g8r8[] =
223 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
224 "e0bc877697093ed440e125154e247ca9d65e933c",
225 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
226 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
227 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
228 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
229 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
230 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
231 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
232 "b753ebb39d90210cc717f57b53dd439f7de6b077",
233 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
234 "94368cea5033b435454daa56d55546310675131e",
235 "bf57a6a37fb107d29ed3d45695919887abcb7902",
236 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
237 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
238 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
239 "b0178632775d29bec2b16de7b9b8287115c40d0f",
240 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
241 "3369889a67d6c79a24ee15f7d14374f9995215e4",
242 "473a1fd07df800c87a5d3286b642ace10c61c6af",
243 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
244 "b8951d2b20518fd129e5113a5f429626893913bf",
245 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
246 "4851c5b7d5bc18590e787c0c218a592ef504e738",
247 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
248 "abdf003699364fe45fab7dc61e67c606d0063b40",
249 "89abaadff4e68c738cf9251c51e3609564843381",
250 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
251 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
252 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
253 "71b9756fdfeedce1e6db201176d21a981b881662",
254 "5319528d9af750c172ae62ee85ddb2eaef73b193",
255 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
256 "19b32a0daa91201725b5e13820c343d0a84ff698",
257 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
258 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
259 "9b81ccc2d956d1de019085f971ba19435fe5feae",
260 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
261 "8566c1110ab5cb8f754787b47923c8bff38f790c",
262 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
263 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
264 "d01071c44259adc94b89978b7d51a058b6dad665",
265 "e6d33b106bcda374e662d338c57a457dbcaa108a",
266 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
267 "339908a568f384e1f384a3e1b0dd415779203b02",
268 "88fd743d00bd37d2ed722092146795b044d08a6e",
269 "c0537ec24147e74939219213d864ee113cad9967",
270 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
271 "eac5d164b83edf2cf85bac242686f9f617ec1fa4",
272 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
273 "698d6393e97539806351368f95be478c6fbc62b0",
274 "c272d1e0342e6089a0182dc42b37e47889116a9b",
275 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
276 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
277 "9098b3ef02debe1924ad5a1bc4d24ade9d91ae7f",
278 "849d4abf4b690128a5f70e9b8ac78f20c437de06",
279 "88a51deb333457af423e1a1a4e3dd4ef8ca4e8c5",
280 "87f57a31253a38dbf3dc3070473328fa04b68a48",
281 "db64cc4d830fc35ed170b53943e722b2342954d4",
282 "9988ceca44dafbee247aece1f027c06c27c01652",
283 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
284 "b76e0724496e471b01ef8b34f8beba69f5bde261",
285 "34201d3d3583f89ce3267d3d0c4e01c64463de4b",
286 "693f5c5fbaeaadb5928d34b035499626fecb8394",
287 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
288 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
289 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
290 NULL
293 static const char *sha1_graphics_r10g10b10[] =
295 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
296 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
297 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
298 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
299 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
300 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
301 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
302 "0ad27de0c916c073d0d18484fff899bbdb258db7",
303 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
304 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
305 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
306 "2986b431a0022153e5f875da77cc792e3825ebd5",
307 "ca4b25a5459885ce1e0a36844612087893d425b1",
308 "181bd4616796d89174cedc0332fb320b65aeb0e2",
309 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
310 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
311 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
312 "536eaaa901d652805a8977ecb2dc73f651094c5b",
313 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
314 "92cddcabf5365eef1e037f488af52b31669d987f",
315 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
316 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
317 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
318 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
319 "d578210815e27fe210eb678a71e6d22ba4b4c196",
320 "c7a027c7079dfcc831ca8bc134a509958273073c",
321 "19cf978596195b848df8709aaf637f83f92b8336",
322 "86ddf268d854f37e5b478c48792b551b57635db6",
323 "8259d388e02542207b6a08d65d553871ce1c4a09",
324 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
325 "66f8d78d4971934794478afee28b3a50e97f1b82",
326 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
327 "63798fb175afef78fa8fe8133d9de97a0cc80651",
328 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
329 "1ceb85697f649a62b1753438daa14944af7f450c",
330 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
331 "1cb0c7d9d89cdbce7b47d19ef0365bb6b2adc831",
332 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
333 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
334 "ada202d2f526f6995f83412479891c1764b66e5a",
335 "68348e8f54883f4fe295354b024e291c85f1038f",
336 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
337 "e9167564031ead3459eee6a3ebb2f58f100d931f",
338 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
339 "46196f50297260df2863e2fa76d2dfcf72006c23",
340 "0790585dfaef94f912b1ee81477d4ac448708708",
341 "589fb8a85d924ad19ed78409ae89475ba479c30a",
342 "43d67bc61ef54014b022891e5c024fc24b1fe797",
343 "5a713a91fd471fd331bd13b0868c994aa2ffe2b2",
344 "fc0c32afb719295f28bcfef22803bef94f798e20",
345 "bb2a421bab95f9b5420704ef44c0f3214a0b5a11",
346 "7735098af7535d8c57266190a13f92d8869e8529",
347 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
348 "d3f08946300e1700865042aed121870e292d1095",
349 "5d0e4959415b18f0c5589e03d03605e553309138",
350 "4782df8e24127e66a434b4e839adebf2dbb223fb",
351 "c31bed2e92265aab0b690fb5092e2f6e533a0554",
352 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
353 "317521e576801acaea62c76fe16813cdfe20f4ad",
354 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
355 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
356 "555b6f04ba8dec9e2a60693dcaac594227052727",
357 "c199b96a71c3aab2d49ccb5b6294bf14eb0dd1eb",
358 "4238fe9d296b5c72b0a8745cc761f308605b2094",
359 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
360 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
361 "1936661eee8073068506131c9e89265b2f8403e8",
362 NULL
365 static const char *sha1_graphics_r6g6b6[] =
367 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
368 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
369 "5b9dab3d8411afb25fbbeba0313db526815ac189",
370 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
371 "2028d1b0d1acef35dc07027135023f35fb9746b9",
372 "378713720dcb5aadb730435ad0989a68ab189114",
373 "084152773feb01a85df6006f2f4f288a1442d37a",
374 "97b824953f60fc9a91028045baacbe7b7dc82b14",
375 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
376 "287d755448e72e29e4812193e2b6f8098a214d82",
377 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
378 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
379 "e51bcf80211cd06e7d10225534b7a79b5454be27",
380 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
381 "0b94e0a5b739ab0020130646522e53da35a149ad",
382 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
383 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
384 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
385 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
386 "2128157e601ef0d6b3636b7387d3b28e876de728",
387 "8bdcdcd463f0052279d070ac763757f4db975483",
388 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
389 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
390 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
391 "66b130f83381957cfc4763558c5f5cddf2e3b564",
392 "d548135ce2320499277ce12b80bc35004f8a9787",
393 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
394 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
395 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
396 "defd95a10d44cad6e736542920b74efd53e9e7eb",
397 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
398 "3f11a735e52030aa3d0f024d83803698293d10e5",
399 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
400 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
401 "3231c4d87faefb7ec5bd377613969c05b70343fc",
402 "00394e438e9edde978e88602c9ad2a572e965bf6",
403 "c0c41390270ba082ee8211576fee39c676813c42",
404 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
405 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
406 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
407 "3d6cf3753390a05504b1f50302f767df443f0f40",
408 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
409 "da9e896a3a98b330980152b2e4a43cb6e686c730",
410 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
411 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
412 "47499ad13b719de18c59c2bc9b38ed578db50b95",
413 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
414 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
415 "8ad5cd520cd628b76d2e5a3f318ae1bbb6b4c994",
416 "49341c297a887186bd47d7465d827ab3147f05e3",
417 "514c07281ef6702c35e68b230e897303a8cdec81",
418 "4b41865829b50b2e29beda51b055bd1f908a649c",
419 "325279e76367200d3fd7194d81c09fd139988ece",
420 "c3def160a1e847605ff0fc7edd30397fa90635a0",
421 "65b7b585ffa3bfaa9ce1561a343e450b6ba409db",
422 "2b3e87e0b705b03c7c08f403409ab82cce095ba1",
423 "3ded1c18712c1d102e327d0699be43675f881e89",
424 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
425 "77ea86e51a94b11a8081b29696cb4115687843e3",
426 "d67b897cad72d31e75359094007b1346fd8806ea",
427 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
428 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
429 "1e5a4ef7f8634847a251d1fcce298c409fd13d87",
430 "481337fbedf181d4324bf7f8299b0327197ff468",
431 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
432 "5da35bad12e3e9b26a0444d30820099481281e45",
433 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
434 NULL
437 static const char *sha1_graphics_24[] =
439 "e993b15c9bd14fb45a15310450b7083c44e42665",
440 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
441 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
442 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
443 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
444 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
445 "fd4be592483623dbc800fe28210a1f0daa71999b",
446 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
447 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
448 "883bc8f305c602edca785e21cd00f488583fb13f",
449 "3bac4e80993f49dc3926e30524115fca9d7a8026",
450 "91369e35be29059a0665782541db4c8b324c6bb2",
451 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
452 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
453 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
454 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
455 "5068bff794553cf5a3145ae407c9a2984357844c",
456 "413a7989969c229dee4ab1798362f32f96cf0a10",
457 "0bb222e540b82720d4971e4a2fc626899af03e03",
458 "adc20832d8c43f1cf372d8392535492013cd2306",
459 "45649794dcbcabda487f66f7a80fc1bec79047a1",
460 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
461 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
462 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
463 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
464 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
465 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
466 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
467 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
468 "955390669afed2369b15b32fa519f2f921cdf1a0",
469 "201906f7d763b930a98c97f8eeab417f2b65e723",
470 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
471 "701c5af1d0c28294ce7d804b5697643c430d22a0",
472 "b0a959745b2db1d9f449e68e4479a4f36301879c",
473 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
474 "e171f6ec77bca91d6b8559911bce296c0bac469e",
475 "33bb75c12f083d799d287fe9caddedbb3892e6fa",
476 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
477 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
478 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
479 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
480 "0f79500eda467cd3cbc220abdd37b5dba695d654",
481 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
482 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
483 "7d479beeb6758c164566638b5c873c188d6a91e7",
484 "80086808fca03e757d812e31d1ae576bf90dac9d",
485 "9560096f1b85ae6d939d736165c44df00a47c424",
486 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
487 "5578c80048520732557abf3a3a3fa22c85015d7d",
488 "b25ba91487ec945410deb2b51bc1156890c032a8",
489 "4c8c936372755f95051f1159b7ff65a484e1a555",
490 "bf55d4bdb26ae0f358bd67ef01932563519aab98",
491 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
492 "ee315634ed92da3a32c2675ecd1b369471c60936",
493 "5ef5da5582a1a57272efaa98b109c0eb20f8ea03",
494 "099c688a920f606655b485e8f0a433dc811bc976",
495 "8a6c0e9f060653365ae76294e1ec53741c89c27d",
496 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
497 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
498 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
499 "bf5ec23456efe00e1e0931c17de9040ab2092858",
500 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
501 "9d86b1b2bbce90efd3c0b9fe20d23ffa3eeecd20",
502 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
503 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
504 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
505 "48658ff76c137185c56a53f3ccf0e958d0296742",
506 NULL
509 static const char *sha1_graphics_r5g5b5[] =
511 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
512 "847005cf7371f511bcc837251cde07b1796f6113",
513 "a8f75743a930843ec14d516cd048b6e0468e5d89",
514 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
515 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
516 "a9034a905daa91757b4f63345c0e40638cd53ca8",
517 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
518 "99474fecf11df7b7035c35be6b8b697be9889418",
519 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
520 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
521 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
522 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
523 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
524 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
525 "449092689226a1172b6086ba1181d6b6d6499f26",
526 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
527 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
528 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
529 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
530 "6daaf945a955928c5c124c880522ca4634fb2343",
531 "12a288390d16e1efa99d4185301de48a4d433b14",
532 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
533 "1d3af561605fd61433035600d8962cb8d266fdd0",
534 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
535 "d7d97e28ed316f6596c737eb83baa5948d86b673",
536 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
537 "656bf3b7121bcd620a0a3ad488f0d66604824577",
538 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
539 "a49530722328ae88fd765792ac0c657efbcce75d",
540 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
541 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
542 "a6fd83542c3826132e88d3f5e304d604c0056fad",
543 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
544 "e428d213ad02651287894f093413949dcb369208",
545 "7df915bedcc5951a1b6f828490f7dbb93212e835",
546 "8720478d904a84c24071e97c731c1ba7882b131e",
547 "76215275593631f5900aad3616d725733dc39493",
548 "573d65665d20f00d36d9782ae2b89772140524ab",
549 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
550 "2a66dae03890ff791eabb982949435adb19af02b",
551 "24ac219478ba406f30794550690486b14cbac5e8",
552 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
553 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
554 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
555 "a92942269911a88793b3460b6f2a2cd56e48eec1",
556 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
557 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
558 "a7506e2c001d271593297c9eda9b984d4d894774",
559 "8f447a3820c83662086dfa836da2205b0130fd5f",
560 "2ebf37d81da3f11434652d06bf65d55e96b090aa",
561 "ace2c60bd76b11a002bee852686e8783f102eba1",
562 "dab47c9dc149e570045d699598b14a613bf319b3",
563 "2daca4d26a086ed34894693be0b0374402232809",
564 "60357eaacc998d34891ce084904fd27d1fcde958",
565 "904f1d82159bcf5485f323bd12b859dc5e83f8eb",
566 "bf63c5db6b057e67a4444c1a0b3a6e5b99a45363",
567 "295ec16530126046790fb734e99f86f5b3b74ed8",
568 "d98b0561010606b55a1b9b85fbc93640f681d256",
569 "1c1499051860b7caa25173b328ca9c862f01dd1a",
570 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
571 "2230f36f12d4becb242e2962fa1b3694db2496ca",
572 "d81e41a765d7a2d68073f5fde3f74f09df84001d",
573 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
574 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
575 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
576 "af45bf81d119be5cf6845ad41191ba52637e65e9",
577 NULL
580 static const char *sha1_graphics_r4g4b4[] =
582 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
583 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
584 "8bd18697d1ef27492805667a0bc956343ac08667",
585 "e8501c830321584474654f90e40eaf27dc21e6a8",
586 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
587 "821177710961d2cb5f7e7dfc0e06e767b6042753",
588 "667124365ffadeea1d8791bedda77a0c7b898de8",
589 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
590 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
591 "fb52b0c373a5f2a60b981604b120962942d2447a",
592 "5ab8dd07436681d762fa04ad7c6d71291c488924",
593 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
594 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
595 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
596 "25fcb75aa687aac35b8f72640889fe92413e00c5",
597 "3bddf9d53e89560b083302b146cd33791b13d941",
598 "a81504498c7a7bb46340ce74476a42f70f2730b1",
599 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
600 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
601 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
602 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
603 "57ebf8becac1524543da120e88e9cc57ecfdec49",
604 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
605 "d591232bbc2592462c819a9486750f64180518fd",
606 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
607 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
608 "8933450132bf949ba4bc28626968425b5ed2867d",
609 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
610 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
611 "233e588cf660e2c9b552cf02065cf63fa6655864",
612 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
613 "a3345acaf272f2e288626906e3056cd0ced70499",
614 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
615 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
616 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
617 "60c0752f592c6426a2f4a71173b44c5c086f4f2a",
618 "9dd123938b0a02601d8d458ecbd6535ddefea724",
619 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
620 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
621 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
622 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
623 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
624 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
625 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
626 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
627 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
628 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
629 "104e85bad287a62dfe25f0e78280179f18bac765",
630 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
631 "fde993dfce1551ef220f5a07ce4acd66e8524ac5",
632 "a80f3df0aea1e1b30d9833039157bca658218f48",
633 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
634 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
635 "facf052602b422d2cbe29f9ab3bb8e2f599f57f3",
636 "f373a5f37b82e7523c64c08eb509b6191e49b173",
637 "a966cb01ea9b1d962094717e483092d3baab6626",
638 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
639 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
640 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
641 "9f72be4467219a345b1164205d1fbfda2d64271e",
642 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
643 "a79e4cc419b9e1735e275e2823da52875536943a",
644 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
645 "f571c7c4aac92491017963032194690c0fa06b42",
646 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
647 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
648 NULL
651 static const char *sha1_graphics_8_color[] =
653 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
654 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
655 "49024d6cbdf1614327dfda9eda17675e76805f7e",
656 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
657 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
658 "84d85009d35ae10abbc435f3913422544105cea2",
659 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
660 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
661 "f3aa8d89430748178952de56643069d80b40aad6",
662 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
663 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
664 "52b1363e821bf604d9df260bfa97e26d428c33fd",
665 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
666 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
667 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
668 "89711289be6d5c55734878410e4923d5cca9aca9",
669 "8355caf57d51ad4e14275943088392e37dc75d33",
670 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
671 "6f0570da9dea7f043f678088f8362ee458cd79fa",
672 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
673 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
674 "5092b22af85a08f10a2899888bb9d552f25f828e",
675 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
676 "e91973be2651eeef568700463652838d8cbba976",
677 "1df851515ecf46df5c2d3279535c1763f72353dd",
678 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
679 "359bd76088a965bb0cee7c44800bc46b2638807e",
680 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
681 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
682 "91f988f575338505ba8a40727865a8d3f2298624",
683 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
684 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
685 "3b7488731da48635d86be551ab7c8c0f91c78219",
686 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
687 "e15a355fc09bfd22267917898e2266168ff410e3",
688 "7a9c326a56a94621377a7258be70ba50042ca9a2",
689 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
690 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
691 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
692 "add949d009217ef2b847e34772ba363e4be7b1b8",
693 "0b58666deb3615e912896a764e5c6475989e95e4",
694 "ea74c00c45569007383b632d7f1d2adc82645717",
695 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
696 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
697 "46f772c2832b3aad584674db666bd63e48b4f338",
698 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
699 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
700 "abd2fff80f74b311072ecdb91ce9ceba268fa6e9",
701 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
702 "8269b32b4a34440f1fa37927308debc7eb85f3fa",
703 "65b2c868790806be7ab4aaa6114d445c42a31f98",
704 "678979a45126a76eb629992cd64734862f53a555",
705 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
706 "d215ad3e5efef008ebe672dcc66478d06935e5cb",
707 "52e7c2f8b01592898c13f1e7633881e350244209",
708 "4907fd0fdbf375a2dcca573208a49efa2e15c9d6",
709 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
710 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
711 "2c07272462c68cf5944b03e2aa049475b99143c5",
712 "07ca369fb875d37b9cf855045f528af1827edec4",
713 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
714 "153ae5c9fc2a31b38c4878b25d9026b9f51f132d",
715 "488341e88810d737de0b26de4e4d4fa0e78eb482",
716 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
717 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
718 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
719 NULL
722 static const char *sha1_graphics_8_grayscale[] =
724 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
725 "df35491dd5038187c05bac06921402ba6d7773a8",
726 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
727 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
728 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
729 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
730 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
731 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
732 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
733 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
734 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
735 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
736 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
737 "114bb377b4e78a1978e1ac09388c48861b5223a3",
738 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
739 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
740 "216388ddf6b563dd2058a9df65b40b6f72df1715",
741 "47f72be971bd2d3399dabd018201f4f5075e96fe",
742 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
743 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
744 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
745 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
746 "b6785a410048bb85e7ea3f0492459972103c935e",
747 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
748 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
749 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
750 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
751 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
752 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
753 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
754 "6d41e6168662e75baacf74d911d7419d54c8d73c",
755 "2404952157ba1519094a2da6bfbf2b0f1356432d",
756 "24caede65b40815a60b83c4edfa06bdc542388cd",
757 "650a51bedd1af92469d2950eb95220db35f95c6e",
758 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
759 "b83f78ae85df87fc7af565db276c60c102274f20",
760 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
761 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
762 "85425940daf119125deb52421b2057acebe6d1cf",
763 "9869b6f088822fb423996f9968e5a931301fc2c3",
764 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
765 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
766 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
767 "1bd2587399006eed0d46beff397d32081f6bc58e",
768 "640a49455acabca6954a7fbb6af4e872af342d11",
769 "589e7911e09332ee090371deae17b0120ff990b5",
770 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
771 "115c90df05b1ff754dbdfe2a712ef126034d952d",
772 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
773 "ae45f0d463ff916f3cb630103969fd49e8d09ef4",
774 "2becf041f83d22ac072fef5e0efd9bc1572796fd",
775 "3685c9ae95118a83db3569832c29753276fa1264",
776 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
777 "5eb00252664ec39e61359adb1dade4906a87a248",
778 "7ae54b25bbead496af7886dadd8530be5f53e85c",
779 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854",
780 "5b4a11854e508a579b1cda121841442367716930",
781 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
782 "17ae603c199a5d6695d198a7f36e6d7263990951",
783 "1918a33f59d3500204ffc573318a39e9ff754221",
784 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
785 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
786 "a6a29836291f9dbca85e25cee60f62ef5faca6d7",
787 "3494a23633405e46af96cb57715617fef1ac252e",
788 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
789 "a3eac75d30f681b3898ee469d368960529634d7d",
790 "e2b393dc3f5833f7868668ea31369e90348768cd",
791 NULL
794 static const char *sha1_graphics_8[] =
796 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
797 "512246d4886ab889a090b167ba194577cb95272e",
798 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
799 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
800 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
801 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
802 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
803 "390b2bf70daba36310683f46af9cd50b9a061396",
804 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
805 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
806 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
807 "da1cc34a9d9b779fc7849e03e214096026506464",
808 "5ba8f99ca034666effa556748c49a0f5a015125f",
809 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
810 "73e2859ce849f756f954718ce3c90f02e31712b6",
811 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
812 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
813 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
814 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
815 "7262364067e03c7fa498af1d59d228d6c63b460e",
816 "5241241a355a667ef0834049adf4218e8b3f16b8",
817 "db22d666690948eb966f75b796c72c7150a5c4b9",
818 "af21fb2645b568b049549de375584c4aa3055143",
819 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
820 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
821 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
822 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
823 "d599bf210423fe3adbb4f1de87d9360de97827d0",
824 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
825 "cc01f17928f7780cefd423ea653b072eea723a1b",
826 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
827 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
828 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
829 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
830 "f4a334e69535de74ee5ed54be93a75120a66e54a",
831 "f751a55fb738b63b6fd7c229c33ef92605d0c9c1",
832 "61907a6685bba93077da40cfb28cf2ab74552fd2",
833 "122015e5e17c1c317c6e51c0e207826b606a4077",
834 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
835 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
836 "acead2745fec0b6c817fa601353bdf2d197b64f7",
837 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
838 "d83adc669c0dea0dc4812b93f998514b6f02d805",
839 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
840 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
841 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
842 "7d1bfff706b0713e53209407889f83a0da26a81d",
843 "5a1d8f9ea978b820edbc5c9e1c6f1cac022620ad",
844 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
845 "c404446958788fac00ee1eff571d682bc21dd7ac",
846 "95060f3dc9e6d01ada42f09a871b69f0699cb77c",
847 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
848 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
849 "b7ffe12eec77bde401bbe17df0de5ea7f37e3323",
850 "0025a440866a404523a8a20e79a8891e45a2ff56",
851 "7833e6cb62b4e4459d3e7ceba2cc6eb18c4b5d59",
852 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
853 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
854 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
855 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
856 "293c41a7ed923a4617560481ae8815cebf83701a",
857 "ec06b56f3abe277be42650ebd49dabeaae9e756d",
858 "750c923785ba2afb9ce597516c072f90f014bf95",
859 "bde5a62a065c027561226fbec5155e938ba7f6b3",
860 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
861 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
862 NULL
865 static const char *sha1_graphics_4[] =
867 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
868 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
869 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
870 "9401799e6116c35e5f0e5bdca07ea25316757a72",
871 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
872 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
873 "2505598845fa026ea7187582461efbf06cb6904f",
874 "3981a19363beca8f28d32a5928ac296fd22a5296",
875 "01404024ebb2c266d17d734059524d874491650f",
876 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
877 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
878 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
879 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
880 "1f26a01730f67d40ea711a50d9d801bac15a642e",
881 "3b53d24178cfacba53103a44dfd5d072b15a6781",
882 "c52cfd57f26037723d37192722fc3a217f280c9e",
883 "e34da6500cf2e424d980714d92737cf6c31a7bda",
884 "d17f4358ae529f920960ed89e535902ee13b0033",
885 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
886 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
887 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
888 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
889 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
890 "39c16648cf6c261be71a33cec41867f28e119b94",
891 "26ad5116562e7b58c76a26eaf521e2e40899e944",
892 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
893 "4f827ca6927f15191588456f985bf29d2a3b3c24",
894 "6fb102d020e5554116feefc8482104f3ae2036d2",
895 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
896 "20c9eb3276c08fdce35755e349bec94b04929812",
897 "628d837163a25c6520f19c0602383176dbad528e",
898 "b5a12cff7100290ad43f5ed17a321b42de048893",
899 "b672afbeeafb44194a821f0def81a8892872937e",
900 "db0124045882b598feea192186cf7eb7a0387866",
901 "602d91471378fe24a2d0248bd8a92b624f099fea",
902 "c93a86adfe58dc2d461f2ed962883d6b90888848",
903 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
904 "1a579cd280422131c35e907a023ee0e80749b5a4",
905 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
906 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
907 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
908 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
909 "3e411b004a5be84451860c6da6a4a1a482b77862",
910 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
911 "7811c536a6527112b438a6413f3927f2c79086a7",
912 "525ef3615040225752a2fe646ab99ee64e360630",
913 "46760975993f9881b7bbe94123173e6a683d3f25",
914 "c644f460937107214a88d5eb9e846d27abd8c874",
915 "df5feb905a31c288008cf5e82d73ac818a160d82",
916 "4f9658dde0432a711a4d783c1b5aa3365fb7d54b",
917 "09438163dcbede3890a0e6d8e614c97a06759380",
918 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
919 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
920 "aa3b12616cfce8ddd8aa71e390c0be5013f870f3",
921 "ccf8d11b1e81895e9781f17c227c821228d8714b",
922 "33a86f99eb8472088a1d63a1c63539bd5cea1c7f",
923 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
924 "029552113292cc110fd6b7888e766628950aaeef",
925 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
926 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
927 "287ea7db721e641439888cb9f4bac3a5f16124eb",
928 "dd9eaa5325cdf250e89162ac84207978ebb6458e",
929 "42466aab11852741d937c1ff6f3bb711e58415a6",
930 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
931 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
932 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
933 NULL
936 static const char *sha1_graphics_4_grayscale[] =
938 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
939 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
940 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
941 "1c201d149c0bd886ff8a427ad513f15a70991174",
942 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
943 "315189097a02024d2eae61d524c4de07a396aee7",
944 "73ac786015dea36ac466a6524dba757d5d238ece",
945 "6e328cc4d53627f034b23706d8bf26afe18512ae",
946 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
947 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
948 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
949 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
950 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
951 "ec3879342b5a44f6de6efe946243ae5ade00980d",
952 "6e328cc4d53627f034b23706d8bf26afe18512ae",
953 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
954 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
955 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
956 "b2bda683edef912957845a33edc055902a801fed",
957 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
958 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
959 "43ee3e187dda14b86aef12371041ae70313b5a65",
960 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
961 "d4930552a7845111ffd9db57260be1ab97967c06",
962 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
963 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
964 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
965 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
966 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
967 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
968 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
969 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
970 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
971 "f8224430462f6a93f85ef33b8aa7299525990708",
972 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
973 "71a1705ee14068ee8c6c6680c1bd99703fb6abd7",
974 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
975 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
976 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
977 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
978 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
979 "027b05bc82ce4f897c4bf812610a641547368939",
980 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
981 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
982 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
983 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
984 "5eeb56afea8040a8fb18c11f29931b836474126d",
985 "30c256a783c4874261667bb31307eb282ab9470e",
986 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
987 "0ba7e5d68419702605739acb52fcc01c96cb63d4",
988 "f8d2f196ba8a16f54acb934e61a759ab7d3f2f05",
989 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
990 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
991 "020b00eab7dcf12ea1a58441d44b85ebc9c026e8",
992 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f",
993 "d5335e66fdbd61a350f010986fa9b47655f1517f",
994 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
995 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
996 "58f400c9bb78e49a879276fb049edfc9c981740a",
997 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
998 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
999 "c96a998be5c1d588ef1243cfd2610d056d16947e",
1000 "68bee638d59a373f33f308751471b3ef41849582",
1001 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1002 "2d5123e757cf00e423a89160d7dc4997c3688829",
1003 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
1004 NULL
1007 static const char *sha1_graphics_1[] =
1009 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1010 "61ade9054d4477fb89cf830539a5e8b4e45f0688",
1011 "ac530c5dbaf837e15b2337347e974184fad73643",
1012 "95fdcda26262d5948a9ade77d83fd698e0031050",
1013 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13",
1014 "f6b61ecf03ad11752775faca1d4404c6bb5065f5",
1015 "d7ad44d6f377598268e9968333ae2cf23a0715ca",
1016 "5871339cd7e6cee12d4dc45934a89071c73efe6b",
1017 "69e9b85b34caf736069ba91e57a5c3fa7c891653",
1018 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1019 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1020 "39ff81f77ef4ee772367ed1a63785987c060126e",
1021 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1022 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1023 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1024 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1025 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1026 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1027 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1028 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1029 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1030 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1031 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1032 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1033 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1034 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1035 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1036 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1037 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1038 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1039 "b71ca46be287598f716bb04fac0a52ad139c70db",
1040 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1041 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1042 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1043 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1044 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1045 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1046 "399e988c922b7fad1c8f6907541c5dda65e60408",
1047 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1048 "655cfadeb157233c804d42b58195569c8846e3c1",
1049 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1050 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1051 "0d180c37bc26d83a1a11f66168757f3de2493243",
1052 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1053 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1054 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1055 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1056 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1057 "a2a928de9007d765da496abec8c21b23601f8c45",
1058 "41a417c1f25f2619301afa44bfcde85198985792",
1059 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1060 "ba682eb15c0ddffb942e6086e0ccad2353ed7241",
1061 "58273e1fbf961ff2c772d57160d60170e258d3fe",
1062 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1063 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1064 "ca711c69165e1fa5be72993b9a7870ef6d485249",
1065 "44a28536466dc895feb824b23dfd4a47c6948af8",
1066 "6bea3a3b5bde2e8038bfee86bb332205167571f4",
1067 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1068 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1069 "55c26d22f11d80b73383fa57d0fac552d705b092",
1070 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1071 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1072 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1073 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1074 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1075 "8d34215487088b5d4ef63062270ce25c2862643d",
1076 "bbabe686a6955402c90530e7c67f1428868369b3",
1077 NULL
1080 static const char *sha1_graphics_1_ddb[] =
1082 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1083 "ff18f1f84bf1e9c83cedacadba4c10cfd5aaec1e",
1084 "cc54ff65557b63ed2ffd31af2013e5b9f06f18a6",
1085 "4325e5d95e1fd395c3bdff4559871aa3bd9d46bc",
1086 "4d37b727337f642c71ab962a34ce1dbea638bd55",
1087 "8e5c8e6006a11e516b1cf23bdd1d5ba4ff9fd0db",
1088 "34c609751431850b92af2ace6c39a69704af2ab9",
1089 "42cca4bd7471bfdad39b588cb376a8c79226e028",
1090 "9995abea51677434c840082221520116db3586cc",
1091 "9b34604016b120fbdcf6a94eff468545ed93de13",
1092 "dbfe6da57a97d7aaf1f83d0f4d96eb31b6bba47c",
1093 "73049f99382565ab2577ea184355758a5e543d6f",
1094 "02aeb94a346605c2d4a454d77dd92362ea998151",
1095 "98a7e54335ab90853ef17f7af4b4df45de01622f",
1096 "3f12111d820af648e4b3c2d2bbfbf7862049619f",
1097 "0e8f567f7dda687840c656be4ddee2647e39cf77",
1098 "baaef56da8622dd15bb69121cac97a8dc014f1a5",
1099 "816e21e1185367ccd6e8e0e6ee16f93e6300b7fb",
1100 "86417cc40c76c2258614ce81490795dff20025d6",
1101 "816e21e1185367ccd6e8e0e6ee16f93e6300b7fb",
1102 "dd95e98da4fd06d9969e04cc4fcfd6df67296c7d",
1103 "6d7849624d7aadabf7b7fe4ef053f7bc1503b2e1",
1104 "2b9d0dbda89a5a83c2a54ee11a31e1b6ebdd8e7f",
1105 "1dd0f905374e6c162a682e7c809b1f9e601da6f2",
1106 "0c9cf65e964c78d64b4b5d30018b5e526d4f85c2",
1107 "bb0526d1b4dac97d7b5fef0f949386e6a66a28d7",
1108 "32f8b8d815f9d6ed6b11fb53ff9b4bdc6d2612e6",
1109 "a8d5fef9f0de5c3061e4f05b3108b5bede120e13",
1110 "92649253a860a588a50001b2e16f190a34589f59",
1111 "5aa9566c9f5985efb3bfdb5f4ee81ec5d85cb37b",
1112 "4e2d8fd4afd9433ab72855ddd9c42cdb2e7bb534",
1113 "1f8af079484cd26df48f2087a810805a85401305",
1114 "b5dd3d0ef05f0780f0f90b2f5d223a3cc0bfc2a9",
1115 "9fab545d95ef18eba8f4a47534a481a211835205",
1116 "b99a9a3b07338c91feff773bef5398259a646b49",
1117 "e9a21d9ed1111667a5bd3d5689e9ad54173410bc",
1118 "a01dfce250e32b9b43c0eff74aca866c94d454d1",
1119 "9a12e04b86e6872d00f41963f733991accc0b4d9",
1120 "c496bbc40614af83ae40c074e3d23cedd07c8c9c",
1121 "ffbe3f09bf828f1c88f7769ebe8dce0a2fba5752",
1122 "cdf50552b2a42e2d8afafc2d7abe52cca85ddcdd",
1123 "36e3133af8dc47142d968a4c8e2a3ba407bca535",
1124 "4aaf9df187919e292f5821ddede15e23136a977e",
1125 "5cc50c29600eedaa6465204df708ee29fb0e4e4e",
1126 "efd6e15fa2e3900b7b478b098dc27a5ab3f485e8",
1127 "a96c2f4f834860f4e744dfd198f1dd186796c39b",
1128 "52e57dba8f57f570279fff2be574654201a97939",
1129 "33177f7a04e197ac084381bc7ed5a68fe2ae0d9a",
1130 "8192d578c73cc9d2a63da0a2e2f0b507ca7234b5",
1131 "2f269550736fe1bbf9cb512134c93ce2bec9d54c",
1132 "3a21c952b9cdf5f8868dd0c0ce8ad371a53a7ea3",
1133 "1817d97806dacf65cb651ad44cbeef3a64f47dd8",
1134 "c7d4942c5760d66f3accb3ff92607974ed6a4062",
1135 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1136 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1137 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1138 "1f840017feeee319623ffbdc01bd70d772aba915",
1139 "2fb72e244966959d41db868de515760b7de5fcaf",
1140 "d08d1e26a9753bd0d7f7a164cd50c1689b863572",
1141 "59beb308a7d664a7c5eba4a1e48e1bd58d686fcc",
1142 "baee5f816f3795c5e55e51075ee2020000d611a3",
1143 "380abbe9731fc1c6afc184310eb6b140d0d7002a",
1144 "693c3f6b73f5a505b31f02e87fe09cf510efc769",
1145 "e658b6d7fc653a36fa8d054f2dcc5b5c8377895e",
1146 "ee5989eb16ef7485764ca07d134273ef3c8fb08c",
1147 "f063c0ab8ecac8b088ccebac289003eca1f91eca",
1148 "13309674d624b6618bfab060bad18ab6e713de99",
1149 "cc21b0d74cc34469765dafe03c8dbf4c0f229402",
1150 "7a3dde7a3ce1835635ed13466c35ec738c85b2a1",
1151 "387575fa149f5d0499b39358e78dd2699b6959bc",
1152 "889f606e05e526aa20dc63fe0fe53164c7f7e426",
1153 "95a2d98b57517df5cabba75ae4102b8435cd4901",
1154 "273c20f24743ac12cc1396c0c9f2e3d413b3c2ee",
1155 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1156 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1157 "ee08e9d1b7741f01c234ab8ee15e43792a00fa9a",
1158 "d1f7b45663412a0405b7a6f5570a990d9e5bdc81",
1159 "9966d82ed278d64ffe54694701c9ece8a81bc9ba",
1160 "7ebfd74314f42a7b2ffba8a87d50f1af988665eb",
1161 "83c4836ce12a48c9e96c2296ffaeaa2142587d27",
1162 "13cb3d7c08fd729e56a0b6c7d2055a4e4bc33773",
1163 "a650ae87155b8dd0b20170da067875128f4a5d2f",
1164 "a6e6428fd50246dcb266228a393f21dfb6a64a73",
1165 "5151a45770faab218ff2a9140ab5df55eecdc583",
1166 "a7b56d1ef313c3b7cda44fa53abc038f9aeff810",
1167 "56a8c158b1a339a13a3fad25333027e9522f945b",
1168 "cbfaaca41d04d57571ec2ee900b518c8f2d9aa67",
1169 "5188431849b4613152fd7bdba6a3ff0a4fd6424b",
1170 NULL
1173 static const char *sha1_graphics_1_ddb_inverted[] =
1175 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1176 "ee903dd1611aa68a41f5b46e9ebd2511da36ea32",
1177 "d8d2f298610311b3d49e03bd3b0ea7f2511a139d",
1178 "1cb1a544bf6e19780626c02c34756d259a50a77e",
1179 "4d37b727337f642c71ab962a34ce1dbea638bd55",
1180 "5de18a789a8ecc4ec53ecfe521a8a8294b19113d",
1181 "fda1709b9b23e5294fff73e6764f29960ccc1eee",
1182 "babf8cc5cce61e2da52b1cd1a151c45774aa35d7",
1183 "c9005d98a9a5890f5b74dca436068e58a31db44d",
1184 "9b34604016b120fbdcf6a94eff468545ed93de13",
1185 "74aa1b4598756e2c1b24ef45874cec5f224dd08c",
1186 "73049f99382565ab2577ea184355758a5e543d6f",
1187 "02aeb94a346605c2d4a454d77dd92362ea998151",
1188 "98a7e54335ab90853ef17f7af4b4df45de01622f",
1189 "3f12111d820af648e4b3c2d2bbfbf7862049619f",
1190 "0e8f567f7dda687840c656be4ddee2647e39cf77",
1191 "baaef56da8622dd15bb69121cac97a8dc014f1a5",
1192 "816e21e1185367ccd6e8e0e6ee16f93e6300b7fb",
1193 "86417cc40c76c2258614ce81490795dff20025d6",
1194 "816e21e1185367ccd6e8e0e6ee16f93e6300b7fb",
1195 "dd95e98da4fd06d9969e04cc4fcfd6df67296c7d",
1196 "6d7849624d7aadabf7b7fe4ef053f7bc1503b2e1",
1197 "2b9d0dbda89a5a83c2a54ee11a31e1b6ebdd8e7f",
1198 "1dd0f905374e6c162a682e7c809b1f9e601da6f2",
1199 "0c9cf65e964c78d64b4b5d30018b5e526d4f85c2",
1200 "bb0526d1b4dac97d7b5fef0f949386e6a66a28d7",
1201 "32f8b8d815f9d6ed6b11fb53ff9b4bdc6d2612e6",
1202 "a8d5fef9f0de5c3061e4f05b3108b5bede120e13",
1203 "92649253a860a588a50001b2e16f190a34589f59",
1204 "5aa9566c9f5985efb3bfdb5f4ee81ec5d85cb37b",
1205 "4e2d8fd4afd9433ab72855ddd9c42cdb2e7bb534",
1206 "1f8af079484cd26df48f2087a810805a85401305",
1207 "b5dd3d0ef05f0780f0f90b2f5d223a3cc0bfc2a9",
1208 "9fab545d95ef18eba8f4a47534a481a211835205",
1209 "b99a9a3b07338c91feff773bef5398259a646b49",
1210 "e9a21d9ed1111667a5bd3d5689e9ad54173410bc",
1211 "a01dfce250e32b9b43c0eff74aca866c94d454d1",
1212 "9a12e04b86e6872d00f41963f733991accc0b4d9",
1213 "c496bbc40614af83ae40c074e3d23cedd07c8c9c",
1214 "ffbe3f09bf828f1c88f7769ebe8dce0a2fba5752",
1215 "cdf50552b2a42e2d8afafc2d7abe52cca85ddcdd",
1216 "36e3133af8dc47142d968a4c8e2a3ba407bca535",
1217 "4aaf9df187919e292f5821ddede15e23136a977e",
1218 "5cc50c29600eedaa6465204df708ee29fb0e4e4e",
1219 "efd6e15fa2e3900b7b478b098dc27a5ab3f485e8",
1220 "a96c2f4f834860f4e744dfd198f1dd186796c39b",
1221 "52e57dba8f57f570279fff2be574654201a97939",
1222 "33177f7a04e197ac084381bc7ed5a68fe2ae0d9a",
1223 "8192d578c73cc9d2a63da0a2e2f0b507ca7234b5",
1224 "2f269550736fe1bbf9cb512134c93ce2bec9d54c",
1225 "3a21c952b9cdf5f8868dd0c0ce8ad371a53a7ea3",
1226 "1817d97806dacf65cb651ad44cbeef3a64f47dd8",
1227 "c7d4942c5760d66f3accb3ff92607974ed6a4062",
1228 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1229 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1230 "a2eb9546b3ebb2a2495ea7393b96113ef7972838",
1231 "1f840017feeee319623ffbdc01bd70d772aba915",
1232 "2fb72e244966959d41db868de515760b7de5fcaf",
1233 "d08d1e26a9753bd0d7f7a164cd50c1689b863572",
1234 "59beb308a7d664a7c5eba4a1e48e1bd58d686fcc",
1235 "baee5f816f3795c5e55e51075ee2020000d611a3",
1236 "380abbe9731fc1c6afc184310eb6b140d0d7002a",
1237 "693c3f6b73f5a505b31f02e87fe09cf510efc769",
1238 "e658b6d7fc653a36fa8d054f2dcc5b5c8377895e",
1239 "ee5989eb16ef7485764ca07d134273ef3c8fb08c",
1240 "f063c0ab8ecac8b088ccebac289003eca1f91eca",
1241 "13309674d624b6618bfab060bad18ab6e713de99",
1242 "cc21b0d74cc34469765dafe03c8dbf4c0f229402",
1243 "7a3dde7a3ce1835635ed13466c35ec738c85b2a1",
1244 "387575fa149f5d0499b39358e78dd2699b6959bc",
1245 "889f606e05e526aa20dc63fe0fe53164c7f7e426",
1246 "95a2d98b57517df5cabba75ae4102b8435cd4901",
1247 "273c20f24743ac12cc1396c0c9f2e3d413b3c2ee",
1248 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1249 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1250 "ee08e9d1b7741f01c234ab8ee15e43792a00fa9a",
1251 "d1f7b45663412a0405b7a6f5570a990d9e5bdc81",
1252 "9966d82ed278d64ffe54694701c9ece8a81bc9ba",
1253 "7ebfd74314f42a7b2ffba8a87d50f1af988665eb",
1254 "83c4836ce12a48c9e96c2296ffaeaa2142587d27",
1255 "13cb3d7c08fd729e56a0b6c7d2055a4e4bc33773",
1256 "a650ae87155b8dd0b20170da067875128f4a5d2f",
1257 "a6e6428fd50246dcb266228a393f21dfb6a64a73",
1258 "5151a45770faab218ff2a9140ab5df55eecdc583",
1259 "a7b56d1ef313c3b7cda44fa53abc038f9aeff810",
1260 "56a8c158b1a339a13a3fad25333027e9522f945b",
1261 "cbfaaca41d04d57571ec2ee900b518c8f2d9aa67",
1262 "5188431849b4613152fd7bdba6a3ff0a4fd6424b",
1263 NULL
1266 static const RECT graphics_bounds[] =
1268 { 0, 0, 0, 0 },
1269 { 10, 3, 219, 101 },
1270 { 100, 100, 301, 301 },
1271 { 0, 0, 201, 201 },
1272 { 10, 10, 110, 320 },
1273 { 10, 99, 300, 200 },
1274 { 99, 12, 201, 200 },
1275 { 90, 110, 300, 200 },
1276 { 90, 90, 210, 200 },
1277 { 10, 99, 300, 200 },
1278 { 10, 99, 300, 200 },
1279 { 99, 12, 201, 200 },
1280 { 99, 11, 201, 200 },
1281 { 90, 110, 300, 200 },
1282 { 90, 110, 300, 200 },
1283 { 10, 10, 365, 405 },
1284 { 10, 10, 365, 405 },
1285 { 10, 10, 365, 405 },
1286 { 10, 10, 365, 405 },
1287 { 10, 10, 365, 405 },
1288 { 10, 10, 365, 405 },
1289 { 10, 10, 365, 405 },
1290 { 10, 10, 365, 405 },
1291 { 10, 10, 350, 251 },
1292 { 10, 10, 300, 200 },
1293 { 300, 10, 9, 260 },
1294 { 10, 10, 435, 405 },
1295 { 10, 10, 120, 120 },
1296 { 10, 10, 110, 110 },
1297 { 10, 10, 120, 110 },
1298 { 10, 10, 110, 120 },
1299 { 10, 10, 120, 120 },
1300 { 10, 10, 110, 110 },
1301 { 10, 10, 120, 110 },
1302 { 10, 10, 110, 120 },
1303 { 0, 4, 356, 356 },
1304 { 100, 100, 356, 356 },
1305 { 50, 50, 306, 306 },
1306 { 100, 100, 356, 356 },
1307 { 100, 100, 356, 356 },
1308 { 100, 100, 356, 356 },
1309 { 100, 100, 356, 356 },
1310 { 100, 100, 356, 356 },
1311 { 100, 100, 356, 356 },
1312 { 100, 100, 356, 356 },
1313 { 100, 100, 356, 356 },
1314 { 100, 100, 356, 356 },
1315 { 10, 10, 356, 356 },
1316 { 100, 100, 356, 356 },
1317 { 0, 0, 260, 39 },
1318 { 0, 0, 16, 16 },
1319 { 10, 10, 416, 26 },
1320 { 10, 8, 60, 104 },
1321 { 0, 0, 512, 512 },
1322 { 0, 10, 511, 306 },
1323 { 0, 0, 512, 336 },
1324 { 1, 1, 300, 512 },
1325 { 0, 0, 500, 512 },
1326 { 5, 5, 206, 206 },
1327 { 45, 45, 256, 256 },
1328 { 86, 86, 215, 215 },
1329 { 45, 45, 256, 256 },
1330 { 8, 0, 392, 231 },
1331 { 8, 0, 392, 231 },
1332 { 0, 0, 60, 20 },
1333 { 0, 0, 512, 512 },
1334 { -1, -1, -1, -1 } /* the end */
1337 static const char **current_sha1;
1338 static const RECT *current_bounds;
1339 static const char *dst_format;
1341 static inline DWORD get_stride(const BITMAPINFO *bmi)
1343 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1346 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1348 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1351 static void reset_bits( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
1353 DWORD size = get_dib_size( bmi );
1354 if (bits) memset( bits, 0xcc, size );
1355 else
1357 void *ddb_bits = malloc( size );
1358 memset( ddb_bits, 0xcc, size );
1359 SetBitmapBits( GetCurrentObject(hdc, OBJ_BITMAP), size, ddb_bits );
1360 free( ddb_bits );
1364 static char *hash_dib(HDC hdc, const BITMAPINFO *bmi, const void *bits)
1366 DWORD dib_size = get_dib_size(bmi);
1367 HCRYPTHASH hash;
1368 char *buf;
1369 BYTE hash_buf[20];
1370 DWORD hash_size = sizeof(hash_buf);
1371 int i;
1372 static const char *hex = "0123456789abcdef";
1374 if(!crypt_prov) return NULL;
1376 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1378 if (!bits)
1380 void *ddb_bits = malloc(dib_size);
1381 GetBitmapBits(GetCurrentObject(hdc, OBJ_BITMAP), dib_size, ddb_bits);
1382 CryptHashData(hash, ddb_bits, dib_size, 0);
1383 free(ddb_bits);
1385 else CryptHashData(hash, bits, dib_size, 0);
1387 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1388 if(hash_size != sizeof(hash_buf)) return NULL;
1390 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1391 CryptDestroyHash(hash);
1393 buf = malloc(hash_size * 2 + 1);
1395 for(i = 0; i < hash_size; i++)
1397 buf[i * 2] = hex[hash_buf[i] >> 4];
1398 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1400 buf[i * 2] = '\0';
1402 return buf;
1405 static void reset_bounds( HDC hdc )
1407 current_bounds = graphics_bounds;
1408 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
1411 static void compare_bounds( HDC hdc, const char *info )
1413 RECT rect;
1415 GetBoundsRect( hdc, &rect, DCB_RESET );
1417 if (current_bounds->left == -1 &&
1418 current_bounds->top == -1 &&
1419 current_bounds->right == -1 &&
1420 current_bounds->bottom == -1)
1422 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect ));
1423 return;
1426 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1427 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect ));
1428 current_bounds++;
1431 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1433 char *hash = hash_dib(hdc, bmi, bits);
1434 BOOL ok_cond;
1435 int i;
1437 /* reset the bits for the next test */
1438 reset_bits( hdc, bmi, bits );
1440 if(!hash)
1442 skip("SHA1 hashing unavailable on this platform\n");
1443 return;
1446 for(i = 0; i <= num_broken; i++)
1448 if(current_sha1[i] == NULL)
1450 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1451 free(hash);
1452 return;
1456 ok_cond = !strcmp(hash, *current_sha1);
1458 for(i = 1; i <= num_broken; i++)
1459 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1461 todo_wine_if(todo)
1462 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1463 dst_format, info, *current_sha1, hash );
1465 current_sha1 += num_broken + 1;
1467 free( hash );
1469 compare_bounds( hdc, info );
1472 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1474 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1477 static const RECT bias_check[] =
1479 {100, 100, 200, 150},
1480 {100, 100, 150, 200},
1481 {100, 100, 50, 200},
1482 {100, 100, 0, 150},
1483 {100, 100, 0, 50},
1484 {100, 100, 50, 0},
1485 {100, 100, 150, 0},
1486 {100, 100, 200, 50}
1489 static const RECT hline_clips[] =
1491 {120, 120, 140, 120}, /* unclipped */
1492 {100, 122, 140, 122}, /* l edgecase */
1493 { 99, 124, 140, 124}, /* l edgecase clipped */
1494 {120, 126, 200, 126}, /* r edgecase */
1495 {120, 128, 201, 128}, /* r edgecase clipped */
1496 { 99, 130, 201, 130}, /* l and r clipped */
1497 {120, 100, 140, 100}, /* t edgecase */
1498 {120, 99, 140, 99}, /* t edgecase clipped */
1499 {120, 199, 140, 199}, /* b edgecase */
1500 {120, 200, 140, 200}, /* b edgecase clipped */
1501 {120, 132, 310, 132}, /* inside two clip rects */
1502 { 10, 134, 101, 134}, /* r end on l edgecase */
1503 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1504 {199, 138, 220, 138}, /* l end on r edgecase */
1505 {200, 140, 220, 140} /* l end on r edgecase clipped */
1508 static const RECT vline_clips[] =
1510 {120, 120, 120, 140}, /* unclipped */
1511 {100, 120, 100, 140}, /* l edgecase */
1512 { 99, 120, 99, 140}, /* l edgecase clipped */
1513 {199, 120, 199, 140}, /* r edgecase */
1514 {200, 120, 200, 140}, /* r edgecase clipped */
1515 {122, 99, 122, 201}, /* t and b clipped */
1516 {124, 100, 124, 140}, /* t edgecase */
1517 {126, 99, 126, 140}, /* t edgecase clipped */
1518 {128, 120, 128, 200}, /* b edgecase */
1519 {130, 120, 130, 201}, /* b edgecase clipped */
1520 {132, 12, 132, 140}, /* inside two clip rects */
1521 {134, 90, 134, 101}, /* b end on t edgecase */
1522 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1523 {138, 199, 138, 220}, /* t end on b edgecase */
1524 {140, 200, 140, 220} /* t end on b edgecase clipped */
1527 static const RECT line_clips[] =
1529 { 90, 110, 310, 120},
1530 { 90, 120, 295, 130},
1531 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1532 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1533 { 90, 132, 101, 137}, /* end pt just inside l edge */
1534 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1535 {199, 142, 210, 143} /* start pt just inside r edge */
1538 static const RECT wide_lines[] =
1540 {100, 10, 200, 10},
1541 {100, 21, 200, 21},
1542 {200, 40, 100, 40},
1543 {200, 61, 100, 61},
1544 { 10, 100, 10, 200},
1545 { 21, 100, 21, 200},
1546 { 40, 200, 40, 100},
1547 { 61, 200, 61, 100},
1550 static const POINT poly_lines[] =
1552 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1555 static const POINT polypoly_lines[] =
1557 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1560 static const DWORD polypoly_counts[] =
1562 ARRAY_SIZE(polypoly_lines)
1565 static const RECT patblt_clips[] =
1567 {120, 120, 140, 126}, /* unclipped */
1568 {100, 130, 140, 136}, /* l edgecase */
1569 { 99, 140, 140, 146}, /* l edgecase clipped */
1570 {180, 130, 200, 136}, /* r edgecase */
1571 {180, 140, 201, 146}, /* r edgecase clipped */
1572 {120, 100, 130, 110}, /* t edgecase */
1573 {140, 99, 150, 110}, /* t edgecase clipped */
1574 {120, 180, 130, 200}, /* b edgecase */
1575 {140, 180, 150, 201}, /* b edgecase */
1576 {199, 150, 210, 156}, /* l edge on r edgecase */
1577 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1578 { 90, 150, 101, 156}, /* r edge on l edgecase */
1579 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1580 {160, 90, 166, 101}, /* b edge on t edgecase */
1581 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1582 {160, 199, 166, 210}, /* t edge on b edgecase */
1583 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1586 static const RECT rectangles[] =
1588 {10, 11, 100, 101},
1589 {250, 100, 350, 10},
1590 {120, 10, 120, 20}, /* zero width */
1591 {120, 10, 130, 10}, /* zero height */
1592 {120, 40, 121, 41}, /* 1 x 1 */
1593 {130, 50, 132, 52}, /* 2 x 2 */
1594 {140, 60, 143, 63}, /* 3 x 3 */
1595 {150, 70, 154, 74}, /* 4 x 4 */
1596 {120, 20, 121, 30}, /* width == 1 */
1597 {130, 20, 132, 30}, /* width == 2 */
1598 {140, 20, 143, 30}, /* width == 3 */
1599 {200, 20, 210, 21}, /* height == 1 */
1600 {200, 30, 210, 32}, /* height == 2 */
1601 {200, 40, 210, 43} /* height == 3 */
1604 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1605 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1606 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1607 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1608 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1609 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1611 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1612 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1613 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1614 0x00, 0x01 }; /* <eod> */
1616 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1617 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1618 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1619 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1621 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1622 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1624 static const RGBQUAD default_palette_1[2] =
1626 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1629 static const RGBQUAD default_palette_4[16] =
1631 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1632 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1633 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1634 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1637 static const RGBQUAD default_palette_8[256] =
1639 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1640 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1641 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1642 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1643 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1644 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1645 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1646 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1647 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1648 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1649 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1650 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1651 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1652 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1653 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1654 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1655 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1656 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1657 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1658 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1659 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1660 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1661 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1662 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1663 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1664 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1665 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1666 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1667 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1668 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1669 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1670 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1671 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1672 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1673 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1674 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1675 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1676 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1677 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1678 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1679 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1680 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1681 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1682 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1683 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1684 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1685 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1686 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1687 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1688 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1689 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1690 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1691 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1692 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1693 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1694 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1695 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1696 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1697 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1698 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1699 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1700 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1701 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1702 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1705 static HPALETTE create_default_palette( int bpp )
1707 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1708 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1709 PALETTEENTRY *entries = pal->palPalEntry;
1710 int i;
1712 pal->palVersion = 0x300;
1713 pal->palNumEntries = 1 << bpp;
1714 switch (bpp)
1716 case 1:
1717 for (i = 0; i < 2; i++)
1719 entries[i].peRed = default_palette_1[i].rgbRed;
1720 entries[i].peGreen = default_palette_1[i].rgbGreen;
1721 entries[i].peBlue = default_palette_1[i].rgbBlue;
1722 entries[i].peFlags = 0;
1724 break;
1725 case 4:
1726 for (i = 0; i < 16; i++)
1728 entries[i].peRed = default_palette_4[i].rgbRed;
1729 entries[i].peGreen = default_palette_4[i].rgbGreen;
1730 entries[i].peBlue = default_palette_4[i].rgbBlue;
1731 entries[i].peFlags = 0;
1733 break;
1734 case 8:
1735 for (i = 0; i < 256; i++)
1737 entries[i].peRed = default_palette_8[i].rgbRed;
1738 entries[i].peGreen = default_palette_8[i].rgbGreen;
1739 entries[i].peBlue = default_palette_8[i].rgbBlue;
1740 entries[i].peFlags = 0;
1742 break;
1744 return CreatePalette( pal );
1747 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1749 HBRUSH brush = CreateSolidBrush( color );
1750 brush = SelectObject( hdc, brush );
1751 PatBlt( hdc, x, y, width, height, PATCOPY );
1752 DeleteObject( SelectObject( hdc, brush ) );
1755 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1757 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1758 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1759 PALETTEENTRY *entries = pal->palPalEntry;
1760 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1761 LOGBRUSH log_brush;
1762 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1763 HBITMAP bmp;
1764 INT i, j, x, y, hatch_style;
1765 HDC src_dc;
1766 HRGN hrgn, hrgn2;
1767 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1768 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1769 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1770 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1771 RGBQUAD *brush_colors = brush_bi->bmiColors;
1772 BYTE *brush_bits, *src_bits;
1773 BOOL is_ddb = !bits;
1774 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1775 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1776 BLENDFUNCTION blend;
1777 COLORREF old_text, old_bkgnd;
1778 HPALETTE hpal, old_hpal;
1780 blend.BlendOp = AC_SRC_OVER;
1781 blend.BlendFlags = 0;
1783 reset_bounds( hdc );
1784 reset_bits( hdc, bmi, bits );
1785 compare_hash(hdc, bmi, bits, "empty");
1787 src_dc = CreateCompatibleDC( 0 );
1788 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1789 orig_pen = SelectObject(hdc, solid_pen);
1790 SetBrushOrgEx(hdc, 0, 0, NULL);
1792 /* horizontal and vertical lines */
1793 for(i = 1; i <= 16; i++)
1795 SetROP2(hdc, i);
1796 MoveToEx(hdc, 10, i * 3, NULL);
1797 LineTo(hdc, 100, i * 3); /* l -> r */
1798 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1799 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1800 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1801 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1802 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1803 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1805 compare_hash(hdc, bmi, bits, "h and v solid lines");
1807 /* diagonal lines */
1808 SetROP2(hdc, R2_COPYPEN);
1809 for(i = 0; i < 16; i++)
1811 double s = sin(M_PI * i / 8.0);
1812 double c = cos(M_PI * i / 8.0);
1814 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1815 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1817 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1819 for(i = 0; i < ARRAY_SIZE(bias_check); i++)
1821 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1822 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1824 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1826 /* solid brush PatBlt */
1827 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1828 orig_brush = SelectObject(hdc, solid_brush);
1830 for(i = 0, y = 10; i < 256; i++)
1832 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1834 if(rop_uses_src(rop3[i]))
1835 ok(ret == FALSE || broken(is_ddb), "got TRUE for %lx\n", rop3[i]);
1836 else
1838 ok(ret, "got FALSE for %lx\n", rop3[i]);
1839 y += 20;
1843 compare_hash_broken_todo(hdc, bmi, bits, "solid patblt", is_ddb, is_ddb);
1845 /* clipped lines */
1846 hrgn = CreateRectRgn(10, 10, 200, 20);
1847 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1848 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1849 SetRectRgn(hrgn2, 290, 100, 300, 200);
1850 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1851 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1852 DeleteObject(hrgn2);
1854 for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
1856 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1857 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1859 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1861 for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
1863 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1864 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1866 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1868 for(i = 0; i < ARRAY_SIZE(line_clips); i++)
1870 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1871 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1873 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1875 /* clipped PatBlt */
1876 for(i = 0; i < ARRAY_SIZE(patblt_clips); i++)
1878 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1879 patblt_clips[i].right - patblt_clips[i].left,
1880 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1882 compare_hash_broken_todo(hdc, bmi, bits, "clipped patblt", is_ddb, is_ddb);
1884 /* clipped dashed lines */
1885 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1886 SelectObject(hdc, dashed_pen);
1887 SetBkMode(hdc, TRANSPARENT);
1888 SetBkColor(hdc, RGB(0, 0xff, 0));
1890 for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
1892 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1893 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1895 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1897 for(i = 0; i < ARRAY_SIZE(hline_clips); i++)
1899 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1900 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1902 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1904 for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
1906 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1907 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1909 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1911 for(i = 0; i < ARRAY_SIZE(vline_clips); i++)
1913 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1914 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1916 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1918 for(i = 0; i < ARRAY_SIZE(line_clips); i++)
1920 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1921 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1923 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1925 SetBkMode(hdc, OPAQUE);
1927 for(i = 0; i < ARRAY_SIZE(line_clips); i++)
1929 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1930 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1932 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1934 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1936 /* 8888 DIB pattern brush */
1938 brush_bi->bmiHeader = dib_brush_header_8888;
1939 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1940 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1941 brush_bits[2] = 0xff;
1942 brush_bits[6] = 0xff;
1943 brush_bits[14] = 0xff;
1944 brush_bits[65] = 0xff;
1945 brush_bits[69] = 0xff;
1946 brush_bits[72] = 0xff;
1948 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1950 SelectObject(hdc, dib_brush);
1951 SetBrushOrgEx(hdc, 1, 1, NULL);
1953 for(i = 0, y = 10; i < 256; i++)
1955 if(!rop_uses_src(rop3[i]))
1957 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1958 ok(ret, "got FALSE for %lx\n", rop3[i]);
1959 y += 25;
1962 compare_hash(hdc, bmi, bits, "top-down 8888 dib brush patblt");
1964 SelectObject(hdc, orig_brush);
1965 DeleteObject(dib_brush);
1967 /* 8888 bottom-up DIB pattern brush */
1969 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1971 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1973 SelectObject(hdc, dib_brush);
1975 /* This used to set the x origin to 100 as well, but
1976 there's a Windows bug for 24 bpp where the brush's x offset
1977 is incorrectly calculated for rops that involve both D and P */
1978 SetBrushOrgEx(hdc, 4, 100, NULL);
1980 for(i = 0, y = 10; i < 256; i++)
1982 if(!rop_uses_src(rop3[i]))
1984 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1985 ok(ret, "got FALSE for %lx\n", rop3[i]);
1986 y += 25;
1989 compare_hash(hdc, bmi, bits, "bottom-up 8888 dib brush patblt");
1991 SelectObject(hdc, orig_brush);
1992 DeleteObject(dib_brush);
1994 /* 24 bpp dib pattern brush */
1996 brush_bi->bmiHeader = dib_brush_header_24;
1997 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1998 memset(brush_bits, 0, 16 * 16 * 3);
1999 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
2000 brush_bits[49] = brush_bits[52] = 0xff;
2002 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2004 SelectObject(hdc, dib_brush);
2005 SetBrushOrgEx(hdc, 1, 1, NULL);
2007 for(i = 0, y = 10; i < 256; i++)
2009 if(!rop_uses_src(rop3[i]))
2011 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2012 ok(ret, "got FALSE for %lx\n", rop3[i]);
2013 y += 25;
2016 compare_hash(hdc, bmi, bits, "top-down 24 bpp brush patblt");
2018 SelectObject(hdc, orig_brush);
2019 DeleteObject(dib_brush);
2021 /* 555 dib pattern brush */
2023 brush_bi->bmiHeader = dib_brush_header_555;
2024 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
2025 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
2026 brush_bits[0] = brush_bits[1] = 0xff;
2027 brush_bits[32] = brush_bits[34] = 0x7c;
2029 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2031 SelectObject(hdc, dib_brush);
2032 SetBrushOrgEx(hdc, 1, 1, NULL);
2034 for(i = 0, y = 10; i < 256; i++)
2036 if(!rop_uses_src(rop3[i]))
2038 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2039 ok(ret, "got FALSE for %lx\n", rop3[i]);
2040 y += 25;
2043 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 0, dib_is_1bpp);
2045 SelectObject(hdc, orig_brush);
2046 DeleteObject(dib_brush);
2048 SetBrushOrgEx(hdc, 0, 0, NULL);
2050 /* 8 bpp dib pattern brush */
2052 brush_bi->bmiHeader = dib_brush_header_8;
2053 brush_bi->bmiHeader.biClrUsed = 3;
2054 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
2055 brush_colors[0].rgbRed = 0xff;
2056 brush_colors[1].rgbRed = 0xff;
2057 brush_colors[1].rgbGreen = 0xff;
2058 brush_colors[1].rgbBlue = 0xff;
2060 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
2061 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
2062 brush_bits[0] = brush_bits[1] = 1;
2063 brush_bits[16] = brush_bits[17] = 2;
2064 brush_bits[32] = brush_bits[33] = 6;
2066 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2068 SelectObject(hdc, dib_brush);
2069 SetBrushOrgEx(hdc, 1, 1, NULL);
2071 for(i = 0, y = 10; i < 256; i++)
2073 if(!rop_uses_src(rop3[i]))
2075 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2076 ok(ret, "got FALSE for %lx\n", rop3[i]);
2077 y += 25;
2080 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", 0, dib_is_1bpp);
2082 SelectObject(hdc, orig_brush);
2083 DeleteObject(dib_brush);
2085 /* 4 bpp dib pattern brush */
2087 brush_bi->bmiHeader = dib_brush_header_4;
2088 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2090 SelectObject(hdc, dib_brush);
2091 SetBrushOrgEx(hdc, 1, 1, NULL);
2093 for(i = 0, y = 10; i < 256; i++)
2095 if(!rop_uses_src(rop3[i]))
2097 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2098 ok(ret, "got FALSE for %lx\n", rop3[i]);
2099 y += 25;
2102 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", 0, dib_is_1bpp);
2104 SelectObject(hdc, orig_brush);
2105 DeleteObject(dib_brush);
2107 /* 1 bpp dib pattern brush */
2109 brush_bi->bmiHeader = dib_brush_header_1;
2110 brush_bi->bmiHeader.biClrUsed = 2;
2111 memset(brush_bits, 0, 16 * 4);
2112 brush_bits[0] = 0xf0;
2113 brush_bits[4] = 0xf0;
2114 brush_bits[8] = 0xf0;
2116 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2117 SelectObject(hdc, dib_brush);
2118 for(i = 0, y = 10; i < 256; i++)
2120 if(!rop_uses_src(rop3[i]))
2122 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2123 ok(ret, "got FALSE for %lx\n", rop3[i]);
2124 y += 25;
2128 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", 0, dib_is_1bpp);
2130 SelectObject(hdc, orig_brush);
2131 DeleteObject(dib_brush);
2133 /* 1 bpp ddb pattern brush */
2135 old_text = GetTextColor( hdc );
2136 old_bkgnd = GetBkColor( hdc );
2137 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2138 dib_brush = CreatePatternBrush( bmp );
2139 SelectObject(hdc, dib_brush);
2140 for(i = 0, y = 10; i < 256; i++)
2142 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2143 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2144 if(!rop_uses_src(rop3[i]))
2146 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2147 ok(ret, "got FALSE for %lx\n", rop3[i]);
2148 y += 25;
2152 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", 0, dib_is_1bpp);
2154 DeleteObject(bmp);
2155 SelectObject(hdc, orig_brush);
2156 DeleteObject( dib_brush );
2157 SetBrushOrgEx(hdc, 0, 0, NULL);
2158 SetTextColor(hdc, old_text);
2159 SetBkColor(hdc, old_bkgnd);
2161 /* Rectangle */
2163 SelectObject(hdc, solid_pen);
2164 SelectObject(hdc, solid_brush);
2166 for(i = 0; i < ARRAY_SIZE(rectangles); i++)
2168 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
2171 SelectObject(hdc, dashed_pen);
2172 for(i = 0; i < ARRAY_SIZE(rectangles); i++)
2174 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
2177 compare_hash_broken_todo(hdc, bmi, bits, "rectangles", is_ddb, is_ddb);
2178 SelectObject(hdc, solid_pen);
2180 /* PaintRgn */
2182 PaintRgn(hdc, hrgn);
2183 compare_hash_broken_todo(hdc, bmi, bits, "PaintRgn", is_ddb, is_ddb);
2185 /* RTL rectangles */
2187 SetLayout(hdc, LAYOUT_RTL);
2188 PaintRgn(hdc, hrgn);
2189 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
2190 Rectangle(hdc, 100, 250, 110, 260);
2191 compare_hash_broken_todo(hdc, bmi, bits, "rtl", is_ddb, is_ddb);
2192 SetLayout(hdc, LAYOUT_LTR);
2193 DeleteObject( hrgn );
2195 for(i = 0, y = 10; i < 256; i++)
2197 if(!rop_uses_src(rop3[i]))
2199 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
2201 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
2202 SelectObject(hdc, hatch_brush);
2203 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
2204 ok(ret, "got FALSE for %lx\n", rop3[i]);
2205 SelectObject(hdc, orig_brush);
2206 DeleteObject(hatch_brush);
2208 y += 25;
2212 compare_hash(hdc, bmi, bits, "hatch brushes");
2214 /* overlapping blits */
2216 orig_brush = SelectObject(hdc, solid_brush);
2218 Rectangle(hdc, 10, 10, 100, 100);
2219 Rectangle(hdc, 20, 15, 30, 40);
2220 Rectangle(hdc, 15, 15, 20, 20);
2221 Rectangle(hdc, 15, 20, 50, 45);
2222 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2223 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y", is_ddb, is_ddb);
2225 Rectangle(hdc, 10, 10, 100, 100);
2226 Rectangle(hdc, 20, 15, 30, 40);
2227 Rectangle(hdc, 15, 15, 20, 20);
2228 Rectangle(hdc, 15, 20, 50, 45);
2229 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2230 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y", dib_is_1bpp + is_ddb, is_ddb);
2232 Rectangle(hdc, 10, 10, 100, 100);
2233 Rectangle(hdc, 20, 15, 30, 40);
2234 Rectangle(hdc, 15, 15, 20, 20);
2235 Rectangle(hdc, 15, 20, 50, 45);
2236 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2237 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y", is_ddb, is_ddb);
2239 Rectangle(hdc, 10, 10, 100, 100);
2240 Rectangle(hdc, 20, 15, 30, 40);
2241 Rectangle(hdc, 15, 15, 20, 20);
2242 Rectangle(hdc, 15, 20, 50, 45);
2243 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2244 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", dib_is_1bpp + is_ddb, is_ddb);
2246 Rectangle(hdc, 10, 10, 100, 100);
2247 Rectangle(hdc, 20, 15, 30, 40);
2248 Rectangle(hdc, 15, 15, 20, 20);
2249 Rectangle(hdc, 15, 20, 50, 45);
2250 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2251 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y", is_ddb, is_ddb);
2253 Rectangle(hdc, 10, 10, 100, 100);
2254 Rectangle(hdc, 20, 15, 30, 40);
2255 Rectangle(hdc, 15, 15, 20, 20);
2256 Rectangle(hdc, 15, 20, 50, 45);
2257 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2258 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y", is_ddb, is_ddb);
2260 Rectangle(hdc, 10, 10, 100, 100);
2261 Rectangle(hdc, 20, 15, 30, 40);
2262 Rectangle(hdc, 15, 15, 20, 20);
2263 Rectangle(hdc, 15, 20, 50, 45);
2264 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2265 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2266 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2267 else
2268 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", is_ddb, is_ddb);
2270 Rectangle(hdc, 10, 10, 100, 100);
2271 Rectangle(hdc, 20, 15, 30, 40);
2272 Rectangle(hdc, 15, 15, 20, 20);
2273 Rectangle(hdc, 15, 20, 50, 45);
2274 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2275 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y", is_ddb, is_ddb);
2277 /* blitting with 32-bpp BI_RGB source */
2279 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2280 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2281 src_bi->bmiHeader.biHeight = 256;
2282 src_bi->bmiHeader.biWidth = 256;
2283 src_bi->bmiHeader.biBitCount = 32;
2284 src_bi->bmiHeader.biPlanes = 1;
2285 src_bi->bmiHeader.biCompression = BI_RGB;
2286 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2287 SelectObject( src_dc, bmp );
2288 for (y = 0; y < 256; y++)
2289 for (x = 0; x < 256; x++)
2291 BYTE a = (x + y) * 2;
2292 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2293 BYTE g = (BYTE)(x + y / 3) * a / 255;
2294 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2295 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2298 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2300 /* Interesting cases for 1-bpp dst */
2301 BitBlt( hdc, 1, 4, 2, 2, src_dc, 0, 0, SRCCOPY );
2302 BitBlt( hdc, 1, 8, 16, 2, src_dc, 0, 0, SRCCOPY );
2303 BitBlt( hdc, 1, 12, 15, 2, src_dc, 0, 0, SRCCOPY );
2304 BitBlt( hdc, 0, 16, 8, 2, src_dc, 0, 0, SRCCOPY );
2305 BitBlt( hdc, 0, 20, 9, 2, src_dc, 0, 0, SRCCOPY );
2306 BitBlt( hdc, 7, 24, 1, 2, src_dc, 0, 0, SRCCOPY );
2307 BitBlt( hdc, 7, 28, 2, 2, src_dc, 0, 0, SRCCOPY );
2308 BitBlt( hdc, 7, 32, 9, 2, src_dc, 0, 0, SRCCOPY );
2309 BitBlt( hdc, 7, 36, 10, 2, src_dc, 0, 0, SRCCOPY );
2310 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2312 blend.SourceConstantAlpha = 0xd0;
2313 blend.AlphaFormat = 0;
2314 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2315 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2317 blend.SourceConstantAlpha = 0xb0;
2318 blend.AlphaFormat = AC_SRC_ALPHA;
2319 GdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2320 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2322 /* blitting with 32-bpp r10g10b10 source */
2324 src_bi->bmiHeader.biBitCount = 32;
2325 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2326 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2327 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2328 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2329 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2330 SelectObject( src_dc, bmp );
2331 for (y = 0; y < 256; y++)
2332 for (x = 0; x < 256; x++)
2334 WORD r = (7 * x + 3 * y) % 1024;
2335 WORD g = (11 * x + y / 3) % 1024;
2336 WORD b = (x / 3 + 9 * y) % 1024;
2337 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2340 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2341 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2343 /* blitting with 32-bpp b6g6r6 source */
2345 src_bi->bmiHeader.biBitCount = 32;
2346 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2347 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2348 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2349 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2350 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2351 SelectObject( src_dc, bmp );
2352 for (y = 0; y < 256; y++)
2353 for (x = 0; x < 256; x++)
2355 BYTE r = (y + 2 * x) % 64;
2356 BYTE g = (x + y / 3) % 64;
2357 BYTE b = (x / 3 + 2 * y) % 64;
2358 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2361 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2362 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2364 /* blitting with 24-bpp source */
2366 src_bi->bmiHeader.biBitCount = 24;
2367 src_bi->bmiHeader.biCompression = BI_RGB;
2368 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2369 DeleteObject( SelectObject( src_dc, bmp ) );
2370 for (y = 0; y < 256; y++)
2371 for (x = 0; x < 256; x++)
2373 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2374 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2375 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2378 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2379 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2381 blend.SourceConstantAlpha = 0xe0;
2382 blend.AlphaFormat = 0;
2383 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2384 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2386 /* blitting with 16-bpp BI_RGB source */
2388 src_bi->bmiHeader.biBitCount = 16;
2389 src_bi->bmiHeader.biCompression = BI_RGB;
2390 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2391 DeleteObject( SelectObject( src_dc, bmp ) );
2392 for (y = 0; y < 256; y++)
2393 for (x = 0; x < 256; x++)
2394 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2396 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2397 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2399 /* blitting with 16-bpp b4g4r4 source */
2401 src_bi->bmiHeader.biBitCount = 16;
2402 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2403 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2404 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2405 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2406 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2407 DeleteObject( SelectObject( src_dc, bmp ) );
2408 for (y = 0; y < 256; y++)
2409 for (x = 0; x < 256; x++)
2410 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2412 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2413 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2415 /* blitting with 8-bpp source */
2417 src_bi->bmiHeader.biBitCount = 8;
2418 src_bi->bmiHeader.biCompression = BI_RGB;
2419 src_bi->bmiHeader.biClrUsed = 160;
2420 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2421 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2422 DeleteObject( SelectObject( src_dc, bmp ) );
2423 for (y = 0; y < 256; y++)
2424 for (x = 0; x < 256; x++)
2425 src_bits[y * 256 + x] = 3 * x + 5 * y;
2427 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2428 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2430 blend.SourceConstantAlpha = 0xd0;
2431 blend.AlphaFormat = 0;
2432 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2433 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2435 /* blitting with 4-bpp source */
2437 src_bi->bmiHeader.biBitCount = 4;
2438 src_bi->bmiHeader.biClrUsed = 12;
2439 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2440 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2441 DeleteObject( SelectObject( src_dc, bmp ) );
2442 for (y = 0; y < 256; y++)
2443 for (x = 0; x < 256; x += 2)
2444 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2446 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2447 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2449 /* blitting with 1-bpp source */
2451 src_bi->bmiHeader.biBitCount = 1;
2452 src_bi->bmiHeader.biClrUsed = 0;
2453 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2454 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2455 DeleteObject( SelectObject( src_dc, bmp ) );
2456 for (y = 0; y < 256; y++)
2457 for (x = 0; x < 256; x += 8)
2458 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2460 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2461 /* Some interesting src co-ords */
2462 BitBlt( hdc, 10, 10, 3, 10, src_dc, 0, 0, SRCCOPY );
2463 BitBlt( hdc, 20, 10, 3, 10, src_dc, 2, 0, SRCCOPY );
2464 BitBlt( hdc, 30, 10, 3, 10, src_dc, 5, 0, SRCCOPY );
2465 BitBlt( hdc, 40, 10, 3, 10, src_dc, 6, 0, SRCCOPY );
2466 BitBlt( hdc, 50, 10, 20, 10, src_dc, 6, 0, SRCCOPY );
2467 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2469 blend.SourceConstantAlpha = 0x90;
2470 blend.AlphaFormat = 0;
2471 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2472 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 0, is_ddb );
2474 /* blitting with 1-bpp ddb source */
2476 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2477 DeleteObject( SelectObject( src_dc, bmp ) );
2479 old_text = GetTextColor( hdc );
2480 old_bkgnd = GetBkColor( hdc );
2481 for (i = 0; i < 256; i += 13)
2483 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2484 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2485 BitBlt( hdc, i, 0, 13, 13, src_dc, 0, 0, SRCCOPY );
2487 for (i = 0; i < 256; i += 13)
2489 SetTextColor(hdc, PALETTEINDEX( i ));
2490 SetBkColor(hdc, PALETTEINDEX( i + 3 ));
2491 BitBlt( hdc, i, 13, 13, 13, src_dc, 0, 0, SRCCOPY );
2493 for (i = 0; i < 256; i += 13)
2495 SetTextColor(hdc, DIBINDEX( i ));
2496 SetBkColor(hdc, DIBINDEX( i + 3 ));
2497 BitBlt( hdc, i, 26, 13, 13, src_dc, 0, 0, SRCCOPY );
2499 SetTextColor( hdc, old_text );
2500 SetBkColor( hdc, old_bkgnd );
2501 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp ddb SRCCOPY" );
2503 DeleteObject( bmp );
2505 /* blitting to 1-bpp ddb dest */
2507 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2508 DeleteObject( SelectObject( src_dc, bmp ) );
2510 for (y = 0; y < 16; y++)
2511 for (x = 0; x < 16; x++)
2512 SetPixel( hdc, x, y, RGB( 16 * x, 16 * y, 8 * (x + y)) );
2513 PatBlt( hdc, 15, 15, 1, 1, WHITENESS );
2514 /* source colors are ignored */
2515 SetTextColor( src_dc, 0xbeef );
2516 SetBkColor( src_dc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2517 /* destination text color is also ignored */
2518 SetTextColor( hdc, 0xbedead );
2520 if (bits)
2522 i = 16;
2523 SetBkColor( hdc, 0xffffff );
2524 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2525 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2526 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2527 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2528 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2529 SetBkColor( hdc, 0 );
2530 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2531 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2532 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2533 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2534 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2535 SetBkColor( hdc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2536 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2537 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2538 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2539 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2540 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2541 SetBkColor( hdc, RGB( 16 * 13, 16 * 14, 8 * (13 + 14) ));
2542 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2543 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2544 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2545 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2546 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2547 SetBkColor( hdc, PALETTEINDEX( 1 ));
2548 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2549 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2550 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2551 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2552 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2553 SetBkColor( hdc, DIBINDEX( 2 ));
2554 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2555 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2556 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2557 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2558 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2559 SetTextColor( hdc, old_text );
2560 SetBkColor( hdc, old_bkgnd );
2562 compare_hash(hdc, bmi, bits, "BitBlt dst 1-bpp ddb");
2564 DeleteDC( src_dc );
2565 DeleteObject( bmp );
2567 /* RLE StretchDIBits */
2568 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2569 src_bi->bmiHeader.biWidth = 8;
2570 src_bi->bmiHeader.biHeight = 8;
2571 src_bi->bmiHeader.biPlanes = 1;
2572 src_bi->bmiHeader.biBitCount = 8;
2573 src_bi->bmiHeader.biCompression = BI_RLE8;
2574 src_bi->bmiHeader.biClrUsed = 0;
2575 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2577 for (i = 0; i < 256; i++)
2579 src_bi->bmiColors[i].rgbRed = i;
2580 src_bi->bmiColors[i].rgbGreen = i;
2581 src_bi->bmiColors[i].rgbBlue = i;
2582 src_bi->bmiColors[i].rgbReserved = 0;
2585 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2586 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2587 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2588 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2589 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2590 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2592 /* 32 bpp StretchDIBits */
2594 src_bi->bmiHeader.biWidth = 4;
2595 src_bi->bmiHeader.biHeight = 4;
2596 src_bi->bmiHeader.biPlanes = 1;
2597 src_bi->bmiHeader.biBitCount = 32;
2598 src_bi->bmiHeader.biCompression = BI_RGB;
2599 src_bi->bmiHeader.biClrUsed = 0;
2600 src_bi->bmiHeader.biSizeImage = 0;
2602 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2603 ok(ret == 4, "got %d\n", ret);
2604 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2605 ok(ret == 4, "got %d\n", ret);
2606 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2607 ok(ret == 4, "got %d\n", ret);
2608 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2609 ok(ret == 4, "got %d\n", ret);
2610 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2611 ok(ret == 4, "got %d\n", ret);
2612 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2613 ok(ret == 4, "got %d\n", ret);
2615 src_bi->bmiHeader.biHeight = -4;
2617 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2618 ok(ret == 4, "got %d\n", ret);
2619 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2620 ok(ret == -4, "got %d\n", ret);
2621 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2622 ok(ret == 4, "got %d\n", ret);
2623 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2624 ok(ret == -4, "got %d\n", ret);
2625 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2626 ok(ret == 4, "got %d\n", ret);
2627 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2628 ok(ret == -4, "got %d\n", ret);
2630 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2632 /* Solid colors */
2634 for (i = 0; i < 16; i++)
2636 for (j = 0; j < 16; j++)
2638 solid_patblt( hdc, 16 * j, 16 * i, 16, 16, RGB( i*16+j, i*16+j, i*16+j ));
2639 solid_patblt( hdc, 16 * j, 256 + 16 * i, 16, 16, RGB( 3*(i*16+j), i*16+j, i*16+j ));
2640 solid_patblt( hdc, 256 + 16 * j, 16 * i, 16, 16, RGB( i*16+j, 3*(i*16+j), i*16+j ));
2641 solid_patblt( hdc, 256 + 16 * j, 256 + 16 * i, 16, 16, RGB( i*16+j, i*16+j, 3*(i*16+j) ));
2644 compare_hash_broken_todo(hdc, bmi, bits, "color fills", is_ddb, is_ddb);
2646 for (i = 0; i < 256; i++)
2648 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2649 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2650 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2651 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2652 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2655 /* A few extra colors that are interesting in the 1bpp case */
2657 /* bk color */
2658 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2659 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2661 /* color 0 */
2662 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2663 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2665 /* color 1 */
2666 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2667 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2669 compare_hash_broken_todo(hdc, bmi, bits, "Colors", is_ddb, is_ddb);
2671 for (i = 0; i < 256; i++)
2673 COLORREF s, g;
2675 for (j = 0; j < 16; j++)
2677 SetROP2( hdc, (j + R2_COPYPEN - 1) % 16 + 1 ); /* Start with R2_COPYPEN */
2679 s = SetPixel( hdc, i * 2, j, DIBINDEX(i) );
2680 g = GetPixel( hdc, i * 2, 0 ); /* retrieve value set with R2_COPYPEN */
2681 ok( s == g, "got %08lx and %08lx\n", s, g );
2683 s = SetPixel( hdc, i * 2, 20 + j, PALETTEINDEX(i) );
2684 g = GetPixel( hdc, i * 2, 20 + 0 ); /* retrieve value set with R2_COPYPEN */
2685 ok( s == g, "got %08lx and %08lx\n", s, g );
2687 s = SetPixel( hdc, i * 2, 40 + j, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2688 g = GetPixel( hdc, i * 2, 40 + 0 ); /* retrieve value set with R2_COPYPEN */
2689 ok( s == g, "got %08lx and %08lx\n", s, g );
2691 s = SetPixel( hdc, i * 2, 60 + j, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2692 g = GetPixel( hdc, i * 2, 60 + 0 ); /* retrieve value set with R2_COPYPEN */
2693 ok( s == g, "got %08lx and %08lx\n", s, g );
2696 SetROP2( hdc, R2_COPYPEN );
2698 for (j = 0; j < 256; j++)
2700 s = SetPixel( hdc, i * 2, 80 + j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2701 g = GetPixel( hdc, i * 2, 80 + j );
2702 ok( s == g, "got %08lx and %08lx\n", s, g );
2704 s = SetPixel( hdc, i * 2 + 1, 80 + j, (j << 24) | i );
2705 g = GetPixel( hdc, i * 2 + 1, 80 + j );
2706 ok( s == g, "got %08lx and %08lx\n", s, g );
2710 compare_hash(hdc, bmi, bits, "SetPixel");
2712 /* gradients */
2715 TRIVERTEX vrect[] =
2717 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2718 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2719 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2720 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2722 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2724 TRIVERTEX vtri[] =
2726 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2727 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2728 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2730 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2731 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2732 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2734 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2735 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2736 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2738 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2739 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2740 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2742 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2743 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2744 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2746 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2747 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2748 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2750 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2751 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2752 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2754 GRADIENT_TRIANGLE tri[] =
2756 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2757 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2760 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2761 for (i = 0; i < 4; i++) vrect[i].y += 250;
2762 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2763 /* Wine's 8-bit dithering isn't identical to Windows */
2764 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) );
2766 GdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2767 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2768 GdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2769 /* Wine's 8-bit dithering isn't identical to Windows */
2770 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) );
2773 /* wide pen */
2775 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2776 SelectObject( hdc, wide_pen );
2778 for (i = 0; i < ARRAY_SIZE(wide_lines); i++)
2780 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2781 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2784 compare_hash( hdc, bmi, bits, "wide pen" );
2786 SelectObject( hdc, orig_pen );
2787 DeleteObject( wide_pen );
2789 log_brush.lbStyle = BS_SOLID;
2790 log_brush.lbColor = RGB(0xff, 0, 0);
2791 log_brush.lbHatch = 0;
2793 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2794 9, &log_brush, 0, NULL );
2795 SelectObject( hdc, wide_pen );
2796 SetBrushOrgEx( hdc, 3, 3, NULL );
2797 Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
2798 compare_hash_broken_todo( hdc, bmi, bits, "wide pen - flat caps, mitred", is_ddb, is_ddb );
2799 SetBrushOrgEx( hdc, 0, 0, NULL );
2801 SelectObject( hdc, orig_pen );
2802 DeleteObject( wide_pen );
2804 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2805 16, &log_brush, 0, NULL );
2806 SelectObject( hdc, wide_pen );
2808 Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
2809 compare_hash_broken_todo( hdc, bmi, bits, "wide pen - square caps, bevelled", is_ddb, is_ddb );
2811 SelectObject( hdc, orig_pen );
2812 DeleteObject( wide_pen );
2814 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2815 9, &log_brush, 0, NULL );
2816 SelectObject( hdc, wide_pen );
2818 PolyPolyline( hdc, polypoly_lines, polypoly_counts, ARRAY_SIZE( polypoly_counts ));
2819 compare_hash_broken_todo( hdc, bmi, bits, "wide pen - empty segments", is_ddb, is_ddb );
2821 SelectObject( hdc, orig_pen );
2822 DeleteObject( wide_pen );
2824 /* brushed wide pen */
2826 old_text = GetTextColor( hdc );
2827 old_bkgnd = GetBkColor( hdc );
2828 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2829 log_brush.lbStyle = BS_PATTERN;
2830 log_brush.lbColor = 0;
2831 log_brush.lbHatch = (ULONG_PTR)bmp;
2832 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2833 12, &log_brush, 0, NULL );
2834 ok( wide_pen != 0, "failed to create pen\n" );
2835 SelectObject( hdc, wide_pen );
2836 Polyline( hdc, poly_lines, ARRAY_SIZE( poly_lines ));
2838 for (i = 1; i < 20; i++)
2840 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2841 i, &log_brush, 0, NULL );
2842 ok( wide_pen != 0, "failed to create pen\n" );
2843 DeleteObject( SelectObject( hdc, wide_pen ));
2844 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2845 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2846 MoveToEx( hdc, 10 * i, 10, NULL );
2847 LineTo( hdc, 10 * i, 200 + i );
2848 LineTo( hdc, 20 * i, 200 + i );
2850 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 0, dib_is_1bpp );
2852 for (i = 1; i < 20; i++)
2854 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2855 i, &log_brush, 0, NULL );
2856 DeleteObject( SelectObject( hdc, wide_pen ));
2857 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2858 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2859 MoveToEx( hdc, 10 * i, 10, NULL );
2860 LineTo( hdc, 10 * i, 200 + i );
2861 LineTo( hdc, 20 * i, 200 + i );
2863 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 0, dib_is_1bpp );
2865 DeleteObject(bmp);
2866 SetTextColor(hdc, old_text);
2867 SetBkColor(hdc, old_bkgnd);
2868 SelectObject( hdc, orig_pen );
2870 /* PALETTEINDEX */
2872 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2873 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2874 SetTextColor( hdc, PALETTEINDEX(38) );
2875 SetBkColor( hdc, PALETTEINDEX(9) );
2876 SelectObject( hdc, solid_brush );
2877 SelectObject( hdc, solid_pen );
2879 pal->palVersion = 0x300;
2880 pal->palNumEntries = 40;
2881 for (i = 0; i < 80; i++)
2883 entries[i].peRed = i * 3;
2884 entries[i].peGreen = i * 7;
2885 entries[i].peBlue = 128 - i;
2886 entries[i].peFlags = 0;
2888 hpal = CreatePalette( pal );
2889 old_hpal = SelectPalette( hdc, hpal, FALSE );
2891 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2892 Rectangle( hdc, 0, 0, 10, 10 );
2893 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2894 Rectangle( hdc, 10, 0, 10, 10 );
2895 SelectObject( hdc, orig_brush );
2896 DeleteObject( solid_brush );
2898 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2899 DeleteObject( SelectObject( hdc, solid_brush ));
2900 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2901 SetPaletteEntries( hpal, 0, 40, entries );
2902 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2903 SelectObject( hdc, orig_brush );
2904 DeleteObject( solid_brush );
2906 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2907 dib_brush = CreatePatternBrush( bmp );
2908 SelectObject( hdc, dib_brush );
2909 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2910 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2911 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2912 DeleteObject( bmp );
2913 SelectObject( hdc, orig_brush );
2914 DeleteObject( dib_brush );
2916 SelectPalette( hdc, old_hpal, FALSE );
2917 DeleteObject( hpal );
2919 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", is_ddb, dib_is_1bpp );
2921 /* ExtFloodFill */
2923 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2924 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2925 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2926 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2927 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2929 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2930 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2931 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2932 DeleteObject( hrgn );
2934 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2935 SelectObject( hdc, solid_brush );
2937 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2938 if (is_ddb)
2939 todo_wine ok (!ret || broken(ret), "got ret %d\n", ret);
2940 else
2941 ok (ret, "got ret %d\n", ret);
2942 compare_hash_broken_todo( hdc, bmi, bits, "flood fill", is_ddb, is_ddb );
2944 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2946 ret = ExtFloodFill( hdc, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2947 ok (!ret, "got ret %d\n", ret);
2949 SelectObject(hdc, orig_brush);
2950 SelectObject(hdc, orig_pen);
2951 DeleteObject(solid_brush);
2952 DeleteObject(wide_pen);
2953 DeleteObject(dashed_pen);
2954 DeleteObject(solid_pen);
2957 static const BYTE ramp[17] =
2959 0, 0x4d, 0x68, 0x7c,
2960 0x8c, 0x9a, 0xa7, 0xb2,
2961 0xbd, 0xc7, 0xd0, 0xd9,
2962 0xe1, 0xe9, 0xf0, 0xf8,
2963 0xff
2966 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2968 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2969 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2972 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2974 BYTE min_comp, max_comp;
2976 if (alpha == 16) return text;
2977 if (alpha <= 1) return dst;
2978 if (text == dst) return dst;
2980 get_range( alpha, text, &min_comp, &max_comp );
2982 if (dst > text)
2984 DWORD diff = dst - text;
2985 DWORD range = max_comp - text;
2986 dst = text + (diff * range ) / (0xff - text);
2987 return dst;
2989 else
2991 DWORD diff = text - dst;
2992 DWORD range = text - min_comp ;
2993 dst = text - (diff * range) / text;
2994 return dst;
2998 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
3000 COLORREF ret;
3002 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
3003 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
3004 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
3005 return ret;
3008 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
3010 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
3012 DWORD dib_size = get_dib_size(bmi), ret;
3013 LOGFONTA lf;
3014 HFONT font;
3015 GLYPHMETRICS gm;
3016 BYTE g_buf[10000];
3017 int i, stride, x, y;
3018 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
3019 char *eto_hash = NULL, *diy_hash = NULL;
3020 static const char str[] = "Hello Wine";
3021 POINT origin, g_org;
3022 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
3023 COLORREF bk_color, text_color;
3024 TEXTMETRICA tm;
3025 RECT rect;
3027 for(i = 0; i < dib_size; i++)
3028 bits[i] = vals[i % 4];
3030 memset( &lf, 0, sizeof(lf) );
3031 strcpy( lf.lfFaceName, "Tahoma" );
3032 lf.lfHeight = 24;
3033 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
3035 font = CreateFontIndirectA( &lf );
3036 font = SelectObject( hdc, font );
3038 GetTextMetricsA( hdc, &tm );
3039 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
3041 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
3042 DeleteObject( SelectObject( hdc, font ) );
3043 return;
3046 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
3047 SetTextAlign( hdc, TA_BASELINE );
3048 SetBkMode( hdc, TRANSPARENT );
3049 origin.x = 10;
3050 origin.y = 100;
3052 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
3053 eto_hash = hash_dib( hdc, bmi, bits );
3055 for(i = 0; i < dib_size; i++)
3056 bits[i] = vals[i % 4];
3058 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
3060 text_color = GetTextColor( hdc );
3061 for (i = 0; i < strlen(str); i++)
3063 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
3065 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
3067 if (ret == GDI_ERROR) continue;
3069 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
3071 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
3072 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
3074 origin.x += gm.gmCellIncX;
3075 origin.y += gm.gmCellIncY;
3077 if (!ret) continue;
3079 if (aa)
3081 stride = (gm.gmBlackBoxX + 3) & ~3;
3083 for (y = 0; y < gm.gmBlackBoxY; y++)
3085 BYTE *g_ptr = g_buf + y * stride;
3086 COLORREF val;
3088 for (x = 0; x < gm.gmBlackBoxX; x++)
3090 if (g_ptr[x] <= 1) continue;
3091 if (g_ptr[x] >= 16) val = text_color;
3092 else
3094 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
3095 val = aa_colorref( val, text_color, g_ptr[x] );
3097 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
3101 else
3103 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
3105 for (y = 0; y < gm.gmBlackBoxY; y++)
3107 BYTE *g_ptr = g_buf + y * stride;
3108 for (x = 0; x < gm.gmBlackBoxX; x++)
3110 if (g_ptr[x / 8] & masks[x % 8])
3111 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
3117 diy_hash = hash_dib( hdc, bmi, bits );
3118 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
3120 bk_color = GetBkColor( hdc );
3121 SetBkColor( hdc, RGB(128,64,32) );
3123 SetRect( &rect, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight );
3124 ret = ExtTextOutA( hdc, 10, 100, ETO_OPAQUE, &rect, str, -1, NULL );
3125 ok( !ret, "ExtTextOutA succeeded\n" );
3127 diy_hash = hash_dib( hdc, bmi, bits );
3128 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
3130 SetBkColor( hdc, bk_color );
3132 free( diy_hash );
3133 free( eto_hash );
3135 font = SelectObject( hdc, font );
3136 DeleteObject( font );
3139 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
3141 draw_text_2( hdc, bmi, bits, FALSE );
3143 /* Rounding errors make these cases hard to test */
3144 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
3145 (bmi->bmiHeader.biBitCount == 16))
3146 return;
3148 draw_text_2( hdc, bmi, bits, TRUE );
3151 static void test_simple_graphics(void)
3153 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
3154 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
3155 RGBQUAD *colors = bmi->bmiColors;
3156 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
3157 HDC mem_dc;
3158 BYTE *bits;
3159 HBITMAP dib, orig_bm;
3160 DIBSECTION ds;
3161 HPALETTE default_palette, old_hpal;
3162 int i;
3164 mem_dc = CreateCompatibleDC(NULL);
3166 /* a8r8g8b8 */
3167 trace("8888\n");
3168 memset(bmi, 0, sizeof(bmibuf));
3169 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
3170 bmi->bmiHeader.biHeight = 512;
3171 bmi->bmiHeader.biWidth = 512;
3172 bmi->bmiHeader.biBitCount = 32;
3173 bmi->bmiHeader.biPlanes = 1;
3174 bmi->bmiHeader.biCompression = BI_RGB;
3176 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3177 ok(dib != NULL, "ret NULL\n");
3178 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3179 ok(ds.dsBitfields[0] == 0, "got %08lx\n", ds.dsBitfields[0]);
3180 ok(ds.dsBitfields[1] == 0, "got %08lx\n", ds.dsBitfields[1]);
3181 ok(ds.dsBitfields[2] == 0, "got %08lx\n", ds.dsBitfields[2]);
3182 ok(ds.dsBmih.biCompression == BI_RGB, "got %lx\n", ds.dsBmih.biCompression);
3184 orig_bm = SelectObject(mem_dc, dib);
3186 default_palette = create_default_palette( 8 );
3187 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
3189 dst_format = "8888";
3190 current_sha1 = sha1_graphics_a8r8g8b8;
3191 draw_graphics(mem_dc, bmi, bits);
3192 draw_text(mem_dc, bmi, bits);
3194 SelectObject(mem_dc, orig_bm);
3195 DeleteObject(dib);
3197 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
3198 trace("8888 - bitfields\n");
3199 bmi->bmiHeader.biBitCount = 32;
3200 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3201 bit_fields[0] = 0xff0000;
3202 bit_fields[1] = 0x00ff00;
3203 bit_fields[2] = 0x0000ff;
3205 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3206 ok(dib != NULL, "ret NULL\n");
3207 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3208 ok(ds.dsBitfields[0] == 0xff0000, "got %08lx\n", ds.dsBitfields[0]);
3209 ok(ds.dsBitfields[1] == 0x00ff00, "got %08lx\n", ds.dsBitfields[1]);
3210 ok(ds.dsBitfields[2] == 0x0000ff, "got %08lx\n", ds.dsBitfields[2]);
3211 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3213 orig_bm = SelectObject(mem_dc, dib);
3214 SelectPalette( mem_dc, default_palette, FALSE );
3216 dst_format = "8888 - bitfields";
3217 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
3218 draw_graphics(mem_dc, bmi, bits);
3219 draw_text(mem_dc, bmi, bits);
3221 SelectObject(mem_dc, orig_bm);
3222 DeleteObject(dib);
3224 /* a8b8g8r8. */
3225 trace("a8b8g8r8\n");
3226 bmi->bmiHeader.biBitCount = 32;
3227 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3228 bit_fields[0] = 0x0000ff;
3229 bit_fields[1] = 0x00ff00;
3230 bit_fields[2] = 0xff0000;
3232 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3233 ok(dib != NULL, "ret NULL\n");
3234 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3235 ok(ds.dsBitfields[0] == 0x0000ff, "got %08lx\n", ds.dsBitfields[0]);
3236 ok(ds.dsBitfields[1] == 0x00ff00, "got %08lx\n", ds.dsBitfields[1]);
3237 ok(ds.dsBitfields[2] == 0xff0000, "got %08lx\n", ds.dsBitfields[2]);
3238 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3240 orig_bm = SelectObject(mem_dc, dib);
3242 dst_format = "a8b8g8r8";
3243 current_sha1 = sha1_graphics_a8b8g8r8;
3244 draw_graphics(mem_dc, bmi, bits);
3245 draw_text(mem_dc, bmi, bits);
3247 SelectObject(mem_dc, orig_bm);
3248 DeleteObject(dib);
3250 /* r10g10b10. */
3251 trace("r10g10b10\n");
3252 bmi->bmiHeader.biBitCount = 32;
3253 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3254 bit_fields[0] = 0x3ff00000;
3255 bit_fields[1] = 0x000ffc00;
3256 bit_fields[2] = 0x000003ff;
3258 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3259 ok(dib != NULL, "ret NULL\n");
3260 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3261 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08lx\n", ds.dsBitfields[0]);
3262 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08lx\n", ds.dsBitfields[1]);
3263 ok(ds.dsBitfields[2] == 0x000003ff, "got %08lx\n", ds.dsBitfields[2]);
3264 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3266 orig_bm = SelectObject(mem_dc, dib);
3268 dst_format = "r10g10b10";
3269 current_sha1 = sha1_graphics_r10g10b10;
3270 draw_graphics(mem_dc, bmi, bits);
3271 draw_text(mem_dc, bmi, bits);
3273 SelectObject(mem_dc, orig_bm);
3274 DeleteObject(dib);
3276 /* r6g6b6. */
3277 trace("r6g6b6\n");
3278 bmi->bmiHeader.biBitCount = 32;
3279 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3280 bit_fields[0] = 0x0003f000;
3281 bit_fields[1] = 0x00000fc0;
3282 bit_fields[2] = 0x0000003f;
3284 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3285 ok(dib != NULL, "ret NULL\n");
3286 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3287 ok(ds.dsBitfields[0] == 0x0003f000, "got %08lx\n", ds.dsBitfields[0]);
3288 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08lx\n", ds.dsBitfields[1]);
3289 ok(ds.dsBitfields[2] == 0x0000003f, "got %08lx\n", ds.dsBitfields[2]);
3290 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3292 orig_bm = SelectObject(mem_dc, dib);
3294 dst_format = "r6g6b6";
3295 current_sha1 = sha1_graphics_r6g6b6;
3296 draw_graphics(mem_dc, bmi, bits);
3297 draw_text(mem_dc, bmi, bits);
3299 SelectObject(mem_dc, orig_bm);
3300 DeleteObject(dib);
3302 /* 24 */
3303 trace("24\n");
3304 bmi->bmiHeader.biBitCount = 24;
3305 bmi->bmiHeader.biCompression = BI_RGB;
3307 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3308 ok(dib != NULL, "ret NULL\n");
3309 orig_bm = SelectObject(mem_dc, dib);
3311 dst_format = "24";
3312 current_sha1 = sha1_graphics_24;
3313 draw_graphics(mem_dc, bmi, bits);
3314 draw_text(mem_dc, bmi, bits);
3316 SelectObject(mem_dc, orig_bm);
3317 DeleteObject(dib);
3319 /* r5g5b5 */
3320 trace("555\n");
3321 bmi->bmiHeader.biBitCount = 16;
3322 bmi->bmiHeader.biCompression = BI_RGB;
3324 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3325 ok(dib != NULL, "ret NULL\n");
3326 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3327 ok(ds.dsBitfields[0] == 0x7c00, "got %08lx\n", ds.dsBitfields[0]);
3328 ok(ds.dsBitfields[1] == 0x03e0, "got %08lx\n", ds.dsBitfields[1]);
3329 ok(ds.dsBitfields[2] == 0x001f, "got %08lx\n", ds.dsBitfields[2]);
3330 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3332 orig_bm = SelectObject(mem_dc, dib);
3334 dst_format = "r5g5b5";
3335 current_sha1 = sha1_graphics_r5g5b5;
3336 draw_graphics(mem_dc, bmi, bits);
3337 draw_text(mem_dc, bmi, bits);
3339 SelectObject(mem_dc, orig_bm);
3340 DeleteObject(dib);
3342 /* r4g4b4 */
3343 trace("444\n");
3344 bmi->bmiHeader.biBitCount = 16;
3345 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3346 bit_fields[0] = 0x0f00;
3347 bit_fields[1] = 0x00f0;
3348 bit_fields[2] = 0x000f;
3349 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3350 ok(dib != NULL, "ret NULL\n");
3351 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3352 ok(ds.dsBitfields[0] == 0x0f00, "got %08lx\n", ds.dsBitfields[0]);
3353 ok(ds.dsBitfields[1] == 0x00f0, "got %08lx\n", ds.dsBitfields[1]);
3354 ok(ds.dsBitfields[2] == 0x000f, "got %08lx\n", ds.dsBitfields[2]);
3355 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %lx\n", ds.dsBmih.biCompression);
3357 orig_bm = SelectObject(mem_dc, dib);
3359 dst_format = "r4g4b4";
3360 current_sha1 = sha1_graphics_r4g4b4;
3361 draw_graphics(mem_dc, bmi, bits);
3362 draw_text(mem_dc, bmi, bits);
3364 SelectObject(mem_dc, orig_bm);
3365 DeleteObject(dib);
3367 /* 8 color */
3368 trace("8 color\n");
3369 bmi->bmiHeader.biBitCount = 8;
3370 bmi->bmiHeader.biCompression = BI_RGB;
3371 bmi->bmiHeader.biClrUsed = 236;
3372 for (i = 0; i < 236; i++)
3374 colors[i].rgbRed = (i & 0x07) << 5;
3375 colors[i].rgbGreen = (i & 0x38) << 2;
3376 colors[i].rgbBlue = i & 0xc0;
3378 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3379 ok(dib != NULL, "ret NULL\n");
3381 orig_bm = SelectObject(mem_dc, dib);
3383 dst_format = "8 color";
3384 current_sha1 = sha1_graphics_8_color;
3385 draw_graphics(mem_dc, bmi, bits);
3386 draw_text(mem_dc, bmi, bits);
3388 SelectObject(mem_dc, orig_bm);
3389 DeleteObject(dib);
3391 /* 8 grayscale */
3392 trace("8 grayscale\n");
3393 bmi->bmiHeader.biBitCount = 8;
3394 bmi->bmiHeader.biCompression = BI_RGB;
3395 bmi->bmiHeader.biClrUsed = 256;
3396 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3398 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3399 ok(dib != NULL, "ret NULL\n");
3401 orig_bm = SelectObject(mem_dc, dib);
3403 dst_format = "8 grayscale";
3404 current_sha1 = sha1_graphics_8_grayscale;
3405 draw_graphics(mem_dc, bmi, bits);
3406 draw_text(mem_dc, bmi, bits);
3408 SelectObject(mem_dc, orig_bm);
3409 DeleteObject(dib);
3411 /* 8 */
3412 trace("8\n");
3413 bmi->bmiHeader.biBitCount = 8;
3414 bmi->bmiHeader.biCompression = BI_RGB;
3415 bmi->bmiHeader.biClrUsed = 5;
3416 colors[0].rgbRed = 0xff;
3417 colors[0].rgbGreen = 0xff;
3418 colors[0].rgbBlue = 0xff;
3419 colors[1].rgbRed = 0;
3420 colors[1].rgbGreen = 0;
3421 colors[1].rgbBlue = 0;
3422 colors[2].rgbRed = 0xff;
3423 colors[2].rgbGreen = 0;
3424 colors[2].rgbBlue = 0;
3425 colors[3].rgbRed = 0;
3426 colors[3].rgbGreen = 0xff;
3427 colors[3].rgbBlue = 0;
3428 colors[4].rgbRed = 0;
3429 colors[4].rgbGreen = 0;
3430 colors[4].rgbBlue = 0xff;
3432 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3433 ok(dib != NULL, "ret NULL\n");
3435 orig_bm = SelectObject(mem_dc, dib);
3437 dst_format = "8";
3438 current_sha1 = sha1_graphics_8;
3439 draw_graphics(mem_dc, bmi, bits);
3440 draw_text(mem_dc, bmi, bits);
3442 SelectObject(mem_dc, orig_bm);
3443 DeleteObject(dib);
3445 /* 4 */
3446 trace("4\n");
3447 bmi->bmiHeader.biBitCount = 4;
3449 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3450 ok(dib != NULL, "ret NULL\n");
3452 orig_bm = SelectObject(mem_dc, dib);
3453 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3455 dst_format = "4";
3456 current_sha1 = sha1_graphics_4;
3457 draw_graphics(mem_dc, bmi, bits);
3458 draw_text(mem_dc, bmi, bits);
3460 SelectObject(mem_dc, orig_bm);
3461 DeleteObject(dib);
3463 /* 4 grayscale */
3464 trace("4 grayscale\n");
3465 bmi->bmiHeader.biClrUsed = 16;
3466 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3468 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3469 ok(dib != NULL, "ret NULL\n");
3471 orig_bm = SelectObject(mem_dc, dib);
3473 dst_format = "4 grayscale";
3474 current_sha1 = sha1_graphics_4_grayscale;
3475 draw_graphics(mem_dc, bmi, bits);
3476 draw_text(mem_dc, bmi, bits);
3478 SelectObject(mem_dc, orig_bm);
3479 DeleteObject(dib);
3481 /* 1 */
3482 trace("1\n");
3483 bmi->bmiHeader.biBitCount = 1;
3484 bmi->bmiHeader.biClrUsed = 2;
3486 colors[0].rgbRed = 0x00;
3487 colors[0].rgbGreen = 0x01;
3488 colors[0].rgbBlue = 0xff;
3489 colors[1].rgbRed = 0xff;
3490 colors[1].rgbGreen = 0x00;
3491 colors[1].rgbBlue = 0x00;
3493 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3494 ok(dib != NULL, "ret NULL\n");
3496 orig_bm = SelectObject(mem_dc, dib);
3497 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3499 dst_format = "1";
3500 current_sha1 = sha1_graphics_1;
3501 draw_graphics(mem_dc, bmi, bits);
3502 draw_text(mem_dc, bmi, bits);
3504 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3505 SelectObject(mem_dc, orig_bm);
3506 DeleteObject(dib);
3508 /* 1 ddb */
3509 trace("1 ddb\n");
3511 dib = CreateBitmap( 512, 512, 1, 1, NULL );
3512 ok(dib != NULL, "ret NULL\n");
3514 orig_bm = SelectObject(mem_dc, dib);
3516 dst_format = "1 ddb";
3517 current_sha1 = sha1_graphics_1_ddb;
3518 draw_graphics(mem_dc, bmi, NULL);
3520 SetTextColor( mem_dc, RGB(240,230,220) );
3521 SetBkColor( mem_dc, RGB(10,20,30) );
3522 dst_format = "1 ddb custom colors inverted";
3523 current_sha1 = sha1_graphics_1_ddb_inverted;
3524 draw_graphics(mem_dc, bmi, NULL);
3526 SelectObject(mem_dc, orig_bm);
3527 DeleteObject(dib);
3529 DeleteDC(mem_dc);
3532 START_TEST(dib)
3534 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3536 test_simple_graphics();
3538 CryptReleaseContext(crypt_prov, 0);