makefiles: Output rules for building generated .rc files.
[wine.git] / dlls / gdi32 / tests / dib.c
blobd16cb0df5c0e1dc959e6c5716912c8aab0a0bd5a
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 = HeapAlloc( GetProcessHeap(), 0, size );
1358 memset( ddb_bits, 0xcc, size );
1359 SetBitmapBits( GetCurrentObject(hdc, OBJ_BITMAP), size, ddb_bits );
1360 HeapFree( GetProcessHeap(), 0, 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 = HeapAlloc( GetProcessHeap(), 0, dib_size );
1381 GetBitmapBits( GetCurrentObject(hdc, OBJ_BITMAP), dib_size, ddb_bits );
1382 CryptHashData(hash, ddb_bits, dib_size, 0);
1383 HeapFree( GetProcessHeap(), 0, 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 = HeapAlloc(GetProcessHeap(), 0, 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 HeapFree(GetProcessHeap(), 0, 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 HeapFree(GetProcessHeap(), 0, 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 %x\n", rop3[i]);
1836 else
1838 ok(ret, "got FALSE for %x\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 %x\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 %x\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 %x\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 %x\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 %x\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 %x\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 %x\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 %x\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 %x\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 %08x and %08x\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 %08x and %08x\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 %08x and %08x\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 %08x and %08x\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 %08x and %08x\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 %08x and %08x\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 TEXTMETRICA tm;
3024 COLORREF text_color;
3026 for(i = 0; i < dib_size; i++)
3027 bits[i] = vals[i % 4];
3029 memset( &lf, 0, sizeof(lf) );
3030 strcpy( lf.lfFaceName, "Tahoma" );
3031 lf.lfHeight = 24;
3032 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
3034 font = CreateFontIndirectA( &lf );
3035 font = SelectObject( hdc, font );
3037 GetTextMetricsA( hdc, &tm );
3038 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
3040 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
3041 DeleteObject( SelectObject( hdc, font ) );
3042 return;
3045 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
3046 SetTextAlign( hdc, TA_BASELINE );
3047 SetBkMode( hdc, TRANSPARENT );
3048 origin.x = 10;
3049 origin.y = 100;
3051 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
3052 eto_hash = hash_dib( hdc, bmi, bits );
3054 for(i = 0; i < dib_size; i++)
3055 bits[i] = vals[i % 4];
3057 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
3059 text_color = GetTextColor( hdc );
3060 for (i = 0; i < strlen(str); i++)
3062 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
3064 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
3066 if (ret == GDI_ERROR) continue;
3068 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
3070 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
3071 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
3073 origin.x += gm.gmCellIncX;
3074 origin.y += gm.gmCellIncY;
3076 if (!ret) continue;
3078 if (aa)
3080 stride = (gm.gmBlackBoxX + 3) & ~3;
3082 for (y = 0; y < gm.gmBlackBoxY; y++)
3084 BYTE *g_ptr = g_buf + y * stride;
3085 COLORREF val;
3087 for (x = 0; x < gm.gmBlackBoxX; x++)
3089 if (g_ptr[x] <= 1) continue;
3090 if (g_ptr[x] >= 16) val = text_color;
3091 else
3093 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
3094 val = aa_colorref( val, text_color, g_ptr[x] );
3096 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
3100 else
3102 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
3104 for (y = 0; y < gm.gmBlackBoxY; y++)
3106 BYTE *g_ptr = g_buf + y * stride;
3107 for (x = 0; x < gm.gmBlackBoxX; x++)
3109 if (g_ptr[x / 8] & masks[x % 8])
3110 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
3116 diy_hash = hash_dib( hdc, bmi, bits );
3117 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
3119 HeapFree( GetProcessHeap(), 0, diy_hash );
3120 HeapFree( GetProcessHeap(), 0, eto_hash );
3122 font = SelectObject( hdc, font );
3123 DeleteObject( font );
3126 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
3128 draw_text_2( hdc, bmi, bits, FALSE );
3130 /* Rounding errors make these cases hard to test */
3131 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
3132 (bmi->bmiHeader.biBitCount == 16))
3133 return;
3135 draw_text_2( hdc, bmi, bits, TRUE );
3138 static void test_simple_graphics(void)
3140 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
3141 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
3142 RGBQUAD *colors = bmi->bmiColors;
3143 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
3144 HDC mem_dc;
3145 BYTE *bits;
3146 HBITMAP dib, orig_bm;
3147 DIBSECTION ds;
3148 HPALETTE default_palette, old_hpal;
3149 int i;
3151 mem_dc = CreateCompatibleDC(NULL);
3153 /* a8r8g8b8 */
3154 trace("8888\n");
3155 memset(bmi, 0, sizeof(bmibuf));
3156 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
3157 bmi->bmiHeader.biHeight = 512;
3158 bmi->bmiHeader.biWidth = 512;
3159 bmi->bmiHeader.biBitCount = 32;
3160 bmi->bmiHeader.biPlanes = 1;
3161 bmi->bmiHeader.biCompression = BI_RGB;
3163 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3164 ok(dib != NULL, "ret NULL\n");
3165 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3166 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
3167 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
3168 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
3169 ok(ds.dsBmih.biCompression == BI_RGB, "got %x\n", ds.dsBmih.biCompression);
3171 orig_bm = SelectObject(mem_dc, dib);
3173 default_palette = create_default_palette( 8 );
3174 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
3176 dst_format = "8888";
3177 current_sha1 = sha1_graphics_a8r8g8b8;
3178 draw_graphics(mem_dc, bmi, bits);
3179 draw_text(mem_dc, bmi, bits);
3181 SelectObject(mem_dc, orig_bm);
3182 DeleteObject(dib);
3184 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
3185 trace("8888 - bitfields\n");
3186 bmi->bmiHeader.biBitCount = 32;
3187 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3188 bit_fields[0] = 0xff0000;
3189 bit_fields[1] = 0x00ff00;
3190 bit_fields[2] = 0x0000ff;
3192 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3193 ok(dib != NULL, "ret NULL\n");
3194 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3195 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
3196 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3197 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
3198 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3200 orig_bm = SelectObject(mem_dc, dib);
3201 SelectPalette( mem_dc, default_palette, FALSE );
3203 dst_format = "8888 - bitfields";
3204 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
3205 draw_graphics(mem_dc, bmi, bits);
3206 draw_text(mem_dc, bmi, bits);
3208 SelectObject(mem_dc, orig_bm);
3209 DeleteObject(dib);
3211 /* a8b8g8r8. */
3212 trace("a8b8g8r8\n");
3213 bmi->bmiHeader.biBitCount = 32;
3214 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3215 bit_fields[0] = 0x0000ff;
3216 bit_fields[1] = 0x00ff00;
3217 bit_fields[2] = 0xff0000;
3219 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3220 ok(dib != NULL, "ret NULL\n");
3221 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3222 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
3223 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3224 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
3225 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3227 orig_bm = SelectObject(mem_dc, dib);
3229 dst_format = "a8b8g8r8";
3230 current_sha1 = sha1_graphics_a8b8g8r8;
3231 draw_graphics(mem_dc, bmi, bits);
3232 draw_text(mem_dc, bmi, bits);
3234 SelectObject(mem_dc, orig_bm);
3235 DeleteObject(dib);
3237 /* r10g10b10. */
3238 trace("r10g10b10\n");
3239 bmi->bmiHeader.biBitCount = 32;
3240 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3241 bit_fields[0] = 0x3ff00000;
3242 bit_fields[1] = 0x000ffc00;
3243 bit_fields[2] = 0x000003ff;
3245 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3246 ok(dib != NULL, "ret NULL\n");
3247 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3248 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3249 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3250 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3251 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3253 orig_bm = SelectObject(mem_dc, dib);
3255 dst_format = "r10g10b10";
3256 current_sha1 = sha1_graphics_r10g10b10;
3257 draw_graphics(mem_dc, bmi, bits);
3258 draw_text(mem_dc, bmi, bits);
3260 SelectObject(mem_dc, orig_bm);
3261 DeleteObject(dib);
3263 /* r6g6b6. */
3264 trace("r6g6b6\n");
3265 bmi->bmiHeader.biBitCount = 32;
3266 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3267 bit_fields[0] = 0x0003f000;
3268 bit_fields[1] = 0x00000fc0;
3269 bit_fields[2] = 0x0000003f;
3271 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3272 ok(dib != NULL, "ret NULL\n");
3273 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3274 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3275 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3276 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3277 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3279 orig_bm = SelectObject(mem_dc, dib);
3281 dst_format = "r6g6b6";
3282 current_sha1 = sha1_graphics_r6g6b6;
3283 draw_graphics(mem_dc, bmi, bits);
3284 draw_text(mem_dc, bmi, bits);
3286 SelectObject(mem_dc, orig_bm);
3287 DeleteObject(dib);
3289 /* 24 */
3290 trace("24\n");
3291 bmi->bmiHeader.biBitCount = 24;
3292 bmi->bmiHeader.biCompression = BI_RGB;
3294 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3295 ok(dib != NULL, "ret NULL\n");
3296 orig_bm = SelectObject(mem_dc, dib);
3298 dst_format = "24";
3299 current_sha1 = sha1_graphics_24;
3300 draw_graphics(mem_dc, bmi, bits);
3301 draw_text(mem_dc, bmi, bits);
3303 SelectObject(mem_dc, orig_bm);
3304 DeleteObject(dib);
3306 /* r5g5b5 */
3307 trace("555\n");
3308 bmi->bmiHeader.biBitCount = 16;
3309 bmi->bmiHeader.biCompression = BI_RGB;
3311 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3312 ok(dib != NULL, "ret NULL\n");
3313 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3314 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3315 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3316 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3317 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3319 orig_bm = SelectObject(mem_dc, dib);
3321 dst_format = "r5g5b5";
3322 current_sha1 = sha1_graphics_r5g5b5;
3323 draw_graphics(mem_dc, bmi, bits);
3324 draw_text(mem_dc, bmi, bits);
3326 SelectObject(mem_dc, orig_bm);
3327 DeleteObject(dib);
3329 /* r4g4b4 */
3330 trace("444\n");
3331 bmi->bmiHeader.biBitCount = 16;
3332 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3333 bit_fields[0] = 0x0f00;
3334 bit_fields[1] = 0x00f0;
3335 bit_fields[2] = 0x000f;
3336 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3337 ok(dib != NULL, "ret NULL\n");
3338 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3339 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3340 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3341 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3342 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3344 orig_bm = SelectObject(mem_dc, dib);
3346 dst_format = "r4g4b4";
3347 current_sha1 = sha1_graphics_r4g4b4;
3348 draw_graphics(mem_dc, bmi, bits);
3349 draw_text(mem_dc, bmi, bits);
3351 SelectObject(mem_dc, orig_bm);
3352 DeleteObject(dib);
3354 /* 8 color */
3355 trace("8 color\n");
3356 bmi->bmiHeader.biBitCount = 8;
3357 bmi->bmiHeader.biCompression = BI_RGB;
3358 bmi->bmiHeader.biClrUsed = 236;
3359 for (i = 0; i < 236; i++)
3361 colors[i].rgbRed = (i & 0x07) << 5;
3362 colors[i].rgbGreen = (i & 0x38) << 2;
3363 colors[i].rgbBlue = i & 0xc0;
3365 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3366 ok(dib != NULL, "ret NULL\n");
3368 orig_bm = SelectObject(mem_dc, dib);
3370 dst_format = "8 color";
3371 current_sha1 = sha1_graphics_8_color;
3372 draw_graphics(mem_dc, bmi, bits);
3373 draw_text(mem_dc, bmi, bits);
3375 SelectObject(mem_dc, orig_bm);
3376 DeleteObject(dib);
3378 /* 8 grayscale */
3379 trace("8 grayscale\n");
3380 bmi->bmiHeader.biBitCount = 8;
3381 bmi->bmiHeader.biCompression = BI_RGB;
3382 bmi->bmiHeader.biClrUsed = 256;
3383 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3385 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3386 ok(dib != NULL, "ret NULL\n");
3388 orig_bm = SelectObject(mem_dc, dib);
3390 dst_format = "8 grayscale";
3391 current_sha1 = sha1_graphics_8_grayscale;
3392 draw_graphics(mem_dc, bmi, bits);
3393 draw_text(mem_dc, bmi, bits);
3395 SelectObject(mem_dc, orig_bm);
3396 DeleteObject(dib);
3398 /* 8 */
3399 trace("8\n");
3400 bmi->bmiHeader.biBitCount = 8;
3401 bmi->bmiHeader.biCompression = BI_RGB;
3402 bmi->bmiHeader.biClrUsed = 5;
3403 colors[0].rgbRed = 0xff;
3404 colors[0].rgbGreen = 0xff;
3405 colors[0].rgbBlue = 0xff;
3406 colors[1].rgbRed = 0;
3407 colors[1].rgbGreen = 0;
3408 colors[1].rgbBlue = 0;
3409 colors[2].rgbRed = 0xff;
3410 colors[2].rgbGreen = 0;
3411 colors[2].rgbBlue = 0;
3412 colors[3].rgbRed = 0;
3413 colors[3].rgbGreen = 0xff;
3414 colors[3].rgbBlue = 0;
3415 colors[4].rgbRed = 0;
3416 colors[4].rgbGreen = 0;
3417 colors[4].rgbBlue = 0xff;
3419 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3420 ok(dib != NULL, "ret NULL\n");
3422 orig_bm = SelectObject(mem_dc, dib);
3424 dst_format = "8";
3425 current_sha1 = sha1_graphics_8;
3426 draw_graphics(mem_dc, bmi, bits);
3427 draw_text(mem_dc, bmi, bits);
3429 SelectObject(mem_dc, orig_bm);
3430 DeleteObject(dib);
3432 /* 4 */
3433 trace("4\n");
3434 bmi->bmiHeader.biBitCount = 4;
3436 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3437 ok(dib != NULL, "ret NULL\n");
3439 orig_bm = SelectObject(mem_dc, dib);
3440 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3442 dst_format = "4";
3443 current_sha1 = sha1_graphics_4;
3444 draw_graphics(mem_dc, bmi, bits);
3445 draw_text(mem_dc, bmi, bits);
3447 SelectObject(mem_dc, orig_bm);
3448 DeleteObject(dib);
3450 /* 4 grayscale */
3451 trace("4 grayscale\n");
3452 bmi->bmiHeader.biClrUsed = 16;
3453 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3455 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3456 ok(dib != NULL, "ret NULL\n");
3458 orig_bm = SelectObject(mem_dc, dib);
3460 dst_format = "4 grayscale";
3461 current_sha1 = sha1_graphics_4_grayscale;
3462 draw_graphics(mem_dc, bmi, bits);
3463 draw_text(mem_dc, bmi, bits);
3465 SelectObject(mem_dc, orig_bm);
3466 DeleteObject(dib);
3468 /* 1 */
3469 trace("1\n");
3470 bmi->bmiHeader.biBitCount = 1;
3471 bmi->bmiHeader.biClrUsed = 2;
3473 colors[0].rgbRed = 0x00;
3474 colors[0].rgbGreen = 0x01;
3475 colors[0].rgbBlue = 0xff;
3476 colors[1].rgbRed = 0xff;
3477 colors[1].rgbGreen = 0x00;
3478 colors[1].rgbBlue = 0x00;
3480 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3481 ok(dib != NULL, "ret NULL\n");
3483 orig_bm = SelectObject(mem_dc, dib);
3484 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3486 dst_format = "1";
3487 current_sha1 = sha1_graphics_1;
3488 draw_graphics(mem_dc, bmi, bits);
3489 draw_text(mem_dc, bmi, bits);
3491 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3492 SelectObject(mem_dc, orig_bm);
3493 DeleteObject(dib);
3495 /* 1 ddb */
3496 trace("1 ddb\n");
3498 dib = CreateBitmap( 512, 512, 1, 1, NULL );
3499 ok(dib != NULL, "ret NULL\n");
3501 orig_bm = SelectObject(mem_dc, dib);
3503 dst_format = "1 ddb";
3504 current_sha1 = sha1_graphics_1_ddb;
3505 draw_graphics(mem_dc, bmi, NULL);
3507 SetTextColor( mem_dc, RGB(240,230,220) );
3508 SetBkColor( mem_dc, RGB(10,20,30) );
3509 dst_format = "1 ddb custom colors inverted";
3510 current_sha1 = sha1_graphics_1_ddb_inverted;
3511 draw_graphics(mem_dc, bmi, NULL);
3513 SelectObject(mem_dc, orig_bm);
3514 DeleteObject(dib);
3516 DeleteDC(mem_dc);
3519 START_TEST(dib)
3521 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3523 test_simple_graphics();
3525 CryptReleaseContext(crypt_prov, 0);