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
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",
151 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
153 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
154 "2426172d9e8fec27d9228088f382ef3c93717da9",
155 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
156 "664fac17803859a4015c6ae29e5538e314d5c827",
157 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
158 "fe6cc678fb13a3ead67839481bf22348adc69f52",
159 "d51bd330cec510cdccf5394328bd8e5411901e9e",
160 "df4aebf98d91f11be560dd232123b3ae327303d7",
161 "f2af53dd073a09b1031d0032d28da35c82adc566",
162 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
163 "c387917268455017aa0b28bed73aa6554044bbb3",
164 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
165 "6c530622a025d872a642e8f950867884d7b136cb",
166 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
167 "b2261353decda2712b83538ab434a49ce21f3172",
168 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
169 "9b9874c1c1d92afa554137e191d34ea33acc322f",
170 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
171 "d7398de15b2837a58a62a701ca1b3384625afec4",
172 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
173 "5246ef357e7317b9d141a3294d300c195da76cb7",
174 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
175 "3d8244b665ecdb104087bad171b0b0f83545133c",
176 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
177 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
178 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
179 "e358efb1c11172e40855de620bdb8a8e545cd790",
180 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
181 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
182 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
183 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
184 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
185 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
186 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
187 "94645300d6eb51020a7ef8261dee2941cd51b5df",
188 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
189 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
190 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
191 "68c18db6abfda626cab12d198298d4c39264bfbc",
192 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
193 "39c31de73aafcfcadf0bf414da4495be9de54417",
194 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
195 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
196 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
197 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
198 "3d2ccbe51408232a04769546b1bdd74f84558a41",
199 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
200 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
201 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
202 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
203 "d7dd4700f49808541bba99244b7eb5840e0a2439",
204 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
205 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
206 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
207 "a1fde1094d2c19ddb20871842dae1da73618709e",
208 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
209 "b2c8e1ebb9435031fe068442f479d1304096e79f",
210 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
211 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
212 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
213 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
214 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
215 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
216 "f451a05f699ac3bbe155d059e7871a2636887b5f",
217 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
218 "dccaef62738ff90da4554a85d8cb846d6436799e",
222 static const char *sha1_graphics_a8b8g8r8[] =
224 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
225 "e0bc877697093ed440e125154e247ca9d65e933c",
226 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
227 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
228 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
229 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
230 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
231 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
232 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
233 "b753ebb39d90210cc717f57b53dd439f7de6b077",
234 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
235 "94368cea5033b435454daa56d55546310675131e",
236 "bf57a6a37fb107d29ed3d45695919887abcb7902",
237 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
238 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
239 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
240 "b0178632775d29bec2b16de7b9b8287115c40d0f",
241 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
242 "3369889a67d6c79a24ee15f7d14374f9995215e4",
243 "473a1fd07df800c87a5d3286b642ace10c61c6af",
244 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
245 "b8951d2b20518fd129e5113a5f429626893913bf",
246 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
247 "4851c5b7d5bc18590e787c0c218a592ef504e738",
248 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
249 "abdf003699364fe45fab7dc61e67c606d0063b40",
250 "89abaadff4e68c738cf9251c51e3609564843381",
251 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
252 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
253 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
254 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
255 "71b9756fdfeedce1e6db201176d21a981b881662",
256 "5319528d9af750c172ae62ee85ddb2eaef73b193",
257 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
258 "19b32a0daa91201725b5e13820c343d0a84ff698",
259 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
260 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
261 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
262 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
263 "8566c1110ab5cb8f754787b47923c8bff38f790c",
264 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
265 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
266 "d01071c44259adc94b89978b7d51a058b6dad665",
267 "e6d33b106bcda374e662d338c57a457dbcaa108a",
268 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
269 "339908a568f384e1f384a3e1b0dd415779203b02",
270 "88fd743d00bd37d2ed722092146795b044d08a6e",
271 "c0537ec24147e74939219213d864ee113cad9967",
272 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
273 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
274 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
275 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
276 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
277 "1cb1810b127f509117b38d62a15b67b2347b9145",
278 "f05b3294f25de5fa6d1114104bca97871052ea5a",
279 "87f57a31253a38dbf3dc3070473328fa04b68a48",
280 "db64cc4d830fc35ed170b53943e722b2342954d4",
281 "9988ceca44dafbee247aece1f027c06c27c01652",
282 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
283 "b76e0724496e471b01ef8b34f8beba69f5bde261",
284 "693f5c5fbaeaadb5928d34b035499626fecb8394",
285 "8a9aa84c42dedc3e681191a1229846887ed262ec",
286 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
287 "707bc44fc9fed68ff1f537f0473e0cd825dd660f",
288 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
289 "175a7bcb73c74eceecc000657a0100bccf158ff4",
293 static const char *sha1_graphics_r10g10b10[] =
295 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
296 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
297 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
298 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
299 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
300 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
301 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
302 "0ad27de0c916c073d0d18484fff899bbdb258db7",
303 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
304 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
305 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
306 "2986b431a0022153e5f875da77cc792e3825ebd5",
307 "ca4b25a5459885ce1e0a36844612087893d425b1",
308 "181bd4616796d89174cedc0332fb320b65aeb0e2",
309 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
310 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
311 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
312 "536eaaa901d652805a8977ecb2dc73f651094c5b",
313 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
314 "92cddcabf5365eef1e037f488af52b31669d987f",
315 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
316 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
317 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
318 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
319 "d578210815e27fe210eb678a71e6d22ba4b4c196",
320 "c7a027c7079dfcc831ca8bc134a509958273073c",
321 "19cf978596195b848df8709aaf637f83f92b8336",
322 "798a835fe50156eeb478c0a6085b088f53409d52",
323 "86ddf268d854f37e5b478c48792b551b57635db6",
324 "8259d388e02542207b6a08d65d553871ce1c4a09",
325 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
326 "66f8d78d4971934794478afee28b3a50e97f1b82",
327 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
328 "63798fb175afef78fa8fe8133d9de97a0cc80651",
329 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
330 "1ceb85697f649a62b1753438daa14944af7f450c",
331 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
332 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
333 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
334 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
335 "ada202d2f526f6995f83412479891c1764b66e5a",
336 "68348e8f54883f4fe295354b024e291c85f1038f",
337 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
338 "e9167564031ead3459eee6a3ebb2f58f100d931f",
339 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
340 "46196f50297260df2863e2fa76d2dfcf72006c23",
341 "0790585dfaef94f912b1ee81477d4ac448708708",
342 "589fb8a85d924ad19ed78409ae89475ba479c30a",
343 "43d67bc61ef54014b022891e5c024fc24b1fe797",
344 "e8783644428b637adbe80bcd084a33428cb69983",
345 "fc0c32afb719295f28bcfef22803bef94f798e20",
346 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
347 "d3f08946300e1700865042aed121870e292d1095",
348 "467ff4af1e105855874f27fbf84d1d2b0417ab5d",
349 "fb0dcff8a67a88313557ee8b588aaa2004fe7b8b",
350 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
351 "317521e576801acaea62c76fe16813cdfe20f4ad",
352 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
353 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
354 "555b6f04ba8dec9e2a60693dcaac594227052727",
355 "4238fe9d296b5c72b0a8745cc761f308605b2094",
356 "943dc6033ab335a6a63e666f70a6bb3a0677e157",
357 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
358 "88cfa7b7c1487f8eda05fce92b622942c9fb7ca4",
359 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
360 "ad91dde8566dceaadc3523cdc8149cd7415a1b70",
364 static const char *sha1_graphics_r6g6b6[] =
366 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
367 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
368 "5b9dab3d8411afb25fbbeba0313db526815ac189",
369 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
370 "2028d1b0d1acef35dc07027135023f35fb9746b9",
371 "378713720dcb5aadb730435ad0989a68ab189114",
372 "084152773feb01a85df6006f2f4f288a1442d37a",
373 "97b824953f60fc9a91028045baacbe7b7dc82b14",
374 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
375 "287d755448e72e29e4812193e2b6f8098a214d82",
376 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
377 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
378 "e51bcf80211cd06e7d10225534b7a79b5454be27",
379 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
380 "0b94e0a5b739ab0020130646522e53da35a149ad",
381 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
382 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
383 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
384 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
385 "2128157e601ef0d6b3636b7387d3b28e876de728",
386 "8bdcdcd463f0052279d070ac763757f4db975483",
387 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
388 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
389 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
390 "66b130f83381957cfc4763558c5f5cddf2e3b564",
391 "d548135ce2320499277ce12b80bc35004f8a9787",
392 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
393 "1906ddfd829e735af49245171f8eb7673295d399",
394 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
395 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
396 "defd95a10d44cad6e736542920b74efd53e9e7eb",
397 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
398 "3f11a735e52030aa3d0f024d83803698293d10e5",
399 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
400 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
401 "3231c4d87faefb7ec5bd377613969c05b70343fc",
402 "00394e438e9edde978e88602c9ad2a572e965bf6",
403 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
404 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
405 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
406 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
407 "3d6cf3753390a05504b1f50302f767df443f0f40",
408 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
409 "da9e896a3a98b330980152b2e4a43cb6e686c730",
410 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
411 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
412 "47499ad13b719de18c59c2bc9b38ed578db50b95",
413 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
414 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
415 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
416 "49341c297a887186bd47d7465d827ab3147f05e3",
417 "325279e76367200d3fd7194d81c09fd139988ece",
418 "c3def160a1e847605ff0fc7edd30397fa90635a0",
419 "a9c2158329c207638cfd2c82cd8a6218efdb28d2",
420 "7f0c4e6874f0c36cee64ff5dec76258ca8822cb2",
421 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
422 "77ea86e51a94b11a8081b29696cb4115687843e3",
423 "d67b897cad72d31e75359094007b1346fd8806ea",
424 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
425 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
426 "481337fbedf181d4324bf7f8299b0327197ff468",
427 "9ab957870fa4e17aec6a79bc1a4fdb42a5ffcc30",
428 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
429 "8e32ea3614c3b20899d748db48258761c7158d2b",
430 "5da35bad12e3e9b26a0444d30820099481281e45",
431 "94f004e98ae8035af948611770a4a2dd6643f510",
435 static const char *sha1_graphics_24[] =
437 "e993b15c9bd14fb45a15310450b7083c44e42665",
438 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
439 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
440 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
441 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
442 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
443 "fd4be592483623dbc800fe28210a1f0daa71999b",
444 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
445 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
446 "883bc8f305c602edca785e21cd00f488583fb13f",
447 "3bac4e80993f49dc3926e30524115fca9d7a8026",
448 "91369e35be29059a0665782541db4c8b324c6bb2",
449 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
450 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
451 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
452 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
453 "5068bff794553cf5a3145ae407c9a2984357844c",
454 "413a7989969c229dee4ab1798362f32f96cf0a10",
455 "0bb222e540b82720d4971e4a2fc626899af03e03",
456 "adc20832d8c43f1cf372d8392535492013cd2306",
457 "45649794dcbcabda487f66f7a80fc1bec79047a1",
458 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
459 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
460 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
461 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
462 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
463 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
464 "92a1ab214dd8027c407814420449119466c92840",
465 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
466 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
467 "955390669afed2369b15b32fa519f2f921cdf1a0",
468 "201906f7d763b930a98c97f8eeab417f2b65e723",
469 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
470 "701c5af1d0c28294ce7d804b5697643c430d22a0",
471 "b0a959745b2db1d9f449e68e4479a4f36301879c",
472 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
473 "e171f6ec77bca91d6b8559911bce296c0bac469e",
474 "9725669042ef68acb408404d196496d10340bb5a",
475 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
476 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
477 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
478 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
479 "0f79500eda467cd3cbc220abdd37b5dba695d654",
480 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
481 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
482 "7d479beeb6758c164566638b5c873c188d6a91e7",
483 "80086808fca03e757d812e31d1ae576bf90dac9d",
484 "9560096f1b85ae6d939d736165c44df00a47c424",
485 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
486 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
487 "b25ba91487ec945410deb2b51bc1156890c032a8",
488 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
489 "ee315634ed92da3a32c2675ecd1b369471c60936",
490 "6776e0612410e7e200c853721b4ab6ad8b6b81f5",
491 "620a5a520d81971a2d9c30b8d836ba696e11b8dd",
492 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
493 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
494 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
495 "bf5ec23456efe00e1e0931c17de9040ab2092858",
496 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
497 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
498 "e96b79bf88988b5694a04dfc3bd0029361b39801",
499 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
500 "09cb4ab070083144bed4271c0a2a34ccb6ed13c0",
501 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
502 "c95afd0a020e68a76982fe8663b5d64113987233",
506 static const char *sha1_graphics_r5g5b5[] =
508 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
509 "847005cf7371f511bcc837251cde07b1796f6113",
510 "a8f75743a930843ec14d516cd048b6e0468e5d89",
511 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
512 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
513 "a9034a905daa91757b4f63345c0e40638cd53ca8",
514 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
515 "99474fecf11df7b7035c35be6b8b697be9889418",
516 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
517 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
518 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
519 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
520 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
521 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
522 "449092689226a1172b6086ba1181d6b6d6499f26",
523 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
524 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
525 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
526 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
527 "6daaf945a955928c5c124c880522ca4634fb2343",
528 "12a288390d16e1efa99d4185301de48a4d433b14",
529 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
530 "1d3af561605fd61433035600d8962cb8d266fdd0",
531 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
532 "d7d97e28ed316f6596c737eb83baa5948d86b673",
533 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
534 "656bf3b7121bcd620a0a3ad488f0d66604824577",
535 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
536 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
537 "a49530722328ae88fd765792ac0c657efbcce75d",
538 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
539 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
540 "a6fd83542c3826132e88d3f5e304d604c0056fad",
541 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
542 "e428d213ad02651287894f093413949dcb369208",
543 "7df915bedcc5951a1b6f828490f7dbb93212e835",
544 "645dc251d205139282b17eb7bece1055fff3bcd0",
545 "76215275593631f5900aad3616d725733dc39493",
546 "81655a550703849a616d4a16504bb9c6f999285f",
547 "573d65665d20f00d36d9782ae2b89772140524ab",
548 "619414c1b33ac60cb0c0de61df86245d472259b0",
549 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
550 "2a66dae03890ff791eabb982949435adb19af02b",
551 "24ac219478ba406f30794550690486b14cbac5e8",
552 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
553 "db8c34882ddd46716d14bbf569d530f80db65ed4",
554 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
555 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
556 "a92942269911a88793b3460b6f2a2cd56e48eec1",
557 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
558 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
559 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
560 "585061e403d9cac1603a38af420efe87338f381a",
561 "8f447a3820c83662086dfa836da2205b0130fd5f",
562 "3772003c7fb420003512d0c437b3659d96d89ce4",
563 "dab47c9dc149e570045d699598b14a613bf319b3",
564 "2daca4d26a086ed34894693be0b0374402232809",
565 "e313ae8f7261b88999757ed0c6f26df85b4f01a5",
566 "47d0bab8664ae0aaa927495d07bb3537cce35f16",
567 "295ec16530126046790fb734e99f86f5b3b74ed8",
568 "d98b0561010606b55a1b9b85fbc93640f681d256",
569 "1c1499051860b7caa25173b328ca9c862f01dd1a",
570 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
571 "2230f36f12d4becb242e2962fa1b3694db2496ca",
572 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
573 "5950f7d00cd8692872377df0e869a7d5ea5e4420",
574 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
575 "7de23c68ca224818fdf127c5e96729dcd0de2b8b",
576 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
577 "1a0fd0df17fa4c455a4a91cad30b5242f77fd233",
581 static const char *sha1_graphics_r4g4b4[] =
583 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
584 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
585 "8bd18697d1ef27492805667a0bc956343ac08667",
586 "e8501c830321584474654f90e40eaf27dc21e6a8",
587 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
588 "821177710961d2cb5f7e7dfc0e06e767b6042753",
589 "667124365ffadeea1d8791bedda77a0c7b898de8",
590 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
591 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
592 "fb52b0c373a5f2a60b981604b120962942d2447a",
593 "5ab8dd07436681d762fa04ad7c6d71291c488924",
594 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
595 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
596 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
597 "25fcb75aa687aac35b8f72640889fe92413e00c5",
598 "3bddf9d53e89560b083302b146cd33791b13d941",
599 "a81504498c7a7bb46340ce74476a42f70f2730b1",
600 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
601 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
602 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
603 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
604 "57ebf8becac1524543da120e88e9cc57ecfdec49",
605 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
606 "d591232bbc2592462c819a9486750f64180518fd",
607 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
608 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
609 "8933450132bf949ba4bc28626968425b5ed2867d",
610 "9928a8f28a66c00069a124f7171b248817005763",
611 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
612 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
613 "233e588cf660e2c9b552cf02065cf63fa6655864",
614 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
615 "a3345acaf272f2e288626906e3056cd0ced70499",
616 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
617 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
618 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
619 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
620 "9dd123938b0a02601d8d458ecbd6535ddefea724",
621 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
622 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
623 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
624 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
625 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
626 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
627 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
628 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
629 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
630 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
631 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
632 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
633 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
634 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
635 "7d80b8289da8a65931f03c74a9ef0aff5f8eb551",
636 "a7a986097e5b553c71bd93fd0ec6037e6bd0f2d1",
637 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
638 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
639 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
640 "9f72be4467219a345b1164205d1fbfda2d64271e",
641 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
642 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
643 "3830cd728c1e72837310940bcdac4e294d6c9843",
644 "f571c7c4aac92491017963032194690c0fa06b42",
645 "6fd751b7328c02954bce98bed94b3ce3c73db118",
646 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
647 "8585783d0373e9696b508776b6e6b18a80b09888",
651 static const char *sha1_graphics_8_color[] =
653 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
654 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
655 "49024d6cbdf1614327dfda9eda17675e76805f7e",
656 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
657 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
658 "84d85009d35ae10abbc435f3913422544105cea2",
659 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
660 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
661 "f3aa8d89430748178952de56643069d80b40aad6",
662 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
663 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
664 "52b1363e821bf604d9df260bfa97e26d428c33fd",
665 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
666 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
667 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
668 "89711289be6d5c55734878410e4923d5cca9aca9",
669 "8355caf57d51ad4e14275943088392e37dc75d33",
670 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
671 "6f0570da9dea7f043f678088f8362ee458cd79fa",
672 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
673 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
674 "5092b22af85a08f10a2899888bb9d552f25f828e",
675 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
676 "e91973be2651eeef568700463652838d8cbba976",
677 "1df851515ecf46df5c2d3279535c1763f72353dd",
678 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
679 "359bd76088a965bb0cee7c44800bc46b2638807e",
680 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
681 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
682 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
683 "91f988f575338505ba8a40727865a8d3f2298624",
684 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
685 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
686 "3b7488731da48635d86be551ab7c8c0f91c78219",
687 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
688 "e15a355fc09bfd22267917898e2266168ff410e3",
689 "b9688566bddf18586787c00e68724e51e97dfb72",
690 "5e38e03310f1c66f2052af2a745d8c60515707c5",
691 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
692 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
693 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
694 "6376234f542467e5887adfece62f753e998dc19d",
695 "add949d009217ef2b847e34772ba363e4be7b1b8",
696 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
697 "0b58666deb3615e912896a764e5c6475989e95e4",
698 "bf460cc44c0edee851d72587c8425c3f06a62c55",
699 "ea74c00c45569007383b632d7f1d2adc82645717",
700 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
701 "284abed096637c80bb50844e393da9dd4b3f19ac",
702 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
703 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
704 "46f772c2832b3aad584674db666bd63e48b4f338",
705 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
706 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
707 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
708 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
709 "678979a45126a76eb629992cd64734862f53a555",
710 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
711 "9b1cc7b24f8ce15db2af7f4aa8cde8687784dfa2",
712 "cc4a4cea622d825700bccef7d90a5a447d9ca39d",
713 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
714 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
715 "2c07272462c68cf5944b03e2aa049475b99143c5",
716 "07ca369fb875d37b9cf855045f528af1827edec4",
717 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
718 "488341e88810d737de0b26de4e4d4fa0e78eb482",
719 "bd1e7f40e3971e2ff6c5561286901193a1557527",
720 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
721 "d7ffa3893c6fa937569791cf49986518a4a4d96e",
722 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
723 "8771d5ff7b93b9dd9d077e672b342235dfb28472",
727 static const char *sha1_graphics_8_grayscale[] =
729 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
730 "df35491dd5038187c05bac06921402ba6d7773a8",
731 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
732 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
733 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
734 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
735 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
736 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
737 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
738 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
739 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
740 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
741 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
742 "114bb377b4e78a1978e1ac09388c48861b5223a3",
743 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
744 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
745 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
746 "216388ddf6b563dd2058a9df65b40b6f72df1715",
747 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
748 "47f72be971bd2d3399dabd018201f4f5075e96fe",
749 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
750 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
751 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
752 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
753 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
754 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
755 "b6785a410048bb85e7ea3f0492459972103c935e",
756 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
757 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
758 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
759 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
760 "0000000000000000000000000000000000000000",
761 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
762 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
763 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
764 "6d41e6168662e75baacf74d911d7419d54c8d73c",
765 "2404952157ba1519094a2da6bfbf2b0f1356432d",
766 "24caede65b40815a60b83c4edfa06bdc542388cd",
767 "650a51bedd1af92469d2950eb95220db35f95c6e",
768 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
769 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
770 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
771 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
772 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
773 "85425940daf119125deb52421b2057acebe6d1cf",
774 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
775 "9869b6f088822fb423996f9968e5a931301fc2c3",
776 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
777 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
778 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
779 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
780 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
781 "f543efc84e638afbaa456e629100f0274de1a35b",
782 "1bd2587399006eed0d46beff397d32081f6bc58e",
783 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
784 "640a49455acabca6954a7fbb6af4e872af342d11",
785 "589e7911e09332ee090371deae17b0120ff990b5",
786 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
787 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
788 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
789 "3685c9ae95118a83db3569832c29753276fa1264",
790 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
791 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
792 "a4b04ed35484de0de61832a8a28bbc7def645622",
793 "515897610714251dd3b54f54fe76a9ed3fd12c53",
794 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
795 "17ae603c199a5d6695d198a7f36e6d7263990951",
796 "1918a33f59d3500204ffc573318a39e9ff754221",
797 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
798 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
799 "3494a23633405e46af96cb57715617fef1ac252e",
800 "5a3ae1da30d83cc157e6a4a5617c85598309f4ac",
801 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
802 "87eab8f81fb2a036080e099760f628037f9306e7",
803 "a3eac75d30f681b3898ee469d368960529634d7d",
804 "cd5caeabdb71241766d24f038cfc5f1e91e11256",
808 static const char *sha1_graphics_8[] =
810 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
811 "512246d4886ab889a090b167ba194577cb95272e",
812 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
813 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
814 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
815 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
816 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
817 "390b2bf70daba36310683f46af9cd50b9a061396",
818 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
819 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
820 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
821 "da1cc34a9d9b779fc7849e03e214096026506464",
822 "5ba8f99ca034666effa556748c49a0f5a015125f",
823 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
824 "73e2859ce849f756f954718ce3c90f02e31712b6",
825 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
826 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
827 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
828 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
829 "7262364067e03c7fa498af1d59d228d6c63b460e",
830 "5241241a355a667ef0834049adf4218e8b3f16b8",
831 "db22d666690948eb966f75b796c72c7150a5c4b9",
832 "af21fb2645b568b049549de375584c4aa3055143",
833 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
834 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
835 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
836 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
837 "bdc0a354635b879871077c5b712570e469863c99",
838 "d599bf210423fe3adbb4f1de87d9360de97827d0",
839 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
840 "cc01f17928f7780cefd423ea653b072eea723a1b",
841 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
842 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
843 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
844 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
845 "f4a334e69535de74ee5ed54be93a75120a66e54a",
846 "559fd1d15447745527c61fe43a94c6708bff3e39",
847 "995f77f2f53398399f09d1365cb4dfd105764e5c",
848 "61907a6685bba93077da40cfb28cf2ab74552fd2",
849 "122015e5e17c1c317c6e51c0e207826b606a4077",
850 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
851 "8c609921d4a3ed89a994a75482b27496bf103cf5",
852 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
853 "66493ee117719e172f327a426af601996025f28c",
854 "acead2745fec0b6c817fa601353bdf2d197b64f7",
855 "a6b858b2d125c159529d3f3ec45b31925a79acff",
856 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
857 "d83adc669c0dea0dc4812b93f998514b6f02d805",
858 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
859 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
860 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
861 "7d1bfff706b0713e53209407889f83a0da26a81d",
862 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
863 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
864 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
865 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
866 "d4f3a5ea033adc405c44e1ca137dc908c606dad6",
867 "7103d428ec9a959778120fd6f0dc62dd608ddd63",
868 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
869 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
870 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
871 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
872 "293c41a7ed923a4617560481ae8815cebf83701a",
873 "750c923785ba2afb9ce597516c072f90f014bf95",
874 "80089132f8a11d86e8038f2f8e12dfba46624ee5",
875 "bde5a62a065c027561226fbec5155e938ba7f6b3",
876 "a6311d74fc058079a327abb536e69353be719925",
877 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
878 "0000000000000000000000000000000000000000",
882 static const char *sha1_graphics_4[] =
884 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
885 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
886 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
887 "9401799e6116c35e5f0e5bdca07ea25316757a72",
888 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
889 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
890 "2505598845fa026ea7187582461efbf06cb6904f",
891 "3981a19363beca8f28d32a5928ac296fd22a5296",
892 "01404024ebb2c266d17d734059524d874491650f",
893 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
894 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
895 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
896 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
897 "1f26a01730f67d40ea711a50d9d801bac15a642e",
898 "3b53d24178cfacba53103a44dfd5d072b15a6781",
899 "c52cfd57f26037723d37192722fc3a217f280c9e",
900 "e34da6500cf2e424d980714d92737cf6c31a7bda",
901 "d17f4358ae529f920960ed89e535902ee13b0033",
902 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
903 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
904 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
905 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
906 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
907 "39c16648cf6c261be71a33cec41867f28e119b94",
908 "26ad5116562e7b58c76a26eaf521e2e40899e944",
909 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
910 "4f827ca6927f15191588456f985bf29d2a3b3c24",
911 "e7de769c3d12ea9dd223bef4881c578823bec67e",
912 "6fb102d020e5554116feefc8482104f3ae2036d2",
913 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
914 "20c9eb3276c08fdce35755e349bec94b04929812",
915 "628d837163a25c6520f19c0602383176dbad528e",
916 "b5a12cff7100290ad43f5ed17a321b42de048893",
917 "b672afbeeafb44194a821f0def81a8892872937e",
918 "db0124045882b598feea192186cf7eb7a0387866",
919 "602d91471378fe24a2d0248bd8a92b624f099fea",
920 "e772873b87a0f55ea51a3da323f64bf8814c6703",
921 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
922 "1a579cd280422131c35e907a023ee0e80749b5a4",
923 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
924 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
925 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
926 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
927 "3e411b004a5be84451860c6da6a4a1a482b77862",
928 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
929 "7811c536a6527112b438a6413f3927f2c79086a7",
930 "525ef3615040225752a2fe646ab99ee64e360630",
931 "46760975993f9881b7bbe94123173e6a683d3f25",
932 "df5feb905a31c288008cf5e82d73ac818a160d82",
933 "df5feb905a31c288008cf5e82d73ac818a160d82",
934 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
935 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
936 "1a23839d71d2379ed4e709a5ae6c14639fbe3ab8",
937 "09f8416a780d80be61cbda3d8a05aee418d0ea00",
938 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
939 "029552113292cc110fd6b7888e766628950aaeef",
940 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
941 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
942 "287ea7db721e641439888cb9f4bac3a5f16124eb",
943 "42466aab11852741d937c1ff6f3bb711e58415a6",
944 "0663cf6330591fcf744aba96664e05d90243d07a",
945 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
946 "6fe7d0d17b892032cfd171c3d7c365f030b5be38",
947 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
948 "0000000000000000000000000000000000000000",
952 static const char *sha1_graphics_4_grayscale[] =
954 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
955 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
956 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
957 "1c201d149c0bd886ff8a427ad513f15a70991174",
958 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
959 "315189097a02024d2eae61d524c4de07a396aee7",
960 "73ac786015dea36ac466a6524dba757d5d238ece",
961 "6e328cc4d53627f034b23706d8bf26afe18512ae",
962 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
963 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
964 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
965 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
966 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
967 "ec3879342b5a44f6de6efe946243ae5ade00980d",
968 "6e328cc4d53627f034b23706d8bf26afe18512ae",
969 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
970 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
971 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
972 "b2bda683edef912957845a33edc055902a801fed",
973 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
974 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
975 "43ee3e187dda14b86aef12371041ae70313b5a65",
976 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
977 "d4930552a7845111ffd9db57260be1ab97967c06",
978 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
979 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
980 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
981 "0000000000000000000000000000000000000000",
982 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
983 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
984 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
985 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
986 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
987 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
988 "f8224430462f6a93f85ef33b8aa7299525990708",
989 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
990 "d58b8760ef01c12e691651c932d683c66fde3654",
991 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
992 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
993 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
994 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
995 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
996 "027b05bc82ce4f897c4bf812610a641547368939",
997 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
998 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
999 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
1000 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
1001 "5eeb56afea8040a8fb18c11f29931b836474126d",
1002 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
1003 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
1004 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
1005 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
1006 "43560b856907f552df3b9dd1f91e1aa8ab9ff17e",
1007 "8cefa6dcb658487d0715598d5d120677dbfdab42",
1008 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
1009 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
1010 "58f400c9bb78e49a879276fb049edfc9c981740a",
1011 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
1012 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
1013 "68bee638d59a373f33f308751471b3ef41849582",
1014 "be0501175cc3cbb61217fca76356f761117fb40f",
1015 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1016 "3efe128a5bf250f2c460664e8f543f5ec54d5dc2",
1017 "2d5123e757cf00e423a89160d7dc4997c3688829",
1018 "0000000000000000000000000000000000000000",
1022 static const char *sha1_graphics_1[] =
1024 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1025 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
1026 "a7cc69f957d7b533a0a330859a143d701daac73c",
1027 "a955bf088c5edb129289ce65caace48ec95632e4",
1028 "5316d3c558c254479883133cf58cd07ab521d3f0",
1029 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
1030 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
1031 "121423a38b4ac4743bd516e0a7e88a3863796313",
1032 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
1033 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1034 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1035 "39ff81f77ef4ee772367ed1a63785987c060126e",
1036 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1037 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1038 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1039 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1040 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
1041 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
1042 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1043 "0ff4b49797e30e3555aab45219adf449a9a560ff",
1044 "280327328ca940c212ce24fe72e0b00014072767",
1045 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1046 "b85463875f755b85f1464b1b6275912bcbad6c9f",
1047 "816f200969feecc788b61dfeecf05b1790984401",
1048 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1049 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
1050 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1051 "0a76e0121facb103857130bc6e12185ad77fc3fa",
1052 "02aede714773d654d0fc2f640afaa133ec718ad5",
1053 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1054 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
1055 "b26699f62661e16a1dc452d24c88ce363a1f2998",
1056 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1057 "c14832e69ec3585c15987b3d69d5007236fa9814",
1058 "e44ea620b0c47125a34193537ab9d219a52ad028",
1059 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1060 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
1061 "8819bf7a43295161fe045a42936000b3a51fe200",
1062 "e08dbc26469c229f75ccbf1a38a133401f270b84",
1063 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1064 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1065 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1066 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1067 "ffc78c075d4be66806f6c59180772d5eed963dc0",
1068 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1069 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1070 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1071 "b71ca46be287598f716bb04fac0a52ad139c70db",
1072 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1073 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1074 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1075 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1076 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1077 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1078 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
1079 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1080 "655cfadeb157233c804d42b58195569c8846e3c1",
1081 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1082 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1083 "0d180c37bc26d83a1a11f66168757f3de2493243",
1084 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1085 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1086 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1087 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1088 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1089 "a2a928de9007d765da496abec8c21b23601f8c45",
1090 "28ded40e72d4327b9413571476b167fb28a1f420",
1091 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1092 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1093 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1094 "44a28536466dc895feb824b23dfd4a47c6948af8",
1095 "f0316a5765a0404760e94cd05b7dc956cae07d26",
1096 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1097 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1098 "55c26d22f11d80b73383fa57d0fac552d705b092",
1099 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1100 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1101 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1102 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1103 "1ee4e951743efc8764249fbc7adecefbfec0428e",
1104 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1105 "128eefd2ee043d59dc37918065f687e378e5ca95",
1106 "c642abc651f525332d9d635049646d309e877839",
1107 "8d34215487088b5d4ef63062270ce25c2862643d",
1108 "3dc3075b0c87fdcaabbbae8928303fb2358c15c2",
1109 "bbae6f0659e095a42b420082079663f937065813",
1113 static const char *dst_format;
1115 static inline DWORD get_stride(BITMAPINFO *bmi)
1117 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1120 static inline DWORD get_dib_size(BITMAPINFO *bmi)
1122 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1125 static char *hash_dib(BITMAPINFO *bmi, void *bits)
1127 DWORD dib_size = get_dib_size(bmi);
1131 DWORD hash_size = sizeof(hash_buf);
1133 static const char *hex = "0123456789abcdef";
1135 if(!crypt_prov) return NULL;
1137 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1139 CryptHashData(hash, bits, dib_size, 0);
1141 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1142 if(hash_size != sizeof(hash_buf)) return NULL;
1144 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1145 CryptDestroyHash(hash);
1147 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1149 for(i = 0; i < hash_size; i++)
1151 buf[i * 2] = hex[hash_buf[i] >> 4];
1152 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1159 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
1161 char *hash = hash_dib(bmi, bits);
1167 skip("SHA1 hashing unavailable on this platform\n");
1171 for(i = 0; i <= num_broken; i++)
1173 if((*sha1)[i] == NULL)
1175 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
1180 ok_cond = !strcmp(hash, **sha1);
1182 for(i = 1; i <= num_broken; i++)
1183 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
1186 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1187 dst_format, info, **sha1, hash );
1189 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1190 dst_format, info, **sha1, hash );
1192 *sha1 += num_broken + 1;
1194 HeapFree(GetProcessHeap(), 0, hash);
1197 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
1199 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
1202 static const RECT bias_check[] =
1204 {100, 100, 200, 150},
1205 {100, 100, 150, 200},
1206 {100, 100, 50, 200},
1214 static const RECT hline_clips[] =
1216 {120, 120, 140, 120}, /* unclipped */
1217 {100, 122, 140, 122}, /* l edgecase */
1218 { 99, 124, 140, 124}, /* l edgecase clipped */
1219 {120, 126, 200, 126}, /* r edgecase */
1220 {120, 128, 201, 128}, /* r edgecase clipped */
1221 { 99, 130, 201, 130}, /* l and r clipped */
1222 {120, 100, 140, 100}, /* t edgecase */
1223 {120, 99, 140, 99}, /* t edgecase clipped */
1224 {120, 199, 140, 199}, /* b edgecase */
1225 {120, 200, 140, 200}, /* b edgecase clipped */
1226 {120, 132, 310, 132}, /* inside two clip rects */
1227 { 10, 134, 101, 134}, /* r end on l edgecase */
1228 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1229 {199, 138, 220, 138}, /* l end on r edgecase */
1230 {200, 140, 220, 140} /* l end on r edgecase clipped */
1233 static const RECT vline_clips[] =
1235 {120, 120, 120, 140}, /* unclipped */
1236 {100, 120, 100, 140}, /* l edgecase */
1237 { 99, 120, 99, 140}, /* l edgecase clipped */
1238 {199, 120, 199, 140}, /* r edgecase */
1239 {200, 120, 200, 140}, /* r edgecase clipped */
1240 {122, 99, 122, 201}, /* t and b clipped */
1241 {124, 100, 124, 140}, /* t edgecase */
1242 {126, 99, 126, 140}, /* t edgecase clipped */
1243 {128, 120, 128, 200}, /* b edgecase */
1244 {130, 120, 130, 201}, /* b edgecase clipped */
1245 {132, 12, 132, 140}, /* inside two clip rects */
1246 {134, 90, 134, 101}, /* b end on t edgecase */
1247 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1248 {138, 199, 138, 220}, /* t end on b edgecase */
1249 {140, 200, 140, 220} /* t end on b edgecase clipped */
1252 static const RECT line_clips[] =
1254 { 90, 110, 310, 120},
1255 { 90, 120, 295, 130},
1256 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1257 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1258 { 90, 132, 101, 137}, /* end pt just inside l edge */
1259 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1260 {199, 142, 210, 143} /* start pt just inside r edge */
1263 static const RECT wide_lines[] =
1269 { 10, 100, 10, 200},
1270 { 21, 100, 21, 200},
1271 { 40, 200, 40, 100},
1272 { 61, 200, 61, 100},
1275 static const POINT poly_lines[] =
1277 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1280 static const RECT patblt_clips[] =
1282 {120, 120, 140, 126}, /* unclipped */
1283 {100, 130, 140, 136}, /* l edgecase */
1284 { 99, 140, 140, 146}, /* l edgecase clipped */
1285 {180, 130, 200, 136}, /* r edgecase */
1286 {180, 140, 201, 146}, /* r edgecase clipped */
1287 {120, 100, 130, 110}, /* t edgecase */
1288 {140, 99, 150, 110}, /* t edgecase clipped */
1289 {120, 180, 130, 200}, /* b edgecase */
1290 {140, 180, 150, 201}, /* b edgecase */
1291 {199, 150, 210, 156}, /* l edge on r edgecase */
1292 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1293 { 90, 150, 101, 156}, /* r edge on l edgecase */
1294 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1295 {160, 90, 166, 101}, /* b edge on t edgecase */
1296 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1297 {160, 199, 166, 210}, /* t edge on b edgecase */
1298 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1301 static const RECT rectangles[] =
1304 {250, 100, 350, 10},
1305 {120, 10, 120, 20}, /* zero width */
1306 {120, 10, 130, 10}, /* zero height */
1307 {120, 40, 121, 41}, /* 1 x 1 */
1308 {130, 50, 132, 52}, /* 2 x 2 */
1309 {140, 60, 143, 63}, /* 3 x 3 */
1310 {150, 70, 154, 74}, /* 4 x 4 */
1311 {120, 20, 121, 30}, /* width == 1 */
1312 {130, 20, 132, 30}, /* width == 2 */
1313 {140, 20, 143, 30}, /* width == 3 */
1314 {200, 20, 210, 21}, /* height == 1 */
1315 {200, 30, 210, 32}, /* height == 2 */
1316 {200, 40, 210, 43} /* height == 3 */
1319 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1320 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1321 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1322 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1323 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1324 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1326 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1327 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1328 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1329 0x00, 0x01 }; /* <eod> */
1331 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1332 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1333 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1334 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1336 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1337 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1339 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1341 HBRUSH brush = CreateSolidBrush( color );
1342 brush = SelectObject( hdc, brush );
1343 PatBlt( hdc, x, y, width, height, PATCOPY );
1344 DeleteObject( SelectObject( hdc, brush ) );
1347 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1349 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1350 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1351 PALETTEENTRY *entries = pal->palPalEntry;
1352 DWORD dib_size = get_dib_size(bmi);
1353 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1355 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1357 INT i, j, x, y, hatch_style;
1360 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1361 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1362 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1363 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1364 RGBQUAD *brush_colors = brush_bi->bmiColors;
1365 BYTE *brush_bits, *src_bits;
1366 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1367 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1368 BLENDFUNCTION blend;
1369 COLORREF old_text, old_bkgnd;
1372 blend.BlendOp = AC_SRC_OVER;
1373 blend.BlendFlags = 0;
1375 memset(bits, 0xcc, dib_size);
1376 compare_hash(bmi, bits, sha1, "empty");
1378 src_dc = CreateCompatibleDC( 0 );
1379 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1380 orig_pen = SelectObject(hdc, solid_pen);
1381 SetBrushOrgEx(hdc, 0, 0, NULL);
1383 /* horizontal and vertical lines */
1384 for(i = 1; i <= 16; i++)
1387 MoveToEx(hdc, 10, i * 3, NULL);
1388 LineTo(hdc, 100, i * 3); /* l -> r */
1389 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1390 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1391 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1392 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1393 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1394 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1396 compare_hash(bmi, bits, sha1, "h and v solid lines");
1397 memset(bits, 0xcc, dib_size);
1399 /* diagonal lines */
1400 SetROP2(hdc, R2_COPYPEN);
1401 for(i = 0; i < 16; i++)
1403 double s = sin(M_PI * i / 8.0);
1404 double c = cos(M_PI * i / 8.0);
1406 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1407 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1409 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1410 memset(bits, 0xcc, dib_size);
1412 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1414 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1415 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1417 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1418 memset(bits, 0xcc, dib_size);
1420 /* solid brush PatBlt */
1421 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1422 orig_brush = SelectObject(hdc, solid_brush);
1424 for(i = 0, y = 10; i < 256; i++)
1426 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1428 if(rop_uses_src(rop3[i]))
1429 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1432 ok(ret, "got FALSE for %x\n", rop3[i]);
1437 compare_hash(bmi, bits, sha1, "solid patblt");
1438 memset(bits, 0xcc, dib_size);
1441 hrgn = CreateRectRgn(10, 10, 200, 20);
1442 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1443 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1444 SetRectRgn(hrgn2, 290, 100, 300, 200);
1445 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1446 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1447 DeleteObject(hrgn2);
1449 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1451 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1452 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1454 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1455 memset(bits, 0xcc, dib_size);
1457 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1459 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1460 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1462 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1463 memset(bits, 0xcc, dib_size);
1465 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1467 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1468 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1470 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1471 memset(bits, 0xcc, dib_size);
1473 /* clipped PatBlt */
1474 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1476 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1477 patblt_clips[i].right - patblt_clips[i].left,
1478 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1480 compare_hash(bmi, bits, sha1, "clipped patblt");
1481 memset(bits, 0xcc, dib_size);
1483 /* clipped dashed lines */
1484 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1485 SelectObject(hdc, dashed_pen);
1486 SetBkMode(hdc, TRANSPARENT);
1487 SetBkColor(hdc, RGB(0, 0xff, 0));
1489 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1491 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1492 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1494 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1495 memset(bits, 0xcc, dib_size);
1497 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1499 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1500 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1502 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1503 memset(bits, 0xcc, dib_size);
1505 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1507 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1508 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1510 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1511 memset(bits, 0xcc, dib_size);
1513 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1515 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1516 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1518 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1519 memset(bits, 0xcc, dib_size);
1521 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1523 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1524 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1526 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1527 memset(bits, 0xcc, dib_size);
1529 SetBkMode(hdc, OPAQUE);
1531 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1533 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1534 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1536 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1537 memset(bits, 0xcc, dib_size);
1539 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1541 /* 8888 DIB pattern brush */
1543 brush_bi->bmiHeader = dib_brush_header_8888;
1544 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1545 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1546 brush_bits[2] = 0xff;
1547 brush_bits[6] = 0xff;
1548 brush_bits[14] = 0xff;
1549 brush_bits[65] = 0xff;
1550 brush_bits[69] = 0xff;
1551 brush_bits[72] = 0xff;
1553 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1555 SelectObject(hdc, dib_brush);
1556 SetBrushOrgEx(hdc, 1, 1, NULL);
1558 for(i = 0, y = 10; i < 256; i++)
1560 if(!rop_uses_src(rop3[i]))
1562 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1563 ok(ret, "got FALSE for %x\n", rop3[i]);
1567 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1568 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1570 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1571 memset(bits, 0xcc, dib_size);
1573 SelectObject(hdc, orig_brush);
1574 DeleteObject(dib_brush);
1576 /* 8888 bottom-up DIB pattern brush */
1578 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1580 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1582 SelectObject(hdc, dib_brush);
1584 /* This used to set the x origin to 100 as well, but
1585 there's a Windows bug for 24 bpp where the brush's x offset
1586 is incorrectly calculated for rops that involve both D and P */
1587 SetBrushOrgEx(hdc, 4, 100, NULL);
1589 for(i = 0, y = 10; i < 256; i++)
1591 if(!rop_uses_src(rop3[i]))
1593 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1594 ok(ret, "got FALSE for %x\n", rop3[i]);
1598 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1599 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1601 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1602 memset(bits, 0xcc, dib_size);
1604 SelectObject(hdc, orig_brush);
1605 DeleteObject(dib_brush);
1607 /* 24 bpp dib pattern brush */
1609 brush_bi->bmiHeader = dib_brush_header_24;
1610 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1611 memset(brush_bits, 0, 16 * 16 * 3);
1612 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1613 brush_bits[49] = brush_bits[52] = 0xff;
1615 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1617 SelectObject(hdc, dib_brush);
1618 SetBrushOrgEx(hdc, 1, 1, NULL);
1620 for(i = 0, y = 10; i < 256; i++)
1622 if(!rop_uses_src(rop3[i]))
1624 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1625 ok(ret, "got FALSE for %x\n", rop3[i]);
1629 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1630 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1632 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1633 memset(bits, 0xcc, dib_size);
1635 SelectObject(hdc, orig_brush);
1636 DeleteObject(dib_brush);
1638 /* 555 dib pattern brush */
1640 brush_bi->bmiHeader = dib_brush_header_555;
1641 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1642 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1643 brush_bits[0] = brush_bits[1] = 0xff;
1644 brush_bits[32] = brush_bits[34] = 0x7c;
1646 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1648 SelectObject(hdc, dib_brush);
1649 SetBrushOrgEx(hdc, 1, 1, NULL);
1651 for(i = 0, y = 10; i < 256; i++)
1653 if(!rop_uses_src(rop3[i]))
1655 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1656 ok(ret, "got FALSE for %x\n", rop3[i]);
1660 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1661 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1663 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1664 memset(bits, 0xcc, dib_size);
1666 SelectObject(hdc, orig_brush);
1667 DeleteObject(dib_brush);
1669 SetBrushOrgEx(hdc, 0, 0, NULL);
1671 /* 8 bpp dib pattern brush */
1673 brush_bi->bmiHeader = dib_brush_header_8;
1674 brush_bi->bmiHeader.biClrUsed = 3;
1675 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1676 brush_colors[0].rgbRed = 0xff;
1677 brush_colors[1].rgbRed = 0xff;
1678 brush_colors[1].rgbGreen = 0xff;
1679 brush_colors[1].rgbBlue = 0xff;
1681 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1682 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1683 brush_bits[0] = brush_bits[1] = 1;
1684 brush_bits[16] = brush_bits[17] = 2;
1685 brush_bits[32] = brush_bits[33] = 6;
1687 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1689 SelectObject(hdc, dib_brush);
1690 SetBrushOrgEx(hdc, 1, 1, NULL);
1692 for(i = 0, y = 10; i < 256; i++)
1694 if(!rop_uses_src(rop3[i]))
1696 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1697 ok(ret, "got FALSE for %x\n", rop3[i]);
1701 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1702 memset(bits, 0xcc, dib_size);
1704 SelectObject(hdc, orig_brush);
1705 DeleteObject(dib_brush);
1707 /* 4 bpp dib pattern brush */
1709 brush_bi->bmiHeader = dib_brush_header_4;
1710 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1712 SelectObject(hdc, dib_brush);
1713 SetBrushOrgEx(hdc, 1, 1, NULL);
1715 for(i = 0, y = 10; i < 256; i++)
1717 if(!rop_uses_src(rop3[i]))
1719 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1720 ok(ret, "got FALSE for %x\n", rop3[i]);
1724 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1725 memset(bits, 0xcc, dib_size);
1727 SelectObject(hdc, orig_brush);
1728 DeleteObject(dib_brush);
1730 /* 1 bpp dib pattern brush */
1732 brush_bi->bmiHeader = dib_brush_header_1;
1733 brush_bi->bmiHeader.biClrUsed = 2;
1734 memset(brush_bits, 0, 16 * 4);
1735 brush_bits[0] = 0xf0;
1736 brush_bits[4] = 0xf0;
1737 brush_bits[8] = 0xf0;
1739 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1740 SelectObject(hdc, dib_brush);
1741 for(i = 0, y = 10; i < 256; i++)
1743 if(!rop_uses_src(rop3[i]))
1745 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1746 ok(ret, "got FALSE for %x\n", rop3[i]);
1751 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1752 memset(bits, 0xcc, dib_size);
1754 SelectObject(hdc, orig_brush);
1755 DeleteObject(dib_brush);
1757 /* 1 bpp ddb pattern brush */
1759 old_text = GetTextColor( hdc );
1760 old_bkgnd = GetBkColor( hdc );
1761 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1762 dib_brush = CreatePatternBrush( bmp );
1763 SelectObject(hdc, dib_brush);
1764 for(i = 0, y = 10; i < 256; i++)
1766 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1767 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1768 if(!rop_uses_src(rop3[i]))
1770 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1771 ok(ret, "got FALSE for %x\n", rop3[i]);
1776 compare_hash_broken_todo(bmi, bits, sha1, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1777 memset(bits, 0xcc, dib_size);
1780 SelectObject(hdc, orig_brush);
1781 SetBrushOrgEx(hdc, 0, 0, NULL);
1782 SetTextColor(hdc, old_text);
1783 SetBkColor(hdc, old_bkgnd);
1787 SelectObject(hdc, solid_pen);
1788 SelectObject(hdc, solid_brush);
1790 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1792 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1795 SelectObject(hdc, dashed_pen);
1796 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1798 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1801 compare_hash(bmi, bits, sha1, "rectangles");
1802 memset(bits, 0xcc, dib_size);
1803 SelectObject(hdc, solid_pen);
1807 PaintRgn(hdc, hrgn);
1808 compare_hash(bmi, bits, sha1, "PaintRgn");
1809 memset(bits, 0xcc, dib_size);
1811 /* RTL rectangles */
1815 win_skip("Don't have SetLayout\n");
1820 pSetLayout(hdc, LAYOUT_RTL);
1821 PaintRgn(hdc, hrgn);
1822 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1823 Rectangle(hdc, 100, 250, 110, 260);
1824 compare_hash(bmi, bits, sha1, "rtl");
1825 memset(bits, 0xcc, dib_size);
1827 pSetLayout(hdc, LAYOUT_LTR);
1830 for(i = 0, y = 10; i < 256; i++)
1832 if(!rop_uses_src(rop3[i]))
1834 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1836 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1837 SelectObject(hdc, hatch_brush);
1838 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1839 ok(ret, "got FALSE for %x\n", rop3[i]);
1840 SelectObject(hdc, orig_brush);
1841 DeleteObject(hatch_brush);
1847 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1848 memset(bits, 0xcc, dib_size);
1850 /* overlapping blits */
1852 orig_brush = SelectObject(hdc, solid_brush);
1854 Rectangle(hdc, 10, 10, 100, 100);
1855 Rectangle(hdc, 20, 15, 30, 40);
1856 Rectangle(hdc, 15, 15, 20, 20);
1857 Rectangle(hdc, 15, 20, 50, 45);
1858 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1859 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1860 memset(bits, 0xcc, dib_size);
1862 Rectangle(hdc, 10, 10, 100, 100);
1863 Rectangle(hdc, 20, 15, 30, 40);
1864 Rectangle(hdc, 15, 15, 20, 20);
1865 Rectangle(hdc, 15, 20, 50, 45);
1866 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1867 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1868 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1870 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1871 memset(bits, 0xcc, dib_size);
1873 Rectangle(hdc, 10, 10, 100, 100);
1874 Rectangle(hdc, 20, 15, 30, 40);
1875 Rectangle(hdc, 15, 15, 20, 20);
1876 Rectangle(hdc, 15, 20, 50, 45);
1877 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1878 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1879 memset(bits, 0xcc, dib_size);
1881 Rectangle(hdc, 10, 10, 100, 100);
1882 Rectangle(hdc, 20, 15, 30, 40);
1883 Rectangle(hdc, 15, 15, 20, 20);
1884 Rectangle(hdc, 15, 20, 50, 45);
1885 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1886 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1887 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1889 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1890 memset(bits, 0xcc, dib_size);
1892 Rectangle(hdc, 10, 10, 100, 100);
1893 Rectangle(hdc, 20, 15, 30, 40);
1894 Rectangle(hdc, 15, 15, 20, 20);
1895 Rectangle(hdc, 15, 20, 50, 45);
1896 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1897 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1898 memset(bits, 0xcc, dib_size);
1900 Rectangle(hdc, 10, 10, 100, 100);
1901 Rectangle(hdc, 20, 15, 30, 40);
1902 Rectangle(hdc, 15, 15, 20, 20);
1903 Rectangle(hdc, 15, 20, 50, 45);
1904 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1905 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1906 memset(bits, 0xcc, dib_size);
1908 Rectangle(hdc, 10, 10, 100, 100);
1909 Rectangle(hdc, 20, 15, 30, 40);
1910 Rectangle(hdc, 15, 15, 20, 20);
1911 Rectangle(hdc, 15, 20, 50, 45);
1912 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1913 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1914 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1916 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1917 memset(bits, 0xcc, dib_size);
1919 Rectangle(hdc, 10, 10, 100, 100);
1920 Rectangle(hdc, 20, 15, 30, 40);
1921 Rectangle(hdc, 15, 15, 20, 20);
1922 Rectangle(hdc, 15, 20, 50, 45);
1923 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1924 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1925 memset(bits, 0xcc, dib_size);
1927 /* blitting with 32-bpp BI_RGB source */
1929 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1930 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1931 src_bi->bmiHeader.biHeight = 256;
1932 src_bi->bmiHeader.biWidth = 256;
1933 src_bi->bmiHeader.biBitCount = 32;
1934 src_bi->bmiHeader.biPlanes = 1;
1935 src_bi->bmiHeader.biCompression = BI_RGB;
1936 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1937 SelectObject( src_dc, bmp );
1938 for (y = 0; y < 256; y++)
1939 for (x = 0; x < 256; x++)
1941 BYTE a = (x + y) * 2;
1942 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1943 BYTE g = (BYTE)(x + y / 3) * a / 255;
1944 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1945 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1948 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1949 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1950 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1952 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1953 memset(bits, 0xcc, dib_size);
1955 blend.SourceConstantAlpha = 0xd0;
1956 blend.AlphaFormat = 0;
1957 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1958 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1960 if (!pGdiAlphaBlend) (*sha1) += 2;
1961 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1965 if (!pGdiAlphaBlend) (*sha1)++;
1966 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1968 memset(bits, 0xcc, dib_size);
1970 blend.SourceConstantAlpha = 0xb0;
1971 blend.AlphaFormat = AC_SRC_ALPHA;
1972 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 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 alpha", 1, FALSE );
1980 if (!pGdiAlphaBlend) (*sha1)++;
1981 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1983 memset(bits, 0xcc, dib_size);
1985 /* blitting with 32-bpp r10g10b10 source */
1987 src_bi->bmiHeader.biBitCount = 32;
1988 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1989 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1990 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1991 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1992 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1993 SelectObject( src_dc, bmp );
1994 for (y = 0; y < 256; y++)
1995 for (x = 0; x < 256; x++)
1997 WORD r = (7 * x + 3 * y) % 1024;
1998 WORD g = (11 * x + y / 3) % 1024;
1999 WORD b = (x / 3 + 9 * y) % 1024;
2000 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2003 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2004 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2005 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2007 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2008 memset(bits, 0xcc, dib_size);
2010 /* blitting with 32-bpp b6g6r6 source */
2012 src_bi->bmiHeader.biBitCount = 32;
2013 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2014 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2015 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2016 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2017 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2018 SelectObject( src_dc, bmp );
2019 for (y = 0; y < 256; y++)
2020 for (x = 0; x < 256; x++)
2022 BYTE r = (y + 2 * x) % 64;
2023 BYTE g = (x + y / 3) % 64;
2024 BYTE b = (x / 3 + 2 * y) % 64;
2025 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2028 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2029 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2030 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2032 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2033 memset(bits, 0xcc, dib_size);
2035 /* blitting with 24-bpp source */
2037 src_bi->bmiHeader.biBitCount = 24;
2038 src_bi->bmiHeader.biCompression = BI_RGB;
2039 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2040 DeleteObject( SelectObject( src_dc, bmp ) );
2041 for (y = 0; y < 256; y++)
2042 for (x = 0; x < 256; x++)
2044 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2045 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2046 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2049 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2050 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2051 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2053 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
2054 memset(bits, 0xcc, dib_size);
2056 blend.SourceConstantAlpha = 0xe0;
2057 blend.AlphaFormat = 0;
2058 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2059 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2061 if (!pGdiAlphaBlend) (*sha1) += 2;
2062 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
2066 if (!pGdiAlphaBlend) (*sha1)++;
2067 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2069 memset(bits, 0xcc, dib_size);
2071 /* blitting with 16-bpp BI_RGB source */
2073 src_bi->bmiHeader.biBitCount = 16;
2074 src_bi->bmiHeader.biCompression = BI_RGB;
2075 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2076 DeleteObject( SelectObject( src_dc, bmp ) );
2077 for (y = 0; y < 256; y++)
2078 for (x = 0; x < 256; x++)
2079 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2081 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2082 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2083 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2085 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
2086 memset(bits, 0xcc, dib_size);
2088 /* blitting with 16-bpp b4g4r4 source */
2090 src_bi->bmiHeader.biBitCount = 16;
2091 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2092 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2093 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2094 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2095 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2096 DeleteObject( SelectObject( src_dc, bmp ) );
2097 for (y = 0; y < 256; y++)
2098 for (x = 0; x < 256; x++)
2099 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2101 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2102 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2103 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2105 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2106 memset(bits, 0xcc, dib_size);
2108 /* blitting with 8-bpp source */
2110 src_bi->bmiHeader.biBitCount = 8;
2111 src_bi->bmiHeader.biCompression = BI_RGB;
2112 src_bi->bmiHeader.biClrUsed = 160;
2113 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2114 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2115 DeleteObject( SelectObject( src_dc, bmp ) );
2116 for (y = 0; y < 256; y++)
2117 for (x = 0; x < 256; x++)
2118 src_bits[y * 256 + x] = 3 * x + 5 * y;
2120 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2121 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
2122 memset(bits, 0xcc, dib_size);
2124 blend.SourceConstantAlpha = 0xd0;
2125 blend.AlphaFormat = 0;
2126 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2127 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2129 if (!pGdiAlphaBlend) (*sha1) += 2;
2130 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
2134 if (!pGdiAlphaBlend) (*sha1)++;
2135 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2137 memset(bits, 0xcc, dib_size);
2139 /* blitting with 4-bpp source */
2141 src_bi->bmiHeader.biBitCount = 4;
2142 src_bi->bmiHeader.biClrUsed = 12;
2143 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2144 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2145 DeleteObject( SelectObject( src_dc, bmp ) );
2146 for (y = 0; y < 256; y++)
2147 for (x = 0; x < 256; x += 2)
2148 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2150 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2151 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
2152 memset(bits, 0xcc, dib_size);
2154 /* blitting with 1-bpp source */
2156 src_bi->bmiHeader.biBitCount = 1;
2157 src_bi->bmiHeader.biClrUsed = 0;
2158 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 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 += 8)
2163 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2165 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2166 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
2167 memset(bits, 0xcc, dib_size);
2169 blend.SourceConstantAlpha = 0x90;
2170 blend.AlphaFormat = 0;
2171 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2172 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2174 if (!pGdiAlphaBlend) (*sha1) += 2;
2175 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
2179 if (!pGdiAlphaBlend) (*sha1)++;
2180 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
2182 memset(bits, 0xcc, dib_size);
2185 DeleteObject( bmp );
2187 /* RLE StretchDIBits */
2188 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2189 src_bi->bmiHeader.biWidth = 8;
2190 src_bi->bmiHeader.biHeight = 8;
2191 src_bi->bmiHeader.biPlanes = 1;
2192 src_bi->bmiHeader.biBitCount = 8;
2193 src_bi->bmiHeader.biCompression = BI_RLE8;
2194 src_bi->bmiHeader.biClrUsed = 0;
2195 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2197 for (i = 0; i < 256; i++)
2199 src_bi->bmiColors[i].rgbRed = i;
2200 src_bi->bmiColors[i].rgbGreen = i;
2201 src_bi->bmiColors[i].rgbBlue = i;
2202 src_bi->bmiColors[i].rgbReserved = 0;
2205 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2206 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2207 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2208 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2209 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2210 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
2211 memset(bits, 0xcc, dib_size);
2213 /* 32 bpp StretchDIBits */
2215 src_bi->bmiHeader.biWidth = 4;
2216 src_bi->bmiHeader.biHeight = 4;
2217 src_bi->bmiHeader.biPlanes = 1;
2218 src_bi->bmiHeader.biBitCount = 32;
2219 src_bi->bmiHeader.biCompression = BI_RGB;
2220 src_bi->bmiHeader.biClrUsed = 0;
2221 src_bi->bmiHeader.biSizeImage = 0;
2223 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2224 ok(ret == 4, "got %d\n", ret);
2225 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2226 ok(ret == 4, "got %d\n", ret);
2227 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2228 ok(ret == 4, "got %d\n", ret);
2229 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2230 ok(ret == 4, "got %d\n", ret);
2231 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2232 ok(ret == 4, "got %d\n", ret);
2233 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2234 ok(ret == 4, "got %d\n", ret);
2236 src_bi->bmiHeader.biHeight = -4;
2238 ret = StretchDIBits( hdc, 10, 100, 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, 100, 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, 100, 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, 100, 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, 100, -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, 100, -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 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2252 memset(bits, 0xcc, dib_size);
2255 for (i = 0; i < 256; i++)
2257 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2258 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2259 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2260 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2261 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2264 /* A few extra colors that are interesting in the 1bpp case */
2267 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2268 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2271 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2272 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2275 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2276 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2278 compare_hash(bmi, bits, sha1, "Colors");
2279 memset(bits, 0xcc, dib_size);
2281 for (i = 0; i < 256; i++)
2284 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2285 g = GetPixel( hdc, i * 2, 10 );
2286 ok( s == g, "got %08x and %08x\n", s, g );
2288 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2289 g = GetPixel( hdc, i * 2, 20 );
2290 ok( s == g, "got %08x and %08x\n", s, g );
2292 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2293 g = GetPixel( hdc, i * 2, 30 );
2294 ok( s == g, "got %08x and %08x\n", s, g );
2296 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2297 g = GetPixel( hdc, i * 2, 40 );
2298 ok( s == g, "got %08x and %08x\n", s, g );
2300 for (j = 0; j < 256; j++)
2302 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2303 g = GetPixel( hdc, i * 2, 50+j );
2304 ok( s == g, "got %08x and %08x\n", s, g );
2306 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2307 g = GetPixel( hdc, i * 2 + 1, 50+j );
2308 ok( s == g, "got %08x and %08x\n", s, g );
2312 compare_hash(bmi, bits, sha1, "SetPixel");
2313 memset(bits, 0xcc, dib_size);
2317 if (pGdiGradientFill)
2321 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2322 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2323 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2324 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2326 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2330 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2331 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2332 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2334 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2335 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2336 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2338 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2339 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2340 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2342 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2343 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2344 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2346 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2347 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2348 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2350 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2351 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2352 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2354 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2355 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2356 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2358 GRADIENT_TRIANGLE tri[] =
2360 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2361 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2364 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2365 for (i = 0; i < 4; i++) vrect[i].y += 250;
2366 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2368 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2369 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2371 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2372 memset(bits, 0xcc, dib_size);
2374 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2375 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2376 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2377 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2378 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2380 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2381 memset(bits, 0xcc, dib_size);
2385 win_skip( "GdiGradientFill not supported\n" );
2391 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2392 SelectObject( hdc, wide_pen );
2394 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2396 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2397 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2400 compare_hash(bmi, bits, sha1, "wide pen" );
2401 memset(bits, 0xcc, dib_size);
2403 SelectObject( hdc, orig_pen );
2404 DeleteObject( wide_pen );
2406 log_brush.lbStyle = BS_SOLID;
2407 log_brush.lbColor = RGB(0xff, 0, 0);
2408 log_brush.lbHatch = 0;
2410 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2411 9, &log_brush, 0, NULL );
2412 SelectObject( hdc, wide_pen );
2414 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2415 compare_hash(bmi, bits, sha1, "wide pen - flat caps, mitred" );
2416 memset(bits, 0xcc, dib_size);
2418 SelectObject( hdc, orig_pen );
2419 DeleteObject( wide_pen );
2421 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2422 16, &log_brush, 0, NULL );
2423 SelectObject( hdc, wide_pen );
2425 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2426 compare_hash(bmi, bits, sha1, "wide pen - square caps, bevelled" );
2427 memset(bits, 0xcc, dib_size);
2429 SelectObject( hdc, orig_pen );
2430 DeleteObject( wide_pen );
2432 /* brushed wide pen */
2434 old_text = GetTextColor( hdc );
2435 old_bkgnd = GetBkColor( hdc );
2436 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2437 log_brush.lbStyle = BS_PATTERN;
2438 log_brush.lbColor = 0;
2439 log_brush.lbHatch = (ULONG_PTR)bmp;
2440 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2441 12, &log_brush, 0, NULL );
2442 ok( wide_pen != 0, "failed to create pen\n" );
2443 SelectObject( hdc, wide_pen );
2444 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2446 for (i = 1; i < 20; i++)
2448 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2449 i, &log_brush, 0, NULL );
2450 ok( wide_pen != 0, "failed to create pen\n" );
2451 DeleteObject( SelectObject( hdc, wide_pen ));
2452 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2453 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2454 MoveToEx( hdc, 10 * i, 10, NULL );
2455 LineTo( hdc, 10 * i, 200 + i );
2456 LineTo( hdc, 20 * i, 200 + i );
2458 /* NT4 broken for all cases, W2K for 1 bpp only */
2459 compare_hash_broken_todo( bmi, bits, sha1, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2460 memset(bits, 0xcc, dib_size);
2462 for (i = 1; i < 20; i++)
2464 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2465 i, &log_brush, 0, NULL );
2466 DeleteObject( SelectObject( hdc, wide_pen ));
2467 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2468 SetBkColor(hdc, RGB( i, 255 - 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, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2475 memset(bits, 0xcc, dib_size);
2478 SetTextColor(hdc, old_text);
2479 SetBkColor(hdc, old_bkgnd);
2480 SelectObject( hdc, orig_pen );
2484 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2485 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2486 SetTextColor( hdc, PALETTEINDEX(38) );
2487 SetBkColor( hdc, PALETTEINDEX(9) );
2488 SelectObject( hdc, solid_brush );
2489 SelectObject( hdc, solid_pen );
2491 pal->palVersion = 0x300;
2492 pal->palNumEntries = 40;
2493 for (i = 0; i < 80; i++)
2495 entries[i].peRed = i * 3;
2496 entries[i].peGreen = i * 7;
2497 entries[i].peBlue = 128 - i;
2498 entries[i].peFlags = 0;
2500 hpal = CreatePalette( pal );
2501 SelectPalette( hdc, hpal, FALSE );
2503 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2504 Rectangle( hdc, 0, 0, 10, 10 );
2505 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2506 Rectangle( hdc, 10, 0, 10, 10 );
2507 SelectObject( hdc, orig_brush );
2508 DeleteObject( solid_brush );
2510 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2511 DeleteObject( SelectObject( hdc, solid_brush ));
2512 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2513 SetPaletteEntries( hpal, 0, 40, entries );
2514 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2515 SelectObject( hdc, orig_brush );
2516 DeleteObject( solid_brush );
2518 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2519 dib_brush = CreatePatternBrush( bmp );
2520 SelectObject( hdc, dib_brush );
2521 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2522 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2523 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2524 DeleteObject( bmp );
2525 SelectObject( hdc, orig_brush );
2526 DeleteObject( dib_brush );
2528 SelectPalette( hdc, GetStockObject(DEFAULT_PALETTE), FALSE );
2529 DeleteObject( hpal );
2531 /* NT4 broken for all cases, W2K for 1 bpp only */
2532 compare_hash_broken_todo(bmi, bits, sha1, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2533 memset(bits, 0xcc, dib_size);
2535 SelectObject(hdc, orig_brush);
2536 SelectObject(hdc, orig_pen);
2538 DeleteObject(dib_brush);
2539 DeleteObject(solid_brush);
2540 DeleteObject(wide_pen);
2541 DeleteObject(dashed_pen);
2542 DeleteObject(solid_pen);
2545 static const BYTE ramp[17] =
2547 0, 0x4d, 0x68, 0x7c,
2548 0x8c, 0x9a, 0xa7, 0xb2,
2549 0xbd, 0xc7, 0xd0, 0xd9,
2550 0xe1, 0xe9, 0xf0, 0xf8,
2554 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2556 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2557 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2560 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2562 BYTE min_comp, max_comp;
2564 if (alpha == 16) return text;
2565 if (alpha <= 1) return dst;
2566 if (text == dst) return dst;
2568 get_range( alpha, text, &min_comp, &max_comp );
2572 DWORD diff = dst - text;
2573 DWORD range = max_comp - text;
2574 dst = text + (diff * range ) / (0xff - text);
2579 DWORD diff = text - dst;
2580 DWORD range = text - min_comp ;
2581 dst = text - (diff * range) / text;
2586 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2590 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2591 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2592 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2596 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2598 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2600 DWORD dib_size = get_dib_size(bmi), ret;
2605 int i, stride, x, y;
2606 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2607 char *eto_hash = NULL, *diy_hash = NULL;
2608 static const char *str = "Hello Wine";
2609 POINT origin, g_org;
2610 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2612 COLORREF text_color;
2614 for(i = 0; i < dib_size; i++)
2615 bits[i] = vals[i % 4];
2617 memset( &lf, 0, sizeof(lf) );
2618 strcpy( lf.lfFaceName, "Tahoma" );
2620 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2622 font = CreateFontIndirect( &lf );
2623 font = SelectObject( hdc, font );
2625 GetTextMetrics( hdc, &tm );
2626 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2628 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2629 DeleteObject( SelectObject( hdc, font ) );
2633 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2634 SetTextAlign( hdc, TA_BASELINE );
2635 SetBkMode( hdc, TRANSPARENT );
2639 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2640 eto_hash = hash_dib( bmi, bits );
2642 for(i = 0; i < dib_size; i++)
2643 bits[i] = vals[i % 4];
2645 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2647 text_color = GetTextColor( hdc );
2648 for (i = 0; i < strlen(str); i++)
2650 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2652 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2654 if (ret == GDI_ERROR) continue;
2656 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2658 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2659 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2661 origin.x += gm.gmCellIncX;
2662 origin.y += gm.gmCellIncY;
2668 stride = (gm.gmBlackBoxX + 3) & ~3;
2670 for (y = 0; y < gm.gmBlackBoxY; y++)
2672 BYTE *g_ptr = g_buf + y * stride;
2675 for (x = 0; x < gm.gmBlackBoxX; x++)
2677 if (g_ptr[x] <= 1) continue;
2678 if (g_ptr[x] >= 16) val = text_color;
2681 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2682 val = aa_colorref( val, text_color, g_ptr[x] );
2684 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2690 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2692 for (y = 0; y < gm.gmBlackBoxY; y++)
2694 BYTE *g_ptr = g_buf + y * stride;
2695 for (x = 0; x < gm.gmBlackBoxX; x++)
2697 if (g_ptr[x / 8] & masks[x % 8])
2698 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2704 diy_hash = hash_dib( bmi, bits );
2705 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2707 HeapFree( GetProcessHeap(), 0, diy_hash );
2708 HeapFree( GetProcessHeap(), 0, eto_hash );
2710 font = SelectObject( hdc, font );
2711 DeleteObject( font );
2714 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2716 draw_text_2( hdc, bmi, bits, FALSE );
2718 /* Rounding errors make these cases hard to test */
2719 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2720 (bmi->bmiHeader.biBitCount == 16))
2723 draw_text_2( hdc, bmi, bits, TRUE );
2726 static void test_simple_graphics(void)
2728 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2729 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2730 RGBQUAD *colors = bmi->bmiColors;
2731 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2734 HBITMAP dib, orig_bm;
2739 mem_dc = CreateCompatibleDC(NULL);
2743 memset(bmi, 0, sizeof(bmibuf));
2744 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2745 bmi->bmiHeader.biHeight = 512;
2746 bmi->bmiHeader.biWidth = 512;
2747 bmi->bmiHeader.biBitCount = 32;
2748 bmi->bmiHeader.biPlanes = 1;
2749 bmi->bmiHeader.biCompression = BI_RGB;
2751 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2752 ok(dib != NULL, "ret NULL\n");
2753 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2754 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2755 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2756 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2757 ok(ds.dsBmih.biCompression == BI_RGB ||
2758 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2759 "got %x\n", ds.dsBmih.biCompression);
2761 orig_bm = SelectObject(mem_dc, dib);
2763 dst_format = "8888";
2764 sha1 = sha1_graphics_a8r8g8b8;
2765 draw_graphics(mem_dc, bmi, bits, &sha1);
2766 draw_text(mem_dc, bmi, bits);
2768 SelectObject(mem_dc, orig_bm);
2771 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2772 trace("8888 - bitfields\n");
2773 bmi->bmiHeader.biBitCount = 32;
2774 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2775 bit_fields[0] = 0xff0000;
2776 bit_fields[1] = 0x00ff00;
2777 bit_fields[2] = 0x0000ff;
2779 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2780 ok(dib != NULL, "ret NULL\n");
2781 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2782 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2783 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2784 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2785 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2787 orig_bm = SelectObject(mem_dc, dib);
2789 dst_format = "8888 - bitfields";
2790 sha1 = sha1_graphics_a8r8g8b8_bitfields;
2791 draw_graphics(mem_dc, bmi, bits, &sha1);
2792 draw_text(mem_dc, bmi, bits);
2794 SelectObject(mem_dc, orig_bm);
2798 trace("a8b8g8r8\n");
2799 bmi->bmiHeader.biBitCount = 32;
2800 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2801 bit_fields[0] = 0x0000ff;
2802 bit_fields[1] = 0x00ff00;
2803 bit_fields[2] = 0xff0000;
2805 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2806 ok(dib != NULL, "ret NULL\n");
2807 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2808 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2809 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2810 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2811 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2813 orig_bm = SelectObject(mem_dc, dib);
2815 dst_format = "a8b8g8r8";
2816 sha1 = sha1_graphics_a8b8g8r8;
2817 draw_graphics(mem_dc, bmi, bits, &sha1);
2818 draw_text(mem_dc, bmi, bits);
2820 SelectObject(mem_dc, orig_bm);
2824 trace("r10g10b10\n");
2825 bmi->bmiHeader.biBitCount = 32;
2826 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2827 bit_fields[0] = 0x3ff00000;
2828 bit_fields[1] = 0x000ffc00;
2829 bit_fields[2] = 0x000003ff;
2831 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2832 ok(dib != NULL, "ret NULL\n");
2833 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2834 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2835 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2836 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2837 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2839 orig_bm = SelectObject(mem_dc, dib);
2841 dst_format = "r10g10b10";
2842 sha1 = sha1_graphics_r10g10b10;
2843 draw_graphics(mem_dc, bmi, bits, &sha1);
2844 draw_text(mem_dc, bmi, bits);
2846 SelectObject(mem_dc, orig_bm);
2851 bmi->bmiHeader.biBitCount = 32;
2852 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2853 bit_fields[0] = 0x0003f000;
2854 bit_fields[1] = 0x00000fc0;
2855 bit_fields[2] = 0x0000003f;
2857 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2858 ok(dib != NULL, "ret NULL\n");
2859 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2860 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2861 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2862 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2863 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2865 orig_bm = SelectObject(mem_dc, dib);
2867 dst_format = "r6g6b6";
2868 sha1 = sha1_graphics_r6g6b6;
2869 draw_graphics(mem_dc, bmi, bits, &sha1);
2870 draw_text(mem_dc, bmi, bits);
2872 SelectObject(mem_dc, orig_bm);
2877 bmi->bmiHeader.biBitCount = 24;
2878 bmi->bmiHeader.biCompression = BI_RGB;
2880 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2881 ok(dib != NULL, "ret NULL\n");
2882 orig_bm = SelectObject(mem_dc, dib);
2885 sha1 = sha1_graphics_24;
2886 draw_graphics(mem_dc, bmi, bits, &sha1);
2887 draw_text(mem_dc, bmi, bits);
2889 SelectObject(mem_dc, orig_bm);
2894 bmi->bmiHeader.biBitCount = 16;
2895 bmi->bmiHeader.biCompression = BI_RGB;
2897 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2898 ok(dib != NULL, "ret NULL\n");
2899 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2900 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2901 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2902 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2903 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2905 orig_bm = SelectObject(mem_dc, dib);
2907 dst_format = "r5g5b5";
2908 sha1 = sha1_graphics_r5g5b5;
2909 draw_graphics(mem_dc, bmi, bits, &sha1);
2910 draw_text(mem_dc, bmi, bits);
2912 SelectObject(mem_dc, orig_bm);
2917 bmi->bmiHeader.biBitCount = 16;
2918 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2919 bit_fields[0] = 0x0f00;
2920 bit_fields[1] = 0x00f0;
2921 bit_fields[2] = 0x000f;
2922 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2923 ok(dib != NULL, "ret NULL\n");
2924 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2925 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2926 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2927 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2928 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2930 orig_bm = SelectObject(mem_dc, dib);
2932 dst_format = "r4g4b4";
2933 sha1 = sha1_graphics_r4g4b4;
2934 draw_graphics(mem_dc, bmi, bits, &sha1);
2935 draw_text(mem_dc, bmi, bits);
2937 SelectObject(mem_dc, orig_bm);
2942 bmi->bmiHeader.biBitCount = 8;
2943 bmi->bmiHeader.biCompression = BI_RGB;
2944 bmi->bmiHeader.biClrUsed = 236;
2945 for (i = 0; i < 236; i++)
2947 colors[i].rgbRed = (i & 0x07) << 5;
2948 colors[i].rgbGreen = (i & 0x38) << 2;
2949 colors[i].rgbBlue = i & 0xc0;
2951 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2952 ok(dib != NULL, "ret NULL\n");
2954 orig_bm = SelectObject(mem_dc, dib);
2956 dst_format = "8 color";
2957 sha1 = sha1_graphics_8_color;
2958 draw_graphics(mem_dc, bmi, bits, &sha1);
2959 draw_text(mem_dc, bmi, bits);
2961 SelectObject(mem_dc, orig_bm);
2965 trace("8 grayscale\n");
2966 bmi->bmiHeader.biBitCount = 8;
2967 bmi->bmiHeader.biCompression = BI_RGB;
2968 bmi->bmiHeader.biClrUsed = 256;
2969 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2971 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2972 ok(dib != NULL, "ret NULL\n");
2974 orig_bm = SelectObject(mem_dc, dib);
2976 dst_format = "8 grayscale";
2977 sha1 = sha1_graphics_8_grayscale;
2978 draw_graphics(mem_dc, bmi, bits, &sha1);
2979 draw_text(mem_dc, bmi, bits);
2981 SelectObject(mem_dc, orig_bm);
2986 bmi->bmiHeader.biBitCount = 8;
2987 bmi->bmiHeader.biCompression = BI_RGB;
2988 bmi->bmiHeader.biClrUsed = 5;
2989 colors[0].rgbRed = 0xff;
2990 colors[0].rgbGreen = 0xff;
2991 colors[0].rgbBlue = 0xff;
2992 colors[1].rgbRed = 0;
2993 colors[1].rgbGreen = 0;
2994 colors[1].rgbBlue = 0;
2995 colors[2].rgbRed = 0xff;
2996 colors[2].rgbGreen = 0;
2997 colors[2].rgbBlue = 0;
2998 colors[3].rgbRed = 0;
2999 colors[3].rgbGreen = 0xff;
3000 colors[3].rgbBlue = 0;
3001 colors[4].rgbRed = 0;
3002 colors[4].rgbGreen = 0;
3003 colors[4].rgbBlue = 0xff;
3005 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3006 ok(dib != NULL, "ret NULL\n");
3008 orig_bm = SelectObject(mem_dc, dib);
3011 sha1 = sha1_graphics_8;
3012 draw_graphics(mem_dc, bmi, bits, &sha1);
3013 draw_text(mem_dc, bmi, bits);
3015 SelectObject(mem_dc, orig_bm);
3020 bmi->bmiHeader.biBitCount = 4;
3022 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3023 ok(dib != NULL, "ret NULL\n");
3025 orig_bm = SelectObject(mem_dc, dib);
3028 sha1 = sha1_graphics_4;
3029 draw_graphics(mem_dc, bmi, bits, &sha1);
3030 draw_text(mem_dc, bmi, bits);
3032 SelectObject(mem_dc, orig_bm);
3036 trace("4 grayscale\n");
3037 bmi->bmiHeader.biClrUsed = 16;
3038 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3040 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3041 ok(dib != NULL, "ret NULL\n");
3043 orig_bm = SelectObject(mem_dc, dib);
3045 dst_format = "4 grayscale";
3046 sha1 = sha1_graphics_4_grayscale;
3047 draw_graphics(mem_dc, bmi, bits, &sha1);
3048 draw_text(mem_dc, bmi, bits);
3050 SelectObject(mem_dc, orig_bm);
3055 bmi->bmiHeader.biBitCount = 1;
3056 bmi->bmiHeader.biClrUsed = 2;
3058 colors[0].rgbRed = 0x00;
3059 colors[0].rgbGreen = 0x01;
3060 colors[0].rgbBlue = 0xff;
3061 colors[1].rgbRed = 0xff;
3062 colors[1].rgbGreen = 0x00;
3063 colors[1].rgbBlue = 0x00;
3065 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3066 ok(dib != NULL, "ret NULL\n");
3068 orig_bm = SelectObject(mem_dc, dib);
3071 sha1 = sha1_graphics_1;
3072 draw_graphics(mem_dc, bmi, bits, &sha1);
3073 draw_text(mem_dc, bmi, bits);
3075 SelectObject(mem_dc, orig_bm);
3083 HMODULE mod = GetModuleHandleA("gdi32.dll");
3084 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3085 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3086 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3088 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3090 test_simple_graphics();
3092 CryptReleaseContext(crypt_prov, 0);