shell32: Added a stub for IShellDispatch2.
[wine/multimedia.git] / dlls / gdi32 / tests / dib.c
blob084617566405bd3168d2f81858a9fe202f4f3dcd
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;
35 static BOOL (WINAPI *pGdiAlphaBlend)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
36 static BOOL (WINAPI *pGdiGradientFill)(HDC,TRIVERTEX*,ULONG,void*,ULONG,ULONG);
37 static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
39 static const DWORD rop3[256] =
41 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
42 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
43 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
44 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
45 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
46 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
47 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
48 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
49 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
50 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
51 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
52 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
53 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
54 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
55 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
56 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
57 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
58 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
59 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
60 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
61 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
62 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
63 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
64 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
65 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
66 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
67 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
68 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
69 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
70 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
71 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
72 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
75 static inline BOOL rop_uses_src(DWORD rop)
77 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
80 static const char *sha1_graphics_a8r8g8b8[] =
82 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
83 "2426172d9e8fec27d9228088f382ef3c93717da9",
84 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
85 "664fac17803859a4015c6ae29e5538e314d5c827",
86 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
87 "fe6cc678fb13a3ead67839481bf22348adc69f52",
88 "d51bd330cec510cdccf5394328bd8e5411901e9e",
89 "df4aebf98d91f11be560dd232123b3ae327303d7",
90 "f2af53dd073a09b1031d0032d28da35c82adc566",
91 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
92 "c387917268455017aa0b28bed73aa6554044bbb3",
93 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
94 "6c530622a025d872a642e8f950867884d7b136cb",
95 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
96 "b2261353decda2712b83538ab434a49ce21f3172",
97 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
98 "9b9874c1c1d92afa554137e191d34ea33acc322f",
99 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
100 "d7398de15b2837a58a62a701ca1b3384625afec4",
101 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
102 "5246ef357e7317b9d141a3294d300c195da76cb7",
103 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
104 "3d8244b665ecdb104087bad171b0b0f83545133c",
105 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
106 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
107 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
108 "e358efb1c11172e40855de620bdb8a8e545cd790",
109 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
110 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
111 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
112 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
113 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
114 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
115 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
116 "94645300d6eb51020a7ef8261dee2941cd51b5df",
117 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
118 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
119 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
120 "68c18db6abfda626cab12d198298d4c39264bfbc",
121 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
122 "39c31de73aafcfcadf0bf414da4495be9de54417",
123 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
124 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
125 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
126 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
127 "3d2ccbe51408232a04769546b1bdd74f84558a41",
128 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
129 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
130 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
131 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
132 "d7dd4700f49808541bba99244b7eb5840e0a2439",
133 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
134 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
135 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
136 "a1fde1094d2c19ddb20871842dae1da73618709e",
137 "e462052a03dbe4ec3814db7700e166d00d4d686f",
138 "a27917d4db49ce77989fae246015aeb2a28520ee",
139 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
140 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
141 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
142 "2b3198bd5c0a87db5dab13df8bbe14363d02acec",
143 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
144 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
145 "f451a05f699ac3bbe155d059e7871a2636887b5f",
146 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
147 "dccaef62738ff90da4554a85d8cb846d6436799e",
148 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
149 NULL
152 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
154 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
155 "2426172d9e8fec27d9228088f382ef3c93717da9",
156 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
157 "664fac17803859a4015c6ae29e5538e314d5c827",
158 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
159 "fe6cc678fb13a3ead67839481bf22348adc69f52",
160 "d51bd330cec510cdccf5394328bd8e5411901e9e",
161 "df4aebf98d91f11be560dd232123b3ae327303d7",
162 "f2af53dd073a09b1031d0032d28da35c82adc566",
163 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
164 "c387917268455017aa0b28bed73aa6554044bbb3",
165 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
166 "6c530622a025d872a642e8f950867884d7b136cb",
167 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
168 "b2261353decda2712b83538ab434a49ce21f3172",
169 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
170 "9b9874c1c1d92afa554137e191d34ea33acc322f",
171 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
172 "d7398de15b2837a58a62a701ca1b3384625afec4",
173 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
174 "5246ef357e7317b9d141a3294d300c195da76cb7",
175 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
176 "3d8244b665ecdb104087bad171b0b0f83545133c",
177 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
178 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
179 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
180 "e358efb1c11172e40855de620bdb8a8e545cd790",
181 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
182 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
183 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
184 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
185 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
186 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
187 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
188 "94645300d6eb51020a7ef8261dee2941cd51b5df",
189 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
190 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
191 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
192 "68c18db6abfda626cab12d198298d4c39264bfbc",
193 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
194 "39c31de73aafcfcadf0bf414da4495be9de54417",
195 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
196 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
197 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
198 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
199 "3d2ccbe51408232a04769546b1bdd74f84558a41",
200 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
201 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
202 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
203 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
204 "d7dd4700f49808541bba99244b7eb5840e0a2439",
205 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
206 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
207 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
208 "a1fde1094d2c19ddb20871842dae1da73618709e",
209 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
210 "b2c8e1ebb9435031fe068442f479d1304096e79f",
211 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
212 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
213 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
214 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
215 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
216 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
217 "f451a05f699ac3bbe155d059e7871a2636887b5f",
218 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
219 "dccaef62738ff90da4554a85d8cb846d6436799e",
220 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
221 NULL
224 static const char *sha1_graphics_a8b8g8r8[] =
226 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
227 "e0bc877697093ed440e125154e247ca9d65e933c",
228 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
229 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
230 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
231 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
232 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
233 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
234 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
235 "b753ebb39d90210cc717f57b53dd439f7de6b077",
236 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
237 "94368cea5033b435454daa56d55546310675131e",
238 "bf57a6a37fb107d29ed3d45695919887abcb7902",
239 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
240 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
241 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
242 "b0178632775d29bec2b16de7b9b8287115c40d0f",
243 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
244 "3369889a67d6c79a24ee15f7d14374f9995215e4",
245 "473a1fd07df800c87a5d3286b642ace10c61c6af",
246 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
247 "b8951d2b20518fd129e5113a5f429626893913bf",
248 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
249 "4851c5b7d5bc18590e787c0c218a592ef504e738",
250 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
251 "abdf003699364fe45fab7dc61e67c606d0063b40",
252 "89abaadff4e68c738cf9251c51e3609564843381",
253 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
254 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
255 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
256 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
257 "71b9756fdfeedce1e6db201176d21a981b881662",
258 "5319528d9af750c172ae62ee85ddb2eaef73b193",
259 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
260 "19b32a0daa91201725b5e13820c343d0a84ff698",
261 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
262 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
263 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
264 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
265 "8566c1110ab5cb8f754787b47923c8bff38f790c",
266 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
267 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
268 "d01071c44259adc94b89978b7d51a058b6dad665",
269 "e6d33b106bcda374e662d338c57a457dbcaa108a",
270 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
271 "339908a568f384e1f384a3e1b0dd415779203b02",
272 "88fd743d00bd37d2ed722092146795b044d08a6e",
273 "c0537ec24147e74939219213d864ee113cad9967",
274 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
275 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
276 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
277 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
278 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
279 "1cb1810b127f509117b38d62a15b67b2347b9145",
280 "f05b3294f25de5fa6d1114104bca97871052ea5a",
281 "87f57a31253a38dbf3dc3070473328fa04b68a48",
282 "db64cc4d830fc35ed170b53943e722b2342954d4",
283 "9988ceca44dafbee247aece1f027c06c27c01652",
284 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
285 "b76e0724496e471b01ef8b34f8beba69f5bde261",
286 "693f5c5fbaeaadb5928d34b035499626fecb8394",
287 "8a9aa84c42dedc3e681191a1229846887ed262ec",
288 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
289 "707bc44fc9fed68ff1f537f0473e0cd825dd660f",
290 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
291 "175a7bcb73c74eceecc000657a0100bccf158ff4",
292 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
293 NULL
296 static const char *sha1_graphics_r10g10b10[] =
298 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
299 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
300 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
301 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
302 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
303 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
304 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
305 "0ad27de0c916c073d0d18484fff899bbdb258db7",
306 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
307 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
308 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
309 "2986b431a0022153e5f875da77cc792e3825ebd5",
310 "ca4b25a5459885ce1e0a36844612087893d425b1",
311 "181bd4616796d89174cedc0332fb320b65aeb0e2",
312 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
313 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
314 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
315 "536eaaa901d652805a8977ecb2dc73f651094c5b",
316 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
317 "92cddcabf5365eef1e037f488af52b31669d987f",
318 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
319 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
320 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
321 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
322 "d578210815e27fe210eb678a71e6d22ba4b4c196",
323 "c7a027c7079dfcc831ca8bc134a509958273073c",
324 "19cf978596195b848df8709aaf637f83f92b8336",
325 "798a835fe50156eeb478c0a6085b088f53409d52",
326 "86ddf268d854f37e5b478c48792b551b57635db6",
327 "8259d388e02542207b6a08d65d553871ce1c4a09",
328 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
329 "66f8d78d4971934794478afee28b3a50e97f1b82",
330 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
331 "63798fb175afef78fa8fe8133d9de97a0cc80651",
332 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
333 "1ceb85697f649a62b1753438daa14944af7f450c",
334 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
335 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
336 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
337 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
338 "ada202d2f526f6995f83412479891c1764b66e5a",
339 "68348e8f54883f4fe295354b024e291c85f1038f",
340 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
341 "e9167564031ead3459eee6a3ebb2f58f100d931f",
342 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
343 "46196f50297260df2863e2fa76d2dfcf72006c23",
344 "0790585dfaef94f912b1ee81477d4ac448708708",
345 "589fb8a85d924ad19ed78409ae89475ba479c30a",
346 "43d67bc61ef54014b022891e5c024fc24b1fe797",
347 "e8783644428b637adbe80bcd084a33428cb69983",
348 "fc0c32afb719295f28bcfef22803bef94f798e20",
349 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
350 "d3f08946300e1700865042aed121870e292d1095",
351 "467ff4af1e105855874f27fbf84d1d2b0417ab5d",
352 "fb0dcff8a67a88313557ee8b588aaa2004fe7b8b",
353 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
354 "317521e576801acaea62c76fe16813cdfe20f4ad",
355 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
356 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
357 "555b6f04ba8dec9e2a60693dcaac594227052727",
358 "4238fe9d296b5c72b0a8745cc761f308605b2094",
359 "943dc6033ab335a6a63e666f70a6bb3a0677e157",
360 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
361 "88cfa7b7c1487f8eda05fce92b622942c9fb7ca4",
362 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
363 "ad91dde8566dceaadc3523cdc8149cd7415a1b70",
364 "1936661eee8073068506131c9e89265b2f8403e8",
365 NULL
368 static const char *sha1_graphics_r6g6b6[] =
370 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
371 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
372 "5b9dab3d8411afb25fbbeba0313db526815ac189",
373 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
374 "2028d1b0d1acef35dc07027135023f35fb9746b9",
375 "378713720dcb5aadb730435ad0989a68ab189114",
376 "084152773feb01a85df6006f2f4f288a1442d37a",
377 "97b824953f60fc9a91028045baacbe7b7dc82b14",
378 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
379 "287d755448e72e29e4812193e2b6f8098a214d82",
380 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
381 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
382 "e51bcf80211cd06e7d10225534b7a79b5454be27",
383 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
384 "0b94e0a5b739ab0020130646522e53da35a149ad",
385 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
386 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
387 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
388 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
389 "2128157e601ef0d6b3636b7387d3b28e876de728",
390 "8bdcdcd463f0052279d070ac763757f4db975483",
391 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
392 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
393 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
394 "66b130f83381957cfc4763558c5f5cddf2e3b564",
395 "d548135ce2320499277ce12b80bc35004f8a9787",
396 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
397 "1906ddfd829e735af49245171f8eb7673295d399",
398 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
399 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
400 "defd95a10d44cad6e736542920b74efd53e9e7eb",
401 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
402 "3f11a735e52030aa3d0f024d83803698293d10e5",
403 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
404 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
405 "3231c4d87faefb7ec5bd377613969c05b70343fc",
406 "00394e438e9edde978e88602c9ad2a572e965bf6",
407 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
408 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
409 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
410 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
411 "3d6cf3753390a05504b1f50302f767df443f0f40",
412 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
413 "da9e896a3a98b330980152b2e4a43cb6e686c730",
414 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
415 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
416 "47499ad13b719de18c59c2bc9b38ed578db50b95",
417 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
418 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
419 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
420 "49341c297a887186bd47d7465d827ab3147f05e3",
421 "325279e76367200d3fd7194d81c09fd139988ece",
422 "c3def160a1e847605ff0fc7edd30397fa90635a0",
423 "a9c2158329c207638cfd2c82cd8a6218efdb28d2",
424 "7f0c4e6874f0c36cee64ff5dec76258ca8822cb2",
425 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
426 "77ea86e51a94b11a8081b29696cb4115687843e3",
427 "d67b897cad72d31e75359094007b1346fd8806ea",
428 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
429 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
430 "481337fbedf181d4324bf7f8299b0327197ff468",
431 "9ab957870fa4e17aec6a79bc1a4fdb42a5ffcc30",
432 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
433 "8e32ea3614c3b20899d748db48258761c7158d2b",
434 "5da35bad12e3e9b26a0444d30820099481281e45",
435 "94f004e98ae8035af948611770a4a2dd6643f510",
436 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
437 NULL
440 static const char *sha1_graphics_24[] =
442 "e993b15c9bd14fb45a15310450b7083c44e42665",
443 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
444 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
445 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
446 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
447 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
448 "fd4be592483623dbc800fe28210a1f0daa71999b",
449 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
450 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
451 "883bc8f305c602edca785e21cd00f488583fb13f",
452 "3bac4e80993f49dc3926e30524115fca9d7a8026",
453 "91369e35be29059a0665782541db4c8b324c6bb2",
454 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
455 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
456 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
457 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
458 "5068bff794553cf5a3145ae407c9a2984357844c",
459 "413a7989969c229dee4ab1798362f32f96cf0a10",
460 "0bb222e540b82720d4971e4a2fc626899af03e03",
461 "adc20832d8c43f1cf372d8392535492013cd2306",
462 "45649794dcbcabda487f66f7a80fc1bec79047a1",
463 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
464 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
465 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
466 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
467 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
468 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
469 "92a1ab214dd8027c407814420449119466c92840",
470 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
471 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
472 "955390669afed2369b15b32fa519f2f921cdf1a0",
473 "201906f7d763b930a98c97f8eeab417f2b65e723",
474 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
475 "701c5af1d0c28294ce7d804b5697643c430d22a0",
476 "b0a959745b2db1d9f449e68e4479a4f36301879c",
477 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
478 "e171f6ec77bca91d6b8559911bce296c0bac469e",
479 "9725669042ef68acb408404d196496d10340bb5a",
480 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
481 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
482 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
483 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
484 "0f79500eda467cd3cbc220abdd37b5dba695d654",
485 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
486 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
487 "7d479beeb6758c164566638b5c873c188d6a91e7",
488 "80086808fca03e757d812e31d1ae576bf90dac9d",
489 "9560096f1b85ae6d939d736165c44df00a47c424",
490 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
491 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
492 "b25ba91487ec945410deb2b51bc1156890c032a8",
493 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
494 "ee315634ed92da3a32c2675ecd1b369471c60936",
495 "6776e0612410e7e200c853721b4ab6ad8b6b81f5",
496 "620a5a520d81971a2d9c30b8d836ba696e11b8dd",
497 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
498 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
499 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
500 "bf5ec23456efe00e1e0931c17de9040ab2092858",
501 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
502 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
503 "e96b79bf88988b5694a04dfc3bd0029361b39801",
504 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
505 "09cb4ab070083144bed4271c0a2a34ccb6ed13c0",
506 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
507 "c95afd0a020e68a76982fe8663b5d64113987233",
508 "48658ff76c137185c56a53f3ccf0e958d0296742",
509 NULL
512 static const char *sha1_graphics_r5g5b5[] =
514 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
515 "847005cf7371f511bcc837251cde07b1796f6113",
516 "a8f75743a930843ec14d516cd048b6e0468e5d89",
517 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
518 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
519 "a9034a905daa91757b4f63345c0e40638cd53ca8",
520 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
521 "99474fecf11df7b7035c35be6b8b697be9889418",
522 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
523 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
524 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
525 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
526 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
527 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
528 "449092689226a1172b6086ba1181d6b6d6499f26",
529 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
530 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
531 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
532 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
533 "6daaf945a955928c5c124c880522ca4634fb2343",
534 "12a288390d16e1efa99d4185301de48a4d433b14",
535 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
536 "1d3af561605fd61433035600d8962cb8d266fdd0",
537 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
538 "d7d97e28ed316f6596c737eb83baa5948d86b673",
539 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
540 "656bf3b7121bcd620a0a3ad488f0d66604824577",
541 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
542 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
543 "a49530722328ae88fd765792ac0c657efbcce75d",
544 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
545 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
546 "a6fd83542c3826132e88d3f5e304d604c0056fad",
547 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
548 "e428d213ad02651287894f093413949dcb369208",
549 "7df915bedcc5951a1b6f828490f7dbb93212e835",
550 "645dc251d205139282b17eb7bece1055fff3bcd0",
551 "76215275593631f5900aad3616d725733dc39493",
552 "81655a550703849a616d4a16504bb9c6f999285f",
553 "573d65665d20f00d36d9782ae2b89772140524ab",
554 "619414c1b33ac60cb0c0de61df86245d472259b0",
555 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
556 "2a66dae03890ff791eabb982949435adb19af02b",
557 "24ac219478ba406f30794550690486b14cbac5e8",
558 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
559 "db8c34882ddd46716d14bbf569d530f80db65ed4",
560 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
561 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
562 "a92942269911a88793b3460b6f2a2cd56e48eec1",
563 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
564 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
565 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
566 "585061e403d9cac1603a38af420efe87338f381a",
567 "8f447a3820c83662086dfa836da2205b0130fd5f",
568 "3772003c7fb420003512d0c437b3659d96d89ce4",
569 "dab47c9dc149e570045d699598b14a613bf319b3",
570 "2daca4d26a086ed34894693be0b0374402232809",
571 "e313ae8f7261b88999757ed0c6f26df85b4f01a5",
572 "47d0bab8664ae0aaa927495d07bb3537cce35f16",
573 "295ec16530126046790fb734e99f86f5b3b74ed8",
574 "d98b0561010606b55a1b9b85fbc93640f681d256",
575 "1c1499051860b7caa25173b328ca9c862f01dd1a",
576 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
577 "2230f36f12d4becb242e2962fa1b3694db2496ca",
578 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
579 "5950f7d00cd8692872377df0e869a7d5ea5e4420",
580 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
581 "7de23c68ca224818fdf127c5e96729dcd0de2b8b",
582 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
583 "1a0fd0df17fa4c455a4a91cad30b5242f77fd233",
584 "af45bf81d119be5cf6845ad41191ba52637e65e9",
585 NULL
588 static const char *sha1_graphics_r4g4b4[] =
590 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
591 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
592 "8bd18697d1ef27492805667a0bc956343ac08667",
593 "e8501c830321584474654f90e40eaf27dc21e6a8",
594 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
595 "821177710961d2cb5f7e7dfc0e06e767b6042753",
596 "667124365ffadeea1d8791bedda77a0c7b898de8",
597 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
598 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
599 "fb52b0c373a5f2a60b981604b120962942d2447a",
600 "5ab8dd07436681d762fa04ad7c6d71291c488924",
601 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
602 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
603 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
604 "25fcb75aa687aac35b8f72640889fe92413e00c5",
605 "3bddf9d53e89560b083302b146cd33791b13d941",
606 "a81504498c7a7bb46340ce74476a42f70f2730b1",
607 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
608 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
609 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
610 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
611 "57ebf8becac1524543da120e88e9cc57ecfdec49",
612 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
613 "d591232bbc2592462c819a9486750f64180518fd",
614 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
615 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
616 "8933450132bf949ba4bc28626968425b5ed2867d",
617 "9928a8f28a66c00069a124f7171b248817005763",
618 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
619 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
620 "233e588cf660e2c9b552cf02065cf63fa6655864",
621 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
622 "a3345acaf272f2e288626906e3056cd0ced70499",
623 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
624 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
625 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
626 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
627 "9dd123938b0a02601d8d458ecbd6535ddefea724",
628 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
629 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
630 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
631 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
632 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
633 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
634 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
635 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
636 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
637 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
638 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
639 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
640 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
641 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
642 "7d80b8289da8a65931f03c74a9ef0aff5f8eb551",
643 "a7a986097e5b553c71bd93fd0ec6037e6bd0f2d1",
644 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
645 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
646 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
647 "9f72be4467219a345b1164205d1fbfda2d64271e",
648 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
649 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
650 "3830cd728c1e72837310940bcdac4e294d6c9843",
651 "f571c7c4aac92491017963032194690c0fa06b42",
652 "6fd751b7328c02954bce98bed94b3ce3c73db118",
653 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
654 "8585783d0373e9696b508776b6e6b18a80b09888",
655 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
656 NULL
659 static const char *sha1_graphics_8_color[] =
661 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
662 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
663 "49024d6cbdf1614327dfda9eda17675e76805f7e",
664 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
665 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
666 "84d85009d35ae10abbc435f3913422544105cea2",
667 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
668 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
669 "f3aa8d89430748178952de56643069d80b40aad6",
670 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
671 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
672 "52b1363e821bf604d9df260bfa97e26d428c33fd",
673 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
674 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
675 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
676 "89711289be6d5c55734878410e4923d5cca9aca9",
677 "8355caf57d51ad4e14275943088392e37dc75d33",
678 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
679 "6f0570da9dea7f043f678088f8362ee458cd79fa",
680 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
681 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
682 "5092b22af85a08f10a2899888bb9d552f25f828e",
683 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
684 "e91973be2651eeef568700463652838d8cbba976",
685 "1df851515ecf46df5c2d3279535c1763f72353dd",
686 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
687 "359bd76088a965bb0cee7c44800bc46b2638807e",
688 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
689 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
690 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
691 "91f988f575338505ba8a40727865a8d3f2298624",
692 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
693 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
694 "3b7488731da48635d86be551ab7c8c0f91c78219",
695 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
696 "e15a355fc09bfd22267917898e2266168ff410e3",
697 "b9688566bddf18586787c00e68724e51e97dfb72",
698 "5e38e03310f1c66f2052af2a745d8c60515707c5",
699 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
700 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
701 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
702 "6376234f542467e5887adfece62f753e998dc19d",
703 "add949d009217ef2b847e34772ba363e4be7b1b8",
704 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
705 "0b58666deb3615e912896a764e5c6475989e95e4",
706 "bf460cc44c0edee851d72587c8425c3f06a62c55",
707 "ea74c00c45569007383b632d7f1d2adc82645717",
708 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
709 "284abed096637c80bb50844e393da9dd4b3f19ac",
710 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
711 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
712 "46f772c2832b3aad584674db666bd63e48b4f338",
713 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
714 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
715 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
716 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
717 "678979a45126a76eb629992cd64734862f53a555",
718 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
719 "9b1cc7b24f8ce15db2af7f4aa8cde8687784dfa2",
720 "cc4a4cea622d825700bccef7d90a5a447d9ca39d",
721 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
722 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
723 "2c07272462c68cf5944b03e2aa049475b99143c5",
724 "07ca369fb875d37b9cf855045f528af1827edec4",
725 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
726 "488341e88810d737de0b26de4e4d4fa0e78eb482",
727 "bd1e7f40e3971e2ff6c5561286901193a1557527",
728 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
729 "d7ffa3893c6fa937569791cf49986518a4a4d96e",
730 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
731 "8771d5ff7b93b9dd9d077e672b342235dfb28472",
732 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
733 NULL
736 static const char *sha1_graphics_8_grayscale[] =
738 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
739 "df35491dd5038187c05bac06921402ba6d7773a8",
740 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
741 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
742 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
743 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
744 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
745 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
746 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
747 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
748 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
749 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
750 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
751 "114bb377b4e78a1978e1ac09388c48861b5223a3",
752 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
753 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
754 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
755 "216388ddf6b563dd2058a9df65b40b6f72df1715",
756 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
757 "47f72be971bd2d3399dabd018201f4f5075e96fe",
758 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
759 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
760 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
761 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
762 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
763 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
764 "b6785a410048bb85e7ea3f0492459972103c935e",
765 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
766 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
767 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
768 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
769 "0000000000000000000000000000000000000000",
770 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
771 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
772 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
773 "6d41e6168662e75baacf74d911d7419d54c8d73c",
774 "2404952157ba1519094a2da6bfbf2b0f1356432d",
775 "24caede65b40815a60b83c4edfa06bdc542388cd",
776 "650a51bedd1af92469d2950eb95220db35f95c6e",
777 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
778 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
779 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
780 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
781 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
782 "85425940daf119125deb52421b2057acebe6d1cf",
783 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
784 "9869b6f088822fb423996f9968e5a931301fc2c3",
785 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
786 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
787 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
788 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
789 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
790 "f543efc84e638afbaa456e629100f0274de1a35b",
791 "1bd2587399006eed0d46beff397d32081f6bc58e",
792 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
793 "640a49455acabca6954a7fbb6af4e872af342d11",
794 "589e7911e09332ee090371deae17b0120ff990b5",
795 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
796 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
797 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
798 "3685c9ae95118a83db3569832c29753276fa1264",
799 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
800 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
801 "a4b04ed35484de0de61832a8a28bbc7def645622",
802 "515897610714251dd3b54f54fe76a9ed3fd12c53",
803 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
804 "17ae603c199a5d6695d198a7f36e6d7263990951",
805 "1918a33f59d3500204ffc573318a39e9ff754221",
806 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
807 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
808 "3494a23633405e46af96cb57715617fef1ac252e",
809 "5a3ae1da30d83cc157e6a4a5617c85598309f4ac",
810 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
811 "87eab8f81fb2a036080e099760f628037f9306e7",
812 "a3eac75d30f681b3898ee469d368960529634d7d",
813 "cd5caeabdb71241766d24f038cfc5f1e91e11256",
814 "e2b393dc3f5833f7868668ea31369e90348768cd",
815 NULL
818 static const char *sha1_graphics_8[] =
820 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
821 "512246d4886ab889a090b167ba194577cb95272e",
822 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
823 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
824 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
825 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
826 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
827 "390b2bf70daba36310683f46af9cd50b9a061396",
828 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
829 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
830 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
831 "da1cc34a9d9b779fc7849e03e214096026506464",
832 "5ba8f99ca034666effa556748c49a0f5a015125f",
833 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
834 "73e2859ce849f756f954718ce3c90f02e31712b6",
835 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
836 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
837 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
838 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
839 "7262364067e03c7fa498af1d59d228d6c63b460e",
840 "5241241a355a667ef0834049adf4218e8b3f16b8",
841 "db22d666690948eb966f75b796c72c7150a5c4b9",
842 "af21fb2645b568b049549de375584c4aa3055143",
843 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
844 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
845 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
846 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
847 "bdc0a354635b879871077c5b712570e469863c99",
848 "d599bf210423fe3adbb4f1de87d9360de97827d0",
849 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
850 "cc01f17928f7780cefd423ea653b072eea723a1b",
851 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
852 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
853 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
854 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
855 "f4a334e69535de74ee5ed54be93a75120a66e54a",
856 "559fd1d15447745527c61fe43a94c6708bff3e39",
857 "995f77f2f53398399f09d1365cb4dfd105764e5c",
858 "61907a6685bba93077da40cfb28cf2ab74552fd2",
859 "122015e5e17c1c317c6e51c0e207826b606a4077",
860 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
861 "8c609921d4a3ed89a994a75482b27496bf103cf5",
862 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
863 "66493ee117719e172f327a426af601996025f28c",
864 "acead2745fec0b6c817fa601353bdf2d197b64f7",
865 "a6b858b2d125c159529d3f3ec45b31925a79acff",
866 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
867 "d83adc669c0dea0dc4812b93f998514b6f02d805",
868 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
869 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
870 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
871 "7d1bfff706b0713e53209407889f83a0da26a81d",
872 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
873 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
874 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
875 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
876 "d4f3a5ea033adc405c44e1ca137dc908c606dad6",
877 "7103d428ec9a959778120fd6f0dc62dd608ddd63",
878 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
879 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
880 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
881 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
882 "293c41a7ed923a4617560481ae8815cebf83701a",
883 "750c923785ba2afb9ce597516c072f90f014bf95",
884 "80089132f8a11d86e8038f2f8e12dfba46624ee5",
885 "bde5a62a065c027561226fbec5155e938ba7f6b3",
886 "a6311d74fc058079a327abb536e69353be719925",
887 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
888 "0000000000000000000000000000000000000000",
889 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
890 NULL
893 static const char *sha1_graphics_4[] =
895 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
896 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
897 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
898 "9401799e6116c35e5f0e5bdca07ea25316757a72",
899 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
900 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
901 "2505598845fa026ea7187582461efbf06cb6904f",
902 "3981a19363beca8f28d32a5928ac296fd22a5296",
903 "01404024ebb2c266d17d734059524d874491650f",
904 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
905 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
906 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
907 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
908 "1f26a01730f67d40ea711a50d9d801bac15a642e",
909 "3b53d24178cfacba53103a44dfd5d072b15a6781",
910 "c52cfd57f26037723d37192722fc3a217f280c9e",
911 "e34da6500cf2e424d980714d92737cf6c31a7bda",
912 "d17f4358ae529f920960ed89e535902ee13b0033",
913 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
914 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
915 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
916 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
917 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
918 "39c16648cf6c261be71a33cec41867f28e119b94",
919 "26ad5116562e7b58c76a26eaf521e2e40899e944",
920 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
921 "4f827ca6927f15191588456f985bf29d2a3b3c24",
922 "e7de769c3d12ea9dd223bef4881c578823bec67e",
923 "6fb102d020e5554116feefc8482104f3ae2036d2",
924 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
925 "20c9eb3276c08fdce35755e349bec94b04929812",
926 "628d837163a25c6520f19c0602383176dbad528e",
927 "b5a12cff7100290ad43f5ed17a321b42de048893",
928 "b672afbeeafb44194a821f0def81a8892872937e",
929 "db0124045882b598feea192186cf7eb7a0387866",
930 "602d91471378fe24a2d0248bd8a92b624f099fea",
931 "e772873b87a0f55ea51a3da323f64bf8814c6703",
932 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
933 "1a579cd280422131c35e907a023ee0e80749b5a4",
934 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
935 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
936 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
937 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
938 "3e411b004a5be84451860c6da6a4a1a482b77862",
939 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
940 "7811c536a6527112b438a6413f3927f2c79086a7",
941 "525ef3615040225752a2fe646ab99ee64e360630",
942 "46760975993f9881b7bbe94123173e6a683d3f25",
943 "df5feb905a31c288008cf5e82d73ac818a160d82",
944 "df5feb905a31c288008cf5e82d73ac818a160d82",
945 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
946 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
947 "1a23839d71d2379ed4e709a5ae6c14639fbe3ab8",
948 "09f8416a780d80be61cbda3d8a05aee418d0ea00",
949 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
950 "029552113292cc110fd6b7888e766628950aaeef",
951 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
952 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
953 "287ea7db721e641439888cb9f4bac3a5f16124eb",
954 "42466aab11852741d937c1ff6f3bb711e58415a6",
955 "0663cf6330591fcf744aba96664e05d90243d07a",
956 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
957 "6fe7d0d17b892032cfd171c3d7c365f030b5be38",
958 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
959 "0000000000000000000000000000000000000000",
960 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
961 NULL
964 static const char *sha1_graphics_4_grayscale[] =
966 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
967 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
968 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
969 "1c201d149c0bd886ff8a427ad513f15a70991174",
970 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
971 "315189097a02024d2eae61d524c4de07a396aee7",
972 "73ac786015dea36ac466a6524dba757d5d238ece",
973 "6e328cc4d53627f034b23706d8bf26afe18512ae",
974 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
975 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
976 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
977 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
978 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
979 "ec3879342b5a44f6de6efe946243ae5ade00980d",
980 "6e328cc4d53627f034b23706d8bf26afe18512ae",
981 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
982 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
983 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
984 "b2bda683edef912957845a33edc055902a801fed",
985 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
986 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
987 "43ee3e187dda14b86aef12371041ae70313b5a65",
988 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
989 "d4930552a7845111ffd9db57260be1ab97967c06",
990 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
991 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
992 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
993 "0000000000000000000000000000000000000000",
994 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
995 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
996 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
997 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
998 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
999 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
1000 "f8224430462f6a93f85ef33b8aa7299525990708",
1001 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
1002 "d58b8760ef01c12e691651c932d683c66fde3654",
1003 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
1004 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
1005 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
1006 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
1007 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
1008 "027b05bc82ce4f897c4bf812610a641547368939",
1009 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
1010 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
1011 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
1012 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
1013 "5eeb56afea8040a8fb18c11f29931b836474126d",
1014 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
1015 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
1016 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
1017 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
1018 "43560b856907f552df3b9dd1f91e1aa8ab9ff17e",
1019 "8cefa6dcb658487d0715598d5d120677dbfdab42",
1020 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
1021 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
1022 "58f400c9bb78e49a879276fb049edfc9c981740a",
1023 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
1024 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
1025 "68bee638d59a373f33f308751471b3ef41849582",
1026 "be0501175cc3cbb61217fca76356f761117fb40f",
1027 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1028 "3efe128a5bf250f2c460664e8f543f5ec54d5dc2",
1029 "2d5123e757cf00e423a89160d7dc4997c3688829",
1030 "0000000000000000000000000000000000000000",
1031 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
1032 NULL
1035 static const char *sha1_graphics_1[] =
1037 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1038 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
1039 "a7cc69f957d7b533a0a330859a143d701daac73c",
1040 "a955bf088c5edb129289ce65caace48ec95632e4",
1041 "5316d3c558c254479883133cf58cd07ab521d3f0",
1042 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
1043 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
1044 "121423a38b4ac4743bd516e0a7e88a3863796313",
1045 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
1046 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1047 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1048 "39ff81f77ef4ee772367ed1a63785987c060126e",
1049 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1050 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1051 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1052 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1053 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
1054 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
1055 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1056 "0ff4b49797e30e3555aab45219adf449a9a560ff",
1057 "280327328ca940c212ce24fe72e0b00014072767",
1058 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1059 "b85463875f755b85f1464b1b6275912bcbad6c9f",
1060 "816f200969feecc788b61dfeecf05b1790984401",
1061 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1062 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
1063 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1064 "0a76e0121facb103857130bc6e12185ad77fc3fa",
1065 "02aede714773d654d0fc2f640afaa133ec718ad5",
1066 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1067 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
1068 "b26699f62661e16a1dc452d24c88ce363a1f2998",
1069 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1070 "c14832e69ec3585c15987b3d69d5007236fa9814",
1071 "e44ea620b0c47125a34193537ab9d219a52ad028",
1072 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1073 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
1074 "8819bf7a43295161fe045a42936000b3a51fe200",
1075 "e08dbc26469c229f75ccbf1a38a133401f270b84",
1076 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1077 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1078 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1079 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1080 "ffc78c075d4be66806f6c59180772d5eed963dc0",
1081 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1082 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1083 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1084 "b71ca46be287598f716bb04fac0a52ad139c70db",
1085 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1086 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1087 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1088 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1089 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1090 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1091 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
1092 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1093 "655cfadeb157233c804d42b58195569c8846e3c1",
1094 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1095 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1096 "0d180c37bc26d83a1a11f66168757f3de2493243",
1097 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1098 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1099 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1100 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1101 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1102 "a2a928de9007d765da496abec8c21b23601f8c45",
1103 "28ded40e72d4327b9413571476b167fb28a1f420",
1104 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1105 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1106 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1107 "44a28536466dc895feb824b23dfd4a47c6948af8",
1108 "f0316a5765a0404760e94cd05b7dc956cae07d26",
1109 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1110 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1111 "55c26d22f11d80b73383fa57d0fac552d705b092",
1112 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1113 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1114 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1115 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1116 "1ee4e951743efc8764249fbc7adecefbfec0428e",
1117 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1118 "128eefd2ee043d59dc37918065f687e378e5ca95",
1119 "c642abc651f525332d9d635049646d309e877839",
1120 "8d34215487088b5d4ef63062270ce25c2862643d",
1121 "3dc3075b0c87fdcaabbbae8928303fb2358c15c2",
1122 "bbae6f0659e095a42b420082079663f937065813",
1123 "ca711c69165e1fa5be72993b9a7870ef6d485249",
1124 NULL
1127 static const char *dst_format;
1129 static inline DWORD get_stride(BITMAPINFO *bmi)
1131 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1134 static inline DWORD get_dib_size(BITMAPINFO *bmi)
1136 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1139 static char *hash_dib(BITMAPINFO *bmi, void *bits)
1141 DWORD dib_size = get_dib_size(bmi);
1142 HCRYPTHASH hash;
1143 char *buf;
1144 BYTE hash_buf[20];
1145 DWORD hash_size = sizeof(hash_buf);
1146 int i;
1147 static const char *hex = "0123456789abcdef";
1149 if(!crypt_prov) return NULL;
1151 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1153 CryptHashData(hash, bits, dib_size, 0);
1155 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1156 if(hash_size != sizeof(hash_buf)) return NULL;
1158 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1159 CryptDestroyHash(hash);
1161 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1163 for(i = 0; i < hash_size; i++)
1165 buf[i * 2] = hex[hash_buf[i] >> 4];
1166 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1168 buf[i * 2] = '\0';
1170 return buf;
1173 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
1175 char *hash = hash_dib(bmi, bits);
1176 BOOL ok_cond;
1177 int i;
1179 if(!hash)
1181 skip("SHA1 hashing unavailable on this platform\n");
1182 return;
1185 for(i = 0; i <= num_broken; i++)
1187 if((*sha1)[i] == NULL)
1189 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
1190 return;
1194 ok_cond = !strcmp(hash, **sha1);
1196 for(i = 1; i <= num_broken; i++)
1197 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
1199 if(todo)
1200 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1201 dst_format, info, **sha1, hash );
1202 else
1203 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1204 dst_format, info, **sha1, hash );
1206 *sha1 += num_broken + 1;
1208 HeapFree(GetProcessHeap(), 0, hash);
1211 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
1213 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
1216 static const RECT bias_check[] =
1218 {100, 100, 200, 150},
1219 {100, 100, 150, 200},
1220 {100, 100, 50, 200},
1221 {100, 100, 0, 150},
1222 {100, 100, 0, 50},
1223 {100, 100, 50, 0},
1224 {100, 100, 150, 0},
1225 {100, 100, 200, 50}
1228 static const RECT hline_clips[] =
1230 {120, 120, 140, 120}, /* unclipped */
1231 {100, 122, 140, 122}, /* l edgecase */
1232 { 99, 124, 140, 124}, /* l edgecase clipped */
1233 {120, 126, 200, 126}, /* r edgecase */
1234 {120, 128, 201, 128}, /* r edgecase clipped */
1235 { 99, 130, 201, 130}, /* l and r clipped */
1236 {120, 100, 140, 100}, /* t edgecase */
1237 {120, 99, 140, 99}, /* t edgecase clipped */
1238 {120, 199, 140, 199}, /* b edgecase */
1239 {120, 200, 140, 200}, /* b edgecase clipped */
1240 {120, 132, 310, 132}, /* inside two clip rects */
1241 { 10, 134, 101, 134}, /* r end on l edgecase */
1242 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1243 {199, 138, 220, 138}, /* l end on r edgecase */
1244 {200, 140, 220, 140} /* l end on r edgecase clipped */
1247 static const RECT vline_clips[] =
1249 {120, 120, 120, 140}, /* unclipped */
1250 {100, 120, 100, 140}, /* l edgecase */
1251 { 99, 120, 99, 140}, /* l edgecase clipped */
1252 {199, 120, 199, 140}, /* r edgecase */
1253 {200, 120, 200, 140}, /* r edgecase clipped */
1254 {122, 99, 122, 201}, /* t and b clipped */
1255 {124, 100, 124, 140}, /* t edgecase */
1256 {126, 99, 126, 140}, /* t edgecase clipped */
1257 {128, 120, 128, 200}, /* b edgecase */
1258 {130, 120, 130, 201}, /* b edgecase clipped */
1259 {132, 12, 132, 140}, /* inside two clip rects */
1260 {134, 90, 134, 101}, /* b end on t edgecase */
1261 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1262 {138, 199, 138, 220}, /* t end on b edgecase */
1263 {140, 200, 140, 220} /* t end on b edgecase clipped */
1266 static const RECT line_clips[] =
1268 { 90, 110, 310, 120},
1269 { 90, 120, 295, 130},
1270 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1271 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1272 { 90, 132, 101, 137}, /* end pt just inside l edge */
1273 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1274 {199, 142, 210, 143} /* start pt just inside r edge */
1277 static const RECT wide_lines[] =
1279 {100, 10, 200, 10},
1280 {100, 21, 200, 21},
1281 {200, 40, 100, 40},
1282 {200, 61, 100, 61},
1283 { 10, 100, 10, 200},
1284 { 21, 100, 21, 200},
1285 { 40, 200, 40, 100},
1286 { 61, 200, 61, 100},
1289 static const POINT poly_lines[] =
1291 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1294 static const RECT patblt_clips[] =
1296 {120, 120, 140, 126}, /* unclipped */
1297 {100, 130, 140, 136}, /* l edgecase */
1298 { 99, 140, 140, 146}, /* l edgecase clipped */
1299 {180, 130, 200, 136}, /* r edgecase */
1300 {180, 140, 201, 146}, /* r edgecase clipped */
1301 {120, 100, 130, 110}, /* t edgecase */
1302 {140, 99, 150, 110}, /* t edgecase clipped */
1303 {120, 180, 130, 200}, /* b edgecase */
1304 {140, 180, 150, 201}, /* b edgecase */
1305 {199, 150, 210, 156}, /* l edge on r edgecase */
1306 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1307 { 90, 150, 101, 156}, /* r edge on l edgecase */
1308 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1309 {160, 90, 166, 101}, /* b edge on t edgecase */
1310 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1311 {160, 199, 166, 210}, /* t edge on b edgecase */
1312 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1315 static const RECT rectangles[] =
1317 {10, 11, 100, 101},
1318 {250, 100, 350, 10},
1319 {120, 10, 120, 20}, /* zero width */
1320 {120, 10, 130, 10}, /* zero height */
1321 {120, 40, 121, 41}, /* 1 x 1 */
1322 {130, 50, 132, 52}, /* 2 x 2 */
1323 {140, 60, 143, 63}, /* 3 x 3 */
1324 {150, 70, 154, 74}, /* 4 x 4 */
1325 {120, 20, 121, 30}, /* width == 1 */
1326 {130, 20, 132, 30}, /* width == 2 */
1327 {140, 20, 143, 30}, /* width == 3 */
1328 {200, 20, 210, 21}, /* height == 1 */
1329 {200, 30, 210, 32}, /* height == 2 */
1330 {200, 40, 210, 43} /* height == 3 */
1333 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1334 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1335 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1336 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1337 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1338 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1340 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1341 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1342 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1343 0x00, 0x01 }; /* <eod> */
1345 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1346 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1347 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1348 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1350 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1351 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1353 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1355 HBRUSH brush = CreateSolidBrush( color );
1356 brush = SelectObject( hdc, brush );
1357 PatBlt( hdc, x, y, width, height, PATCOPY );
1358 DeleteObject( SelectObject( hdc, brush ) );
1361 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1363 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1364 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1365 PALETTEENTRY *entries = pal->palPalEntry;
1366 DWORD dib_size = get_dib_size(bmi);
1367 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1368 LOGBRUSH log_brush;
1369 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1370 HBITMAP bmp;
1371 INT i, j, x, y, hatch_style;
1372 HDC src_dc;
1373 HRGN hrgn, hrgn2;
1374 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1375 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1376 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1377 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1378 RGBQUAD *brush_colors = brush_bi->bmiColors;
1379 BYTE *brush_bits, *src_bits;
1380 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1381 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1382 BLENDFUNCTION blend;
1383 COLORREF old_text, old_bkgnd;
1384 HPALETTE hpal;
1386 blend.BlendOp = AC_SRC_OVER;
1387 blend.BlendFlags = 0;
1389 memset(bits, 0xcc, dib_size);
1390 compare_hash(bmi, bits, sha1, "empty");
1392 src_dc = CreateCompatibleDC( 0 );
1393 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1394 orig_pen = SelectObject(hdc, solid_pen);
1395 SetBrushOrgEx(hdc, 0, 0, NULL);
1397 /* horizontal and vertical lines */
1398 for(i = 1; i <= 16; i++)
1400 SetROP2(hdc, i);
1401 MoveToEx(hdc, 10, i * 3, NULL);
1402 LineTo(hdc, 100, i * 3); /* l -> r */
1403 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1404 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1405 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1406 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1407 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1408 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1410 compare_hash(bmi, bits, sha1, "h and v solid lines");
1411 memset(bits, 0xcc, dib_size);
1413 /* diagonal lines */
1414 SetROP2(hdc, R2_COPYPEN);
1415 for(i = 0; i < 16; i++)
1417 double s = sin(M_PI * i / 8.0);
1418 double c = cos(M_PI * i / 8.0);
1420 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1421 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1423 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1424 memset(bits, 0xcc, dib_size);
1426 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1428 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1429 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1431 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1432 memset(bits, 0xcc, dib_size);
1434 /* solid brush PatBlt */
1435 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1436 orig_brush = SelectObject(hdc, solid_brush);
1438 for(i = 0, y = 10; i < 256; i++)
1440 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1442 if(rop_uses_src(rop3[i]))
1443 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1444 else
1446 ok(ret, "got FALSE for %x\n", rop3[i]);
1447 y += 20;
1451 compare_hash(bmi, bits, sha1, "solid patblt");
1452 memset(bits, 0xcc, dib_size);
1454 /* clipped lines */
1455 hrgn = CreateRectRgn(10, 10, 200, 20);
1456 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1457 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1458 SetRectRgn(hrgn2, 290, 100, 300, 200);
1459 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1460 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1461 DeleteObject(hrgn2);
1463 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1465 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1466 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1468 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1469 memset(bits, 0xcc, dib_size);
1471 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1473 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1474 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1476 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1477 memset(bits, 0xcc, dib_size);
1479 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1481 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1482 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1484 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1485 memset(bits, 0xcc, dib_size);
1487 /* clipped PatBlt */
1488 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1490 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1491 patblt_clips[i].right - patblt_clips[i].left,
1492 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1494 compare_hash(bmi, bits, sha1, "clipped patblt");
1495 memset(bits, 0xcc, dib_size);
1497 /* clipped dashed lines */
1498 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1499 SelectObject(hdc, dashed_pen);
1500 SetBkMode(hdc, TRANSPARENT);
1501 SetBkColor(hdc, RGB(0, 0xff, 0));
1503 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1505 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1506 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1508 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1509 memset(bits, 0xcc, dib_size);
1511 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1513 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1514 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1516 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1517 memset(bits, 0xcc, dib_size);
1519 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1521 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1522 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1524 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1525 memset(bits, 0xcc, dib_size);
1527 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1529 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1530 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1532 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1533 memset(bits, 0xcc, dib_size);
1535 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1537 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1538 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1540 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1541 memset(bits, 0xcc, dib_size);
1543 SetBkMode(hdc, OPAQUE);
1545 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1547 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1548 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1550 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1551 memset(bits, 0xcc, dib_size);
1553 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1555 /* 8888 DIB pattern brush */
1557 brush_bi->bmiHeader = dib_brush_header_8888;
1558 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1559 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1560 brush_bits[2] = 0xff;
1561 brush_bits[6] = 0xff;
1562 brush_bits[14] = 0xff;
1563 brush_bits[65] = 0xff;
1564 brush_bits[69] = 0xff;
1565 brush_bits[72] = 0xff;
1567 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1569 SelectObject(hdc, dib_brush);
1570 SetBrushOrgEx(hdc, 1, 1, NULL);
1572 for(i = 0, y = 10; i < 256; i++)
1574 if(!rop_uses_src(rop3[i]))
1576 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1577 ok(ret, "got FALSE for %x\n", rop3[i]);
1578 y += 25;
1581 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1582 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1583 else
1584 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1585 memset(bits, 0xcc, dib_size);
1587 SelectObject(hdc, orig_brush);
1588 DeleteObject(dib_brush);
1590 /* 8888 bottom-up DIB pattern brush */
1592 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1594 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1596 SelectObject(hdc, dib_brush);
1598 /* This used to set the x origin to 100 as well, but
1599 there's a Windows bug for 24 bpp where the brush's x offset
1600 is incorrectly calculated for rops that involve both D and P */
1601 SetBrushOrgEx(hdc, 4, 100, NULL);
1603 for(i = 0, y = 10; i < 256; i++)
1605 if(!rop_uses_src(rop3[i]))
1607 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1608 ok(ret, "got FALSE for %x\n", rop3[i]);
1609 y += 25;
1612 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1613 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1614 else
1615 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1616 memset(bits, 0xcc, dib_size);
1618 SelectObject(hdc, orig_brush);
1619 DeleteObject(dib_brush);
1621 /* 24 bpp dib pattern brush */
1623 brush_bi->bmiHeader = dib_brush_header_24;
1624 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1625 memset(brush_bits, 0, 16 * 16 * 3);
1626 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1627 brush_bits[49] = brush_bits[52] = 0xff;
1629 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1631 SelectObject(hdc, dib_brush);
1632 SetBrushOrgEx(hdc, 1, 1, NULL);
1634 for(i = 0, y = 10; i < 256; i++)
1636 if(!rop_uses_src(rop3[i]))
1638 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1639 ok(ret, "got FALSE for %x\n", rop3[i]);
1640 y += 25;
1643 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1644 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1645 else
1646 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1647 memset(bits, 0xcc, dib_size);
1649 SelectObject(hdc, orig_brush);
1650 DeleteObject(dib_brush);
1652 /* 555 dib pattern brush */
1654 brush_bi->bmiHeader = dib_brush_header_555;
1655 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1656 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1657 brush_bits[0] = brush_bits[1] = 0xff;
1658 brush_bits[32] = brush_bits[34] = 0x7c;
1660 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1662 SelectObject(hdc, dib_brush);
1663 SetBrushOrgEx(hdc, 1, 1, NULL);
1665 for(i = 0, y = 10; i < 256; i++)
1667 if(!rop_uses_src(rop3[i]))
1669 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1670 ok(ret, "got FALSE for %x\n", rop3[i]);
1671 y += 25;
1674 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1675 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1676 else
1677 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1678 memset(bits, 0xcc, dib_size);
1680 SelectObject(hdc, orig_brush);
1681 DeleteObject(dib_brush);
1683 SetBrushOrgEx(hdc, 0, 0, NULL);
1685 /* 8 bpp dib pattern brush */
1687 brush_bi->bmiHeader = dib_brush_header_8;
1688 brush_bi->bmiHeader.biClrUsed = 3;
1689 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1690 brush_colors[0].rgbRed = 0xff;
1691 brush_colors[1].rgbRed = 0xff;
1692 brush_colors[1].rgbGreen = 0xff;
1693 brush_colors[1].rgbBlue = 0xff;
1695 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1696 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1697 brush_bits[0] = brush_bits[1] = 1;
1698 brush_bits[16] = brush_bits[17] = 2;
1699 brush_bits[32] = brush_bits[33] = 6;
1701 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1703 SelectObject(hdc, dib_brush);
1704 SetBrushOrgEx(hdc, 1, 1, NULL);
1706 for(i = 0, y = 10; i < 256; i++)
1708 if(!rop_uses_src(rop3[i]))
1710 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1711 ok(ret, "got FALSE for %x\n", rop3[i]);
1712 y += 25;
1715 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1716 memset(bits, 0xcc, dib_size);
1718 SelectObject(hdc, orig_brush);
1719 DeleteObject(dib_brush);
1721 /* 4 bpp dib pattern brush */
1723 brush_bi->bmiHeader = dib_brush_header_4;
1724 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1726 SelectObject(hdc, dib_brush);
1727 SetBrushOrgEx(hdc, 1, 1, NULL);
1729 for(i = 0, y = 10; i < 256; i++)
1731 if(!rop_uses_src(rop3[i]))
1733 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1734 ok(ret, "got FALSE for %x\n", rop3[i]);
1735 y += 25;
1738 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1739 memset(bits, 0xcc, dib_size);
1741 SelectObject(hdc, orig_brush);
1742 DeleteObject(dib_brush);
1744 /* 1 bpp dib pattern brush */
1746 brush_bi->bmiHeader = dib_brush_header_1;
1747 brush_bi->bmiHeader.biClrUsed = 2;
1748 memset(brush_bits, 0, 16 * 4);
1749 brush_bits[0] = 0xf0;
1750 brush_bits[4] = 0xf0;
1751 brush_bits[8] = 0xf0;
1753 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1754 SelectObject(hdc, dib_brush);
1755 for(i = 0, y = 10; i < 256; i++)
1757 if(!rop_uses_src(rop3[i]))
1759 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1760 ok(ret, "got FALSE for %x\n", rop3[i]);
1761 y += 25;
1765 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1766 memset(bits, 0xcc, dib_size);
1768 SelectObject(hdc, orig_brush);
1769 DeleteObject(dib_brush);
1771 /* 1 bpp ddb pattern brush */
1773 old_text = GetTextColor( hdc );
1774 old_bkgnd = GetBkColor( hdc );
1775 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1776 dib_brush = CreatePatternBrush( bmp );
1777 SelectObject(hdc, dib_brush);
1778 for(i = 0, y = 10; i < 256; i++)
1780 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1781 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1782 if(!rop_uses_src(rop3[i]))
1784 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1785 ok(ret, "got FALSE for %x\n", rop3[i]);
1786 y += 25;
1790 compare_hash_broken_todo(bmi, bits, sha1, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1791 memset(bits, 0xcc, dib_size);
1793 DeleteObject(bmp);
1794 SelectObject(hdc, orig_brush);
1795 SetBrushOrgEx(hdc, 0, 0, NULL);
1796 SetTextColor(hdc, old_text);
1797 SetBkColor(hdc, old_bkgnd);
1799 /* Rectangle */
1801 SelectObject(hdc, solid_pen);
1802 SelectObject(hdc, solid_brush);
1804 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1806 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1809 SelectObject(hdc, dashed_pen);
1810 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1812 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1815 compare_hash(bmi, bits, sha1, "rectangles");
1816 memset(bits, 0xcc, dib_size);
1817 SelectObject(hdc, solid_pen);
1819 /* PaintRgn */
1821 PaintRgn(hdc, hrgn);
1822 compare_hash(bmi, bits, sha1, "PaintRgn");
1823 memset(bits, 0xcc, dib_size);
1825 /* RTL rectangles */
1827 if( !pSetLayout )
1829 win_skip("Don't have SetLayout\n");
1830 (*sha1)++;
1832 else
1834 pSetLayout(hdc, LAYOUT_RTL);
1835 PaintRgn(hdc, hrgn);
1836 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1837 Rectangle(hdc, 100, 250, 110, 260);
1838 compare_hash(bmi, bits, sha1, "rtl");
1839 memset(bits, 0xcc, dib_size);
1841 pSetLayout(hdc, LAYOUT_LTR);
1843 DeleteObject( hrgn );
1845 for(i = 0, y = 10; i < 256; i++)
1847 if(!rop_uses_src(rop3[i]))
1849 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1851 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1852 SelectObject(hdc, hatch_brush);
1853 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1854 ok(ret, "got FALSE for %x\n", rop3[i]);
1855 SelectObject(hdc, orig_brush);
1856 DeleteObject(hatch_brush);
1858 y += 25;
1862 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1863 memset(bits, 0xcc, dib_size);
1865 /* overlapping blits */
1867 orig_brush = SelectObject(hdc, solid_brush);
1869 Rectangle(hdc, 10, 10, 100, 100);
1870 Rectangle(hdc, 20, 15, 30, 40);
1871 Rectangle(hdc, 15, 15, 20, 20);
1872 Rectangle(hdc, 15, 20, 50, 45);
1873 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1874 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1875 memset(bits, 0xcc, dib_size);
1877 Rectangle(hdc, 10, 10, 100, 100);
1878 Rectangle(hdc, 20, 15, 30, 40);
1879 Rectangle(hdc, 15, 15, 20, 20);
1880 Rectangle(hdc, 15, 20, 50, 45);
1881 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1882 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1883 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1884 else
1885 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1886 memset(bits, 0xcc, dib_size);
1888 Rectangle(hdc, 10, 10, 100, 100);
1889 Rectangle(hdc, 20, 15, 30, 40);
1890 Rectangle(hdc, 15, 15, 20, 20);
1891 Rectangle(hdc, 15, 20, 50, 45);
1892 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1893 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1894 memset(bits, 0xcc, dib_size);
1896 Rectangle(hdc, 10, 10, 100, 100);
1897 Rectangle(hdc, 20, 15, 30, 40);
1898 Rectangle(hdc, 15, 15, 20, 20);
1899 Rectangle(hdc, 15, 20, 50, 45);
1900 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1901 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1902 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1903 else
1904 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1905 memset(bits, 0xcc, dib_size);
1907 Rectangle(hdc, 10, 10, 100, 100);
1908 Rectangle(hdc, 20, 15, 30, 40);
1909 Rectangle(hdc, 15, 15, 20, 20);
1910 Rectangle(hdc, 15, 20, 50, 45);
1911 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1912 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1913 memset(bits, 0xcc, dib_size);
1915 Rectangle(hdc, 10, 10, 100, 100);
1916 Rectangle(hdc, 20, 15, 30, 40);
1917 Rectangle(hdc, 15, 15, 20, 20);
1918 Rectangle(hdc, 15, 20, 50, 45);
1919 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1920 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1921 memset(bits, 0xcc, dib_size);
1923 Rectangle(hdc, 10, 10, 100, 100);
1924 Rectangle(hdc, 20, 15, 30, 40);
1925 Rectangle(hdc, 15, 15, 20, 20);
1926 Rectangle(hdc, 15, 20, 50, 45);
1927 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1928 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1929 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1930 else
1931 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1932 memset(bits, 0xcc, dib_size);
1934 Rectangle(hdc, 10, 10, 100, 100);
1935 Rectangle(hdc, 20, 15, 30, 40);
1936 Rectangle(hdc, 15, 15, 20, 20);
1937 Rectangle(hdc, 15, 20, 50, 45);
1938 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1939 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1940 memset(bits, 0xcc, dib_size);
1942 /* blitting with 32-bpp BI_RGB source */
1944 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1945 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1946 src_bi->bmiHeader.biHeight = 256;
1947 src_bi->bmiHeader.biWidth = 256;
1948 src_bi->bmiHeader.biBitCount = 32;
1949 src_bi->bmiHeader.biPlanes = 1;
1950 src_bi->bmiHeader.biCompression = BI_RGB;
1951 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1952 SelectObject( src_dc, bmp );
1953 for (y = 0; y < 256; y++)
1954 for (x = 0; x < 256; x++)
1956 BYTE a = (x + y) * 2;
1957 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1958 BYTE g = (BYTE)(x + y / 3) * a / 255;
1959 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1960 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1963 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1964 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1965 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1966 else
1967 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1968 memset(bits, 0xcc, dib_size);
1970 blend.SourceConstantAlpha = 0xd0;
1971 blend.AlphaFormat = 0;
1972 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1973 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1975 if (!pGdiAlphaBlend) (*sha1) += 2;
1976 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1978 else
1980 if (!pGdiAlphaBlend) (*sha1)++;
1981 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1983 memset(bits, 0xcc, dib_size);
1985 blend.SourceConstantAlpha = 0xb0;
1986 blend.AlphaFormat = AC_SRC_ALPHA;
1987 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1988 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1990 if (!pGdiAlphaBlend) (*sha1) += 2;
1991 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1993 else
1995 if (!pGdiAlphaBlend) (*sha1)++;
1996 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1998 memset(bits, 0xcc, dib_size);
2000 /* blitting with 32-bpp r10g10b10 source */
2002 src_bi->bmiHeader.biBitCount = 32;
2003 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2004 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2005 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2006 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2007 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2008 SelectObject( src_dc, bmp );
2009 for (y = 0; y < 256; y++)
2010 for (x = 0; x < 256; x++)
2012 WORD r = (7 * x + 3 * y) % 1024;
2013 WORD g = (11 * x + y / 3) % 1024;
2014 WORD b = (x / 3 + 9 * y) % 1024;
2015 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2018 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2019 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2020 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2021 else
2022 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2023 memset(bits, 0xcc, dib_size);
2025 /* blitting with 32-bpp b6g6r6 source */
2027 src_bi->bmiHeader.biBitCount = 32;
2028 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2029 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2030 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2031 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2032 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2033 SelectObject( src_dc, bmp );
2034 for (y = 0; y < 256; y++)
2035 for (x = 0; x < 256; x++)
2037 BYTE r = (y + 2 * x) % 64;
2038 BYTE g = (x + y / 3) % 64;
2039 BYTE b = (x / 3 + 2 * y) % 64;
2040 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2043 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2044 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2045 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2046 else
2047 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2048 memset(bits, 0xcc, dib_size);
2050 /* blitting with 24-bpp source */
2052 src_bi->bmiHeader.biBitCount = 24;
2053 src_bi->bmiHeader.biCompression = BI_RGB;
2054 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2055 DeleteObject( SelectObject( src_dc, bmp ) );
2056 for (y = 0; y < 256; y++)
2057 for (x = 0; x < 256; x++)
2059 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2060 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2061 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2064 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2065 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2066 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2067 else
2068 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
2069 memset(bits, 0xcc, dib_size);
2071 blend.SourceConstantAlpha = 0xe0;
2072 blend.AlphaFormat = 0;
2073 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2074 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2076 if (!pGdiAlphaBlend) (*sha1) += 2;
2077 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
2079 else
2081 if (!pGdiAlphaBlend) (*sha1)++;
2082 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2084 memset(bits, 0xcc, dib_size);
2086 /* blitting with 16-bpp BI_RGB source */
2088 src_bi->bmiHeader.biBitCount = 16;
2089 src_bi->bmiHeader.biCompression = BI_RGB;
2090 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2091 DeleteObject( SelectObject( src_dc, bmp ) );
2092 for (y = 0; y < 256; y++)
2093 for (x = 0; x < 256; x++)
2094 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2096 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2097 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2098 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2099 else
2100 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
2101 memset(bits, 0xcc, dib_size);
2103 /* blitting with 16-bpp b4g4r4 source */
2105 src_bi->bmiHeader.biBitCount = 16;
2106 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2107 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2108 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2109 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2110 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2111 DeleteObject( SelectObject( src_dc, bmp ) );
2112 for (y = 0; y < 256; y++)
2113 for (x = 0; x < 256; x++)
2114 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2116 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2117 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2118 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2119 else
2120 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2121 memset(bits, 0xcc, dib_size);
2123 /* blitting with 8-bpp source */
2125 src_bi->bmiHeader.biBitCount = 8;
2126 src_bi->bmiHeader.biCompression = BI_RGB;
2127 src_bi->bmiHeader.biClrUsed = 160;
2128 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2129 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2130 DeleteObject( SelectObject( src_dc, bmp ) );
2131 for (y = 0; y < 256; y++)
2132 for (x = 0; x < 256; x++)
2133 src_bits[y * 256 + x] = 3 * x + 5 * y;
2135 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2136 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
2137 memset(bits, 0xcc, dib_size);
2139 blend.SourceConstantAlpha = 0xd0;
2140 blend.AlphaFormat = 0;
2141 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2142 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2144 if (!pGdiAlphaBlend) (*sha1) += 2;
2145 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
2147 else
2149 if (!pGdiAlphaBlend) (*sha1)++;
2150 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2152 memset(bits, 0xcc, dib_size);
2154 /* blitting with 4-bpp source */
2156 src_bi->bmiHeader.biBitCount = 4;
2157 src_bi->bmiHeader.biClrUsed = 12;
2158 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2159 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2160 DeleteObject( SelectObject( src_dc, bmp ) );
2161 for (y = 0; y < 256; y++)
2162 for (x = 0; x < 256; x += 2)
2163 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2165 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2166 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
2167 memset(bits, 0xcc, dib_size);
2169 /* blitting with 1-bpp source */
2171 src_bi->bmiHeader.biBitCount = 1;
2172 src_bi->bmiHeader.biClrUsed = 0;
2173 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2174 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2175 DeleteObject( SelectObject( src_dc, bmp ) );
2176 for (y = 0; y < 256; y++)
2177 for (x = 0; x < 256; x += 8)
2178 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2180 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2181 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
2182 memset(bits, 0xcc, dib_size);
2184 blend.SourceConstantAlpha = 0x90;
2185 blend.AlphaFormat = 0;
2186 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2187 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2189 if (!pGdiAlphaBlend) (*sha1) += 2;
2190 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
2192 else
2194 if (!pGdiAlphaBlend) (*sha1)++;
2195 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
2197 memset(bits, 0xcc, dib_size);
2199 DeleteDC( src_dc );
2200 DeleteObject( bmp );
2202 /* RLE StretchDIBits */
2203 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2204 src_bi->bmiHeader.biWidth = 8;
2205 src_bi->bmiHeader.biHeight = 8;
2206 src_bi->bmiHeader.biPlanes = 1;
2207 src_bi->bmiHeader.biBitCount = 8;
2208 src_bi->bmiHeader.biCompression = BI_RLE8;
2209 src_bi->bmiHeader.biClrUsed = 0;
2210 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2212 for (i = 0; i < 256; i++)
2214 src_bi->bmiColors[i].rgbRed = i;
2215 src_bi->bmiColors[i].rgbGreen = i;
2216 src_bi->bmiColors[i].rgbBlue = i;
2217 src_bi->bmiColors[i].rgbReserved = 0;
2220 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2221 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2222 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2223 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2224 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2225 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
2226 memset(bits, 0xcc, dib_size);
2228 /* 32 bpp StretchDIBits */
2230 src_bi->bmiHeader.biWidth = 4;
2231 src_bi->bmiHeader.biHeight = 4;
2232 src_bi->bmiHeader.biPlanes = 1;
2233 src_bi->bmiHeader.biBitCount = 32;
2234 src_bi->bmiHeader.biCompression = BI_RGB;
2235 src_bi->bmiHeader.biClrUsed = 0;
2236 src_bi->bmiHeader.biSizeImage = 0;
2238 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2239 ok(ret == 4, "got %d\n", ret);
2240 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2241 ok(ret == 4, "got %d\n", ret);
2242 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2243 ok(ret == 4, "got %d\n", ret);
2244 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2245 ok(ret == 4, "got %d\n", ret);
2246 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2247 ok(ret == 4, "got %d\n", ret);
2248 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2249 ok(ret == 4, "got %d\n", ret);
2251 src_bi->bmiHeader.biHeight = -4;
2253 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2254 ok(ret == 4, "got %d\n", ret);
2255 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2256 ok(ret == -4, "got %d\n", ret);
2257 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2258 ok(ret == 4, "got %d\n", ret);
2259 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2260 ok(ret == -4, "got %d\n", ret);
2261 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2262 ok(ret == 4, "got %d\n", ret);
2263 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2264 ok(ret == -4, "got %d\n", ret);
2266 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2267 memset(bits, 0xcc, dib_size);
2269 /* Solid colors */
2270 for (i = 0; i < 256; i++)
2272 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2273 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2274 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2275 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2276 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2279 /* A few extra colors that are interesting in the 1bpp case */
2281 /* bk color */
2282 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2283 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2285 /* color 0 */
2286 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2287 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2289 /* color 1 */
2290 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2291 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2293 compare_hash(bmi, bits, sha1, "Colors");
2294 memset(bits, 0xcc, dib_size);
2296 for (i = 0; i < 256; i++)
2298 COLORREF s, g;
2299 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2300 g = GetPixel( hdc, i * 2, 10 );
2301 ok( s == g, "got %08x and %08x\n", s, g );
2303 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2304 g = GetPixel( hdc, i * 2, 20 );
2305 ok( s == g, "got %08x and %08x\n", s, g );
2307 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2308 g = GetPixel( hdc, i * 2, 30 );
2309 ok( s == g, "got %08x and %08x\n", s, g );
2311 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2312 g = GetPixel( hdc, i * 2, 40 );
2313 ok( s == g, "got %08x and %08x\n", s, g );
2315 for (j = 0; j < 256; j++)
2317 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2318 g = GetPixel( hdc, i * 2, 50+j );
2319 ok( s == g, "got %08x and %08x\n", s, g );
2321 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2322 g = GetPixel( hdc, i * 2 + 1, 50+j );
2323 ok( s == g, "got %08x and %08x\n", s, g );
2327 compare_hash(bmi, bits, sha1, "SetPixel");
2328 memset(bits, 0xcc, dib_size);
2330 /* gradients */
2332 if (pGdiGradientFill)
2334 TRIVERTEX vrect[] =
2336 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2337 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2338 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2339 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2341 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2343 TRIVERTEX vtri[] =
2345 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2346 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2347 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2349 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2350 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2351 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2353 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2354 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2355 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2357 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2358 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2359 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2361 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2362 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2363 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2365 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2366 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2367 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2369 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2370 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2371 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2373 GRADIENT_TRIANGLE tri[] =
2375 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2376 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2379 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2380 for (i = 0; i < 4; i++) vrect[i].y += 250;
2381 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2383 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2384 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2385 else
2386 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2387 memset(bits, 0xcc, dib_size);
2389 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2390 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2391 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2392 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2393 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2394 else
2395 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2396 memset(bits, 0xcc, dib_size);
2398 else
2400 win_skip( "GdiGradientFill not supported\n" );
2401 *sha1 += 2;
2404 /* wide pen */
2406 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2407 SelectObject( hdc, wide_pen );
2409 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2411 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2412 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2415 compare_hash(bmi, bits, sha1, "wide pen" );
2416 memset(bits, 0xcc, dib_size);
2418 SelectObject( hdc, orig_pen );
2419 DeleteObject( wide_pen );
2421 log_brush.lbStyle = BS_SOLID;
2422 log_brush.lbColor = RGB(0xff, 0, 0);
2423 log_brush.lbHatch = 0;
2425 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2426 9, &log_brush, 0, NULL );
2427 SelectObject( hdc, wide_pen );
2429 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2430 compare_hash(bmi, bits, sha1, "wide pen - flat caps, mitred" );
2431 memset(bits, 0xcc, dib_size);
2433 SelectObject( hdc, orig_pen );
2434 DeleteObject( wide_pen );
2436 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2437 16, &log_brush, 0, NULL );
2438 SelectObject( hdc, wide_pen );
2440 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2441 compare_hash(bmi, bits, sha1, "wide pen - square caps, bevelled" );
2442 memset(bits, 0xcc, dib_size);
2444 SelectObject( hdc, orig_pen );
2445 DeleteObject( wide_pen );
2447 /* brushed wide pen */
2449 old_text = GetTextColor( hdc );
2450 old_bkgnd = GetBkColor( hdc );
2451 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2452 log_brush.lbStyle = BS_PATTERN;
2453 log_brush.lbColor = 0;
2454 log_brush.lbHatch = (ULONG_PTR)bmp;
2455 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2456 12, &log_brush, 0, NULL );
2457 ok( wide_pen != 0, "failed to create pen\n" );
2458 SelectObject( hdc, wide_pen );
2459 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2461 for (i = 1; i < 20; i++)
2463 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2464 i, &log_brush, 0, NULL );
2465 ok( wide_pen != 0, "failed to create pen\n" );
2466 DeleteObject( SelectObject( hdc, wide_pen ));
2467 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2468 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2469 MoveToEx( hdc, 10 * i, 10, NULL );
2470 LineTo( hdc, 10 * i, 200 + i );
2471 LineTo( hdc, 20 * i, 200 + i );
2473 /* NT4 broken for all cases, W2K for 1 bpp only */
2474 compare_hash_broken_todo( bmi, bits, sha1, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2475 memset(bits, 0xcc, dib_size);
2477 for (i = 1; i < 20; i++)
2479 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2480 i, &log_brush, 0, NULL );
2481 DeleteObject( SelectObject( hdc, wide_pen ));
2482 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2483 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2484 MoveToEx( hdc, 10 * i, 10, NULL );
2485 LineTo( hdc, 10 * i, 200 + i );
2486 LineTo( hdc, 20 * i, 200 + i );
2488 /* NT4 broken for all cases, W2K for 1 bpp only */
2489 compare_hash_broken_todo( bmi, bits, sha1, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2490 memset(bits, 0xcc, dib_size);
2492 DeleteObject(bmp);
2493 SetTextColor(hdc, old_text);
2494 SetBkColor(hdc, old_bkgnd);
2495 SelectObject( hdc, orig_pen );
2497 /* PALETTEINDEX */
2499 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2500 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2501 SetTextColor( hdc, PALETTEINDEX(38) );
2502 SetBkColor( hdc, PALETTEINDEX(9) );
2503 SelectObject( hdc, solid_brush );
2504 SelectObject( hdc, solid_pen );
2506 pal->palVersion = 0x300;
2507 pal->palNumEntries = 40;
2508 for (i = 0; i < 80; i++)
2510 entries[i].peRed = i * 3;
2511 entries[i].peGreen = i * 7;
2512 entries[i].peBlue = 128 - i;
2513 entries[i].peFlags = 0;
2515 hpal = CreatePalette( pal );
2516 SelectPalette( hdc, hpal, FALSE );
2518 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2519 Rectangle( hdc, 0, 0, 10, 10 );
2520 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2521 Rectangle( hdc, 10, 0, 10, 10 );
2522 SelectObject( hdc, orig_brush );
2523 DeleteObject( solid_brush );
2525 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2526 DeleteObject( SelectObject( hdc, solid_brush ));
2527 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2528 SetPaletteEntries( hpal, 0, 40, entries );
2529 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2530 SelectObject( hdc, orig_brush );
2531 DeleteObject( solid_brush );
2533 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2534 dib_brush = CreatePatternBrush( bmp );
2535 SelectObject( hdc, dib_brush );
2536 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2537 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2538 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2539 DeleteObject( bmp );
2540 SelectObject( hdc, orig_brush );
2541 DeleteObject( dib_brush );
2543 SelectPalette( hdc, GetStockObject(DEFAULT_PALETTE), FALSE );
2544 DeleteObject( hpal );
2546 /* NT4 broken for all cases, W2K for 1 bpp only */
2547 compare_hash_broken_todo(bmi, bits, sha1, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2548 memset(bits, 0xcc, dib_size);
2550 /* ExtFloodFill */
2552 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2553 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2554 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2555 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2556 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2558 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2559 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2560 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2561 DeleteObject( hrgn );
2563 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2564 SelectObject( hdc, solid_brush );
2566 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2567 ok (!ret == !!dib_is_1bpp, "got ret %d\n", ret);
2568 compare_hash(bmi, bits, sha1, "flood fill" );
2569 memset(bits, 0xcc, dib_size);
2571 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2573 SelectObject(hdc, orig_brush);
2574 SelectObject(hdc, orig_pen);
2575 DeleteObject(dib_brush);
2576 DeleteObject(solid_brush);
2577 DeleteObject(wide_pen);
2578 DeleteObject(dashed_pen);
2579 DeleteObject(solid_pen);
2582 static const BYTE ramp[17] =
2584 0, 0x4d, 0x68, 0x7c,
2585 0x8c, 0x9a, 0xa7, 0xb2,
2586 0xbd, 0xc7, 0xd0, 0xd9,
2587 0xe1, 0xe9, 0xf0, 0xf8,
2588 0xff
2591 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2593 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2594 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2597 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2599 BYTE min_comp, max_comp;
2601 if (alpha == 16) return text;
2602 if (alpha <= 1) return dst;
2603 if (text == dst) return dst;
2605 get_range( alpha, text, &min_comp, &max_comp );
2607 if (dst > text)
2609 DWORD diff = dst - text;
2610 DWORD range = max_comp - text;
2611 dst = text + (diff * range ) / (0xff - text);
2612 return dst;
2614 else
2616 DWORD diff = text - dst;
2617 DWORD range = text - min_comp ;
2618 dst = text - (diff * range) / text;
2619 return dst;
2623 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2625 COLORREF ret;
2627 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2628 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2629 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2630 return ret;
2633 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2635 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2637 DWORD dib_size = get_dib_size(bmi), ret;
2638 LOGFONT lf;
2639 HFONT font;
2640 GLYPHMETRICS gm;
2641 BYTE g_buf[10000];
2642 int i, stride, x, y;
2643 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2644 char *eto_hash = NULL, *diy_hash = NULL;
2645 static const char *str = "Hello Wine";
2646 POINT origin, g_org;
2647 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2648 TEXTMETRIC tm;
2649 COLORREF text_color;
2651 for(i = 0; i < dib_size; i++)
2652 bits[i] = vals[i % 4];
2654 memset( &lf, 0, sizeof(lf) );
2655 strcpy( lf.lfFaceName, "Tahoma" );
2656 lf.lfHeight = 24;
2657 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2659 font = CreateFontIndirect( &lf );
2660 font = SelectObject( hdc, font );
2662 GetTextMetrics( hdc, &tm );
2663 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2665 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2666 DeleteObject( SelectObject( hdc, font ) );
2667 return;
2670 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2671 SetTextAlign( hdc, TA_BASELINE );
2672 SetBkMode( hdc, TRANSPARENT );
2673 origin.x = 10;
2674 origin.y = 100;
2676 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2677 eto_hash = hash_dib( bmi, bits );
2679 for(i = 0; i < dib_size; i++)
2680 bits[i] = vals[i % 4];
2682 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2684 text_color = GetTextColor( hdc );
2685 for (i = 0; i < strlen(str); i++)
2687 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2689 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2691 if (ret == GDI_ERROR) continue;
2693 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2695 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2696 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2698 origin.x += gm.gmCellIncX;
2699 origin.y += gm.gmCellIncY;
2701 if (!ret) continue;
2703 if (aa)
2705 stride = (gm.gmBlackBoxX + 3) & ~3;
2707 for (y = 0; y < gm.gmBlackBoxY; y++)
2709 BYTE *g_ptr = g_buf + y * stride;
2710 COLORREF val;
2712 for (x = 0; x < gm.gmBlackBoxX; x++)
2714 if (g_ptr[x] <= 1) continue;
2715 if (g_ptr[x] >= 16) val = text_color;
2716 else
2718 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2719 val = aa_colorref( val, text_color, g_ptr[x] );
2721 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2725 else
2727 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2729 for (y = 0; y < gm.gmBlackBoxY; y++)
2731 BYTE *g_ptr = g_buf + y * stride;
2732 for (x = 0; x < gm.gmBlackBoxX; x++)
2734 if (g_ptr[x / 8] & masks[x % 8])
2735 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2741 diy_hash = hash_dib( bmi, bits );
2742 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2744 HeapFree( GetProcessHeap(), 0, diy_hash );
2745 HeapFree( GetProcessHeap(), 0, eto_hash );
2747 font = SelectObject( hdc, font );
2748 DeleteObject( font );
2751 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2753 draw_text_2( hdc, bmi, bits, FALSE );
2755 /* Rounding errors make these cases hard to test */
2756 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2757 (bmi->bmiHeader.biBitCount == 16))
2758 return;
2760 draw_text_2( hdc, bmi, bits, TRUE );
2763 static void test_simple_graphics(void)
2765 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2766 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2767 RGBQUAD *colors = bmi->bmiColors;
2768 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2769 HDC mem_dc;
2770 BYTE *bits;
2771 HBITMAP dib, orig_bm;
2772 const char **sha1;
2773 DIBSECTION ds;
2774 int i;
2776 mem_dc = CreateCompatibleDC(NULL);
2778 /* a8r8g8b8 */
2779 trace("8888\n");
2780 memset(bmi, 0, sizeof(bmibuf));
2781 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2782 bmi->bmiHeader.biHeight = 512;
2783 bmi->bmiHeader.biWidth = 512;
2784 bmi->bmiHeader.biBitCount = 32;
2785 bmi->bmiHeader.biPlanes = 1;
2786 bmi->bmiHeader.biCompression = BI_RGB;
2788 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2789 ok(dib != NULL, "ret NULL\n");
2790 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2791 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2792 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2793 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2794 ok(ds.dsBmih.biCompression == BI_RGB ||
2795 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2796 "got %x\n", ds.dsBmih.biCompression);
2798 orig_bm = SelectObject(mem_dc, dib);
2800 dst_format = "8888";
2801 sha1 = sha1_graphics_a8r8g8b8;
2802 draw_graphics(mem_dc, bmi, bits, &sha1);
2803 draw_text(mem_dc, bmi, bits);
2805 SelectObject(mem_dc, orig_bm);
2806 DeleteObject(dib);
2808 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2809 trace("8888 - bitfields\n");
2810 bmi->bmiHeader.biBitCount = 32;
2811 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2812 bit_fields[0] = 0xff0000;
2813 bit_fields[1] = 0x00ff00;
2814 bit_fields[2] = 0x0000ff;
2816 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2817 ok(dib != NULL, "ret NULL\n");
2818 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2819 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2820 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2821 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2822 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2824 orig_bm = SelectObject(mem_dc, dib);
2826 dst_format = "8888 - bitfields";
2827 sha1 = sha1_graphics_a8r8g8b8_bitfields;
2828 draw_graphics(mem_dc, bmi, bits, &sha1);
2829 draw_text(mem_dc, bmi, bits);
2831 SelectObject(mem_dc, orig_bm);
2832 DeleteObject(dib);
2834 /* a8b8g8r8. */
2835 trace("a8b8g8r8\n");
2836 bmi->bmiHeader.biBitCount = 32;
2837 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2838 bit_fields[0] = 0x0000ff;
2839 bit_fields[1] = 0x00ff00;
2840 bit_fields[2] = 0xff0000;
2842 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2843 ok(dib != NULL, "ret NULL\n");
2844 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2845 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2846 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2847 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2848 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2850 orig_bm = SelectObject(mem_dc, dib);
2852 dst_format = "a8b8g8r8";
2853 sha1 = sha1_graphics_a8b8g8r8;
2854 draw_graphics(mem_dc, bmi, bits, &sha1);
2855 draw_text(mem_dc, bmi, bits);
2857 SelectObject(mem_dc, orig_bm);
2858 DeleteObject(dib);
2860 /* r10g10b10. */
2861 trace("r10g10b10\n");
2862 bmi->bmiHeader.biBitCount = 32;
2863 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2864 bit_fields[0] = 0x3ff00000;
2865 bit_fields[1] = 0x000ffc00;
2866 bit_fields[2] = 0x000003ff;
2868 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2869 ok(dib != NULL, "ret NULL\n");
2870 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2871 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2872 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2873 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2874 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2876 orig_bm = SelectObject(mem_dc, dib);
2878 dst_format = "r10g10b10";
2879 sha1 = sha1_graphics_r10g10b10;
2880 draw_graphics(mem_dc, bmi, bits, &sha1);
2881 draw_text(mem_dc, bmi, bits);
2883 SelectObject(mem_dc, orig_bm);
2884 DeleteObject(dib);
2886 /* r6g6b6. */
2887 trace("r6g6b6\n");
2888 bmi->bmiHeader.biBitCount = 32;
2889 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2890 bit_fields[0] = 0x0003f000;
2891 bit_fields[1] = 0x00000fc0;
2892 bit_fields[2] = 0x0000003f;
2894 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2895 ok(dib != NULL, "ret NULL\n");
2896 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2897 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2898 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2899 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2900 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2902 orig_bm = SelectObject(mem_dc, dib);
2904 dst_format = "r6g6b6";
2905 sha1 = sha1_graphics_r6g6b6;
2906 draw_graphics(mem_dc, bmi, bits, &sha1);
2907 draw_text(mem_dc, bmi, bits);
2909 SelectObject(mem_dc, orig_bm);
2910 DeleteObject(dib);
2912 /* 24 */
2913 trace("24\n");
2914 bmi->bmiHeader.biBitCount = 24;
2915 bmi->bmiHeader.biCompression = BI_RGB;
2917 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2918 ok(dib != NULL, "ret NULL\n");
2919 orig_bm = SelectObject(mem_dc, dib);
2921 dst_format = "24";
2922 sha1 = sha1_graphics_24;
2923 draw_graphics(mem_dc, bmi, bits, &sha1);
2924 draw_text(mem_dc, bmi, bits);
2926 SelectObject(mem_dc, orig_bm);
2927 DeleteObject(dib);
2929 /* r5g5b5 */
2930 trace("555\n");
2931 bmi->bmiHeader.biBitCount = 16;
2932 bmi->bmiHeader.biCompression = BI_RGB;
2934 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2935 ok(dib != NULL, "ret NULL\n");
2936 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2937 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2938 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2939 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2940 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2942 orig_bm = SelectObject(mem_dc, dib);
2944 dst_format = "r5g5b5";
2945 sha1 = sha1_graphics_r5g5b5;
2946 draw_graphics(mem_dc, bmi, bits, &sha1);
2947 draw_text(mem_dc, bmi, bits);
2949 SelectObject(mem_dc, orig_bm);
2950 DeleteObject(dib);
2952 /* r4g4b4 */
2953 trace("444\n");
2954 bmi->bmiHeader.biBitCount = 16;
2955 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2956 bit_fields[0] = 0x0f00;
2957 bit_fields[1] = 0x00f0;
2958 bit_fields[2] = 0x000f;
2959 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2960 ok(dib != NULL, "ret NULL\n");
2961 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2962 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2963 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2964 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2965 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2967 orig_bm = SelectObject(mem_dc, dib);
2969 dst_format = "r4g4b4";
2970 sha1 = sha1_graphics_r4g4b4;
2971 draw_graphics(mem_dc, bmi, bits, &sha1);
2972 draw_text(mem_dc, bmi, bits);
2974 SelectObject(mem_dc, orig_bm);
2975 DeleteObject(dib);
2977 /* 8 color */
2978 trace("8 color\n");
2979 bmi->bmiHeader.biBitCount = 8;
2980 bmi->bmiHeader.biCompression = BI_RGB;
2981 bmi->bmiHeader.biClrUsed = 236;
2982 for (i = 0; i < 236; i++)
2984 colors[i].rgbRed = (i & 0x07) << 5;
2985 colors[i].rgbGreen = (i & 0x38) << 2;
2986 colors[i].rgbBlue = i & 0xc0;
2988 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2989 ok(dib != NULL, "ret NULL\n");
2991 orig_bm = SelectObject(mem_dc, dib);
2993 dst_format = "8 color";
2994 sha1 = sha1_graphics_8_color;
2995 draw_graphics(mem_dc, bmi, bits, &sha1);
2996 draw_text(mem_dc, bmi, bits);
2998 SelectObject(mem_dc, orig_bm);
2999 DeleteObject(dib);
3001 /* 8 grayscale */
3002 trace("8 grayscale\n");
3003 bmi->bmiHeader.biBitCount = 8;
3004 bmi->bmiHeader.biCompression = BI_RGB;
3005 bmi->bmiHeader.biClrUsed = 256;
3006 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3008 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3009 ok(dib != NULL, "ret NULL\n");
3011 orig_bm = SelectObject(mem_dc, dib);
3013 dst_format = "8 grayscale";
3014 sha1 = sha1_graphics_8_grayscale;
3015 draw_graphics(mem_dc, bmi, bits, &sha1);
3016 draw_text(mem_dc, bmi, bits);
3018 SelectObject(mem_dc, orig_bm);
3019 DeleteObject(dib);
3021 /* 8 */
3022 trace("8\n");
3023 bmi->bmiHeader.biBitCount = 8;
3024 bmi->bmiHeader.biCompression = BI_RGB;
3025 bmi->bmiHeader.biClrUsed = 5;
3026 colors[0].rgbRed = 0xff;
3027 colors[0].rgbGreen = 0xff;
3028 colors[0].rgbBlue = 0xff;
3029 colors[1].rgbRed = 0;
3030 colors[1].rgbGreen = 0;
3031 colors[1].rgbBlue = 0;
3032 colors[2].rgbRed = 0xff;
3033 colors[2].rgbGreen = 0;
3034 colors[2].rgbBlue = 0;
3035 colors[3].rgbRed = 0;
3036 colors[3].rgbGreen = 0xff;
3037 colors[3].rgbBlue = 0;
3038 colors[4].rgbRed = 0;
3039 colors[4].rgbGreen = 0;
3040 colors[4].rgbBlue = 0xff;
3042 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3043 ok(dib != NULL, "ret NULL\n");
3045 orig_bm = SelectObject(mem_dc, dib);
3047 dst_format = "8";
3048 sha1 = sha1_graphics_8;
3049 draw_graphics(mem_dc, bmi, bits, &sha1);
3050 draw_text(mem_dc, bmi, bits);
3052 SelectObject(mem_dc, orig_bm);
3053 DeleteObject(dib);
3055 /* 4 */
3056 trace("4\n");
3057 bmi->bmiHeader.biBitCount = 4;
3059 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3060 ok(dib != NULL, "ret NULL\n");
3062 orig_bm = SelectObject(mem_dc, dib);
3064 dst_format = "4";
3065 sha1 = sha1_graphics_4;
3066 draw_graphics(mem_dc, bmi, bits, &sha1);
3067 draw_text(mem_dc, bmi, bits);
3069 SelectObject(mem_dc, orig_bm);
3070 DeleteObject(dib);
3072 /* 4 grayscale */
3073 trace("4 grayscale\n");
3074 bmi->bmiHeader.biClrUsed = 16;
3075 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3077 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3078 ok(dib != NULL, "ret NULL\n");
3080 orig_bm = SelectObject(mem_dc, dib);
3082 dst_format = "4 grayscale";
3083 sha1 = sha1_graphics_4_grayscale;
3084 draw_graphics(mem_dc, bmi, bits, &sha1);
3085 draw_text(mem_dc, bmi, bits);
3087 SelectObject(mem_dc, orig_bm);
3088 DeleteObject(dib);
3090 /* 1 */
3091 trace("1\n");
3092 bmi->bmiHeader.biBitCount = 1;
3093 bmi->bmiHeader.biClrUsed = 2;
3095 colors[0].rgbRed = 0x00;
3096 colors[0].rgbGreen = 0x01;
3097 colors[0].rgbBlue = 0xff;
3098 colors[1].rgbRed = 0xff;
3099 colors[1].rgbGreen = 0x00;
3100 colors[1].rgbBlue = 0x00;
3102 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3103 ok(dib != NULL, "ret NULL\n");
3105 orig_bm = SelectObject(mem_dc, dib);
3107 dst_format = "1";
3108 sha1 = sha1_graphics_1;
3109 draw_graphics(mem_dc, bmi, bits, &sha1);
3110 draw_text(mem_dc, bmi, bits);
3112 SelectObject(mem_dc, orig_bm);
3113 DeleteObject(dib);
3115 DeleteDC(mem_dc);
3118 START_TEST(dib)
3120 HMODULE mod = GetModuleHandleA("gdi32.dll");
3121 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3122 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3123 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3125 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3127 test_simple_graphics();
3129 CryptReleaseContext(crypt_prov, 0);