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",
148 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
152 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
154 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
155 "2426172d9e8fec27d9228088f382ef3c93717da9",
156 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
157 "664fac17803859a4015c6ae29e5538e314d5c827",
158 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
159 "fe6cc678fb13a3ead67839481bf22348adc69f52",
160 "d51bd330cec510cdccf5394328bd8e5411901e9e",
161 "df4aebf98d91f11be560dd232123b3ae327303d7",
162 "f2af53dd073a09b1031d0032d28da35c82adc566",
163 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
164 "c387917268455017aa0b28bed73aa6554044bbb3",
165 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
166 "6c530622a025d872a642e8f950867884d7b136cb",
167 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
168 "b2261353decda2712b83538ab434a49ce21f3172",
169 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
170 "9b9874c1c1d92afa554137e191d34ea33acc322f",
171 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
172 "d7398de15b2837a58a62a701ca1b3384625afec4",
173 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
174 "5246ef357e7317b9d141a3294d300c195da76cb7",
175 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
176 "3d8244b665ecdb104087bad171b0b0f83545133c",
177 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
178 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
179 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
180 "e358efb1c11172e40855de620bdb8a8e545cd790",
181 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
182 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
183 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
184 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
185 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
186 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
187 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
188 "94645300d6eb51020a7ef8261dee2941cd51b5df",
189 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
190 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
191 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
192 "68c18db6abfda626cab12d198298d4c39264bfbc",
193 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
194 "39c31de73aafcfcadf0bf414da4495be9de54417",
195 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
196 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
197 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
198 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
199 "3d2ccbe51408232a04769546b1bdd74f84558a41",
200 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
201 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
202 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
203 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
204 "d7dd4700f49808541bba99244b7eb5840e0a2439",
205 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
206 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
207 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
208 "a1fde1094d2c19ddb20871842dae1da73618709e",
209 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
210 "b2c8e1ebb9435031fe068442f479d1304096e79f",
211 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
212 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
213 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
214 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
215 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
216 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
217 "f451a05f699ac3bbe155d059e7871a2636887b5f",
218 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
219 "dccaef62738ff90da4554a85d8cb846d6436799e",
220 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
224 static const char *sha1_graphics_a8b8g8r8[] =
226 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
227 "e0bc877697093ed440e125154e247ca9d65e933c",
228 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
229 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
230 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
231 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
232 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
233 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
234 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
235 "b753ebb39d90210cc717f57b53dd439f7de6b077",
236 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
237 "94368cea5033b435454daa56d55546310675131e",
238 "bf57a6a37fb107d29ed3d45695919887abcb7902",
239 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
240 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
241 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
242 "b0178632775d29bec2b16de7b9b8287115c40d0f",
243 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
244 "3369889a67d6c79a24ee15f7d14374f9995215e4",
245 "473a1fd07df800c87a5d3286b642ace10c61c6af",
246 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
247 "b8951d2b20518fd129e5113a5f429626893913bf",
248 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
249 "4851c5b7d5bc18590e787c0c218a592ef504e738",
250 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
251 "abdf003699364fe45fab7dc61e67c606d0063b40",
252 "89abaadff4e68c738cf9251c51e3609564843381",
253 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
254 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
255 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
256 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
257 "71b9756fdfeedce1e6db201176d21a981b881662",
258 "5319528d9af750c172ae62ee85ddb2eaef73b193",
259 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
260 "19b32a0daa91201725b5e13820c343d0a84ff698",
261 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
262 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
263 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
264 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
265 "8566c1110ab5cb8f754787b47923c8bff38f790c",
266 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
267 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
268 "d01071c44259adc94b89978b7d51a058b6dad665",
269 "e6d33b106bcda374e662d338c57a457dbcaa108a",
270 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
271 "339908a568f384e1f384a3e1b0dd415779203b02",
272 "88fd743d00bd37d2ed722092146795b044d08a6e",
273 "c0537ec24147e74939219213d864ee113cad9967",
274 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
275 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
276 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
277 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
278 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
279 "1cb1810b127f509117b38d62a15b67b2347b9145",
280 "f05b3294f25de5fa6d1114104bca97871052ea5a",
281 "87f57a31253a38dbf3dc3070473328fa04b68a48",
282 "db64cc4d830fc35ed170b53943e722b2342954d4",
283 "9988ceca44dafbee247aece1f027c06c27c01652",
284 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
285 "b76e0724496e471b01ef8b34f8beba69f5bde261",
286 "693f5c5fbaeaadb5928d34b035499626fecb8394",
287 "8a9aa84c42dedc3e681191a1229846887ed262ec",
288 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
289 "707bc44fc9fed68ff1f537f0473e0cd825dd660f",
290 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
291 "175a7bcb73c74eceecc000657a0100bccf158ff4",
292 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
296 static const char *sha1_graphics_r10g10b10[] =
298 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
299 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
300 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
301 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
302 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
303 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
304 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
305 "0ad27de0c916c073d0d18484fff899bbdb258db7",
306 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
307 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
308 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
309 "2986b431a0022153e5f875da77cc792e3825ebd5",
310 "ca4b25a5459885ce1e0a36844612087893d425b1",
311 "181bd4616796d89174cedc0332fb320b65aeb0e2",
312 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
313 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
314 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
315 "536eaaa901d652805a8977ecb2dc73f651094c5b",
316 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
317 "92cddcabf5365eef1e037f488af52b31669d987f",
318 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
319 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
320 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
321 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
322 "d578210815e27fe210eb678a71e6d22ba4b4c196",
323 "c7a027c7079dfcc831ca8bc134a509958273073c",
324 "19cf978596195b848df8709aaf637f83f92b8336",
325 "798a835fe50156eeb478c0a6085b088f53409d52",
326 "86ddf268d854f37e5b478c48792b551b57635db6",
327 "8259d388e02542207b6a08d65d553871ce1c4a09",
328 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
329 "66f8d78d4971934794478afee28b3a50e97f1b82",
330 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
331 "63798fb175afef78fa8fe8133d9de97a0cc80651",
332 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
333 "1ceb85697f649a62b1753438daa14944af7f450c",
334 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
335 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
336 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
337 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
338 "ada202d2f526f6995f83412479891c1764b66e5a",
339 "68348e8f54883f4fe295354b024e291c85f1038f",
340 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
341 "e9167564031ead3459eee6a3ebb2f58f100d931f",
342 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
343 "46196f50297260df2863e2fa76d2dfcf72006c23",
344 "0790585dfaef94f912b1ee81477d4ac448708708",
345 "589fb8a85d924ad19ed78409ae89475ba479c30a",
346 "43d67bc61ef54014b022891e5c024fc24b1fe797",
347 "e8783644428b637adbe80bcd084a33428cb69983",
348 "fc0c32afb719295f28bcfef22803bef94f798e20",
349 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
350 "d3f08946300e1700865042aed121870e292d1095",
351 "467ff4af1e105855874f27fbf84d1d2b0417ab5d",
352 "fb0dcff8a67a88313557ee8b588aaa2004fe7b8b",
353 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
354 "317521e576801acaea62c76fe16813cdfe20f4ad",
355 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
356 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
357 "555b6f04ba8dec9e2a60693dcaac594227052727",
358 "4238fe9d296b5c72b0a8745cc761f308605b2094",
359 "943dc6033ab335a6a63e666f70a6bb3a0677e157",
360 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
361 "88cfa7b7c1487f8eda05fce92b622942c9fb7ca4",
362 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
363 "ad91dde8566dceaadc3523cdc8149cd7415a1b70",
364 "1936661eee8073068506131c9e89265b2f8403e8",
368 static const char *sha1_graphics_r6g6b6[] =
370 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
371 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
372 "5b9dab3d8411afb25fbbeba0313db526815ac189",
373 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
374 "2028d1b0d1acef35dc07027135023f35fb9746b9",
375 "378713720dcb5aadb730435ad0989a68ab189114",
376 "084152773feb01a85df6006f2f4f288a1442d37a",
377 "97b824953f60fc9a91028045baacbe7b7dc82b14",
378 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
379 "287d755448e72e29e4812193e2b6f8098a214d82",
380 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
381 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
382 "e51bcf80211cd06e7d10225534b7a79b5454be27",
383 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
384 "0b94e0a5b739ab0020130646522e53da35a149ad",
385 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
386 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
387 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
388 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
389 "2128157e601ef0d6b3636b7387d3b28e876de728",
390 "8bdcdcd463f0052279d070ac763757f4db975483",
391 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
392 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
393 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
394 "66b130f83381957cfc4763558c5f5cddf2e3b564",
395 "d548135ce2320499277ce12b80bc35004f8a9787",
396 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
397 "1906ddfd829e735af49245171f8eb7673295d399",
398 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
399 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
400 "defd95a10d44cad6e736542920b74efd53e9e7eb",
401 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
402 "3f11a735e52030aa3d0f024d83803698293d10e5",
403 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
404 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
405 "3231c4d87faefb7ec5bd377613969c05b70343fc",
406 "00394e438e9edde978e88602c9ad2a572e965bf6",
407 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
408 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
409 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
410 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
411 "3d6cf3753390a05504b1f50302f767df443f0f40",
412 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
413 "da9e896a3a98b330980152b2e4a43cb6e686c730",
414 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
415 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
416 "47499ad13b719de18c59c2bc9b38ed578db50b95",
417 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
418 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
419 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
420 "49341c297a887186bd47d7465d827ab3147f05e3",
421 "325279e76367200d3fd7194d81c09fd139988ece",
422 "c3def160a1e847605ff0fc7edd30397fa90635a0",
423 "a9c2158329c207638cfd2c82cd8a6218efdb28d2",
424 "7f0c4e6874f0c36cee64ff5dec76258ca8822cb2",
425 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
426 "77ea86e51a94b11a8081b29696cb4115687843e3",
427 "d67b897cad72d31e75359094007b1346fd8806ea",
428 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
429 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
430 "481337fbedf181d4324bf7f8299b0327197ff468",
431 "9ab957870fa4e17aec6a79bc1a4fdb42a5ffcc30",
432 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
433 "8e32ea3614c3b20899d748db48258761c7158d2b",
434 "5da35bad12e3e9b26a0444d30820099481281e45",
435 "94f004e98ae8035af948611770a4a2dd6643f510",
436 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
440 static const char *sha1_graphics_24[] =
442 "e993b15c9bd14fb45a15310450b7083c44e42665",
443 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
444 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
445 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
446 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
447 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
448 "fd4be592483623dbc800fe28210a1f0daa71999b",
449 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
450 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
451 "883bc8f305c602edca785e21cd00f488583fb13f",
452 "3bac4e80993f49dc3926e30524115fca9d7a8026",
453 "91369e35be29059a0665782541db4c8b324c6bb2",
454 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
455 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
456 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
457 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
458 "5068bff794553cf5a3145ae407c9a2984357844c",
459 "413a7989969c229dee4ab1798362f32f96cf0a10",
460 "0bb222e540b82720d4971e4a2fc626899af03e03",
461 "adc20832d8c43f1cf372d8392535492013cd2306",
462 "45649794dcbcabda487f66f7a80fc1bec79047a1",
463 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
464 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
465 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
466 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
467 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
468 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
469 "92a1ab214dd8027c407814420449119466c92840",
470 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
471 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
472 "955390669afed2369b15b32fa519f2f921cdf1a0",
473 "201906f7d763b930a98c97f8eeab417f2b65e723",
474 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
475 "701c5af1d0c28294ce7d804b5697643c430d22a0",
476 "b0a959745b2db1d9f449e68e4479a4f36301879c",
477 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
478 "e171f6ec77bca91d6b8559911bce296c0bac469e",
479 "9725669042ef68acb408404d196496d10340bb5a",
480 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
481 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
482 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
483 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
484 "0f79500eda467cd3cbc220abdd37b5dba695d654",
485 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
486 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
487 "7d479beeb6758c164566638b5c873c188d6a91e7",
488 "80086808fca03e757d812e31d1ae576bf90dac9d",
489 "9560096f1b85ae6d939d736165c44df00a47c424",
490 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
491 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
492 "b25ba91487ec945410deb2b51bc1156890c032a8",
493 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
494 "ee315634ed92da3a32c2675ecd1b369471c60936",
495 "6776e0612410e7e200c853721b4ab6ad8b6b81f5",
496 "620a5a520d81971a2d9c30b8d836ba696e11b8dd",
497 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
498 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
499 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
500 "bf5ec23456efe00e1e0931c17de9040ab2092858",
501 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
502 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
503 "e96b79bf88988b5694a04dfc3bd0029361b39801",
504 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
505 "09cb4ab070083144bed4271c0a2a34ccb6ed13c0",
506 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
507 "c95afd0a020e68a76982fe8663b5d64113987233",
508 "48658ff76c137185c56a53f3ccf0e958d0296742",
512 static const char *sha1_graphics_r5g5b5[] =
514 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
515 "847005cf7371f511bcc837251cde07b1796f6113",
516 "a8f75743a930843ec14d516cd048b6e0468e5d89",
517 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
518 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
519 "a9034a905daa91757b4f63345c0e40638cd53ca8",
520 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
521 "99474fecf11df7b7035c35be6b8b697be9889418",
522 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
523 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
524 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
525 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
526 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
527 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
528 "449092689226a1172b6086ba1181d6b6d6499f26",
529 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
530 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
531 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
532 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
533 "6daaf945a955928c5c124c880522ca4634fb2343",
534 "12a288390d16e1efa99d4185301de48a4d433b14",
535 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
536 "1d3af561605fd61433035600d8962cb8d266fdd0",
537 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
538 "d7d97e28ed316f6596c737eb83baa5948d86b673",
539 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
540 "656bf3b7121bcd620a0a3ad488f0d66604824577",
541 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
542 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
543 "a49530722328ae88fd765792ac0c657efbcce75d",
544 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
545 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
546 "a6fd83542c3826132e88d3f5e304d604c0056fad",
547 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
548 "e428d213ad02651287894f093413949dcb369208",
549 "7df915bedcc5951a1b6f828490f7dbb93212e835",
550 "645dc251d205139282b17eb7bece1055fff3bcd0",
551 "76215275593631f5900aad3616d725733dc39493",
552 "81655a550703849a616d4a16504bb9c6f999285f",
553 "573d65665d20f00d36d9782ae2b89772140524ab",
554 "619414c1b33ac60cb0c0de61df86245d472259b0",
555 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
556 "2a66dae03890ff791eabb982949435adb19af02b",
557 "24ac219478ba406f30794550690486b14cbac5e8",
558 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
559 "db8c34882ddd46716d14bbf569d530f80db65ed4",
560 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
561 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
562 "a92942269911a88793b3460b6f2a2cd56e48eec1",
563 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
564 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
565 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
566 "585061e403d9cac1603a38af420efe87338f381a",
567 "8f447a3820c83662086dfa836da2205b0130fd5f",
568 "3772003c7fb420003512d0c437b3659d96d89ce4",
569 "dab47c9dc149e570045d699598b14a613bf319b3",
570 "2daca4d26a086ed34894693be0b0374402232809",
571 "e313ae8f7261b88999757ed0c6f26df85b4f01a5",
572 "47d0bab8664ae0aaa927495d07bb3537cce35f16",
573 "295ec16530126046790fb734e99f86f5b3b74ed8",
574 "d98b0561010606b55a1b9b85fbc93640f681d256",
575 "1c1499051860b7caa25173b328ca9c862f01dd1a",
576 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
577 "2230f36f12d4becb242e2962fa1b3694db2496ca",
578 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
579 "5950f7d00cd8692872377df0e869a7d5ea5e4420",
580 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
581 "7de23c68ca224818fdf127c5e96729dcd0de2b8b",
582 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
583 "1a0fd0df17fa4c455a4a91cad30b5242f77fd233",
584 "af45bf81d119be5cf6845ad41191ba52637e65e9",
588 static const char *sha1_graphics_r4g4b4[] =
590 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
591 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
592 "8bd18697d1ef27492805667a0bc956343ac08667",
593 "e8501c830321584474654f90e40eaf27dc21e6a8",
594 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
595 "821177710961d2cb5f7e7dfc0e06e767b6042753",
596 "667124365ffadeea1d8791bedda77a0c7b898de8",
597 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
598 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
599 "fb52b0c373a5f2a60b981604b120962942d2447a",
600 "5ab8dd07436681d762fa04ad7c6d71291c488924",
601 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
602 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
603 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
604 "25fcb75aa687aac35b8f72640889fe92413e00c5",
605 "3bddf9d53e89560b083302b146cd33791b13d941",
606 "a81504498c7a7bb46340ce74476a42f70f2730b1",
607 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
608 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
609 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
610 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
611 "57ebf8becac1524543da120e88e9cc57ecfdec49",
612 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
613 "d591232bbc2592462c819a9486750f64180518fd",
614 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
615 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
616 "8933450132bf949ba4bc28626968425b5ed2867d",
617 "9928a8f28a66c00069a124f7171b248817005763",
618 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
619 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
620 "233e588cf660e2c9b552cf02065cf63fa6655864",
621 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
622 "a3345acaf272f2e288626906e3056cd0ced70499",
623 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
624 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
625 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
626 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
627 "9dd123938b0a02601d8d458ecbd6535ddefea724",
628 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
629 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
630 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
631 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
632 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
633 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
634 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
635 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
636 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
637 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
638 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
639 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
640 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
641 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
642 "7d80b8289da8a65931f03c74a9ef0aff5f8eb551",
643 "a7a986097e5b553c71bd93fd0ec6037e6bd0f2d1",
644 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
645 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
646 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
647 "9f72be4467219a345b1164205d1fbfda2d64271e",
648 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
649 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
650 "3830cd728c1e72837310940bcdac4e294d6c9843",
651 "f571c7c4aac92491017963032194690c0fa06b42",
652 "6fd751b7328c02954bce98bed94b3ce3c73db118",
653 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
654 "8585783d0373e9696b508776b6e6b18a80b09888",
655 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
659 static const char *sha1_graphics_8_color[] =
661 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
662 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
663 "49024d6cbdf1614327dfda9eda17675e76805f7e",
664 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
665 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
666 "84d85009d35ae10abbc435f3913422544105cea2",
667 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
668 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
669 "f3aa8d89430748178952de56643069d80b40aad6",
670 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
671 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
672 "52b1363e821bf604d9df260bfa97e26d428c33fd",
673 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
674 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
675 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
676 "89711289be6d5c55734878410e4923d5cca9aca9",
677 "8355caf57d51ad4e14275943088392e37dc75d33",
678 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
679 "6f0570da9dea7f043f678088f8362ee458cd79fa",
680 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
681 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
682 "5092b22af85a08f10a2899888bb9d552f25f828e",
683 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
684 "e91973be2651eeef568700463652838d8cbba976",
685 "1df851515ecf46df5c2d3279535c1763f72353dd",
686 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
687 "359bd76088a965bb0cee7c44800bc46b2638807e",
688 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
689 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
690 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
691 "91f988f575338505ba8a40727865a8d3f2298624",
692 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
693 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
694 "3b7488731da48635d86be551ab7c8c0f91c78219",
695 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
696 "e15a355fc09bfd22267917898e2266168ff410e3",
697 "b9688566bddf18586787c00e68724e51e97dfb72",
698 "5e38e03310f1c66f2052af2a745d8c60515707c5",
699 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
700 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
701 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
702 "6376234f542467e5887adfece62f753e998dc19d",
703 "add949d009217ef2b847e34772ba363e4be7b1b8",
704 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
705 "0b58666deb3615e912896a764e5c6475989e95e4",
706 "bf460cc44c0edee851d72587c8425c3f06a62c55",
707 "ea74c00c45569007383b632d7f1d2adc82645717",
708 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
709 "284abed096637c80bb50844e393da9dd4b3f19ac",
710 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
711 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
712 "46f772c2832b3aad584674db666bd63e48b4f338",
713 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
714 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
715 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
716 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
717 "678979a45126a76eb629992cd64734862f53a555",
718 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
719 "9b1cc7b24f8ce15db2af7f4aa8cde8687784dfa2",
720 "cc4a4cea622d825700bccef7d90a5a447d9ca39d",
721 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
722 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
723 "2c07272462c68cf5944b03e2aa049475b99143c5",
724 "07ca369fb875d37b9cf855045f528af1827edec4",
725 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
726 "488341e88810d737de0b26de4e4d4fa0e78eb482",
727 "bd1e7f40e3971e2ff6c5561286901193a1557527",
728 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
729 "d7ffa3893c6fa937569791cf49986518a4a4d96e",
730 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
731 "8771d5ff7b93b9dd9d077e672b342235dfb28472",
732 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
736 static const char *sha1_graphics_8_grayscale[] =
738 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
739 "df35491dd5038187c05bac06921402ba6d7773a8",
740 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
741 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
742 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
743 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
744 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
745 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
746 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
747 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
748 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
749 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
750 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
751 "114bb377b4e78a1978e1ac09388c48861b5223a3",
752 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
753 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
754 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
755 "216388ddf6b563dd2058a9df65b40b6f72df1715",
756 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
757 "47f72be971bd2d3399dabd018201f4f5075e96fe",
758 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
759 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
760 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
761 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
762 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
763 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
764 "b6785a410048bb85e7ea3f0492459972103c935e",
765 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
766 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
767 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
768 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
769 "0000000000000000000000000000000000000000",
770 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
771 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
772 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
773 "6d41e6168662e75baacf74d911d7419d54c8d73c",
774 "2404952157ba1519094a2da6bfbf2b0f1356432d",
775 "24caede65b40815a60b83c4edfa06bdc542388cd",
776 "650a51bedd1af92469d2950eb95220db35f95c6e",
777 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
778 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
779 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
780 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
781 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
782 "85425940daf119125deb52421b2057acebe6d1cf",
783 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
784 "9869b6f088822fb423996f9968e5a931301fc2c3",
785 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
786 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
787 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
788 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
789 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
790 "f543efc84e638afbaa456e629100f0274de1a35b",
791 "1bd2587399006eed0d46beff397d32081f6bc58e",
792 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
793 "640a49455acabca6954a7fbb6af4e872af342d11",
794 "589e7911e09332ee090371deae17b0120ff990b5",
795 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
796 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
797 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
798 "3685c9ae95118a83db3569832c29753276fa1264",
799 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
800 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
801 "a4b04ed35484de0de61832a8a28bbc7def645622",
802 "515897610714251dd3b54f54fe76a9ed3fd12c53",
803 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
804 "17ae603c199a5d6695d198a7f36e6d7263990951",
805 "1918a33f59d3500204ffc573318a39e9ff754221",
806 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
807 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
808 "3494a23633405e46af96cb57715617fef1ac252e",
809 "5a3ae1da30d83cc157e6a4a5617c85598309f4ac",
810 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
811 "87eab8f81fb2a036080e099760f628037f9306e7",
812 "a3eac75d30f681b3898ee469d368960529634d7d",
813 "cd5caeabdb71241766d24f038cfc5f1e91e11256",
814 "e2b393dc3f5833f7868668ea31369e90348768cd",
818 static const char *sha1_graphics_8[] =
820 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
821 "512246d4886ab889a090b167ba194577cb95272e",
822 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
823 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
824 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
825 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
826 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
827 "390b2bf70daba36310683f46af9cd50b9a061396",
828 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
829 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
830 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
831 "da1cc34a9d9b779fc7849e03e214096026506464",
832 "5ba8f99ca034666effa556748c49a0f5a015125f",
833 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
834 "73e2859ce849f756f954718ce3c90f02e31712b6",
835 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
836 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
837 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
838 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
839 "7262364067e03c7fa498af1d59d228d6c63b460e",
840 "5241241a355a667ef0834049adf4218e8b3f16b8",
841 "db22d666690948eb966f75b796c72c7150a5c4b9",
842 "af21fb2645b568b049549de375584c4aa3055143",
843 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
844 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
845 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
846 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
847 "bdc0a354635b879871077c5b712570e469863c99",
848 "d599bf210423fe3adbb4f1de87d9360de97827d0",
849 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
850 "cc01f17928f7780cefd423ea653b072eea723a1b",
851 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
852 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
853 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
854 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
855 "f4a334e69535de74ee5ed54be93a75120a66e54a",
856 "559fd1d15447745527c61fe43a94c6708bff3e39",
857 "995f77f2f53398399f09d1365cb4dfd105764e5c",
858 "61907a6685bba93077da40cfb28cf2ab74552fd2",
859 "122015e5e17c1c317c6e51c0e207826b606a4077",
860 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
861 "8c609921d4a3ed89a994a75482b27496bf103cf5",
862 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
863 "66493ee117719e172f327a426af601996025f28c",
864 "acead2745fec0b6c817fa601353bdf2d197b64f7",
865 "a6b858b2d125c159529d3f3ec45b31925a79acff",
866 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
867 "d83adc669c0dea0dc4812b93f998514b6f02d805",
868 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
869 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
870 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
871 "7d1bfff706b0713e53209407889f83a0da26a81d",
872 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
873 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
874 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
875 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
876 "d4f3a5ea033adc405c44e1ca137dc908c606dad6",
877 "7103d428ec9a959778120fd6f0dc62dd608ddd63",
878 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
879 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
880 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
881 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
882 "293c41a7ed923a4617560481ae8815cebf83701a",
883 "750c923785ba2afb9ce597516c072f90f014bf95",
884 "80089132f8a11d86e8038f2f8e12dfba46624ee5",
885 "bde5a62a065c027561226fbec5155e938ba7f6b3",
886 "a6311d74fc058079a327abb536e69353be719925",
887 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
888 "0000000000000000000000000000000000000000",
889 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
893 static const char *sha1_graphics_4[] =
895 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
896 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
897 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
898 "9401799e6116c35e5f0e5bdca07ea25316757a72",
899 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
900 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
901 "2505598845fa026ea7187582461efbf06cb6904f",
902 "3981a19363beca8f28d32a5928ac296fd22a5296",
903 "01404024ebb2c266d17d734059524d874491650f",
904 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
905 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
906 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
907 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
908 "1f26a01730f67d40ea711a50d9d801bac15a642e",
909 "3b53d24178cfacba53103a44dfd5d072b15a6781",
910 "c52cfd57f26037723d37192722fc3a217f280c9e",
911 "e34da6500cf2e424d980714d92737cf6c31a7bda",
912 "d17f4358ae529f920960ed89e535902ee13b0033",
913 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
914 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
915 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
916 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
917 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
918 "39c16648cf6c261be71a33cec41867f28e119b94",
919 "26ad5116562e7b58c76a26eaf521e2e40899e944",
920 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
921 "4f827ca6927f15191588456f985bf29d2a3b3c24",
922 "e7de769c3d12ea9dd223bef4881c578823bec67e",
923 "6fb102d020e5554116feefc8482104f3ae2036d2",
924 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
925 "20c9eb3276c08fdce35755e349bec94b04929812",
926 "628d837163a25c6520f19c0602383176dbad528e",
927 "b5a12cff7100290ad43f5ed17a321b42de048893",
928 "b672afbeeafb44194a821f0def81a8892872937e",
929 "db0124045882b598feea192186cf7eb7a0387866",
930 "602d91471378fe24a2d0248bd8a92b624f099fea",
931 "e772873b87a0f55ea51a3da323f64bf8814c6703",
932 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
933 "1a579cd280422131c35e907a023ee0e80749b5a4",
934 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
935 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
936 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
937 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
938 "3e411b004a5be84451860c6da6a4a1a482b77862",
939 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
940 "7811c536a6527112b438a6413f3927f2c79086a7",
941 "525ef3615040225752a2fe646ab99ee64e360630",
942 "46760975993f9881b7bbe94123173e6a683d3f25",
943 "df5feb905a31c288008cf5e82d73ac818a160d82",
944 "df5feb905a31c288008cf5e82d73ac818a160d82",
945 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
946 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
947 "1a23839d71d2379ed4e709a5ae6c14639fbe3ab8",
948 "09f8416a780d80be61cbda3d8a05aee418d0ea00",
949 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
950 "029552113292cc110fd6b7888e766628950aaeef",
951 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
952 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
953 "287ea7db721e641439888cb9f4bac3a5f16124eb",
954 "42466aab11852741d937c1ff6f3bb711e58415a6",
955 "0663cf6330591fcf744aba96664e05d90243d07a",
956 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
957 "6fe7d0d17b892032cfd171c3d7c365f030b5be38",
958 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
959 "0000000000000000000000000000000000000000",
960 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
964 static const char *sha1_graphics_4_grayscale[] =
966 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
967 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
968 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
969 "1c201d149c0bd886ff8a427ad513f15a70991174",
970 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
971 "315189097a02024d2eae61d524c4de07a396aee7",
972 "73ac786015dea36ac466a6524dba757d5d238ece",
973 "6e328cc4d53627f034b23706d8bf26afe18512ae",
974 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
975 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
976 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
977 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
978 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
979 "ec3879342b5a44f6de6efe946243ae5ade00980d",
980 "6e328cc4d53627f034b23706d8bf26afe18512ae",
981 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
982 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
983 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
984 "b2bda683edef912957845a33edc055902a801fed",
985 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
986 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
987 "43ee3e187dda14b86aef12371041ae70313b5a65",
988 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
989 "d4930552a7845111ffd9db57260be1ab97967c06",
990 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
991 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
992 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
993 "0000000000000000000000000000000000000000",
994 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
995 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
996 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
997 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
998 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
999 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
1000 "f8224430462f6a93f85ef33b8aa7299525990708",
1001 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
1002 "d58b8760ef01c12e691651c932d683c66fde3654",
1003 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
1004 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
1005 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
1006 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
1007 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
1008 "027b05bc82ce4f897c4bf812610a641547368939",
1009 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
1010 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
1011 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
1012 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
1013 "5eeb56afea8040a8fb18c11f29931b836474126d",
1014 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
1015 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
1016 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
1017 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
1018 "43560b856907f552df3b9dd1f91e1aa8ab9ff17e",
1019 "8cefa6dcb658487d0715598d5d120677dbfdab42",
1020 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
1021 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
1022 "58f400c9bb78e49a879276fb049edfc9c981740a",
1023 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
1024 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
1025 "68bee638d59a373f33f308751471b3ef41849582",
1026 "be0501175cc3cbb61217fca76356f761117fb40f",
1027 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1028 "3efe128a5bf250f2c460664e8f543f5ec54d5dc2",
1029 "2d5123e757cf00e423a89160d7dc4997c3688829",
1030 "0000000000000000000000000000000000000000",
1031 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
1035 static const char *sha1_graphics_1[] =
1037 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1038 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
1039 "a7cc69f957d7b533a0a330859a143d701daac73c",
1040 "a955bf088c5edb129289ce65caace48ec95632e4",
1041 "5316d3c558c254479883133cf58cd07ab521d3f0",
1042 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
1043 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
1044 "121423a38b4ac4743bd516e0a7e88a3863796313",
1045 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
1046 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1047 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1048 "39ff81f77ef4ee772367ed1a63785987c060126e",
1049 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1050 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1051 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1052 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1053 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
1054 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
1055 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1056 "0ff4b49797e30e3555aab45219adf449a9a560ff",
1057 "280327328ca940c212ce24fe72e0b00014072767",
1058 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1059 "b85463875f755b85f1464b1b6275912bcbad6c9f",
1060 "816f200969feecc788b61dfeecf05b1790984401",
1061 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1062 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
1063 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1064 "0a76e0121facb103857130bc6e12185ad77fc3fa",
1065 "02aede714773d654d0fc2f640afaa133ec718ad5",
1066 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1067 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
1068 "b26699f62661e16a1dc452d24c88ce363a1f2998",
1069 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1070 "c14832e69ec3585c15987b3d69d5007236fa9814",
1071 "e44ea620b0c47125a34193537ab9d219a52ad028",
1072 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1073 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
1074 "8819bf7a43295161fe045a42936000b3a51fe200",
1075 "e08dbc26469c229f75ccbf1a38a133401f270b84",
1076 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1077 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1078 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1079 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1080 "ffc78c075d4be66806f6c59180772d5eed963dc0",
1081 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1082 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1083 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1084 "b71ca46be287598f716bb04fac0a52ad139c70db",
1085 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1086 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1087 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1088 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1089 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1090 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1091 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
1092 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1093 "655cfadeb157233c804d42b58195569c8846e3c1",
1094 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1095 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1096 "0d180c37bc26d83a1a11f66168757f3de2493243",
1097 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1098 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1099 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1100 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1101 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1102 "a2a928de9007d765da496abec8c21b23601f8c45",
1103 "28ded40e72d4327b9413571476b167fb28a1f420",
1104 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1105 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1106 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1107 "44a28536466dc895feb824b23dfd4a47c6948af8",
1108 "f0316a5765a0404760e94cd05b7dc956cae07d26",
1109 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1110 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1111 "55c26d22f11d80b73383fa57d0fac552d705b092",
1112 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1113 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1114 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1115 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1116 "1ee4e951743efc8764249fbc7adecefbfec0428e",
1117 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1118 "128eefd2ee043d59dc37918065f687e378e5ca95",
1119 "c642abc651f525332d9d635049646d309e877839",
1120 "8d34215487088b5d4ef63062270ce25c2862643d",
1121 "3dc3075b0c87fdcaabbbae8928303fb2358c15c2",
1122 "bbae6f0659e095a42b420082079663f937065813",
1123 "ca711c69165e1fa5be72993b9a7870ef6d485249",
1127 static const RECT graphics_bounds[] =
1130 { 10, 3, 219, 101 },
1131 { 100, 100, 301, 301 },
1133 { 10, 10, 110, 320 },
1134 { 10, 99, 300, 200 },
1135 { 99, 12, 201, 200 },
1136 { 90, 110, 300, 200 },
1137 { 90, 90, 210, 200 },
1138 { 10, 99, 300, 200 },
1139 { 10, 99, 300, 200 },
1140 { 99, 12, 201, 200 },
1141 { 99, 11, 201, 200 },
1142 { 90, 110, 300, 200 },
1143 { 90, 110, 300, 200 },
1144 { 10, 10, 365, 405 },
1145 { 10, 10, 365, 405 },
1146 { 10, 10, 365, 405 },
1147 { 10, 10, 365, 405 },
1148 { 10, 10, 365, 405 },
1149 { 10, 10, 365, 405 },
1150 { 10, 10, 365, 405 },
1151 { 10, 10, 365, 405 },
1152 { 10, 10, 350, 251 },
1153 { 10, 10, 300, 200 },
1154 { 300, 10, 9, 260 },
1155 { 10, 10, 435, 405 },
1156 { 10, 10, 120, 120 },
1157 { 10, 10, 110, 110 },
1158 { 10, 10, 120, 110 },
1159 { 10, 10, 110, 120 },
1160 { 10, 10, 120, 120 },
1161 { 10, 10, 110, 110 },
1162 { 10, 10, 120, 110 },
1163 { 10, 10, 110, 120 },
1164 { 100, 100, 356, 356 },
1165 { 100, 100, 356, 356 },
1166 { 50, 50, 306, 306 },
1167 { 100, 100, 356, 356 },
1168 { 100, 100, 356, 356 },
1169 { 100, 100, 356, 356 },
1170 { 100, 100, 356, 356 },
1171 { 100, 100, 356, 356 },
1172 { 100, 100, 356, 356 },
1173 { 100, 100, 356, 356 },
1174 { 100, 100, 356, 356 },
1175 { 100, 100, 356, 356 },
1176 { 100, 100, 356, 356 },
1177 { 100, 100, 356, 356 },
1178 { 10, 10, 416, 26 },
1180 { 0, 10, 511, 306 },
1181 { 0, 10, 512, 306 },
1185 { 45, 45, 256, 256 },
1186 { 86, 86, 215, 215 },
1191 { -1, -1, -1, -1 } /* the end */
1194 static const char **current_sha1;
1195 static const RECT *current_bounds;
1196 static const char *dst_format;
1198 static inline DWORD get_stride(BITMAPINFO *bmi)
1200 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1203 static inline DWORD get_dib_size(BITMAPINFO *bmi)
1205 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1208 static char *hash_dib(BITMAPINFO *bmi, void *bits)
1210 DWORD dib_size = get_dib_size(bmi);
1214 DWORD hash_size = sizeof(hash_buf);
1216 static const char *hex = "0123456789abcdef";
1218 if(!crypt_prov) return NULL;
1220 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1222 CryptHashData(hash, bits, dib_size, 0);
1224 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1225 if(hash_size != sizeof(hash_buf)) return NULL;
1227 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1228 CryptDestroyHash(hash);
1230 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1232 for(i = 0; i < hash_size; i++)
1234 buf[i * 2] = hex[hash_buf[i] >> 4];
1235 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1242 static void reset_bounds( HDC hdc )
1244 current_bounds = graphics_bounds;
1245 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
1248 static void compare_bounds( HDC hdc, const char *info )
1252 GetBoundsRect( hdc, &rect, DCB_RESET );
1254 if (current_bounds->left == -1 &&
1255 current_bounds->top == -1 &&
1256 current_bounds->right == -1 &&
1257 current_bounds->bottom == -1)
1259 ok( 0, "missing bounds, got { %d, %d, %d, %d },\n", rect.left, rect.top, rect.right, rect.bottom );
1263 if (current_bounds->left == 0 && current_bounds->top == 0 &&
1264 current_bounds->right == 0 && current_bounds->bottom == 0)
1265 ok( !memcmp( current_bounds, &rect, sizeof(RECT) ),
1266 "%s: %s: expected bounds %d,%d,%d,%d got %d,%d,%d,%d\n", dst_format, info,
1267 current_bounds->left, current_bounds->top, current_bounds->right, current_bounds->bottom,
1268 rect.left, rect.top, rect.right, rect.bottom );
1271 ok( !memcmp( current_bounds, &rect, sizeof(RECT) ),
1272 "%s: %s: expected bounds %d,%d,%d,%d got %d,%d,%d,%d\n", dst_format, info,
1273 current_bounds->left, current_bounds->top, current_bounds->right, current_bounds->bottom,
1274 rect.left, rect.top, rect.right, rect.bottom );
1278 static void skip_compare( int count )
1280 current_sha1 += count;
1284 static void compare_hash_broken_todo(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1286 char *hash = hash_dib(bmi, bits);
1290 /* reset the bits for the next test */
1291 memset( bits, 0xcc, get_dib_size(bmi) );
1295 skip("SHA1 hashing unavailable on this platform\n");
1299 for(i = 0; i <= num_broken; i++)
1301 if(current_sha1[i] == NULL)
1303 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1308 ok_cond = !strcmp(hash, *current_sha1);
1310 for(i = 1; i <= num_broken; i++)
1311 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1314 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1315 dst_format, info, *current_sha1, hash );
1317 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1318 dst_format, info, *current_sha1, hash );
1320 current_sha1 += num_broken + 1;
1322 HeapFree(GetProcessHeap(), 0, hash);
1324 compare_bounds( hdc, info );
1327 static void compare_hash(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char *info)
1329 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1332 static const RECT bias_check[] =
1334 {100, 100, 200, 150},
1335 {100, 100, 150, 200},
1336 {100, 100, 50, 200},
1344 static const RECT hline_clips[] =
1346 {120, 120, 140, 120}, /* unclipped */
1347 {100, 122, 140, 122}, /* l edgecase */
1348 { 99, 124, 140, 124}, /* l edgecase clipped */
1349 {120, 126, 200, 126}, /* r edgecase */
1350 {120, 128, 201, 128}, /* r edgecase clipped */
1351 { 99, 130, 201, 130}, /* l and r clipped */
1352 {120, 100, 140, 100}, /* t edgecase */
1353 {120, 99, 140, 99}, /* t edgecase clipped */
1354 {120, 199, 140, 199}, /* b edgecase */
1355 {120, 200, 140, 200}, /* b edgecase clipped */
1356 {120, 132, 310, 132}, /* inside two clip rects */
1357 { 10, 134, 101, 134}, /* r end on l edgecase */
1358 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1359 {199, 138, 220, 138}, /* l end on r edgecase */
1360 {200, 140, 220, 140} /* l end on r edgecase clipped */
1363 static const RECT vline_clips[] =
1365 {120, 120, 120, 140}, /* unclipped */
1366 {100, 120, 100, 140}, /* l edgecase */
1367 { 99, 120, 99, 140}, /* l edgecase clipped */
1368 {199, 120, 199, 140}, /* r edgecase */
1369 {200, 120, 200, 140}, /* r edgecase clipped */
1370 {122, 99, 122, 201}, /* t and b clipped */
1371 {124, 100, 124, 140}, /* t edgecase */
1372 {126, 99, 126, 140}, /* t edgecase clipped */
1373 {128, 120, 128, 200}, /* b edgecase */
1374 {130, 120, 130, 201}, /* b edgecase clipped */
1375 {132, 12, 132, 140}, /* inside two clip rects */
1376 {134, 90, 134, 101}, /* b end on t edgecase */
1377 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1378 {138, 199, 138, 220}, /* t end on b edgecase */
1379 {140, 200, 140, 220} /* t end on b edgecase clipped */
1382 static const RECT line_clips[] =
1384 { 90, 110, 310, 120},
1385 { 90, 120, 295, 130},
1386 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1387 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1388 { 90, 132, 101, 137}, /* end pt just inside l edge */
1389 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1390 {199, 142, 210, 143} /* start pt just inside r edge */
1393 static const RECT wide_lines[] =
1399 { 10, 100, 10, 200},
1400 { 21, 100, 21, 200},
1401 { 40, 200, 40, 100},
1402 { 61, 200, 61, 100},
1405 static const POINT poly_lines[] =
1407 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1410 static const RECT patblt_clips[] =
1412 {120, 120, 140, 126}, /* unclipped */
1413 {100, 130, 140, 136}, /* l edgecase */
1414 { 99, 140, 140, 146}, /* l edgecase clipped */
1415 {180, 130, 200, 136}, /* r edgecase */
1416 {180, 140, 201, 146}, /* r edgecase clipped */
1417 {120, 100, 130, 110}, /* t edgecase */
1418 {140, 99, 150, 110}, /* t edgecase clipped */
1419 {120, 180, 130, 200}, /* b edgecase */
1420 {140, 180, 150, 201}, /* b edgecase */
1421 {199, 150, 210, 156}, /* l edge on r edgecase */
1422 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1423 { 90, 150, 101, 156}, /* r edge on l edgecase */
1424 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1425 {160, 90, 166, 101}, /* b edge on t edgecase */
1426 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1427 {160, 199, 166, 210}, /* t edge on b edgecase */
1428 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1431 static const RECT rectangles[] =
1434 {250, 100, 350, 10},
1435 {120, 10, 120, 20}, /* zero width */
1436 {120, 10, 130, 10}, /* zero height */
1437 {120, 40, 121, 41}, /* 1 x 1 */
1438 {130, 50, 132, 52}, /* 2 x 2 */
1439 {140, 60, 143, 63}, /* 3 x 3 */
1440 {150, 70, 154, 74}, /* 4 x 4 */
1441 {120, 20, 121, 30}, /* width == 1 */
1442 {130, 20, 132, 30}, /* width == 2 */
1443 {140, 20, 143, 30}, /* width == 3 */
1444 {200, 20, 210, 21}, /* height == 1 */
1445 {200, 30, 210, 32}, /* height == 2 */
1446 {200, 40, 210, 43} /* height == 3 */
1449 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1450 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1451 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1452 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1453 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1454 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1456 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1457 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1458 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1459 0x00, 0x01 }; /* <eod> */
1461 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1462 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1463 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1464 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1466 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1467 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1469 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1471 HBRUSH brush = CreateSolidBrush( color );
1472 brush = SelectObject( hdc, brush );
1473 PatBlt( hdc, x, y, width, height, PATCOPY );
1474 DeleteObject( SelectObject( hdc, brush ) );
1477 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits)
1479 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1480 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1481 PALETTEENTRY *entries = pal->palPalEntry;
1482 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1484 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1486 INT i, j, x, y, hatch_style;
1489 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1490 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1491 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1492 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1493 RGBQUAD *brush_colors = brush_bi->bmiColors;
1494 BYTE *brush_bits, *src_bits;
1495 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1496 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1497 BLENDFUNCTION blend;
1498 COLORREF old_text, old_bkgnd;
1501 blend.BlendOp = AC_SRC_OVER;
1502 blend.BlendFlags = 0;
1504 reset_bounds( hdc );
1506 memset(bits, 0xcc, get_dib_size(bmi));
1507 compare_hash(hdc, bmi, bits, "empty");
1509 src_dc = CreateCompatibleDC( 0 );
1510 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1511 orig_pen = SelectObject(hdc, solid_pen);
1512 SetBrushOrgEx(hdc, 0, 0, NULL);
1514 /* horizontal and vertical lines */
1515 for(i = 1; i <= 16; i++)
1518 MoveToEx(hdc, 10, i * 3, NULL);
1519 LineTo(hdc, 100, i * 3); /* l -> r */
1520 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1521 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1522 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1523 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1524 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1525 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1527 compare_hash(hdc, bmi, bits, "h and v solid lines");
1529 /* diagonal lines */
1530 SetROP2(hdc, R2_COPYPEN);
1531 for(i = 0; i < 16; i++)
1533 double s = sin(M_PI * i / 8.0);
1534 double c = cos(M_PI * i / 8.0);
1536 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1537 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1539 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1541 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1543 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1544 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1546 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1548 /* solid brush PatBlt */
1549 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1550 orig_brush = SelectObject(hdc, solid_brush);
1552 for(i = 0, y = 10; i < 256; i++)
1554 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1556 if(rop_uses_src(rop3[i]))
1557 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1560 ok(ret, "got FALSE for %x\n", rop3[i]);
1565 compare_hash(hdc, bmi, bits, "solid patblt");
1568 hrgn = CreateRectRgn(10, 10, 200, 20);
1569 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1570 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1571 SetRectRgn(hrgn2, 290, 100, 300, 200);
1572 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1573 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1574 DeleteObject(hrgn2);
1576 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1578 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1579 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1581 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1583 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1585 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1586 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1588 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1590 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1592 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1593 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1595 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1597 /* clipped PatBlt */
1598 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1600 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1601 patblt_clips[i].right - patblt_clips[i].left,
1602 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1604 compare_hash(hdc, bmi, bits, "clipped patblt");
1606 /* clipped dashed lines */
1607 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1608 SelectObject(hdc, dashed_pen);
1609 SetBkMode(hdc, TRANSPARENT);
1610 SetBkColor(hdc, RGB(0, 0xff, 0));
1612 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1614 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1615 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1617 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1619 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1621 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1622 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1624 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1626 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1628 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1629 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1631 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1633 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1635 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1636 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1638 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1640 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1642 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1643 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1645 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1647 SetBkMode(hdc, OPAQUE);
1649 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1651 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1652 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1654 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1656 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1658 /* 8888 DIB pattern brush */
1660 brush_bi->bmiHeader = dib_brush_header_8888;
1661 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1662 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1663 brush_bits[2] = 0xff;
1664 brush_bits[6] = 0xff;
1665 brush_bits[14] = 0xff;
1666 brush_bits[65] = 0xff;
1667 brush_bits[69] = 0xff;
1668 brush_bits[72] = 0xff;
1670 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1672 SelectObject(hdc, dib_brush);
1673 SetBrushOrgEx(hdc, 1, 1, NULL);
1675 for(i = 0, y = 10; i < 256; i++)
1677 if(!rop_uses_src(rop3[i]))
1679 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1680 ok(ret, "got FALSE for %x\n", rop3[i]);
1684 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1685 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1687 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1689 SelectObject(hdc, orig_brush);
1690 DeleteObject(dib_brush);
1692 /* 8888 bottom-up DIB pattern brush */
1694 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1696 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1698 SelectObject(hdc, dib_brush);
1700 /* This used to set the x origin to 100 as well, but
1701 there's a Windows bug for 24 bpp where the brush's x offset
1702 is incorrectly calculated for rops that involve both D and P */
1703 SetBrushOrgEx(hdc, 4, 100, NULL);
1705 for(i = 0, y = 10; i < 256; i++)
1707 if(!rop_uses_src(rop3[i]))
1709 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1710 ok(ret, "got FALSE for %x\n", rop3[i]);
1714 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1715 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1717 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1719 SelectObject(hdc, orig_brush);
1720 DeleteObject(dib_brush);
1722 /* 24 bpp dib pattern brush */
1724 brush_bi->bmiHeader = dib_brush_header_24;
1725 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1726 memset(brush_bits, 0, 16 * 16 * 3);
1727 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1728 brush_bits[49] = brush_bits[52] = 0xff;
1730 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1732 SelectObject(hdc, dib_brush);
1733 SetBrushOrgEx(hdc, 1, 1, NULL);
1735 for(i = 0, y = 10; i < 256; i++)
1737 if(!rop_uses_src(rop3[i]))
1739 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1740 ok(ret, "got FALSE for %x\n", rop3[i]);
1744 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1745 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1747 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1749 SelectObject(hdc, orig_brush);
1750 DeleteObject(dib_brush);
1752 /* 555 dib pattern brush */
1754 brush_bi->bmiHeader = dib_brush_header_555;
1755 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1756 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1757 brush_bits[0] = brush_bits[1] = 0xff;
1758 brush_bits[32] = brush_bits[34] = 0x7c;
1760 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1762 SelectObject(hdc, dib_brush);
1763 SetBrushOrgEx(hdc, 1, 1, NULL);
1765 for(i = 0, y = 10; i < 256; i++)
1767 if(!rop_uses_src(rop3[i]))
1769 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1770 ok(ret, "got FALSE for %x\n", rop3[i]);
1774 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1775 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1777 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1779 SelectObject(hdc, orig_brush);
1780 DeleteObject(dib_brush);
1782 SetBrushOrgEx(hdc, 0, 0, NULL);
1784 /* 8 bpp dib pattern brush */
1786 brush_bi->bmiHeader = dib_brush_header_8;
1787 brush_bi->bmiHeader.biClrUsed = 3;
1788 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1789 brush_colors[0].rgbRed = 0xff;
1790 brush_colors[1].rgbRed = 0xff;
1791 brush_colors[1].rgbGreen = 0xff;
1792 brush_colors[1].rgbBlue = 0xff;
1794 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1795 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1796 brush_bits[0] = brush_bits[1] = 1;
1797 brush_bits[16] = brush_bits[17] = 2;
1798 brush_bits[32] = brush_bits[33] = 6;
1800 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1802 SelectObject(hdc, dib_brush);
1803 SetBrushOrgEx(hdc, 1, 1, NULL);
1805 for(i = 0, y = 10; i < 256; i++)
1807 if(!rop_uses_src(rop3[i]))
1809 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1810 ok(ret, "got FALSE for %x\n", rop3[i]);
1814 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1816 SelectObject(hdc, orig_brush);
1817 DeleteObject(dib_brush);
1819 /* 4 bpp dib pattern brush */
1821 brush_bi->bmiHeader = dib_brush_header_4;
1822 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1824 SelectObject(hdc, dib_brush);
1825 SetBrushOrgEx(hdc, 1, 1, NULL);
1827 for(i = 0, y = 10; i < 256; i++)
1829 if(!rop_uses_src(rop3[i]))
1831 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1832 ok(ret, "got FALSE for %x\n", rop3[i]);
1836 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1838 SelectObject(hdc, orig_brush);
1839 DeleteObject(dib_brush);
1841 /* 1 bpp dib pattern brush */
1843 brush_bi->bmiHeader = dib_brush_header_1;
1844 brush_bi->bmiHeader.biClrUsed = 2;
1845 memset(brush_bits, 0, 16 * 4);
1846 brush_bits[0] = 0xf0;
1847 brush_bits[4] = 0xf0;
1848 brush_bits[8] = 0xf0;
1850 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1851 SelectObject(hdc, dib_brush);
1852 for(i = 0, y = 10; i < 256; i++)
1854 if(!rop_uses_src(rop3[i]))
1856 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1857 ok(ret, "got FALSE for %x\n", rop3[i]);
1862 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1864 SelectObject(hdc, orig_brush);
1865 DeleteObject(dib_brush);
1867 /* 1 bpp ddb pattern brush */
1869 old_text = GetTextColor( hdc );
1870 old_bkgnd = GetBkColor( hdc );
1871 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1872 dib_brush = CreatePatternBrush( bmp );
1873 SelectObject(hdc, dib_brush);
1874 for(i = 0, y = 10; i < 256; i++)
1876 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1877 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1878 if(!rop_uses_src(rop3[i]))
1880 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1881 ok(ret, "got FALSE for %x\n", rop3[i]);
1886 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1889 SelectObject(hdc, orig_brush);
1890 SetBrushOrgEx(hdc, 0, 0, NULL);
1891 SetTextColor(hdc, old_text);
1892 SetBkColor(hdc, old_bkgnd);
1896 SelectObject(hdc, solid_pen);
1897 SelectObject(hdc, solid_brush);
1899 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1901 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1904 SelectObject(hdc, dashed_pen);
1905 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1907 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1910 compare_hash(hdc, bmi, bits, "rectangles");
1911 SelectObject(hdc, solid_pen);
1915 PaintRgn(hdc, hrgn);
1916 compare_hash(hdc, bmi, bits, "PaintRgn");
1918 /* RTL rectangles */
1922 win_skip("Don't have SetLayout\n");
1927 pSetLayout(hdc, LAYOUT_RTL);
1928 PaintRgn(hdc, hrgn);
1929 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1930 Rectangle(hdc, 100, 250, 110, 260);
1931 compare_hash(hdc, bmi, bits, "rtl");
1933 pSetLayout(hdc, LAYOUT_LTR);
1935 DeleteObject( hrgn );
1937 for(i = 0, y = 10; i < 256; i++)
1939 if(!rop_uses_src(rop3[i]))
1941 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1943 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1944 SelectObject(hdc, hatch_brush);
1945 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1946 ok(ret, "got FALSE for %x\n", rop3[i]);
1947 SelectObject(hdc, orig_brush);
1948 DeleteObject(hatch_brush);
1954 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
1956 /* overlapping blits */
1958 orig_brush = SelectObject(hdc, solid_brush);
1960 Rectangle(hdc, 10, 10, 100, 100);
1961 Rectangle(hdc, 20, 15, 30, 40);
1962 Rectangle(hdc, 15, 15, 20, 20);
1963 Rectangle(hdc, 15, 20, 50, 45);
1964 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1965 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
1967 Rectangle(hdc, 10, 10, 100, 100);
1968 Rectangle(hdc, 20, 15, 30, 40);
1969 Rectangle(hdc, 15, 15, 20, 20);
1970 Rectangle(hdc, 15, 20, 50, 45);
1971 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1972 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1973 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1975 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
1977 Rectangle(hdc, 10, 10, 100, 100);
1978 Rectangle(hdc, 20, 15, 30, 40);
1979 Rectangle(hdc, 15, 15, 20, 20);
1980 Rectangle(hdc, 15, 20, 50, 45);
1981 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1982 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
1984 Rectangle(hdc, 10, 10, 100, 100);
1985 Rectangle(hdc, 20, 15, 30, 40);
1986 Rectangle(hdc, 15, 15, 20, 20);
1987 Rectangle(hdc, 15, 20, 50, 45);
1988 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1989 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1990 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1992 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
1994 Rectangle(hdc, 10, 10, 100, 100);
1995 Rectangle(hdc, 20, 15, 30, 40);
1996 Rectangle(hdc, 15, 15, 20, 20);
1997 Rectangle(hdc, 15, 20, 50, 45);
1998 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1999 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2001 Rectangle(hdc, 10, 10, 100, 100);
2002 Rectangle(hdc, 20, 15, 30, 40);
2003 Rectangle(hdc, 15, 15, 20, 20);
2004 Rectangle(hdc, 15, 20, 50, 45);
2005 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2006 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2008 Rectangle(hdc, 10, 10, 100, 100);
2009 Rectangle(hdc, 20, 15, 30, 40);
2010 Rectangle(hdc, 15, 15, 20, 20);
2011 Rectangle(hdc, 15, 20, 50, 45);
2012 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2013 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2014 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2016 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2018 Rectangle(hdc, 10, 10, 100, 100);
2019 Rectangle(hdc, 20, 15, 30, 40);
2020 Rectangle(hdc, 15, 15, 20, 20);
2021 Rectangle(hdc, 15, 20, 50, 45);
2022 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2023 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2025 /* blitting with 32-bpp BI_RGB source */
2027 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2028 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2029 src_bi->bmiHeader.biHeight = 256;
2030 src_bi->bmiHeader.biWidth = 256;
2031 src_bi->bmiHeader.biBitCount = 32;
2032 src_bi->bmiHeader.biPlanes = 1;
2033 src_bi->bmiHeader.biCompression = BI_RGB;
2034 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2035 SelectObject( src_dc, bmp );
2036 for (y = 0; y < 256; y++)
2037 for (x = 0; x < 256; x++)
2039 BYTE a = (x + y) * 2;
2040 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2041 BYTE g = (BYTE)(x + y / 3) * a / 255;
2042 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2043 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2046 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2047 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2048 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2050 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2052 blend.SourceConstantAlpha = 0xd0;
2053 blend.AlphaFormat = 0;
2054 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2055 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2057 if (!pGdiAlphaBlend) skip_compare(2);
2058 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2062 if (!pGdiAlphaBlend) skip_compare(1);
2063 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2066 blend.SourceConstantAlpha = 0xb0;
2067 blend.AlphaFormat = AC_SRC_ALPHA;
2068 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2069 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2071 if (!pGdiAlphaBlend) skip_compare(2);
2072 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2076 if (!pGdiAlphaBlend) skip_compare(1);
2077 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2080 /* blitting with 32-bpp r10g10b10 source */
2082 src_bi->bmiHeader.biBitCount = 32;
2083 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2084 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2085 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2086 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2087 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2088 SelectObject( src_dc, bmp );
2089 for (y = 0; y < 256; y++)
2090 for (x = 0; x < 256; x++)
2092 WORD r = (7 * x + 3 * y) % 1024;
2093 WORD g = (11 * x + y / 3) % 1024;
2094 WORD b = (x / 3 + 9 * y) % 1024;
2095 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2098 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2099 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2100 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2102 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2104 /* blitting with 32-bpp b6g6r6 source */
2106 src_bi->bmiHeader.biBitCount = 32;
2107 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2108 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2109 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2110 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2111 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2112 SelectObject( src_dc, bmp );
2113 for (y = 0; y < 256; y++)
2114 for (x = 0; x < 256; x++)
2116 BYTE r = (y + 2 * x) % 64;
2117 BYTE g = (x + y / 3) % 64;
2118 BYTE b = (x / 3 + 2 * y) % 64;
2119 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2122 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2123 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2124 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2126 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2128 /* blitting with 24-bpp source */
2130 src_bi->bmiHeader.biBitCount = 24;
2131 src_bi->bmiHeader.biCompression = BI_RGB;
2132 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2133 DeleteObject( SelectObject( src_dc, bmp ) );
2134 for (y = 0; y < 256; y++)
2135 for (x = 0; x < 256; x++)
2137 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2138 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2139 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2142 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2143 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2144 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2146 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2148 blend.SourceConstantAlpha = 0xe0;
2149 blend.AlphaFormat = 0;
2150 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2151 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2153 if (!pGdiAlphaBlend) skip_compare(2);
2154 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2158 if (!pGdiAlphaBlend) skip_compare(1);
2159 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2162 /* blitting with 16-bpp BI_RGB source */
2164 src_bi->bmiHeader.biBitCount = 16;
2165 src_bi->bmiHeader.biCompression = BI_RGB;
2166 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2167 DeleteObject( SelectObject( src_dc, bmp ) );
2168 for (y = 0; y < 256; y++)
2169 for (x = 0; x < 256; x++)
2170 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2172 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2173 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2174 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2176 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2178 /* blitting with 16-bpp b4g4r4 source */
2180 src_bi->bmiHeader.biBitCount = 16;
2181 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2182 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2183 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2184 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2185 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2186 DeleteObject( SelectObject( src_dc, bmp ) );
2187 for (y = 0; y < 256; y++)
2188 for (x = 0; x < 256; x++)
2189 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2191 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2192 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2193 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2195 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2197 /* blitting with 8-bpp source */
2199 src_bi->bmiHeader.biBitCount = 8;
2200 src_bi->bmiHeader.biCompression = BI_RGB;
2201 src_bi->bmiHeader.biClrUsed = 160;
2202 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2203 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2204 DeleteObject( SelectObject( src_dc, bmp ) );
2205 for (y = 0; y < 256; y++)
2206 for (x = 0; x < 256; x++)
2207 src_bits[y * 256 + x] = 3 * x + 5 * y;
2209 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2210 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2212 blend.SourceConstantAlpha = 0xd0;
2213 blend.AlphaFormat = 0;
2214 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2215 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2217 if (!pGdiAlphaBlend) skip_compare(2);
2218 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2222 if (!pGdiAlphaBlend) skip_compare(1);
2223 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2226 /* blitting with 4-bpp source */
2228 src_bi->bmiHeader.biBitCount = 4;
2229 src_bi->bmiHeader.biClrUsed = 12;
2230 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2231 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2232 DeleteObject( SelectObject( src_dc, bmp ) );
2233 for (y = 0; y < 256; y++)
2234 for (x = 0; x < 256; x += 2)
2235 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2237 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2238 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2240 /* blitting with 1-bpp source */
2242 src_bi->bmiHeader.biBitCount = 1;
2243 src_bi->bmiHeader.biClrUsed = 0;
2244 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2245 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2246 DeleteObject( SelectObject( src_dc, bmp ) );
2247 for (y = 0; y < 256; y++)
2248 for (x = 0; x < 256; x += 8)
2249 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2251 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2252 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2254 blend.SourceConstantAlpha = 0x90;
2255 blend.AlphaFormat = 0;
2256 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2257 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2259 if (!pGdiAlphaBlend) skip_compare(2);
2260 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2264 if (!pGdiAlphaBlend) skip_compare(1);
2265 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2269 DeleteObject( bmp );
2271 /* RLE StretchDIBits */
2272 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2273 src_bi->bmiHeader.biWidth = 8;
2274 src_bi->bmiHeader.biHeight = 8;
2275 src_bi->bmiHeader.biPlanes = 1;
2276 src_bi->bmiHeader.biBitCount = 8;
2277 src_bi->bmiHeader.biCompression = BI_RLE8;
2278 src_bi->bmiHeader.biClrUsed = 0;
2279 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2281 for (i = 0; i < 256; i++)
2283 src_bi->bmiColors[i].rgbRed = i;
2284 src_bi->bmiColors[i].rgbGreen = i;
2285 src_bi->bmiColors[i].rgbBlue = i;
2286 src_bi->bmiColors[i].rgbReserved = 0;
2289 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2290 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2291 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2292 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2293 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2294 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2296 /* 32 bpp StretchDIBits */
2298 src_bi->bmiHeader.biWidth = 4;
2299 src_bi->bmiHeader.biHeight = 4;
2300 src_bi->bmiHeader.biPlanes = 1;
2301 src_bi->bmiHeader.biBitCount = 32;
2302 src_bi->bmiHeader.biCompression = BI_RGB;
2303 src_bi->bmiHeader.biClrUsed = 0;
2304 src_bi->bmiHeader.biSizeImage = 0;
2306 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2307 ok(ret == 4, "got %d\n", ret);
2308 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2309 ok(ret == 4, "got %d\n", ret);
2310 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2311 ok(ret == 4, "got %d\n", ret);
2312 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2313 ok(ret == 4, "got %d\n", ret);
2314 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2315 ok(ret == 4, "got %d\n", ret);
2316 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2317 ok(ret == 4, "got %d\n", ret);
2319 src_bi->bmiHeader.biHeight = -4;
2321 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2322 ok(ret == 4, "got %d\n", ret);
2323 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2324 ok(ret == -4, "got %d\n", ret);
2325 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2326 ok(ret == 4, "got %d\n", ret);
2327 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2328 ok(ret == -4, "got %d\n", ret);
2329 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2330 ok(ret == 4, "got %d\n", ret);
2331 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2332 ok(ret == -4, "got %d\n", ret);
2334 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2337 for (i = 0; i < 256; i++)
2339 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2340 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2341 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2342 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2343 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2346 /* A few extra colors that are interesting in the 1bpp case */
2349 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2350 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2353 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2354 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2357 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2358 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2360 compare_hash(hdc, bmi, bits, "Colors");
2362 for (i = 0; i < 256; i++)
2365 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2366 g = GetPixel( hdc, i * 2, 10 );
2367 ok( s == g, "got %08x and %08x\n", s, g );
2369 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2370 g = GetPixel( hdc, i * 2, 20 );
2371 ok( s == g, "got %08x and %08x\n", s, g );
2373 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2374 g = GetPixel( hdc, i * 2, 30 );
2375 ok( s == g, "got %08x and %08x\n", s, g );
2377 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2378 g = GetPixel( hdc, i * 2, 40 );
2379 ok( s == g, "got %08x and %08x\n", s, g );
2381 for (j = 0; j < 256; j++)
2383 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2384 g = GetPixel( hdc, i * 2, 50+j );
2385 ok( s == g, "got %08x and %08x\n", s, g );
2387 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2388 g = GetPixel( hdc, i * 2 + 1, 50+j );
2389 ok( s == g, "got %08x and %08x\n", s, g );
2393 compare_hash(hdc, bmi, bits, "SetPixel");
2397 if (pGdiGradientFill)
2401 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2402 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2403 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2404 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2406 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2410 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2411 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2412 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2414 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2415 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2416 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2418 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2419 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2420 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2422 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2423 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2424 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2426 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2427 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2428 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2430 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2431 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2432 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2434 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2435 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2436 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2438 GRADIENT_TRIANGLE tri[] =
2440 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2441 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2444 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2445 for (i = 0; i < 4; i++) vrect[i].y += 250;
2446 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2448 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2449 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2451 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2453 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2454 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2455 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2456 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2457 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2459 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2463 win_skip( "GdiGradientFill not supported\n" );
2470 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2471 SelectObject( hdc, wide_pen );
2473 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2475 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2476 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2479 compare_hash(hdc, bmi, bits, "wide pen" );
2481 SelectObject( hdc, orig_pen );
2482 DeleteObject( wide_pen );
2484 log_brush.lbStyle = BS_SOLID;
2485 log_brush.lbColor = RGB(0xff, 0, 0);
2486 log_brush.lbHatch = 0;
2488 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2489 9, &log_brush, 0, NULL );
2490 SelectObject( hdc, wide_pen );
2492 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2493 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2495 SelectObject( hdc, orig_pen );
2496 DeleteObject( wide_pen );
2498 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2499 16, &log_brush, 0, NULL );
2500 SelectObject( hdc, wide_pen );
2502 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2503 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2505 SelectObject( hdc, orig_pen );
2506 DeleteObject( wide_pen );
2508 /* brushed wide pen */
2510 old_text = GetTextColor( hdc );
2511 old_bkgnd = GetBkColor( hdc );
2512 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2513 log_brush.lbStyle = BS_PATTERN;
2514 log_brush.lbColor = 0;
2515 log_brush.lbHatch = (ULONG_PTR)bmp;
2516 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2517 12, &log_brush, 0, NULL );
2518 ok( wide_pen != 0, "failed to create pen\n" );
2519 SelectObject( hdc, wide_pen );
2520 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2522 for (i = 1; i < 20; i++)
2524 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2525 i, &log_brush, 0, NULL );
2526 ok( wide_pen != 0, "failed to create pen\n" );
2527 DeleteObject( SelectObject( hdc, wide_pen ));
2528 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2529 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2530 MoveToEx( hdc, 10 * i, 10, NULL );
2531 LineTo( hdc, 10 * i, 200 + i );
2532 LineTo( hdc, 20 * i, 200 + i );
2534 /* NT4 broken for all cases, W2K for 1 bpp only */
2535 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2537 for (i = 1; i < 20; i++)
2539 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2540 i, &log_brush, 0, NULL );
2541 DeleteObject( SelectObject( hdc, wide_pen ));
2542 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2543 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2544 MoveToEx( hdc, 10 * i, 10, NULL );
2545 LineTo( hdc, 10 * i, 200 + i );
2546 LineTo( hdc, 20 * i, 200 + i );
2548 /* NT4 broken for all cases, W2K for 1 bpp only */
2549 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2552 SetTextColor(hdc, old_text);
2553 SetBkColor(hdc, old_bkgnd);
2554 SelectObject( hdc, orig_pen );
2558 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2559 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2560 SetTextColor( hdc, PALETTEINDEX(38) );
2561 SetBkColor( hdc, PALETTEINDEX(9) );
2562 SelectObject( hdc, solid_brush );
2563 SelectObject( hdc, solid_pen );
2565 pal->palVersion = 0x300;
2566 pal->palNumEntries = 40;
2567 for (i = 0; i < 80; i++)
2569 entries[i].peRed = i * 3;
2570 entries[i].peGreen = i * 7;
2571 entries[i].peBlue = 128 - i;
2572 entries[i].peFlags = 0;
2574 hpal = CreatePalette( pal );
2575 SelectPalette( hdc, hpal, FALSE );
2577 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2578 Rectangle( hdc, 0, 0, 10, 10 );
2579 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2580 Rectangle( hdc, 10, 0, 10, 10 );
2581 SelectObject( hdc, orig_brush );
2582 DeleteObject( solid_brush );
2584 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2585 DeleteObject( SelectObject( hdc, solid_brush ));
2586 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2587 SetPaletteEntries( hpal, 0, 40, entries );
2588 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2589 SelectObject( hdc, orig_brush );
2590 DeleteObject( solid_brush );
2592 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2593 dib_brush = CreatePatternBrush( bmp );
2594 SelectObject( hdc, dib_brush );
2595 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2596 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2597 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2598 DeleteObject( bmp );
2599 SelectObject( hdc, orig_brush );
2600 DeleteObject( dib_brush );
2602 SelectPalette( hdc, GetStockObject(DEFAULT_PALETTE), FALSE );
2603 DeleteObject( hpal );
2605 /* NT4 broken for all cases, W2K for 1 bpp only */
2606 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2610 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2611 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2612 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2613 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2614 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2616 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2617 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2618 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2619 DeleteObject( hrgn );
2621 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2622 SelectObject( hdc, solid_brush );
2624 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2625 ok (!ret == !!dib_is_1bpp, "got ret %d\n", ret);
2626 compare_hash(hdc, bmi, bits, "flood fill" );
2628 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2630 SelectObject(hdc, orig_brush);
2631 SelectObject(hdc, orig_pen);
2632 DeleteObject(dib_brush);
2633 DeleteObject(solid_brush);
2634 DeleteObject(wide_pen);
2635 DeleteObject(dashed_pen);
2636 DeleteObject(solid_pen);
2639 static const BYTE ramp[17] =
2641 0, 0x4d, 0x68, 0x7c,
2642 0x8c, 0x9a, 0xa7, 0xb2,
2643 0xbd, 0xc7, 0xd0, 0xd9,
2644 0xe1, 0xe9, 0xf0, 0xf8,
2648 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2650 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2651 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2654 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2656 BYTE min_comp, max_comp;
2658 if (alpha == 16) return text;
2659 if (alpha <= 1) return dst;
2660 if (text == dst) return dst;
2662 get_range( alpha, text, &min_comp, &max_comp );
2666 DWORD diff = dst - text;
2667 DWORD range = max_comp - text;
2668 dst = text + (diff * range ) / (0xff - text);
2673 DWORD diff = text - dst;
2674 DWORD range = text - min_comp ;
2675 dst = text - (diff * range) / text;
2680 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2684 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2685 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2686 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2690 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2692 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2694 DWORD dib_size = get_dib_size(bmi), ret;
2699 int i, stride, x, y;
2700 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2701 char *eto_hash = NULL, *diy_hash = NULL;
2702 static const char *str = "Hello Wine";
2703 POINT origin, g_org;
2704 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2706 COLORREF text_color;
2708 for(i = 0; i < dib_size; i++)
2709 bits[i] = vals[i % 4];
2711 memset( &lf, 0, sizeof(lf) );
2712 strcpy( lf.lfFaceName, "Tahoma" );
2714 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2716 font = CreateFontIndirect( &lf );
2717 font = SelectObject( hdc, font );
2719 GetTextMetrics( hdc, &tm );
2720 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2722 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2723 DeleteObject( SelectObject( hdc, font ) );
2727 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2728 SetTextAlign( hdc, TA_BASELINE );
2729 SetBkMode( hdc, TRANSPARENT );
2733 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2734 eto_hash = hash_dib( bmi, bits );
2736 for(i = 0; i < dib_size; i++)
2737 bits[i] = vals[i % 4];
2739 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2741 text_color = GetTextColor( hdc );
2742 for (i = 0; i < strlen(str); i++)
2744 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2746 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2748 if (ret == GDI_ERROR) continue;
2750 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2752 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2753 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2755 origin.x += gm.gmCellIncX;
2756 origin.y += gm.gmCellIncY;
2762 stride = (gm.gmBlackBoxX + 3) & ~3;
2764 for (y = 0; y < gm.gmBlackBoxY; y++)
2766 BYTE *g_ptr = g_buf + y * stride;
2769 for (x = 0; x < gm.gmBlackBoxX; x++)
2771 if (g_ptr[x] <= 1) continue;
2772 if (g_ptr[x] >= 16) val = text_color;
2775 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2776 val = aa_colorref( val, text_color, g_ptr[x] );
2778 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2784 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2786 for (y = 0; y < gm.gmBlackBoxY; y++)
2788 BYTE *g_ptr = g_buf + y * stride;
2789 for (x = 0; x < gm.gmBlackBoxX; x++)
2791 if (g_ptr[x / 8] & masks[x % 8])
2792 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2798 diy_hash = hash_dib( bmi, bits );
2799 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2801 HeapFree( GetProcessHeap(), 0, diy_hash );
2802 HeapFree( GetProcessHeap(), 0, eto_hash );
2804 font = SelectObject( hdc, font );
2805 DeleteObject( font );
2808 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2810 draw_text_2( hdc, bmi, bits, FALSE );
2812 /* Rounding errors make these cases hard to test */
2813 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2814 (bmi->bmiHeader.biBitCount == 16))
2817 draw_text_2( hdc, bmi, bits, TRUE );
2820 static void test_simple_graphics(void)
2822 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2823 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2824 RGBQUAD *colors = bmi->bmiColors;
2825 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2828 HBITMAP dib, orig_bm;
2832 mem_dc = CreateCompatibleDC(NULL);
2836 memset(bmi, 0, sizeof(bmibuf));
2837 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2838 bmi->bmiHeader.biHeight = 512;
2839 bmi->bmiHeader.biWidth = 512;
2840 bmi->bmiHeader.biBitCount = 32;
2841 bmi->bmiHeader.biPlanes = 1;
2842 bmi->bmiHeader.biCompression = BI_RGB;
2844 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2845 ok(dib != NULL, "ret NULL\n");
2846 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2847 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2848 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2849 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2850 ok(ds.dsBmih.biCompression == BI_RGB ||
2851 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2852 "got %x\n", ds.dsBmih.biCompression);
2854 orig_bm = SelectObject(mem_dc, dib);
2856 dst_format = "8888";
2857 current_sha1 = sha1_graphics_a8r8g8b8;
2858 draw_graphics(mem_dc, bmi, bits);
2859 draw_text(mem_dc, bmi, bits);
2861 SelectObject(mem_dc, orig_bm);
2864 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2865 trace("8888 - bitfields\n");
2866 bmi->bmiHeader.biBitCount = 32;
2867 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2868 bit_fields[0] = 0xff0000;
2869 bit_fields[1] = 0x00ff00;
2870 bit_fields[2] = 0x0000ff;
2872 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2873 ok(dib != NULL, "ret NULL\n");
2874 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2875 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2876 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2877 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2878 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2880 orig_bm = SelectObject(mem_dc, dib);
2882 dst_format = "8888 - bitfields";
2883 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
2884 draw_graphics(mem_dc, bmi, bits);
2885 draw_text(mem_dc, bmi, bits);
2887 SelectObject(mem_dc, orig_bm);
2891 trace("a8b8g8r8\n");
2892 bmi->bmiHeader.biBitCount = 32;
2893 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2894 bit_fields[0] = 0x0000ff;
2895 bit_fields[1] = 0x00ff00;
2896 bit_fields[2] = 0xff0000;
2898 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2899 ok(dib != NULL, "ret NULL\n");
2900 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2901 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2902 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2903 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2904 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2906 orig_bm = SelectObject(mem_dc, dib);
2908 dst_format = "a8b8g8r8";
2909 current_sha1 = sha1_graphics_a8b8g8r8;
2910 draw_graphics(mem_dc, bmi, bits);
2911 draw_text(mem_dc, bmi, bits);
2913 SelectObject(mem_dc, orig_bm);
2917 trace("r10g10b10\n");
2918 bmi->bmiHeader.biBitCount = 32;
2919 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2920 bit_fields[0] = 0x3ff00000;
2921 bit_fields[1] = 0x000ffc00;
2922 bit_fields[2] = 0x000003ff;
2924 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2925 ok(dib != NULL, "ret NULL\n");
2926 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2927 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2928 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2929 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2930 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2932 orig_bm = SelectObject(mem_dc, dib);
2934 dst_format = "r10g10b10";
2935 current_sha1 = sha1_graphics_r10g10b10;
2936 draw_graphics(mem_dc, bmi, bits);
2937 draw_text(mem_dc, bmi, bits);
2939 SelectObject(mem_dc, orig_bm);
2944 bmi->bmiHeader.biBitCount = 32;
2945 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2946 bit_fields[0] = 0x0003f000;
2947 bit_fields[1] = 0x00000fc0;
2948 bit_fields[2] = 0x0000003f;
2950 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2951 ok(dib != NULL, "ret NULL\n");
2952 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2953 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2954 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2955 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2956 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2958 orig_bm = SelectObject(mem_dc, dib);
2960 dst_format = "r6g6b6";
2961 current_sha1 = sha1_graphics_r6g6b6;
2962 draw_graphics(mem_dc, bmi, bits);
2963 draw_text(mem_dc, bmi, bits);
2965 SelectObject(mem_dc, orig_bm);
2970 bmi->bmiHeader.biBitCount = 24;
2971 bmi->bmiHeader.biCompression = BI_RGB;
2973 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2974 ok(dib != NULL, "ret NULL\n");
2975 orig_bm = SelectObject(mem_dc, dib);
2978 current_sha1 = sha1_graphics_24;
2979 draw_graphics(mem_dc, bmi, bits);
2980 draw_text(mem_dc, bmi, bits);
2982 SelectObject(mem_dc, orig_bm);
2987 bmi->bmiHeader.biBitCount = 16;
2988 bmi->bmiHeader.biCompression = BI_RGB;
2990 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2991 ok(dib != NULL, "ret NULL\n");
2992 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2993 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2994 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2995 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2996 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2998 orig_bm = SelectObject(mem_dc, dib);
3000 dst_format = "r5g5b5";
3001 current_sha1 = sha1_graphics_r5g5b5;
3002 draw_graphics(mem_dc, bmi, bits);
3003 draw_text(mem_dc, bmi, bits);
3005 SelectObject(mem_dc, orig_bm);
3010 bmi->bmiHeader.biBitCount = 16;
3011 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3012 bit_fields[0] = 0x0f00;
3013 bit_fields[1] = 0x00f0;
3014 bit_fields[2] = 0x000f;
3015 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3016 ok(dib != NULL, "ret NULL\n");
3017 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3018 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3019 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3020 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3021 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3023 orig_bm = SelectObject(mem_dc, dib);
3025 dst_format = "r4g4b4";
3026 current_sha1 = sha1_graphics_r4g4b4;
3027 draw_graphics(mem_dc, bmi, bits);
3028 draw_text(mem_dc, bmi, bits);
3030 SelectObject(mem_dc, orig_bm);
3035 bmi->bmiHeader.biBitCount = 8;
3036 bmi->bmiHeader.biCompression = BI_RGB;
3037 bmi->bmiHeader.biClrUsed = 236;
3038 for (i = 0; i < 236; i++)
3040 colors[i].rgbRed = (i & 0x07) << 5;
3041 colors[i].rgbGreen = (i & 0x38) << 2;
3042 colors[i].rgbBlue = i & 0xc0;
3044 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3045 ok(dib != NULL, "ret NULL\n");
3047 orig_bm = SelectObject(mem_dc, dib);
3049 dst_format = "8 color";
3050 current_sha1 = sha1_graphics_8_color;
3051 draw_graphics(mem_dc, bmi, bits);
3052 draw_text(mem_dc, bmi, bits);
3054 SelectObject(mem_dc, orig_bm);
3058 trace("8 grayscale\n");
3059 bmi->bmiHeader.biBitCount = 8;
3060 bmi->bmiHeader.biCompression = BI_RGB;
3061 bmi->bmiHeader.biClrUsed = 256;
3062 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3064 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3065 ok(dib != NULL, "ret NULL\n");
3067 orig_bm = SelectObject(mem_dc, dib);
3069 dst_format = "8 grayscale";
3070 current_sha1 = sha1_graphics_8_grayscale;
3071 draw_graphics(mem_dc, bmi, bits);
3072 draw_text(mem_dc, bmi, bits);
3074 SelectObject(mem_dc, orig_bm);
3079 bmi->bmiHeader.biBitCount = 8;
3080 bmi->bmiHeader.biCompression = BI_RGB;
3081 bmi->bmiHeader.biClrUsed = 5;
3082 colors[0].rgbRed = 0xff;
3083 colors[0].rgbGreen = 0xff;
3084 colors[0].rgbBlue = 0xff;
3085 colors[1].rgbRed = 0;
3086 colors[1].rgbGreen = 0;
3087 colors[1].rgbBlue = 0;
3088 colors[2].rgbRed = 0xff;
3089 colors[2].rgbGreen = 0;
3090 colors[2].rgbBlue = 0;
3091 colors[3].rgbRed = 0;
3092 colors[3].rgbGreen = 0xff;
3093 colors[3].rgbBlue = 0;
3094 colors[4].rgbRed = 0;
3095 colors[4].rgbGreen = 0;
3096 colors[4].rgbBlue = 0xff;
3098 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3099 ok(dib != NULL, "ret NULL\n");
3101 orig_bm = SelectObject(mem_dc, dib);
3104 current_sha1 = sha1_graphics_8;
3105 draw_graphics(mem_dc, bmi, bits);
3106 draw_text(mem_dc, bmi, bits);
3108 SelectObject(mem_dc, orig_bm);
3113 bmi->bmiHeader.biBitCount = 4;
3115 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3116 ok(dib != NULL, "ret NULL\n");
3118 orig_bm = SelectObject(mem_dc, dib);
3121 current_sha1 = sha1_graphics_4;
3122 draw_graphics(mem_dc, bmi, bits);
3123 draw_text(mem_dc, bmi, bits);
3125 SelectObject(mem_dc, orig_bm);
3129 trace("4 grayscale\n");
3130 bmi->bmiHeader.biClrUsed = 16;
3131 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3133 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3134 ok(dib != NULL, "ret NULL\n");
3136 orig_bm = SelectObject(mem_dc, dib);
3138 dst_format = "4 grayscale";
3139 current_sha1 = sha1_graphics_4_grayscale;
3140 draw_graphics(mem_dc, bmi, bits);
3141 draw_text(mem_dc, bmi, bits);
3143 SelectObject(mem_dc, orig_bm);
3148 bmi->bmiHeader.biBitCount = 1;
3149 bmi->bmiHeader.biClrUsed = 2;
3151 colors[0].rgbRed = 0x00;
3152 colors[0].rgbGreen = 0x01;
3153 colors[0].rgbBlue = 0xff;
3154 colors[1].rgbRed = 0xff;
3155 colors[1].rgbGreen = 0x00;
3156 colors[1].rgbBlue = 0x00;
3158 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3159 ok(dib != NULL, "ret NULL\n");
3161 orig_bm = SelectObject(mem_dc, dib);
3164 current_sha1 = sha1_graphics_1;
3165 draw_graphics(mem_dc, bmi, bits);
3166 draw_text(mem_dc, bmi, bits);
3168 SelectObject(mem_dc, orig_bm);
3176 HMODULE mod = GetModuleHandleA("gdi32.dll");
3177 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3178 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3179 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3181 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3183 test_simple_graphics();
3185 CryptReleaseContext(crypt_prov, 0);