gdi32/tests: Add a test case for DIB color painting.
[wine.git] / dlls / gdi32 / tests / dib.c
blob23d376d77385184b3ce5a3ec59f91eed241b88a8
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 RECT graphics_bounds[] =
1082 { 0, 0, 0, 0 },
1083 { 10, 3, 219, 101 },
1084 { 100, 100, 301, 301 },
1085 { 0, 0, 201, 201 },
1086 { 10, 10, 110, 320 },
1087 { 10, 99, 300, 200 },
1088 { 99, 12, 201, 200 },
1089 { 90, 110, 300, 200 },
1090 { 90, 90, 210, 200 },
1091 { 10, 99, 300, 200 },
1092 { 10, 99, 300, 200 },
1093 { 99, 12, 201, 200 },
1094 { 99, 11, 201, 200 },
1095 { 90, 110, 300, 200 },
1096 { 90, 110, 300, 200 },
1097 { 10, 10, 365, 405 },
1098 { 10, 10, 365, 405 },
1099 { 10, 10, 365, 405 },
1100 { 10, 10, 365, 405 },
1101 { 10, 10, 365, 405 },
1102 { 10, 10, 365, 405 },
1103 { 10, 10, 365, 405 },
1104 { 10, 10, 365, 405 },
1105 { 10, 10, 350, 251 },
1106 { 10, 10, 300, 200 },
1107 { 300, 10, 9, 260 },
1108 { 10, 10, 435, 405 },
1109 { 10, 10, 120, 120 },
1110 { 10, 10, 110, 110 },
1111 { 10, 10, 120, 110 },
1112 { 10, 10, 110, 120 },
1113 { 10, 10, 120, 120 },
1114 { 10, 10, 110, 110 },
1115 { 10, 10, 120, 110 },
1116 { 10, 10, 110, 120 },
1117 { 0, 4, 356, 356 },
1118 { 100, 100, 356, 356 },
1119 { 50, 50, 306, 306 },
1120 { 100, 100, 356, 356 },
1121 { 100, 100, 356, 356 },
1122 { 100, 100, 356, 356 },
1123 { 100, 100, 356, 356 },
1124 { 100, 100, 356, 356 },
1125 { 100, 100, 356, 356 },
1126 { 100, 100, 356, 356 },
1127 { 100, 100, 356, 356 },
1128 { 100, 100, 356, 356 },
1129 { 10, 10, 356, 356 },
1130 { 100, 100, 356, 356 },
1131 { 0, 0, 260, 39 },
1132 { 0, 0, 16, 16 },
1133 { 10, 10, 416, 26 },
1134 { 10, 8, 60, 104 },
1135 { 0, 0, 512, 512 },
1136 { 0, 10, 511, 306 },
1137 { 0, 0, 512, 336 },
1138 { 1, 1, 300, 512 },
1139 { 0, 0, 500, 512 },
1140 { 5, 5, 206, 206 },
1141 { 45, 45, 256, 256 },
1142 { 86, 86, 215, 215 },
1143 { 45, 45, 256, 256 },
1144 { 8, 0, 392, 231 },
1145 { 8, 0, 392, 231 },
1146 { 0, 0, 60, 20 },
1147 { 0, 0, 512, 512 },
1148 { -1, -1, -1, -1 } /* the end */
1151 static const char **current_sha1;
1152 static const RECT *current_bounds;
1153 static const char *dst_format;
1155 static inline DWORD get_stride(const BITMAPINFO *bmi)
1157 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1160 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1162 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1165 static char *hash_dib(const BITMAPINFO *bmi, const void *bits)
1167 DWORD dib_size = get_dib_size(bmi);
1168 HCRYPTHASH hash;
1169 char *buf;
1170 BYTE hash_buf[20];
1171 DWORD hash_size = sizeof(hash_buf);
1172 int i;
1173 static const char *hex = "0123456789abcdef";
1175 if(!crypt_prov) return NULL;
1177 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1179 CryptHashData(hash, bits, dib_size, 0);
1181 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1182 if(hash_size != sizeof(hash_buf)) return NULL;
1184 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1185 CryptDestroyHash(hash);
1187 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1189 for(i = 0; i < hash_size; i++)
1191 buf[i * 2] = hex[hash_buf[i] >> 4];
1192 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1194 buf[i * 2] = '\0';
1196 return buf;
1199 static void reset_bounds( HDC hdc )
1201 current_bounds = graphics_bounds;
1202 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
1205 static void compare_bounds( HDC hdc, const char *info )
1207 RECT rect;
1209 GetBoundsRect( hdc, &rect, DCB_RESET );
1211 if (current_bounds->left == -1 &&
1212 current_bounds->top == -1 &&
1213 current_bounds->right == -1 &&
1214 current_bounds->bottom == -1)
1216 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect ));
1217 return;
1220 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1221 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect ));
1222 current_bounds++;
1225 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1227 char *hash = hash_dib(bmi, bits);
1228 BOOL ok_cond;
1229 int i;
1231 /* reset the bits for the next test */
1232 memset( bits, 0xcc, get_dib_size(bmi) );
1234 if(!hash)
1236 skip("SHA1 hashing unavailable on this platform\n");
1237 return;
1240 for(i = 0; i <= num_broken; i++)
1242 if(current_sha1[i] == NULL)
1244 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1245 HeapFree(GetProcessHeap(), 0, hash);
1246 return;
1250 ok_cond = !strcmp(hash, *current_sha1);
1252 for(i = 1; i <= num_broken; i++)
1253 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1255 todo_wine_if(todo)
1256 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1257 dst_format, info, *current_sha1, hash );
1259 current_sha1 += num_broken + 1;
1261 HeapFree(GetProcessHeap(), 0, hash);
1263 compare_bounds( hdc, info );
1266 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1268 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1271 static const RECT bias_check[] =
1273 {100, 100, 200, 150},
1274 {100, 100, 150, 200},
1275 {100, 100, 50, 200},
1276 {100, 100, 0, 150},
1277 {100, 100, 0, 50},
1278 {100, 100, 50, 0},
1279 {100, 100, 150, 0},
1280 {100, 100, 200, 50}
1283 static const RECT hline_clips[] =
1285 {120, 120, 140, 120}, /* unclipped */
1286 {100, 122, 140, 122}, /* l edgecase */
1287 { 99, 124, 140, 124}, /* l edgecase clipped */
1288 {120, 126, 200, 126}, /* r edgecase */
1289 {120, 128, 201, 128}, /* r edgecase clipped */
1290 { 99, 130, 201, 130}, /* l and r clipped */
1291 {120, 100, 140, 100}, /* t edgecase */
1292 {120, 99, 140, 99}, /* t edgecase clipped */
1293 {120, 199, 140, 199}, /* b edgecase */
1294 {120, 200, 140, 200}, /* b edgecase clipped */
1295 {120, 132, 310, 132}, /* inside two clip rects */
1296 { 10, 134, 101, 134}, /* r end on l edgecase */
1297 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1298 {199, 138, 220, 138}, /* l end on r edgecase */
1299 {200, 140, 220, 140} /* l end on r edgecase clipped */
1302 static const RECT vline_clips[] =
1304 {120, 120, 120, 140}, /* unclipped */
1305 {100, 120, 100, 140}, /* l edgecase */
1306 { 99, 120, 99, 140}, /* l edgecase clipped */
1307 {199, 120, 199, 140}, /* r edgecase */
1308 {200, 120, 200, 140}, /* r edgecase clipped */
1309 {122, 99, 122, 201}, /* t and b clipped */
1310 {124, 100, 124, 140}, /* t edgecase */
1311 {126, 99, 126, 140}, /* t edgecase clipped */
1312 {128, 120, 128, 200}, /* b edgecase */
1313 {130, 120, 130, 201}, /* b edgecase clipped */
1314 {132, 12, 132, 140}, /* inside two clip rects */
1315 {134, 90, 134, 101}, /* b end on t edgecase */
1316 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1317 {138, 199, 138, 220}, /* t end on b edgecase */
1318 {140, 200, 140, 220} /* t end on b edgecase clipped */
1321 static const RECT line_clips[] =
1323 { 90, 110, 310, 120},
1324 { 90, 120, 295, 130},
1325 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1326 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1327 { 90, 132, 101, 137}, /* end pt just inside l edge */
1328 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1329 {199, 142, 210, 143} /* start pt just inside r edge */
1332 static const RECT wide_lines[] =
1334 {100, 10, 200, 10},
1335 {100, 21, 200, 21},
1336 {200, 40, 100, 40},
1337 {200, 61, 100, 61},
1338 { 10, 100, 10, 200},
1339 { 21, 100, 21, 200},
1340 { 40, 200, 40, 100},
1341 { 61, 200, 61, 100},
1344 static const POINT poly_lines[] =
1346 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1349 static const POINT polypoly_lines[] =
1351 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1354 static const DWORD polypoly_counts[] =
1356 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1359 static const RECT patblt_clips[] =
1361 {120, 120, 140, 126}, /* unclipped */
1362 {100, 130, 140, 136}, /* l edgecase */
1363 { 99, 140, 140, 146}, /* l edgecase clipped */
1364 {180, 130, 200, 136}, /* r edgecase */
1365 {180, 140, 201, 146}, /* r edgecase clipped */
1366 {120, 100, 130, 110}, /* t edgecase */
1367 {140, 99, 150, 110}, /* t edgecase clipped */
1368 {120, 180, 130, 200}, /* b edgecase */
1369 {140, 180, 150, 201}, /* b edgecase */
1370 {199, 150, 210, 156}, /* l edge on r edgecase */
1371 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1372 { 90, 150, 101, 156}, /* r edge on l edgecase */
1373 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1374 {160, 90, 166, 101}, /* b edge on t edgecase */
1375 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1376 {160, 199, 166, 210}, /* t edge on b edgecase */
1377 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1380 static const RECT rectangles[] =
1382 {10, 11, 100, 101},
1383 {250, 100, 350, 10},
1384 {120, 10, 120, 20}, /* zero width */
1385 {120, 10, 130, 10}, /* zero height */
1386 {120, 40, 121, 41}, /* 1 x 1 */
1387 {130, 50, 132, 52}, /* 2 x 2 */
1388 {140, 60, 143, 63}, /* 3 x 3 */
1389 {150, 70, 154, 74}, /* 4 x 4 */
1390 {120, 20, 121, 30}, /* width == 1 */
1391 {130, 20, 132, 30}, /* width == 2 */
1392 {140, 20, 143, 30}, /* width == 3 */
1393 {200, 20, 210, 21}, /* height == 1 */
1394 {200, 30, 210, 32}, /* height == 2 */
1395 {200, 40, 210, 43} /* height == 3 */
1398 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1399 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1400 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1401 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1402 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1403 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1405 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1406 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1407 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1408 0x00, 0x01 }; /* <eod> */
1410 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1411 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1412 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1413 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1415 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1416 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1418 static const RGBQUAD default_palette_1[2] =
1420 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1423 static const RGBQUAD default_palette_4[16] =
1425 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1426 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1427 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1428 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1431 static const RGBQUAD default_palette_8[256] =
1433 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1434 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1435 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1436 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1437 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1438 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1439 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1440 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1441 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1442 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1443 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1444 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1445 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1446 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1447 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1448 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1449 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1450 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1451 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1452 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1453 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1454 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1455 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1456 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1457 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1458 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1459 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1460 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1461 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1462 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1463 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1464 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1465 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1466 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1467 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1468 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1469 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1470 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1471 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1472 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1473 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1474 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1475 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1476 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1477 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1478 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1479 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1480 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1481 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1482 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1483 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1484 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1485 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1486 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1487 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1488 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1489 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1490 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1491 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1492 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1493 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1494 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1495 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1496 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1499 static HPALETTE create_default_palette( int bpp )
1501 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1502 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1503 PALETTEENTRY *entries = pal->palPalEntry;
1504 int i;
1506 pal->palVersion = 0x300;
1507 pal->palNumEntries = 1 << bpp;
1508 switch (bpp)
1510 case 1:
1511 for (i = 0; i < 2; i++)
1513 entries[i].peRed = default_palette_1[i].rgbRed;
1514 entries[i].peGreen = default_palette_1[i].rgbGreen;
1515 entries[i].peBlue = default_palette_1[i].rgbBlue;
1516 entries[i].peFlags = 0;
1518 break;
1519 case 4:
1520 for (i = 0; i < 16; i++)
1522 entries[i].peRed = default_palette_4[i].rgbRed;
1523 entries[i].peGreen = default_palette_4[i].rgbGreen;
1524 entries[i].peBlue = default_palette_4[i].rgbBlue;
1525 entries[i].peFlags = 0;
1527 break;
1528 case 8:
1529 for (i = 0; i < 256; i++)
1531 entries[i].peRed = default_palette_8[i].rgbRed;
1532 entries[i].peGreen = default_palette_8[i].rgbGreen;
1533 entries[i].peBlue = default_palette_8[i].rgbBlue;
1534 entries[i].peFlags = 0;
1536 break;
1538 return CreatePalette( pal );
1541 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1543 HBRUSH brush = CreateSolidBrush( color );
1544 brush = SelectObject( hdc, brush );
1545 PatBlt( hdc, x, y, width, height, PATCOPY );
1546 DeleteObject( SelectObject( hdc, brush ) );
1549 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1551 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1552 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1553 PALETTEENTRY *entries = pal->palPalEntry;
1554 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1555 LOGBRUSH log_brush;
1556 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1557 HBITMAP bmp;
1558 INT i, j, x, y, hatch_style;
1559 HDC src_dc;
1560 HRGN hrgn, hrgn2;
1561 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1562 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1563 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1564 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1565 RGBQUAD *brush_colors = brush_bi->bmiColors;
1566 BYTE *brush_bits, *src_bits;
1567 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1568 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1569 BLENDFUNCTION blend;
1570 COLORREF old_text, old_bkgnd;
1571 HPALETTE hpal, old_hpal;
1573 blend.BlendOp = AC_SRC_OVER;
1574 blend.BlendFlags = 0;
1576 reset_bounds( hdc );
1578 memset(bits, 0xcc, get_dib_size(bmi));
1579 compare_hash(hdc, bmi, bits, "empty");
1581 src_dc = CreateCompatibleDC( 0 );
1582 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1583 orig_pen = SelectObject(hdc, solid_pen);
1584 SetBrushOrgEx(hdc, 0, 0, NULL);
1586 /* horizontal and vertical lines */
1587 for(i = 1; i <= 16; i++)
1589 SetROP2(hdc, i);
1590 MoveToEx(hdc, 10, i * 3, NULL);
1591 LineTo(hdc, 100, i * 3); /* l -> r */
1592 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1593 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1594 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1595 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1596 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1597 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1599 compare_hash(hdc, bmi, bits, "h and v solid lines");
1601 /* diagonal lines */
1602 SetROP2(hdc, R2_COPYPEN);
1603 for(i = 0; i < 16; i++)
1605 double s = sin(M_PI * i / 8.0);
1606 double c = cos(M_PI * i / 8.0);
1608 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1609 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1611 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1613 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1615 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1616 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1618 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1620 /* solid brush PatBlt */
1621 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1622 orig_brush = SelectObject(hdc, solid_brush);
1624 for(i = 0, y = 10; i < 256; i++)
1626 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1628 if(rop_uses_src(rop3[i]))
1629 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1630 else
1632 ok(ret, "got FALSE for %x\n", rop3[i]);
1633 y += 20;
1637 compare_hash(hdc, bmi, bits, "solid patblt");
1639 /* clipped lines */
1640 hrgn = CreateRectRgn(10, 10, 200, 20);
1641 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1642 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1643 SetRectRgn(hrgn2, 290, 100, 300, 200);
1644 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1645 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1646 DeleteObject(hrgn2);
1648 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1650 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1651 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1653 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1655 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1657 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1658 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1660 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1662 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1664 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1665 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1667 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1669 /* clipped PatBlt */
1670 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1672 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1673 patblt_clips[i].right - patblt_clips[i].left,
1674 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1676 compare_hash(hdc, bmi, bits, "clipped patblt");
1678 /* clipped dashed lines */
1679 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1680 SelectObject(hdc, dashed_pen);
1681 SetBkMode(hdc, TRANSPARENT);
1682 SetBkColor(hdc, RGB(0, 0xff, 0));
1684 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1686 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1687 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1689 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1691 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1693 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1694 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1696 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1698 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1700 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1701 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1703 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1705 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1707 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1708 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1710 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1712 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1714 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1715 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1717 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1719 SetBkMode(hdc, OPAQUE);
1721 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1723 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1724 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1726 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1728 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1730 /* 8888 DIB pattern brush */
1732 brush_bi->bmiHeader = dib_brush_header_8888;
1733 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1734 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1735 brush_bits[2] = 0xff;
1736 brush_bits[6] = 0xff;
1737 brush_bits[14] = 0xff;
1738 brush_bits[65] = 0xff;
1739 brush_bits[69] = 0xff;
1740 brush_bits[72] = 0xff;
1742 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1744 SelectObject(hdc, dib_brush);
1745 SetBrushOrgEx(hdc, 1, 1, NULL);
1747 for(i = 0, y = 10; i < 256; i++)
1749 if(!rop_uses_src(rop3[i]))
1751 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1752 ok(ret, "got FALSE for %x\n", rop3[i]);
1753 y += 25;
1756 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 0, dib_is_1bpp);
1758 SelectObject(hdc, orig_brush);
1759 DeleteObject(dib_brush);
1761 /* 8888 bottom-up DIB pattern brush */
1763 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1765 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1767 SelectObject(hdc, dib_brush);
1769 /* This used to set the x origin to 100 as well, but
1770 there's a Windows bug for 24 bpp where the brush's x offset
1771 is incorrectly calculated for rops that involve both D and P */
1772 SetBrushOrgEx(hdc, 4, 100, NULL);
1774 for(i = 0, y = 10; i < 256; i++)
1776 if(!rop_uses_src(rop3[i]))
1778 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1779 ok(ret, "got FALSE for %x\n", rop3[i]);
1780 y += 25;
1783 compare_hash(hdc, bmi, bits, "bottom-up 8888 dib brush patblt");
1785 SelectObject(hdc, orig_brush);
1786 DeleteObject(dib_brush);
1788 /* 24 bpp dib pattern brush */
1790 brush_bi->bmiHeader = dib_brush_header_24;
1791 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1792 memset(brush_bits, 0, 16 * 16 * 3);
1793 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1794 brush_bits[49] = brush_bits[52] = 0xff;
1796 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1798 SelectObject(hdc, dib_brush);
1799 SetBrushOrgEx(hdc, 1, 1, NULL);
1801 for(i = 0, y = 10; i < 256; i++)
1803 if(!rop_uses_src(rop3[i]))
1805 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1806 ok(ret, "got FALSE for %x\n", rop3[i]);
1807 y += 25;
1810 compare_hash(hdc, bmi, bits, "top-down 24 bpp brush patblt");
1812 SelectObject(hdc, orig_brush);
1813 DeleteObject(dib_brush);
1815 /* 555 dib pattern brush */
1817 brush_bi->bmiHeader = dib_brush_header_555;
1818 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1819 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1820 brush_bits[0] = brush_bits[1] = 0xff;
1821 brush_bits[32] = brush_bits[34] = 0x7c;
1823 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1825 SelectObject(hdc, dib_brush);
1826 SetBrushOrgEx(hdc, 1, 1, NULL);
1828 for(i = 0, y = 10; i < 256; i++)
1830 if(!rop_uses_src(rop3[i]))
1832 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1833 ok(ret, "got FALSE for %x\n", rop3[i]);
1834 y += 25;
1837 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 0, dib_is_1bpp);
1839 SelectObject(hdc, orig_brush);
1840 DeleteObject(dib_brush);
1842 SetBrushOrgEx(hdc, 0, 0, NULL);
1844 /* 8 bpp dib pattern brush */
1846 brush_bi->bmiHeader = dib_brush_header_8;
1847 brush_bi->bmiHeader.biClrUsed = 3;
1848 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1849 brush_colors[0].rgbRed = 0xff;
1850 brush_colors[1].rgbRed = 0xff;
1851 brush_colors[1].rgbGreen = 0xff;
1852 brush_colors[1].rgbBlue = 0xff;
1854 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1855 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1856 brush_bits[0] = brush_bits[1] = 1;
1857 brush_bits[16] = brush_bits[17] = 2;
1858 brush_bits[32] = brush_bits[33] = 6;
1860 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1862 SelectObject(hdc, dib_brush);
1863 SetBrushOrgEx(hdc, 1, 1, NULL);
1865 for(i = 0, y = 10; i < 256; i++)
1867 if(!rop_uses_src(rop3[i]))
1869 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1870 ok(ret, "got FALSE for %x\n", rop3[i]);
1871 y += 25;
1874 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", 0, dib_is_1bpp);
1876 SelectObject(hdc, orig_brush);
1877 DeleteObject(dib_brush);
1879 /* 4 bpp dib pattern brush */
1881 brush_bi->bmiHeader = dib_brush_header_4;
1882 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1884 SelectObject(hdc, dib_brush);
1885 SetBrushOrgEx(hdc, 1, 1, NULL);
1887 for(i = 0, y = 10; i < 256; i++)
1889 if(!rop_uses_src(rop3[i]))
1891 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1892 ok(ret, "got FALSE for %x\n", rop3[i]);
1893 y += 25;
1896 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", 0, dib_is_1bpp);
1898 SelectObject(hdc, orig_brush);
1899 DeleteObject(dib_brush);
1901 /* 1 bpp dib pattern brush */
1903 brush_bi->bmiHeader = dib_brush_header_1;
1904 brush_bi->bmiHeader.biClrUsed = 2;
1905 memset(brush_bits, 0, 16 * 4);
1906 brush_bits[0] = 0xf0;
1907 brush_bits[4] = 0xf0;
1908 brush_bits[8] = 0xf0;
1910 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1911 SelectObject(hdc, dib_brush);
1912 for(i = 0, y = 10; i < 256; i++)
1914 if(!rop_uses_src(rop3[i]))
1916 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1917 ok(ret, "got FALSE for %x\n", rop3[i]);
1918 y += 25;
1922 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", 0, dib_is_1bpp);
1924 SelectObject(hdc, orig_brush);
1925 DeleteObject(dib_brush);
1927 /* 1 bpp ddb pattern brush */
1929 old_text = GetTextColor( hdc );
1930 old_bkgnd = GetBkColor( hdc );
1931 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1932 dib_brush = CreatePatternBrush( bmp );
1933 SelectObject(hdc, dib_brush);
1934 for(i = 0, y = 10; i < 256; i++)
1936 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1937 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1938 if(!rop_uses_src(rop3[i]))
1940 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1941 ok(ret, "got FALSE for %x\n", rop3[i]);
1942 y += 25;
1946 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", 0, dib_is_1bpp);
1948 DeleteObject(bmp);
1949 SelectObject(hdc, orig_brush);
1950 DeleteObject( dib_brush );
1951 SetBrushOrgEx(hdc, 0, 0, NULL);
1952 SetTextColor(hdc, old_text);
1953 SetBkColor(hdc, old_bkgnd);
1955 /* Rectangle */
1957 SelectObject(hdc, solid_pen);
1958 SelectObject(hdc, solid_brush);
1960 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1962 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1965 SelectObject(hdc, dashed_pen);
1966 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1968 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1971 compare_hash(hdc, bmi, bits, "rectangles");
1972 SelectObject(hdc, solid_pen);
1974 /* PaintRgn */
1976 PaintRgn(hdc, hrgn);
1977 compare_hash(hdc, bmi, bits, "PaintRgn");
1979 /* RTL rectangles */
1981 SetLayout(hdc, LAYOUT_RTL);
1982 PaintRgn(hdc, hrgn);
1983 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1984 Rectangle(hdc, 100, 250, 110, 260);
1985 compare_hash(hdc, bmi, bits, "rtl");
1986 SetLayout(hdc, LAYOUT_LTR);
1987 DeleteObject( hrgn );
1989 for(i = 0, y = 10; i < 256; i++)
1991 if(!rop_uses_src(rop3[i]))
1993 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1995 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1996 SelectObject(hdc, hatch_brush);
1997 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1998 ok(ret, "got FALSE for %x\n", rop3[i]);
1999 SelectObject(hdc, orig_brush);
2000 DeleteObject(hatch_brush);
2002 y += 25;
2006 compare_hash(hdc, bmi, bits, "hatch brushes");
2008 /* overlapping blits */
2010 orig_brush = SelectObject(hdc, solid_brush);
2012 Rectangle(hdc, 10, 10, 100, 100);
2013 Rectangle(hdc, 20, 15, 30, 40);
2014 Rectangle(hdc, 15, 15, 20, 20);
2015 Rectangle(hdc, 15, 20, 50, 45);
2016 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2017 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
2019 Rectangle(hdc, 10, 10, 100, 100);
2020 Rectangle(hdc, 20, 15, 30, 40);
2021 Rectangle(hdc, 15, 15, 20, 20);
2022 Rectangle(hdc, 15, 20, 50, 45);
2023 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2024 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2025 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
2026 else
2027 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2029 Rectangle(hdc, 10, 10, 100, 100);
2030 Rectangle(hdc, 20, 15, 30, 40);
2031 Rectangle(hdc, 15, 15, 20, 20);
2032 Rectangle(hdc, 15, 20, 50, 45);
2033 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2034 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2036 Rectangle(hdc, 10, 10, 100, 100);
2037 Rectangle(hdc, 20, 15, 30, 40);
2038 Rectangle(hdc, 15, 15, 20, 20);
2039 Rectangle(hdc, 15, 20, 50, 45);
2040 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2041 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2042 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2043 else
2044 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2046 Rectangle(hdc, 10, 10, 100, 100);
2047 Rectangle(hdc, 20, 15, 30, 40);
2048 Rectangle(hdc, 15, 15, 20, 20);
2049 Rectangle(hdc, 15, 20, 50, 45);
2050 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2051 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2053 Rectangle(hdc, 10, 10, 100, 100);
2054 Rectangle(hdc, 20, 15, 30, 40);
2055 Rectangle(hdc, 15, 15, 20, 20);
2056 Rectangle(hdc, 15, 20, 50, 45);
2057 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2058 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2060 Rectangle(hdc, 10, 10, 100, 100);
2061 Rectangle(hdc, 20, 15, 30, 40);
2062 Rectangle(hdc, 15, 15, 20, 20);
2063 Rectangle(hdc, 15, 20, 50, 45);
2064 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2065 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2066 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2067 else
2068 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2070 Rectangle(hdc, 10, 10, 100, 100);
2071 Rectangle(hdc, 20, 15, 30, 40);
2072 Rectangle(hdc, 15, 15, 20, 20);
2073 Rectangle(hdc, 15, 20, 50, 45);
2074 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2075 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2077 /* blitting with 32-bpp BI_RGB source */
2079 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2080 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2081 src_bi->bmiHeader.biHeight = 256;
2082 src_bi->bmiHeader.biWidth = 256;
2083 src_bi->bmiHeader.biBitCount = 32;
2084 src_bi->bmiHeader.biPlanes = 1;
2085 src_bi->bmiHeader.biCompression = BI_RGB;
2086 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2087 SelectObject( src_dc, bmp );
2088 for (y = 0; y < 256; y++)
2089 for (x = 0; x < 256; x++)
2091 BYTE a = (x + y) * 2;
2092 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2093 BYTE g = (BYTE)(x + y / 3) * a / 255;
2094 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2095 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2098 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2100 /* Interesting cases for 1-bpp dst */
2101 BitBlt( hdc, 1, 4, 2, 2, src_dc, 0, 0, SRCCOPY );
2102 BitBlt( hdc, 1, 8, 16, 2, src_dc, 0, 0, SRCCOPY );
2103 BitBlt( hdc, 1, 12, 15, 2, src_dc, 0, 0, SRCCOPY );
2104 BitBlt( hdc, 0, 16, 8, 2, src_dc, 0, 0, SRCCOPY );
2105 BitBlt( hdc, 0, 20, 9, 2, src_dc, 0, 0, SRCCOPY );
2106 BitBlt( hdc, 7, 24, 1, 2, src_dc, 0, 0, SRCCOPY );
2107 BitBlt( hdc, 7, 28, 2, 2, src_dc, 0, 0, SRCCOPY );
2108 BitBlt( hdc, 7, 32, 9, 2, src_dc, 0, 0, SRCCOPY );
2109 BitBlt( hdc, 7, 36, 10, 2, src_dc, 0, 0, SRCCOPY );
2110 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2112 blend.SourceConstantAlpha = 0xd0;
2113 blend.AlphaFormat = 0;
2114 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2115 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2117 blend.SourceConstantAlpha = 0xb0;
2118 blend.AlphaFormat = AC_SRC_ALPHA;
2119 GdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2120 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2122 /* blitting with 32-bpp r10g10b10 source */
2124 src_bi->bmiHeader.biBitCount = 32;
2125 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2126 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2127 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2128 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2129 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2130 SelectObject( src_dc, bmp );
2131 for (y = 0; y < 256; y++)
2132 for (x = 0; x < 256; x++)
2134 WORD r = (7 * x + 3 * y) % 1024;
2135 WORD g = (11 * x + y / 3) % 1024;
2136 WORD b = (x / 3 + 9 * y) % 1024;
2137 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2140 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2141 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2143 /* blitting with 32-bpp b6g6r6 source */
2145 src_bi->bmiHeader.biBitCount = 32;
2146 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2147 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2148 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2149 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2150 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2151 SelectObject( src_dc, bmp );
2152 for (y = 0; y < 256; y++)
2153 for (x = 0; x < 256; x++)
2155 BYTE r = (y + 2 * x) % 64;
2156 BYTE g = (x + y / 3) % 64;
2157 BYTE b = (x / 3 + 2 * y) % 64;
2158 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2161 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2162 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2164 /* blitting with 24-bpp source */
2166 src_bi->bmiHeader.biBitCount = 24;
2167 src_bi->bmiHeader.biCompression = BI_RGB;
2168 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2169 DeleteObject( SelectObject( src_dc, bmp ) );
2170 for (y = 0; y < 256; y++)
2171 for (x = 0; x < 256; x++)
2173 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2174 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2175 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2178 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2179 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2181 blend.SourceConstantAlpha = 0xe0;
2182 blend.AlphaFormat = 0;
2183 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2184 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2186 /* blitting with 16-bpp BI_RGB source */
2188 src_bi->bmiHeader.biBitCount = 16;
2189 src_bi->bmiHeader.biCompression = BI_RGB;
2190 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2191 DeleteObject( SelectObject( src_dc, bmp ) );
2192 for (y = 0; y < 256; y++)
2193 for (x = 0; x < 256; x++)
2194 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2196 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2197 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2199 /* blitting with 16-bpp b4g4r4 source */
2201 src_bi->bmiHeader.biBitCount = 16;
2202 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2203 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2204 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2205 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2206 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2207 DeleteObject( SelectObject( src_dc, bmp ) );
2208 for (y = 0; y < 256; y++)
2209 for (x = 0; x < 256; x++)
2210 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2212 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2213 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2215 /* blitting with 8-bpp source */
2217 src_bi->bmiHeader.biBitCount = 8;
2218 src_bi->bmiHeader.biCompression = BI_RGB;
2219 src_bi->bmiHeader.biClrUsed = 160;
2220 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2221 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2222 DeleteObject( SelectObject( src_dc, bmp ) );
2223 for (y = 0; y < 256; y++)
2224 for (x = 0; x < 256; x++)
2225 src_bits[y * 256 + x] = 3 * x + 5 * y;
2227 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2228 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2230 blend.SourceConstantAlpha = 0xd0;
2231 blend.AlphaFormat = 0;
2232 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2233 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2235 /* blitting with 4-bpp source */
2237 src_bi->bmiHeader.biBitCount = 4;
2238 src_bi->bmiHeader.biClrUsed = 12;
2239 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2240 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2241 DeleteObject( SelectObject( src_dc, bmp ) );
2242 for (y = 0; y < 256; y++)
2243 for (x = 0; x < 256; x += 2)
2244 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2246 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2247 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2249 /* blitting with 1-bpp source */
2251 src_bi->bmiHeader.biBitCount = 1;
2252 src_bi->bmiHeader.biClrUsed = 0;
2253 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2254 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2255 DeleteObject( SelectObject( src_dc, bmp ) );
2256 for (y = 0; y < 256; y++)
2257 for (x = 0; x < 256; x += 8)
2258 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2260 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2261 /* Some interesting src co-ords */
2262 BitBlt( hdc, 10, 10, 3, 10, src_dc, 0, 0, SRCCOPY );
2263 BitBlt( hdc, 20, 10, 3, 10, src_dc, 2, 0, SRCCOPY );
2264 BitBlt( hdc, 30, 10, 3, 10, src_dc, 5, 0, SRCCOPY );
2265 BitBlt( hdc, 40, 10, 3, 10, src_dc, 6, 0, SRCCOPY );
2266 BitBlt( hdc, 50, 10, 20, 10, src_dc, 6, 0, SRCCOPY );
2267 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2269 blend.SourceConstantAlpha = 0x90;
2270 blend.AlphaFormat = 0;
2271 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2272 compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2274 /* blitting with 1-bpp ddb source */
2276 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2277 DeleteObject( SelectObject( src_dc, bmp ) );
2279 old_text = GetTextColor( hdc );
2280 old_bkgnd = GetBkColor( hdc );
2281 for (i = 0; i < 256; i += 13)
2283 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2284 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2285 BitBlt( hdc, i, 0, 13, 13, src_dc, 0, 0, SRCCOPY );
2287 for (i = 0; i < 256; i += 13)
2289 SetTextColor(hdc, PALETTEINDEX( i ));
2290 SetBkColor(hdc, PALETTEINDEX( i + 3 ));
2291 BitBlt( hdc, i, 13, 13, 13, src_dc, 0, 0, SRCCOPY );
2293 for (i = 0; i < 256; i += 13)
2295 SetTextColor(hdc, DIBINDEX( i ));
2296 SetBkColor(hdc, DIBINDEX( i + 3 ));
2297 BitBlt( hdc, i, 26, 13, 13, src_dc, 0, 0, SRCCOPY );
2299 SetTextColor( hdc, old_text );
2300 SetBkColor( hdc, old_bkgnd );
2301 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp ddb SRCCOPY" );
2303 DeleteObject( bmp );
2305 /* blitting to 1-bpp ddb dest */
2307 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2308 DeleteObject( SelectObject( src_dc, bmp ) );
2310 for (y = 0; y < 16; y++)
2311 for (x = 0; x < 16; x++)
2312 SetPixel( hdc, x, y, RGB( 16 * x, 16 * y, 8 * (x + y)) );
2313 PatBlt( hdc, 15, 15, 1, 1, WHITENESS );
2314 /* source colors are ignored */
2315 SetTextColor( src_dc, 0xbeef );
2316 SetBkColor( src_dc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2317 /* destination text color is also ignored */
2318 SetTextColor( hdc, 0xbedead );
2320 i = 16;
2321 SetBkColor( hdc, 0xffffff );
2322 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2323 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2324 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2325 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2326 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2327 SetBkColor( hdc, 0 );
2328 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2329 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2330 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2331 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2332 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2333 SetBkColor( hdc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2334 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2335 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2336 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2337 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2338 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2339 SetBkColor( hdc, RGB( 16 * 13, 16 * 14, 8 * (13 + 14) ));
2340 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2341 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2342 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2343 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2344 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2345 SetBkColor( hdc, PALETTEINDEX( 1 ));
2346 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2347 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2348 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2349 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2350 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2351 SetBkColor( hdc, DIBINDEX( 2 ));
2352 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2353 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2354 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2355 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2356 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2357 SetTextColor( hdc, old_text );
2358 SetBkColor( hdc, old_bkgnd );
2359 compare_hash(hdc, bmi, bits, "BitBlt dst 1-bpp ddb");
2361 DeleteDC( src_dc );
2362 DeleteObject( bmp );
2364 /* RLE StretchDIBits */
2365 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2366 src_bi->bmiHeader.biWidth = 8;
2367 src_bi->bmiHeader.biHeight = 8;
2368 src_bi->bmiHeader.biPlanes = 1;
2369 src_bi->bmiHeader.biBitCount = 8;
2370 src_bi->bmiHeader.biCompression = BI_RLE8;
2371 src_bi->bmiHeader.biClrUsed = 0;
2372 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2374 for (i = 0; i < 256; i++)
2376 src_bi->bmiColors[i].rgbRed = i;
2377 src_bi->bmiColors[i].rgbGreen = i;
2378 src_bi->bmiColors[i].rgbBlue = i;
2379 src_bi->bmiColors[i].rgbReserved = 0;
2382 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2383 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2384 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2385 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2386 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2387 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2389 /* 32 bpp StretchDIBits */
2391 src_bi->bmiHeader.biWidth = 4;
2392 src_bi->bmiHeader.biHeight = 4;
2393 src_bi->bmiHeader.biPlanes = 1;
2394 src_bi->bmiHeader.biBitCount = 32;
2395 src_bi->bmiHeader.biCompression = BI_RGB;
2396 src_bi->bmiHeader.biClrUsed = 0;
2397 src_bi->bmiHeader.biSizeImage = 0;
2399 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2400 ok(ret == 4, "got %d\n", ret);
2401 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2402 ok(ret == 4, "got %d\n", ret);
2403 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2404 ok(ret == 4, "got %d\n", ret);
2405 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2406 ok(ret == 4, "got %d\n", ret);
2407 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2408 ok(ret == 4, "got %d\n", ret);
2409 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2410 ok(ret == 4, "got %d\n", ret);
2412 src_bi->bmiHeader.biHeight = -4;
2414 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2415 ok(ret == 4, "got %d\n", ret);
2416 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2417 ok(ret == -4, "got %d\n", ret);
2418 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2419 ok(ret == 4, "got %d\n", ret);
2420 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2421 ok(ret == -4, "got %d\n", ret);
2422 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2423 ok(ret == 4, "got %d\n", ret);
2424 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2425 ok(ret == -4, "got %d\n", ret);
2427 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2429 /* Solid colors */
2431 for (i = 0; i < 16; i++)
2433 for (j = 0; j < 16; j++)
2435 solid_patblt( hdc, 16 * j, 16 * i, 16, 16, RGB( i*16+j, i*16+j, i*16+j ));
2436 solid_patblt( hdc, 16 * j, 256 + 16 * i, 16, 16, RGB( 3*(i*16+j), i*16+j, i*16+j ));
2437 solid_patblt( hdc, 256 + 16 * j, 16 * i, 16, 16, RGB( i*16+j, 3*(i*16+j), i*16+j ));
2438 solid_patblt( hdc, 256 + 16 * j, 256 + 16 * i, 16, 16, RGB( i*16+j, i*16+j, 3*(i*16+j) ));
2441 compare_hash(hdc, bmi, bits, "color fills");
2443 for (i = 0; i < 256; i++)
2445 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2446 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2447 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2448 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2449 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2452 /* A few extra colors that are interesting in the 1bpp case */
2454 /* bk color */
2455 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2456 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2458 /* color 0 */
2459 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2460 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2462 /* color 1 */
2463 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2464 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2466 compare_hash(hdc, bmi, bits, "Colors");
2468 for (i = 0; i < 256; i++)
2470 COLORREF s, g;
2472 for (j = 0; j < 16; j++)
2474 SetROP2( hdc, (j + R2_COPYPEN - 1) % 16 + 1 ); /* Start with R2_COPYPEN */
2476 s = SetPixel( hdc, i * 2, j, DIBINDEX(i) );
2477 g = GetPixel( hdc, i * 2, 0 ); /* retrieve value set with R2_COPYPEN */
2478 ok( s == g, "got %08x and %08x\n", s, g );
2480 s = SetPixel( hdc, i * 2, 20 + j, PALETTEINDEX(i) );
2481 g = GetPixel( hdc, i * 2, 20 + 0 ); /* retrieve value set with R2_COPYPEN */
2482 ok( s == g, "got %08x and %08x\n", s, g );
2484 s = SetPixel( hdc, i * 2, 40 + j, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2485 g = GetPixel( hdc, i * 2, 40 + 0 ); /* retrieve value set with R2_COPYPEN */
2486 ok( s == g, "got %08x and %08x\n", s, g );
2488 s = SetPixel( hdc, i * 2, 60 + j, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2489 g = GetPixel( hdc, i * 2, 60 + 0 ); /* retrieve value set with R2_COPYPEN */
2490 ok( s == g, "got %08x and %08x\n", s, g );
2493 SetROP2( hdc, R2_COPYPEN );
2495 for (j = 0; j < 256; j++)
2497 s = SetPixel( hdc, i * 2, 80 + j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2498 g = GetPixel( hdc, i * 2, 80 + j );
2499 ok( s == g, "got %08x and %08x\n", s, g );
2501 s = SetPixel( hdc, i * 2 + 1, 80 + j, (j << 24) | i );
2502 g = GetPixel( hdc, i * 2 + 1, 80 + j );
2503 ok( s == g, "got %08x and %08x\n", s, g );
2507 compare_hash(hdc, bmi, bits, "SetPixel");
2509 /* gradients */
2512 TRIVERTEX vrect[] =
2514 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2515 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2516 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2517 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2519 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2521 TRIVERTEX vtri[] =
2523 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2524 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2525 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2527 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2528 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2529 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2531 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2532 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2533 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2535 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2536 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2537 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2539 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2540 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2541 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2543 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2544 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2545 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2547 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2548 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2549 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2551 GRADIENT_TRIANGLE tri[] =
2553 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2554 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2557 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2558 for (i = 0; i < 4; i++) vrect[i].y += 250;
2559 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2560 /* Wine's 8-bit dithering isn't identical to Windows */
2561 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) );
2563 GdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2564 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2565 GdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2566 /* Wine's 8-bit dithering isn't identical to Windows */
2567 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) );
2570 /* wide pen */
2572 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2573 SelectObject( hdc, wide_pen );
2575 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2577 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2578 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2581 compare_hash(hdc, bmi, bits, "wide pen" );
2583 SelectObject( hdc, orig_pen );
2584 DeleteObject( wide_pen );
2586 log_brush.lbStyle = BS_SOLID;
2587 log_brush.lbColor = RGB(0xff, 0, 0);
2588 log_brush.lbHatch = 0;
2590 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2591 9, &log_brush, 0, NULL );
2592 SelectObject( hdc, wide_pen );
2594 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2595 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2597 SelectObject( hdc, orig_pen );
2598 DeleteObject( wide_pen );
2600 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2601 16, &log_brush, 0, NULL );
2602 SelectObject( hdc, wide_pen );
2604 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2605 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2607 SelectObject( hdc, orig_pen );
2608 DeleteObject( wide_pen );
2610 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2611 9, &log_brush, 0, NULL );
2612 SelectObject( hdc, wide_pen );
2614 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2615 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2617 SelectObject( hdc, orig_pen );
2618 DeleteObject( wide_pen );
2620 /* brushed wide pen */
2622 old_text = GetTextColor( hdc );
2623 old_bkgnd = GetBkColor( hdc );
2624 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2625 log_brush.lbStyle = BS_PATTERN;
2626 log_brush.lbColor = 0;
2627 log_brush.lbHatch = (ULONG_PTR)bmp;
2628 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2629 12, &log_brush, 0, NULL );
2630 ok( wide_pen != 0, "failed to create pen\n" );
2631 SelectObject( hdc, wide_pen );
2632 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2634 for (i = 1; i < 20; i++)
2636 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2637 i, &log_brush, 0, NULL );
2638 ok( wide_pen != 0, "failed to create pen\n" );
2639 DeleteObject( SelectObject( hdc, wide_pen ));
2640 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2641 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2642 MoveToEx( hdc, 10 * i, 10, NULL );
2643 LineTo( hdc, 10 * i, 200 + i );
2644 LineTo( hdc, 20 * i, 200 + i );
2646 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 0, dib_is_1bpp );
2648 for (i = 1; i < 20; i++)
2650 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2651 i, &log_brush, 0, NULL );
2652 DeleteObject( SelectObject( hdc, wide_pen ));
2653 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2654 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2655 MoveToEx( hdc, 10 * i, 10, NULL );
2656 LineTo( hdc, 10 * i, 200 + i );
2657 LineTo( hdc, 20 * i, 200 + i );
2659 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 0, dib_is_1bpp );
2661 DeleteObject(bmp);
2662 SetTextColor(hdc, old_text);
2663 SetBkColor(hdc, old_bkgnd);
2664 SelectObject( hdc, orig_pen );
2666 /* PALETTEINDEX */
2668 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2669 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2670 SetTextColor( hdc, PALETTEINDEX(38) );
2671 SetBkColor( hdc, PALETTEINDEX(9) );
2672 SelectObject( hdc, solid_brush );
2673 SelectObject( hdc, solid_pen );
2675 pal->palVersion = 0x300;
2676 pal->palNumEntries = 40;
2677 for (i = 0; i < 80; i++)
2679 entries[i].peRed = i * 3;
2680 entries[i].peGreen = i * 7;
2681 entries[i].peBlue = 128 - i;
2682 entries[i].peFlags = 0;
2684 hpal = CreatePalette( pal );
2685 old_hpal = SelectPalette( hdc, hpal, FALSE );
2687 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2688 Rectangle( hdc, 0, 0, 10, 10 );
2689 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2690 Rectangle( hdc, 10, 0, 10, 10 );
2691 SelectObject( hdc, orig_brush );
2692 DeleteObject( solid_brush );
2694 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2695 DeleteObject( SelectObject( hdc, solid_brush ));
2696 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2697 SetPaletteEntries( hpal, 0, 40, entries );
2698 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2699 SelectObject( hdc, orig_brush );
2700 DeleteObject( solid_brush );
2702 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2703 dib_brush = CreatePatternBrush( bmp );
2704 SelectObject( hdc, dib_brush );
2705 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2706 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2707 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2708 DeleteObject( bmp );
2709 SelectObject( hdc, orig_brush );
2710 DeleteObject( dib_brush );
2712 SelectPalette( hdc, old_hpal, FALSE );
2713 DeleteObject( hpal );
2715 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 0, dib_is_1bpp );
2717 /* ExtFloodFill */
2719 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2720 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2721 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2722 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2723 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2725 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2726 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2727 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2728 DeleteObject( hrgn );
2730 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2731 SelectObject( hdc, solid_brush );
2733 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2734 ok (ret, "got ret %d\n", ret);
2735 compare_hash(hdc, bmi, bits, "flood fill" );
2737 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2739 ret = ExtFloodFill( hdc, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2740 ok (!ret, "got ret %d\n", ret);
2742 SelectObject(hdc, orig_brush);
2743 SelectObject(hdc, orig_pen);
2744 DeleteObject(solid_brush);
2745 DeleteObject(wide_pen);
2746 DeleteObject(dashed_pen);
2747 DeleteObject(solid_pen);
2750 static const BYTE ramp[17] =
2752 0, 0x4d, 0x68, 0x7c,
2753 0x8c, 0x9a, 0xa7, 0xb2,
2754 0xbd, 0xc7, 0xd0, 0xd9,
2755 0xe1, 0xe9, 0xf0, 0xf8,
2756 0xff
2759 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2761 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2762 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2765 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2767 BYTE min_comp, max_comp;
2769 if (alpha == 16) return text;
2770 if (alpha <= 1) return dst;
2771 if (text == dst) return dst;
2773 get_range( alpha, text, &min_comp, &max_comp );
2775 if (dst > text)
2777 DWORD diff = dst - text;
2778 DWORD range = max_comp - text;
2779 dst = text + (diff * range ) / (0xff - text);
2780 return dst;
2782 else
2784 DWORD diff = text - dst;
2785 DWORD range = text - min_comp ;
2786 dst = text - (diff * range) / text;
2787 return dst;
2791 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2793 COLORREF ret;
2795 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2796 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2797 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2798 return ret;
2801 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2803 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2805 DWORD dib_size = get_dib_size(bmi), ret;
2806 LOGFONTA lf;
2807 HFONT font;
2808 GLYPHMETRICS gm;
2809 BYTE g_buf[10000];
2810 int i, stride, x, y;
2811 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2812 char *eto_hash = NULL, *diy_hash = NULL;
2813 static const char str[] = "Hello Wine";
2814 POINT origin, g_org;
2815 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2816 TEXTMETRICA tm;
2817 COLORREF text_color;
2819 for(i = 0; i < dib_size; i++)
2820 bits[i] = vals[i % 4];
2822 memset( &lf, 0, sizeof(lf) );
2823 strcpy( lf.lfFaceName, "Tahoma" );
2824 lf.lfHeight = 24;
2825 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2827 font = CreateFontIndirectA( &lf );
2828 font = SelectObject( hdc, font );
2830 GetTextMetricsA( hdc, &tm );
2831 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2833 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2834 DeleteObject( SelectObject( hdc, font ) );
2835 return;
2838 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2839 SetTextAlign( hdc, TA_BASELINE );
2840 SetBkMode( hdc, TRANSPARENT );
2841 origin.x = 10;
2842 origin.y = 100;
2844 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2845 eto_hash = hash_dib( bmi, bits );
2847 for(i = 0; i < dib_size; i++)
2848 bits[i] = vals[i % 4];
2850 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2852 text_color = GetTextColor( hdc );
2853 for (i = 0; i < strlen(str); i++)
2855 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2857 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2859 if (ret == GDI_ERROR) continue;
2861 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2863 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2864 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2866 origin.x += gm.gmCellIncX;
2867 origin.y += gm.gmCellIncY;
2869 if (!ret) continue;
2871 if (aa)
2873 stride = (gm.gmBlackBoxX + 3) & ~3;
2875 for (y = 0; y < gm.gmBlackBoxY; y++)
2877 BYTE *g_ptr = g_buf + y * stride;
2878 COLORREF val;
2880 for (x = 0; x < gm.gmBlackBoxX; x++)
2882 if (g_ptr[x] <= 1) continue;
2883 if (g_ptr[x] >= 16) val = text_color;
2884 else
2886 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2887 val = aa_colorref( val, text_color, g_ptr[x] );
2889 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2893 else
2895 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2897 for (y = 0; y < gm.gmBlackBoxY; y++)
2899 BYTE *g_ptr = g_buf + y * stride;
2900 for (x = 0; x < gm.gmBlackBoxX; x++)
2902 if (g_ptr[x / 8] & masks[x % 8])
2903 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2909 diy_hash = hash_dib( bmi, bits );
2910 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2912 HeapFree( GetProcessHeap(), 0, diy_hash );
2913 HeapFree( GetProcessHeap(), 0, eto_hash );
2915 font = SelectObject( hdc, font );
2916 DeleteObject( font );
2919 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
2921 draw_text_2( hdc, bmi, bits, FALSE );
2923 /* Rounding errors make these cases hard to test */
2924 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2925 (bmi->bmiHeader.biBitCount == 16))
2926 return;
2928 draw_text_2( hdc, bmi, bits, TRUE );
2931 static void test_simple_graphics(void)
2933 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2934 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2935 RGBQUAD *colors = bmi->bmiColors;
2936 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2937 HDC mem_dc;
2938 BYTE *bits;
2939 HBITMAP dib, orig_bm;
2940 DIBSECTION ds;
2941 HPALETTE default_palette, old_hpal;
2942 int i;
2944 mem_dc = CreateCompatibleDC(NULL);
2946 /* a8r8g8b8 */
2947 trace("8888\n");
2948 memset(bmi, 0, sizeof(bmibuf));
2949 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2950 bmi->bmiHeader.biHeight = 512;
2951 bmi->bmiHeader.biWidth = 512;
2952 bmi->bmiHeader.biBitCount = 32;
2953 bmi->bmiHeader.biPlanes = 1;
2954 bmi->bmiHeader.biCompression = BI_RGB;
2956 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2957 ok(dib != NULL, "ret NULL\n");
2958 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2959 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2960 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2961 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2962 ok(ds.dsBmih.biCompression == BI_RGB, "got %x\n", ds.dsBmih.biCompression);
2964 orig_bm = SelectObject(mem_dc, dib);
2966 default_palette = create_default_palette( 8 );
2967 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
2969 dst_format = "8888";
2970 current_sha1 = sha1_graphics_a8r8g8b8;
2971 draw_graphics(mem_dc, bmi, bits);
2972 draw_text(mem_dc, bmi, bits);
2974 SelectObject(mem_dc, orig_bm);
2975 DeleteObject(dib);
2977 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2978 trace("8888 - bitfields\n");
2979 bmi->bmiHeader.biBitCount = 32;
2980 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2981 bit_fields[0] = 0xff0000;
2982 bit_fields[1] = 0x00ff00;
2983 bit_fields[2] = 0x0000ff;
2985 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2986 ok(dib != NULL, "ret NULL\n");
2987 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2988 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2989 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2990 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2991 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2993 orig_bm = SelectObject(mem_dc, dib);
2994 SelectPalette( mem_dc, default_palette, FALSE );
2996 dst_format = "8888 - bitfields";
2997 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
2998 draw_graphics(mem_dc, bmi, bits);
2999 draw_text(mem_dc, bmi, bits);
3001 SelectObject(mem_dc, orig_bm);
3002 DeleteObject(dib);
3004 /* a8b8g8r8. */
3005 trace("a8b8g8r8\n");
3006 bmi->bmiHeader.biBitCount = 32;
3007 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3008 bit_fields[0] = 0x0000ff;
3009 bit_fields[1] = 0x00ff00;
3010 bit_fields[2] = 0xff0000;
3012 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3013 ok(dib != NULL, "ret NULL\n");
3014 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3015 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
3016 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3017 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
3018 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3020 orig_bm = SelectObject(mem_dc, dib);
3022 dst_format = "a8b8g8r8";
3023 current_sha1 = sha1_graphics_a8b8g8r8;
3024 draw_graphics(mem_dc, bmi, bits);
3025 draw_text(mem_dc, bmi, bits);
3027 SelectObject(mem_dc, orig_bm);
3028 DeleteObject(dib);
3030 /* r10g10b10. */
3031 trace("r10g10b10\n");
3032 bmi->bmiHeader.biBitCount = 32;
3033 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3034 bit_fields[0] = 0x3ff00000;
3035 bit_fields[1] = 0x000ffc00;
3036 bit_fields[2] = 0x000003ff;
3038 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3039 ok(dib != NULL, "ret NULL\n");
3040 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3041 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3042 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3043 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3044 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3046 orig_bm = SelectObject(mem_dc, dib);
3048 dst_format = "r10g10b10";
3049 current_sha1 = sha1_graphics_r10g10b10;
3050 draw_graphics(mem_dc, bmi, bits);
3051 draw_text(mem_dc, bmi, bits);
3053 SelectObject(mem_dc, orig_bm);
3054 DeleteObject(dib);
3056 /* r6g6b6. */
3057 trace("r6g6b6\n");
3058 bmi->bmiHeader.biBitCount = 32;
3059 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3060 bit_fields[0] = 0x0003f000;
3061 bit_fields[1] = 0x00000fc0;
3062 bit_fields[2] = 0x0000003f;
3064 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3065 ok(dib != NULL, "ret NULL\n");
3066 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3067 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3068 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3069 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3070 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3072 orig_bm = SelectObject(mem_dc, dib);
3074 dst_format = "r6g6b6";
3075 current_sha1 = sha1_graphics_r6g6b6;
3076 draw_graphics(mem_dc, bmi, bits);
3077 draw_text(mem_dc, bmi, bits);
3079 SelectObject(mem_dc, orig_bm);
3080 DeleteObject(dib);
3082 /* 24 */
3083 trace("24\n");
3084 bmi->bmiHeader.biBitCount = 24;
3085 bmi->bmiHeader.biCompression = BI_RGB;
3087 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3088 ok(dib != NULL, "ret NULL\n");
3089 orig_bm = SelectObject(mem_dc, dib);
3091 dst_format = "24";
3092 current_sha1 = sha1_graphics_24;
3093 draw_graphics(mem_dc, bmi, bits);
3094 draw_text(mem_dc, bmi, bits);
3096 SelectObject(mem_dc, orig_bm);
3097 DeleteObject(dib);
3099 /* r5g5b5 */
3100 trace("555\n");
3101 bmi->bmiHeader.biBitCount = 16;
3102 bmi->bmiHeader.biCompression = BI_RGB;
3104 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3105 ok(dib != NULL, "ret NULL\n");
3106 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3107 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3108 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3109 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3110 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3112 orig_bm = SelectObject(mem_dc, dib);
3114 dst_format = "r5g5b5";
3115 current_sha1 = sha1_graphics_r5g5b5;
3116 draw_graphics(mem_dc, bmi, bits);
3117 draw_text(mem_dc, bmi, bits);
3119 SelectObject(mem_dc, orig_bm);
3120 DeleteObject(dib);
3122 /* r4g4b4 */
3123 trace("444\n");
3124 bmi->bmiHeader.biBitCount = 16;
3125 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3126 bit_fields[0] = 0x0f00;
3127 bit_fields[1] = 0x00f0;
3128 bit_fields[2] = 0x000f;
3129 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3130 ok(dib != NULL, "ret NULL\n");
3131 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3132 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3133 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3134 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3135 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3137 orig_bm = SelectObject(mem_dc, dib);
3139 dst_format = "r4g4b4";
3140 current_sha1 = sha1_graphics_r4g4b4;
3141 draw_graphics(mem_dc, bmi, bits);
3142 draw_text(mem_dc, bmi, bits);
3144 SelectObject(mem_dc, orig_bm);
3145 DeleteObject(dib);
3147 /* 8 color */
3148 trace("8 color\n");
3149 bmi->bmiHeader.biBitCount = 8;
3150 bmi->bmiHeader.biCompression = BI_RGB;
3151 bmi->bmiHeader.biClrUsed = 236;
3152 for (i = 0; i < 236; i++)
3154 colors[i].rgbRed = (i & 0x07) << 5;
3155 colors[i].rgbGreen = (i & 0x38) << 2;
3156 colors[i].rgbBlue = i & 0xc0;
3158 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3159 ok(dib != NULL, "ret NULL\n");
3161 orig_bm = SelectObject(mem_dc, dib);
3163 dst_format = "8 color";
3164 current_sha1 = sha1_graphics_8_color;
3165 draw_graphics(mem_dc, bmi, bits);
3166 draw_text(mem_dc, bmi, bits);
3168 SelectObject(mem_dc, orig_bm);
3169 DeleteObject(dib);
3171 /* 8 grayscale */
3172 trace("8 grayscale\n");
3173 bmi->bmiHeader.biBitCount = 8;
3174 bmi->bmiHeader.biCompression = BI_RGB;
3175 bmi->bmiHeader.biClrUsed = 256;
3176 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3178 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3179 ok(dib != NULL, "ret NULL\n");
3181 orig_bm = SelectObject(mem_dc, dib);
3183 dst_format = "8 grayscale";
3184 current_sha1 = sha1_graphics_8_grayscale;
3185 draw_graphics(mem_dc, bmi, bits);
3186 draw_text(mem_dc, bmi, bits);
3188 SelectObject(mem_dc, orig_bm);
3189 DeleteObject(dib);
3191 /* 8 */
3192 trace("8\n");
3193 bmi->bmiHeader.biBitCount = 8;
3194 bmi->bmiHeader.biCompression = BI_RGB;
3195 bmi->bmiHeader.biClrUsed = 5;
3196 colors[0].rgbRed = 0xff;
3197 colors[0].rgbGreen = 0xff;
3198 colors[0].rgbBlue = 0xff;
3199 colors[1].rgbRed = 0;
3200 colors[1].rgbGreen = 0;
3201 colors[1].rgbBlue = 0;
3202 colors[2].rgbRed = 0xff;
3203 colors[2].rgbGreen = 0;
3204 colors[2].rgbBlue = 0;
3205 colors[3].rgbRed = 0;
3206 colors[3].rgbGreen = 0xff;
3207 colors[3].rgbBlue = 0;
3208 colors[4].rgbRed = 0;
3209 colors[4].rgbGreen = 0;
3210 colors[4].rgbBlue = 0xff;
3212 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3213 ok(dib != NULL, "ret NULL\n");
3215 orig_bm = SelectObject(mem_dc, dib);
3217 dst_format = "8";
3218 current_sha1 = sha1_graphics_8;
3219 draw_graphics(mem_dc, bmi, bits);
3220 draw_text(mem_dc, bmi, bits);
3222 SelectObject(mem_dc, orig_bm);
3223 DeleteObject(dib);
3225 /* 4 */
3226 trace("4\n");
3227 bmi->bmiHeader.biBitCount = 4;
3229 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3230 ok(dib != NULL, "ret NULL\n");
3232 orig_bm = SelectObject(mem_dc, dib);
3233 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3235 dst_format = "4";
3236 current_sha1 = sha1_graphics_4;
3237 draw_graphics(mem_dc, bmi, bits);
3238 draw_text(mem_dc, bmi, bits);
3240 SelectObject(mem_dc, orig_bm);
3241 DeleteObject(dib);
3243 /* 4 grayscale */
3244 trace("4 grayscale\n");
3245 bmi->bmiHeader.biClrUsed = 16;
3246 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3248 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3249 ok(dib != NULL, "ret NULL\n");
3251 orig_bm = SelectObject(mem_dc, dib);
3253 dst_format = "4 grayscale";
3254 current_sha1 = sha1_graphics_4_grayscale;
3255 draw_graphics(mem_dc, bmi, bits);
3256 draw_text(mem_dc, bmi, bits);
3258 SelectObject(mem_dc, orig_bm);
3259 DeleteObject(dib);
3261 /* 1 */
3262 trace("1\n");
3263 bmi->bmiHeader.biBitCount = 1;
3264 bmi->bmiHeader.biClrUsed = 2;
3266 colors[0].rgbRed = 0x00;
3267 colors[0].rgbGreen = 0x01;
3268 colors[0].rgbBlue = 0xff;
3269 colors[1].rgbRed = 0xff;
3270 colors[1].rgbGreen = 0x00;
3271 colors[1].rgbBlue = 0x00;
3273 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3274 ok(dib != NULL, "ret NULL\n");
3276 orig_bm = SelectObject(mem_dc, dib);
3277 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3279 dst_format = "1";
3280 current_sha1 = sha1_graphics_1;
3281 draw_graphics(mem_dc, bmi, bits);
3282 draw_text(mem_dc, bmi, bits);
3284 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3285 SelectObject(mem_dc, orig_bm);
3286 DeleteObject(dib);
3288 DeleteDC(mem_dc);
3291 START_TEST(dib)
3293 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3295 test_simple_graphics();
3297 CryptReleaseContext(crypt_prov, 0);