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 "257d114354a93e681225072bcde756f155b70496",
136 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
137 "e462052a03dbe4ec3814db7700e166d00d4d686f",
138 "a27917d4db49ce77989fae246015aeb2a28520ee",
139 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
143 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
145 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
146 "2426172d9e8fec27d9228088f382ef3c93717da9",
147 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
148 "664fac17803859a4015c6ae29e5538e314d5c827",
149 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
150 "fe6cc678fb13a3ead67839481bf22348adc69f52",
151 "d51bd330cec510cdccf5394328bd8e5411901e9e",
152 "df4aebf98d91f11be560dd232123b3ae327303d7",
153 "f2af53dd073a09b1031d0032d28da35c82adc566",
154 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
155 "c387917268455017aa0b28bed73aa6554044bbb3",
156 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
157 "6c530622a025d872a642e8f950867884d7b136cb",
158 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
159 "b2261353decda2712b83538ab434a49ce21f3172",
160 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
161 "9b9874c1c1d92afa554137e191d34ea33acc322f",
162 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
163 "d7398de15b2837a58a62a701ca1b3384625afec4",
164 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
165 "5246ef357e7317b9d141a3294d300c195da76cb7",
166 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
167 "3d8244b665ecdb104087bad171b0b0f83545133c",
168 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
169 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
170 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
171 "e358efb1c11172e40855de620bdb8a8e545cd790",
172 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
173 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
174 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
175 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
176 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
177 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
178 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
179 "94645300d6eb51020a7ef8261dee2941cd51b5df",
180 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
181 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
182 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
183 "68c18db6abfda626cab12d198298d4c39264bfbc",
184 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
185 "39c31de73aafcfcadf0bf414da4495be9de54417",
186 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
187 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
188 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
189 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
190 "3d2ccbe51408232a04769546b1bdd74f84558a41",
191 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
192 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
193 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
194 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
195 "d7dd4700f49808541bba99244b7eb5840e0a2439",
196 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
197 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
198 "257d114354a93e681225072bcde756f155b70496",
199 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
200 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
201 "b2c8e1ebb9435031fe068442f479d1304096e79f",
202 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
206 static const char *sha1_graphics_a8b8g8r8[] =
208 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
209 "e0bc877697093ed440e125154e247ca9d65e933c",
210 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
211 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
212 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
213 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
214 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
215 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
216 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
217 "b753ebb39d90210cc717f57b53dd439f7de6b077",
218 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
219 "94368cea5033b435454daa56d55546310675131e",
220 "bf57a6a37fb107d29ed3d45695919887abcb7902",
221 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
222 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
223 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
224 "b0178632775d29bec2b16de7b9b8287115c40d0f",
225 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
226 "3369889a67d6c79a24ee15f7d14374f9995215e4",
227 "473a1fd07df800c87a5d3286b642ace10c61c6af",
228 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
229 "b8951d2b20518fd129e5113a5f429626893913bf",
230 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
231 "4851c5b7d5bc18590e787c0c218a592ef504e738",
232 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
233 "abdf003699364fe45fab7dc61e67c606d0063b40",
234 "89abaadff4e68c738cf9251c51e3609564843381",
235 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
236 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
237 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
238 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
239 "71b9756fdfeedce1e6db201176d21a981b881662",
240 "5319528d9af750c172ae62ee85ddb2eaef73b193",
241 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
242 "19b32a0daa91201725b5e13820c343d0a84ff698",
243 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
244 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
245 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
246 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
247 "8566c1110ab5cb8f754787b47923c8bff38f790c",
248 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
249 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
250 "d01071c44259adc94b89978b7d51a058b6dad665",
251 "e6d33b106bcda374e662d338c57a457dbcaa108a",
252 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
253 "339908a568f384e1f384a3e1b0dd415779203b02",
254 "88fd743d00bd37d2ed722092146795b044d08a6e",
255 "c0537ec24147e74939219213d864ee113cad9967",
256 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
257 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
258 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
259 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
260 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
261 "2c4f116451b571106beba8b85da8e4b923937246",
262 "9c8f3063504a81bbbfa8558e111c63d8bc36dbbf",
263 "87f57a31253a38dbf3dc3070473328fa04b68a48",
264 "db64cc4d830fc35ed170b53943e722b2342954d4",
265 "9988ceca44dafbee247aece1f027c06c27c01652",
269 static const char *sha1_graphics_r10g10b10[] =
271 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
272 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
273 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
274 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
275 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
276 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
277 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
278 "0ad27de0c916c073d0d18484fff899bbdb258db7",
279 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
280 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
281 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
282 "2986b431a0022153e5f875da77cc792e3825ebd5",
283 "ca4b25a5459885ce1e0a36844612087893d425b1",
284 "181bd4616796d89174cedc0332fb320b65aeb0e2",
285 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
286 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
287 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
288 "536eaaa901d652805a8977ecb2dc73f651094c5b",
289 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
290 "92cddcabf5365eef1e037f488af52b31669d987f",
291 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
292 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
293 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
294 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
295 "d578210815e27fe210eb678a71e6d22ba4b4c196",
296 "c7a027c7079dfcc831ca8bc134a509958273073c",
297 "19cf978596195b848df8709aaf637f83f92b8336",
298 "798a835fe50156eeb478c0a6085b088f53409d52",
299 "86ddf268d854f37e5b478c48792b551b57635db6",
300 "8259d388e02542207b6a08d65d553871ce1c4a09",
301 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
302 "66f8d78d4971934794478afee28b3a50e97f1b82",
303 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
304 "63798fb175afef78fa8fe8133d9de97a0cc80651",
305 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
306 "1ceb85697f649a62b1753438daa14944af7f450c",
307 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
308 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
309 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
310 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
311 "ada202d2f526f6995f83412479891c1764b66e5a",
312 "68348e8f54883f4fe295354b024e291c85f1038f",
313 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
314 "e9167564031ead3459eee6a3ebb2f58f100d931f",
315 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
316 "46196f50297260df2863e2fa76d2dfcf72006c23",
317 "0790585dfaef94f912b1ee81477d4ac448708708",
318 "589fb8a85d924ad19ed78409ae89475ba479c30a",
319 "43d67bc61ef54014b022891e5c024fc24b1fe797",
320 "e8783644428b637adbe80bcd084a33428cb69983",
321 "fc0c32afb719295f28bcfef22803bef94f798e20",
322 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
323 "d3f08946300e1700865042aed121870e292d1095",
324 "abb56db94becb64d663b51f0ea6b4bd535a88ba0",
325 "3a81fe558c69ca0aea7e7191771ed86cf4321a5a",
326 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
327 "317521e576801acaea62c76fe16813cdfe20f4ad",
328 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
332 static const char *sha1_graphics_r6g6b6[] =
334 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
335 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
336 "5b9dab3d8411afb25fbbeba0313db526815ac189",
337 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
338 "2028d1b0d1acef35dc07027135023f35fb9746b9",
339 "378713720dcb5aadb730435ad0989a68ab189114",
340 "084152773feb01a85df6006f2f4f288a1442d37a",
341 "97b824953f60fc9a91028045baacbe7b7dc82b14",
342 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
343 "287d755448e72e29e4812193e2b6f8098a214d82",
344 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
345 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
346 "e51bcf80211cd06e7d10225534b7a79b5454be27",
347 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
348 "0b94e0a5b739ab0020130646522e53da35a149ad",
349 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
350 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
351 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
352 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
353 "2128157e601ef0d6b3636b7387d3b28e876de728",
354 "8bdcdcd463f0052279d070ac763757f4db975483",
355 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
356 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
357 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
358 "66b130f83381957cfc4763558c5f5cddf2e3b564",
359 "d548135ce2320499277ce12b80bc35004f8a9787",
360 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
361 "1906ddfd829e735af49245171f8eb7673295d399",
362 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
363 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
364 "defd95a10d44cad6e736542920b74efd53e9e7eb",
365 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
366 "3f11a735e52030aa3d0f024d83803698293d10e5",
367 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
368 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
369 "3231c4d87faefb7ec5bd377613969c05b70343fc",
370 "00394e438e9edde978e88602c9ad2a572e965bf6",
371 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
372 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
373 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
374 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
375 "3d6cf3753390a05504b1f50302f767df443f0f40",
376 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
377 "da9e896a3a98b330980152b2e4a43cb6e686c730",
378 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
379 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
380 "47499ad13b719de18c59c2bc9b38ed578db50b95",
381 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
382 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
383 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
384 "49341c297a887186bd47d7465d827ab3147f05e3",
385 "325279e76367200d3fd7194d81c09fd139988ece",
386 "c3def160a1e847605ff0fc7edd30397fa90635a0",
387 "50acb1597c4d53ad63225376d2aa36f64e8a229d",
388 "796fd861474aa7861bd0384127df755458757ec3",
389 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
390 "77ea86e51a94b11a8081b29696cb4115687843e3",
391 "d67b897cad72d31e75359094007b1346fd8806ea",
395 static const char *sha1_graphics_24[] =
397 "e993b15c9bd14fb45a15310450b7083c44e42665",
398 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
399 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
400 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
401 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
402 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
403 "fd4be592483623dbc800fe28210a1f0daa71999b",
404 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
405 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
406 "883bc8f305c602edca785e21cd00f488583fb13f",
407 "3bac4e80993f49dc3926e30524115fca9d7a8026",
408 "91369e35be29059a0665782541db4c8b324c6bb2",
409 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
410 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
411 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
412 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
413 "5068bff794553cf5a3145ae407c9a2984357844c",
414 "413a7989969c229dee4ab1798362f32f96cf0a10",
415 "0bb222e540b82720d4971e4a2fc626899af03e03",
416 "adc20832d8c43f1cf372d8392535492013cd2306",
417 "45649794dcbcabda487f66f7a80fc1bec79047a1",
418 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
419 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
420 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
421 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
422 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
423 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
424 "92a1ab214dd8027c407814420449119466c92840",
425 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
426 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
427 "955390669afed2369b15b32fa519f2f921cdf1a0",
428 "201906f7d763b930a98c97f8eeab417f2b65e723",
429 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
430 "701c5af1d0c28294ce7d804b5697643c430d22a0",
431 "b0a959745b2db1d9f449e68e4479a4f36301879c",
432 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
433 "e171f6ec77bca91d6b8559911bce296c0bac469e",
434 "9725669042ef68acb408404d196496d10340bb5a",
435 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
436 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
437 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
438 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
439 "0f79500eda467cd3cbc220abdd37b5dba695d654",
440 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
441 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
442 "7d479beeb6758c164566638b5c873c188d6a91e7",
443 "80086808fca03e757d812e31d1ae576bf90dac9d",
444 "9560096f1b85ae6d939d736165c44df00a47c424",
445 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
446 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
447 "b25ba91487ec945410deb2b51bc1156890c032a8",
448 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
449 "ee315634ed92da3a32c2675ecd1b369471c60936",
450 "3491e2bd81e70dd203c8551cc2d39b19401caafe",
451 "826de85271b67a11e7bd1a6596b58a045a96b69e",
452 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
453 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
454 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
458 static const char *sha1_graphics_r5g5b5[] =
460 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
461 "847005cf7371f511bcc837251cde07b1796f6113",
462 "a8f75743a930843ec14d516cd048b6e0468e5d89",
463 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
464 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
465 "a9034a905daa91757b4f63345c0e40638cd53ca8",
466 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
467 "99474fecf11df7b7035c35be6b8b697be9889418",
468 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
469 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
470 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
471 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
472 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
473 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
474 "449092689226a1172b6086ba1181d6b6d6499f26",
475 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
476 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
477 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
478 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
479 "6daaf945a955928c5c124c880522ca4634fb2343",
480 "12a288390d16e1efa99d4185301de48a4d433b14",
481 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
482 "1d3af561605fd61433035600d8962cb8d266fdd0",
483 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
484 "d7d97e28ed316f6596c737eb83baa5948d86b673",
485 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
486 "656bf3b7121bcd620a0a3ad488f0d66604824577",
487 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
488 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
489 "a49530722328ae88fd765792ac0c657efbcce75d",
490 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
491 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
492 "a6fd83542c3826132e88d3f5e304d604c0056fad",
493 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
494 "e428d213ad02651287894f093413949dcb369208",
495 "7df915bedcc5951a1b6f828490f7dbb93212e835",
496 "645dc251d205139282b17eb7bece1055fff3bcd0",
497 "76215275593631f5900aad3616d725733dc39493",
498 "81655a550703849a616d4a16504bb9c6f999285f",
499 "573d65665d20f00d36d9782ae2b89772140524ab",
500 "619414c1b33ac60cb0c0de61df86245d472259b0",
501 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
502 "2a66dae03890ff791eabb982949435adb19af02b",
503 "24ac219478ba406f30794550690486b14cbac5e8",
504 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
505 "db8c34882ddd46716d14bbf569d530f80db65ed4",
506 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
507 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
508 "a92942269911a88793b3460b6f2a2cd56e48eec1",
509 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
510 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
511 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
512 "585061e403d9cac1603a38af420efe87338f381a",
513 "8f447a3820c83662086dfa836da2205b0130fd5f",
514 "3772003c7fb420003512d0c437b3659d96d89ce4",
515 "dab47c9dc149e570045d699598b14a613bf319b3",
516 "2daca4d26a086ed34894693be0b0374402232809",
517 "bf0e0b74ce5686b73c527843e0d0df0cd10efefe",
518 "517e32a8c0312b5676d498583ea092b0f198f2bc",
519 "295ec16530126046790fb734e99f86f5b3b74ed8",
520 "d98b0561010606b55a1b9b85fbc93640f681d256",
521 "1c1499051860b7caa25173b328ca9c862f01dd1a",
525 static const char *sha1_graphics_r4g4b4[] =
527 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
528 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
529 "8bd18697d1ef27492805667a0bc956343ac08667",
530 "e8501c830321584474654f90e40eaf27dc21e6a8",
531 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
532 "821177710961d2cb5f7e7dfc0e06e767b6042753",
533 "667124365ffadeea1d8791bedda77a0c7b898de8",
534 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
535 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
536 "fb52b0c373a5f2a60b981604b120962942d2447a",
537 "5ab8dd07436681d762fa04ad7c6d71291c488924",
538 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
539 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
540 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
541 "25fcb75aa687aac35b8f72640889fe92413e00c5",
542 "3bddf9d53e89560b083302b146cd33791b13d941",
543 "a81504498c7a7bb46340ce74476a42f70f2730b1",
544 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
545 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
546 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
547 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
548 "57ebf8becac1524543da120e88e9cc57ecfdec49",
549 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
550 "d591232bbc2592462c819a9486750f64180518fd",
551 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
552 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
553 "8933450132bf949ba4bc28626968425b5ed2867d",
554 "9928a8f28a66c00069a124f7171b248817005763",
555 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
556 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
557 "233e588cf660e2c9b552cf02065cf63fa6655864",
558 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
559 "a3345acaf272f2e288626906e3056cd0ced70499",
560 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
561 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
562 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
563 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
564 "9dd123938b0a02601d8d458ecbd6535ddefea724",
565 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
566 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
567 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
568 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
569 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
570 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
571 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
572 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
573 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
574 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
575 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
576 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
577 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
578 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
579 "734d4a7836891d729f4a9ec6916ead78eecb2596",
580 "d8ba2e556fd64c9c2f1746496e6e7dd7a487cd6d",
581 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
582 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
583 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
587 static const char *sha1_graphics_8_color[] =
589 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
590 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
591 "49024d6cbdf1614327dfda9eda17675e76805f7e",
592 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
593 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
594 "84d85009d35ae10abbc435f3913422544105cea2",
595 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
596 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
597 "f3aa8d89430748178952de56643069d80b40aad6",
598 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
599 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
600 "52b1363e821bf604d9df260bfa97e26d428c33fd",
601 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
602 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
603 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
604 "89711289be6d5c55734878410e4923d5cca9aca9",
605 "8355caf57d51ad4e14275943088392e37dc75d33",
606 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
607 "6f0570da9dea7f043f678088f8362ee458cd79fa",
608 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
609 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
610 "5092b22af85a08f10a2899888bb9d552f25f828e",
611 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
612 "e91973be2651eeef568700463652838d8cbba976",
613 "1df851515ecf46df5c2d3279535c1763f72353dd",
614 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
615 "359bd76088a965bb0cee7c44800bc46b2638807e",
616 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
617 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
618 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
619 "91f988f575338505ba8a40727865a8d3f2298624",
620 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
621 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
622 "3b7488731da48635d86be551ab7c8c0f91c78219",
623 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
624 "e15a355fc09bfd22267917898e2266168ff410e3",
625 "b9688566bddf18586787c00e68724e51e97dfb72",
626 "5e38e03310f1c66f2052af2a745d8c60515707c5",
627 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
628 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
629 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
630 "6376234f542467e5887adfece62f753e998dc19d",
631 "add949d009217ef2b847e34772ba363e4be7b1b8",
632 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
633 "0b58666deb3615e912896a764e5c6475989e95e4",
634 "bf460cc44c0edee851d72587c8425c3f06a62c55",
635 "ea74c00c45569007383b632d7f1d2adc82645717",
636 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
637 "284abed096637c80bb50844e393da9dd4b3f19ac",
638 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
639 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
640 "46f772c2832b3aad584674db666bd63e48b4f338",
641 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
642 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
643 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
644 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
645 "678979a45126a76eb629992cd64734862f53a555",
646 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
647 "0204f06422a01787f7379d0edb51104bb023758a",
648 "1f9a21eba2f2ce87768a5618d9cfefa7e48fb386",
649 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
650 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
651 "2c07272462c68cf5944b03e2aa049475b99143c5",
655 static const char *sha1_graphics_8_grayscale[] =
657 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
658 "df35491dd5038187c05bac06921402ba6d7773a8",
659 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
660 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
661 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
662 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
663 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
664 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
665 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
666 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
667 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
668 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
669 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
670 "114bb377b4e78a1978e1ac09388c48861b5223a3",
671 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
672 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
673 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
674 "216388ddf6b563dd2058a9df65b40b6f72df1715",
675 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
676 "47f72be971bd2d3399dabd018201f4f5075e96fe",
677 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
678 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
679 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
680 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
681 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
682 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
683 "b6785a410048bb85e7ea3f0492459972103c935e",
684 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
685 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
686 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
687 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
688 "0000000000000000000000000000000000000000",
689 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
690 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
691 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
692 "6d41e6168662e75baacf74d911d7419d54c8d73c",
693 "2404952157ba1519094a2da6bfbf2b0f1356432d",
694 "24caede65b40815a60b83c4edfa06bdc542388cd",
695 "650a51bedd1af92469d2950eb95220db35f95c6e",
696 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
697 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
698 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
699 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
700 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
701 "85425940daf119125deb52421b2057acebe6d1cf",
702 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
703 "9869b6f088822fb423996f9968e5a931301fc2c3",
704 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
705 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
706 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
707 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
708 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
709 "f543efc84e638afbaa456e629100f0274de1a35b",
710 "1bd2587399006eed0d46beff397d32081f6bc58e",
711 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
712 "640a49455acabca6954a7fbb6af4e872af342d11",
713 "589e7911e09332ee090371deae17b0120ff990b5",
714 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
715 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
716 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
717 "3685c9ae95118a83db3569832c29753276fa1264",
718 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
719 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
720 "a05e05b2e6e515baa59ea032d063ca11e70a72b5",
721 "d908c86b7301666a8d7999b831841115a4938181",
722 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
723 "17ae603c199a5d6695d198a7f36e6d7263990951",
724 "1918a33f59d3500204ffc573318a39e9ff754221",
728 static const char *sha1_graphics_8[] =
730 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
731 "512246d4886ab889a090b167ba194577cb95272e",
732 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
733 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
734 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
735 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
736 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
737 "390b2bf70daba36310683f46af9cd50b9a061396",
738 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
739 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
740 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
741 "da1cc34a9d9b779fc7849e03e214096026506464",
742 "5ba8f99ca034666effa556748c49a0f5a015125f",
743 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
744 "73e2859ce849f756f954718ce3c90f02e31712b6",
745 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
746 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
747 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
748 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
749 "7262364067e03c7fa498af1d59d228d6c63b460e",
750 "5241241a355a667ef0834049adf4218e8b3f16b8",
751 "db22d666690948eb966f75b796c72c7150a5c4b9",
752 "af21fb2645b568b049549de375584c4aa3055143",
753 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
754 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
755 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
756 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
757 "bdc0a354635b879871077c5b712570e469863c99",
758 "d599bf210423fe3adbb4f1de87d9360de97827d0",
759 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
760 "cc01f17928f7780cefd423ea653b072eea723a1b",
761 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
762 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
763 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
764 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
765 "f4a334e69535de74ee5ed54be93a75120a66e54a",
766 "559fd1d15447745527c61fe43a94c6708bff3e39",
767 "995f77f2f53398399f09d1365cb4dfd105764e5c",
768 "61907a6685bba93077da40cfb28cf2ab74552fd2",
769 "122015e5e17c1c317c6e51c0e207826b606a4077",
770 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
771 "8c609921d4a3ed89a994a75482b27496bf103cf5",
772 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
773 "66493ee117719e172f327a426af601996025f28c",
774 "acead2745fec0b6c817fa601353bdf2d197b64f7",
775 "a6b858b2d125c159529d3f3ec45b31925a79acff",
776 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
777 "d83adc669c0dea0dc4812b93f998514b6f02d805",
778 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
779 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
780 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
781 "7d1bfff706b0713e53209407889f83a0da26a81d",
782 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
783 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
784 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
785 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
786 "963d1fa8608c8b743e972eb9a4e9f3fc53c6c7e8",
787 "ba49de83c4668fb08956221f465b93e7dd6a3383",
788 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
789 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
790 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
794 static const char *sha1_graphics_4[] =
796 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
797 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
798 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
799 "9401799e6116c35e5f0e5bdca07ea25316757a72",
800 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
801 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
802 "2505598845fa026ea7187582461efbf06cb6904f",
803 "3981a19363beca8f28d32a5928ac296fd22a5296",
804 "01404024ebb2c266d17d734059524d874491650f",
805 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
806 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
807 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
808 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
809 "1f26a01730f67d40ea711a50d9d801bac15a642e",
810 "3b53d24178cfacba53103a44dfd5d072b15a6781",
811 "c52cfd57f26037723d37192722fc3a217f280c9e",
812 "e34da6500cf2e424d980714d92737cf6c31a7bda",
813 "d17f4358ae529f920960ed89e535902ee13b0033",
814 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
815 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
816 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
817 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
818 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
819 "39c16648cf6c261be71a33cec41867f28e119b94",
820 "26ad5116562e7b58c76a26eaf521e2e40899e944",
821 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
822 "4f827ca6927f15191588456f985bf29d2a3b3c24",
823 "e7de769c3d12ea9dd223bef4881c578823bec67e",
824 "6fb102d020e5554116feefc8482104f3ae2036d2",
825 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
826 "20c9eb3276c08fdce35755e349bec94b04929812",
827 "628d837163a25c6520f19c0602383176dbad528e",
828 "b5a12cff7100290ad43f5ed17a321b42de048893",
829 "b672afbeeafb44194a821f0def81a8892872937e",
830 "db0124045882b598feea192186cf7eb7a0387866",
831 "602d91471378fe24a2d0248bd8a92b624f099fea",
832 "e772873b87a0f55ea51a3da323f64bf8814c6703",
833 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
834 "1a579cd280422131c35e907a023ee0e80749b5a4",
835 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
836 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
837 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
838 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
839 "3e411b004a5be84451860c6da6a4a1a482b77862",
840 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
841 "7811c536a6527112b438a6413f3927f2c79086a7",
842 "525ef3615040225752a2fe646ab99ee64e360630",
843 "46760975993f9881b7bbe94123173e6a683d3f25",
844 "df5feb905a31c288008cf5e82d73ac818a160d82",
845 "df5feb905a31c288008cf5e82d73ac818a160d82",
846 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
847 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
848 "da401c745421f6bdfaefd590ab99dee948dce412",
849 "38a3b6edcba2a1fba6064f0b4d771aedae7f4673",
850 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
851 "029552113292cc110fd6b7888e766628950aaeef",
852 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
856 static const char *sha1_graphics_4_grayscale[] =
858 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
859 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
860 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
861 "1c201d149c0bd886ff8a427ad513f15a70991174",
862 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
863 "315189097a02024d2eae61d524c4de07a396aee7",
864 "73ac786015dea36ac466a6524dba757d5d238ece",
865 "6e328cc4d53627f034b23706d8bf26afe18512ae",
866 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
867 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
868 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
869 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
870 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
871 "ec3879342b5a44f6de6efe946243ae5ade00980d",
872 "6e328cc4d53627f034b23706d8bf26afe18512ae",
873 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
874 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
875 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
876 "b2bda683edef912957845a33edc055902a801fed",
877 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
878 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
879 "43ee3e187dda14b86aef12371041ae70313b5a65",
880 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
881 "d4930552a7845111ffd9db57260be1ab97967c06",
882 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
883 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
884 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
885 "0000000000000000000000000000000000000000",
886 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
887 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
888 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
889 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
890 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
891 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
892 "f8224430462f6a93f85ef33b8aa7299525990708",
893 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
894 "d58b8760ef01c12e691651c932d683c66fde3654",
895 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
896 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
897 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
898 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
899 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
900 "027b05bc82ce4f897c4bf812610a641547368939",
901 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
902 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
903 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
904 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
905 "5eeb56afea8040a8fb18c11f29931b836474126d",
906 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
907 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
908 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
909 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
910 "25ec9fd2eeb1514ba4e0458a444149a5456cf63a",
911 "2e4dc1e859350289575ffc2a47cd0033efca6c32",
912 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
913 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
914 "58f400c9bb78e49a879276fb049edfc9c981740a",
918 static const char *sha1_graphics_1[] =
920 "23366004515f3bc46796ea505d748f8d0f97fbe1",
921 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
922 "a7cc69f957d7b533a0a330859a143d701daac73c",
923 "a955bf088c5edb129289ce65caace48ec95632e4",
924 "5316d3c558c254479883133cf58cd07ab521d3f0",
925 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
926 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
927 "121423a38b4ac4743bd516e0a7e88a3863796313",
928 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
929 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
930 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
931 "39ff81f77ef4ee772367ed1a63785987c060126e",
932 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
933 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
934 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
935 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
936 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
937 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
938 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
939 "0ff4b49797e30e3555aab45219adf449a9a560ff",
940 "280327328ca940c212ce24fe72e0b00014072767",
941 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
942 "b85463875f755b85f1464b1b6275912bcbad6c9f",
943 "816f200969feecc788b61dfeecf05b1790984401",
944 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
945 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
946 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
947 "0a76e0121facb103857130bc6e12185ad77fc3fa",
948 "02aede714773d654d0fc2f640afaa133ec718ad5",
949 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
950 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
951 "b26699f62661e16a1dc452d24c88ce363a1f2998",
952 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
953 "c14832e69ec3585c15987b3d69d5007236fa9814",
954 "e44ea620b0c47125a34193537ab9d219a52ad028",
955 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
956 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
957 "8819bf7a43295161fe045a42936000b3a51fe200",
958 "e08dbc26469c229f75ccbf1a38a133401f270b84",
959 "d1e6091caa4482d3142df3b958606c41ebf4698e",
960 "07c1116d8286fb665a1005de220eadc3d5999aaf",
961 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
962 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
963 "ffc78c075d4be66806f6c59180772d5eed963dc0",
964 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
965 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
966 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
967 "b71ca46be287598f716bb04fac0a52ad139c70db",
968 "6589e48498e30ab036fbfe94d73427b2b1238a69",
969 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
970 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
971 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
972 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
973 "18f4497e43903e8df5b27da4ceebf62b15550a87",
974 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
975 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
976 "655cfadeb157233c804d42b58195569c8846e3c1",
977 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
978 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
979 "0d180c37bc26d83a1a11f66168757f3de2493243",
980 "b362ba4790def178c236c0ae7b0093dbba47cf24",
981 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
982 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
983 "ee22f43ea867228c6ff937d39e1826e285a107e8",
984 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
985 "a2a928de9007d765da496abec8c21b23601f8c45",
986 "28ded40e72d4327b9413571476b167fb28a1f420",
987 "23366004515f3bc46796ea505d748f8d0f97fbe1",
988 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
989 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
990 "6b2cb2346b5820bdd0251cd6a4aeb5c22ee82e85",
991 "6c4640b17e072efc682044c499e5a4f3481b7c87",
992 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
993 "df510792a7790cc699532b1420d43c6d4da2ae2f",
994 "55c26d22f11d80b73383fa57d0fac552d705b092",
998 static const char *dst_format;
1000 static inline DWORD get_stride(BITMAPINFO *bmi)
1002 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1005 static inline DWORD get_dib_size(BITMAPINFO *bmi)
1007 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1010 static char *hash_dib(BITMAPINFO *bmi, void *bits)
1012 DWORD dib_size = get_dib_size(bmi);
1016 DWORD hash_size = sizeof(hash_buf);
1018 static const char *hex = "0123456789abcdef";
1020 if(!crypt_prov) return NULL;
1022 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1024 CryptHashData(hash, bits, dib_size, 0);
1026 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1027 if(hash_size != sizeof(hash_buf)) return NULL;
1029 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1030 CryptDestroyHash(hash);
1032 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1034 for(i = 0; i < hash_size; i++)
1036 buf[i * 2] = hex[hash_buf[i] >> 4];
1037 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1044 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
1046 char *hash = hash_dib(bmi, bits);
1052 skip("SHA1 hashing unavailable on this platform\n");
1056 for(i = 0; i <= num_broken; i++)
1058 if((*sha1)[i] == NULL)
1060 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
1065 ok_cond = !strcmp(hash, **sha1);
1067 for(i = 1; i <= num_broken; i++)
1068 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
1071 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1072 dst_format, info, **sha1, hash );
1074 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1075 dst_format, info, **sha1, hash );
1077 *sha1 += num_broken + 1;
1079 HeapFree(GetProcessHeap(), 0, hash);
1082 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
1084 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
1087 static const RECT bias_check[] =
1089 {100, 100, 200, 150},
1090 {100, 100, 150, 200},
1091 {100, 100, 50, 200},
1099 static const RECT hline_clips[] =
1101 {120, 120, 140, 120}, /* unclipped */
1102 {100, 122, 140, 122}, /* l edgecase */
1103 { 99, 124, 140, 124}, /* l edgecase clipped */
1104 {120, 126, 200, 126}, /* r edgecase */
1105 {120, 128, 201, 128}, /* r edgecase clipped */
1106 { 99, 130, 201, 130}, /* l and r clipped */
1107 {120, 100, 140, 100}, /* t edgecase */
1108 {120, 99, 140, 99}, /* t edgecase clipped */
1109 {120, 199, 140, 199}, /* b edgecase */
1110 {120, 200, 140, 200}, /* b edgecase clipped */
1111 {120, 132, 310, 132}, /* inside two clip rects */
1112 { 10, 134, 101, 134}, /* r end on l edgecase */
1113 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1114 {199, 138, 220, 138}, /* l end on r edgecase */
1115 {200, 140, 220, 140} /* l end on r edgecase clipped */
1118 static const RECT vline_clips[] =
1120 {120, 120, 120, 140}, /* unclipped */
1121 {100, 120, 100, 140}, /* l edgecase */
1122 { 99, 120, 99, 140}, /* l edgecase clipped */
1123 {199, 120, 199, 140}, /* r edgecase */
1124 {200, 120, 200, 140}, /* r edgecase clipped */
1125 {122, 99, 122, 201}, /* t and b clipped */
1126 {124, 100, 124, 140}, /* t edgecase */
1127 {126, 99, 126, 140}, /* t edgecase clipped */
1128 {128, 120, 128, 200}, /* b edgecase */
1129 {130, 120, 130, 201}, /* b edgecase clipped */
1130 {132, 12, 132, 140}, /* inside two clip rects */
1131 {134, 90, 134, 101}, /* b end on t edgecase */
1132 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1133 {138, 199, 138, 220}, /* t end on b edgecase */
1134 {140, 200, 140, 220} /* t end on b edgecase clipped */
1137 static const RECT line_clips[] =
1139 { 90, 110, 310, 120},
1140 { 90, 120, 295, 130},
1141 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1142 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1143 { 90, 132, 101, 137}, /* end pt just inside l edge */
1144 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1145 {199, 142, 210, 143} /* start pt just inside r edge */
1148 static const RECT wide_lines[] =
1154 { 10, 100, 10, 200},
1155 { 21, 100, 21, 200},
1156 { 40, 200, 40, 100},
1157 { 61, 200, 61, 100},
1160 static const RECT patblt_clips[] =
1162 {120, 120, 140, 126}, /* unclipped */
1163 {100, 130, 140, 136}, /* l edgecase */
1164 { 99, 140, 140, 146}, /* l edgecase clipped */
1165 {180, 130, 200, 136}, /* r edgecase */
1166 {180, 140, 201, 146}, /* r edgecase clipped */
1167 {120, 100, 130, 110}, /* t edgecase */
1168 {140, 99, 150, 110}, /* t edgecase clipped */
1169 {120, 180, 130, 200}, /* b edgecase */
1170 {140, 180, 150, 201}, /* b edgecase */
1171 {199, 150, 210, 156}, /* l edge on r edgecase */
1172 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1173 { 90, 150, 101, 156}, /* r edge on l edgecase */
1174 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1175 {160, 90, 166, 101}, /* b edge on t edgecase */
1176 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1177 {160, 199, 166, 210}, /* t edge on b edgecase */
1178 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1181 static const RECT rectangles[] =
1184 {250, 100, 350, 10},
1185 {120, 10, 120, 20}, /* zero width */
1186 {120, 10, 130, 10}, /* zero height */
1187 {120, 40, 121, 41}, /* 1 x 1 */
1188 {130, 50, 132, 52}, /* 2 x 2 */
1189 {140, 60, 143, 63}, /* 3 x 3 */
1190 {150, 70, 154, 74}, /* 4 x 4 */
1191 {120, 20, 121, 30}, /* width == 1 */
1192 {130, 20, 132, 30}, /* width == 2 */
1193 {140, 20, 143, 30}, /* width == 3 */
1194 {200, 20, 210, 21}, /* height == 1 */
1195 {200, 30, 210, 32}, /* height == 2 */
1196 {200, 40, 210, 43} /* height == 3 */
1199 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1200 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1201 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1202 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1203 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1204 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1206 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1207 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1208 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1209 0x00, 0x01 }; /* <eod> */
1211 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1212 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1213 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1214 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1216 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1217 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1219 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1221 HBRUSH brush = CreateSolidBrush( color );
1222 brush = SelectObject( hdc, brush );
1223 PatBlt( hdc, x, y, width, height, PATCOPY );
1224 DeleteObject( SelectObject( hdc, brush ) );
1227 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1229 DWORD dib_size = get_dib_size(bmi);
1230 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1231 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1233 INT i, x, y, hatch_style;
1236 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1237 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1238 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1239 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1240 RGBQUAD *brush_colors = brush_bi->bmiColors;
1241 BYTE *brush_bits, *src_bits;
1242 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1243 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1244 BLENDFUNCTION blend;
1245 COLORREF old_text, old_bkgnd;
1247 blend.BlendOp = AC_SRC_OVER;
1248 blend.BlendFlags = 0;
1250 memset(bits, 0xcc, dib_size);
1251 compare_hash(bmi, bits, sha1, "empty");
1253 src_dc = CreateCompatibleDC( 0 );
1254 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1255 orig_pen = SelectObject(hdc, solid_pen);
1256 SetBrushOrgEx(hdc, 0, 0, NULL);
1258 /* horizontal and vertical lines */
1259 for(i = 1; i <= 16; i++)
1262 MoveToEx(hdc, 10, i * 3, NULL);
1263 LineTo(hdc, 100, i * 3); /* l -> r */
1264 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1265 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1266 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1267 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1268 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1269 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1271 compare_hash(bmi, bits, sha1, "h and v solid lines");
1272 memset(bits, 0xcc, dib_size);
1274 /* diagonal lines */
1275 SetROP2(hdc, R2_COPYPEN);
1276 for(i = 0; i < 16; i++)
1278 double s = sin(M_PI * i / 8.0);
1279 double c = cos(M_PI * i / 8.0);
1281 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1282 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1284 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1285 memset(bits, 0xcc, dib_size);
1287 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1289 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1290 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1292 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1293 memset(bits, 0xcc, dib_size);
1295 /* solid brush PatBlt */
1296 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1297 orig_brush = SelectObject(hdc, solid_brush);
1299 for(i = 0, y = 10; i < 256; i++)
1301 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1303 if(rop_uses_src(rop3[i]))
1304 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1307 ok(ret, "got FALSE for %x\n", rop3[i]);
1312 compare_hash(bmi, bits, sha1, "solid patblt");
1313 memset(bits, 0xcc, dib_size);
1316 hrgn = CreateRectRgn(10, 10, 200, 20);
1317 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1318 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1319 SetRectRgn(hrgn2, 290, 100, 300, 200);
1320 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1321 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1322 DeleteObject(hrgn2);
1324 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1326 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1327 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1329 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1330 memset(bits, 0xcc, dib_size);
1332 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1334 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1335 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1337 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1338 memset(bits, 0xcc, dib_size);
1340 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1342 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1343 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1345 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1346 memset(bits, 0xcc, dib_size);
1348 /* clipped PatBlt */
1349 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1351 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1352 patblt_clips[i].right - patblt_clips[i].left,
1353 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1355 compare_hash(bmi, bits, sha1, "clipped patblt");
1356 memset(bits, 0xcc, dib_size);
1358 /* clipped dashed lines */
1359 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1360 SelectObject(hdc, dashed_pen);
1361 SetBkMode(hdc, TRANSPARENT);
1362 SetBkColor(hdc, RGB(0, 0xff, 0));
1364 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1366 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1367 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1369 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1370 memset(bits, 0xcc, dib_size);
1372 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1374 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1375 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1377 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1378 memset(bits, 0xcc, dib_size);
1380 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1382 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1383 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1385 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1386 memset(bits, 0xcc, dib_size);
1388 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1390 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1391 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1393 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1394 memset(bits, 0xcc, dib_size);
1396 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1398 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1399 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1401 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1402 memset(bits, 0xcc, dib_size);
1404 SetBkMode(hdc, OPAQUE);
1406 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1408 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1409 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1411 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1412 memset(bits, 0xcc, dib_size);
1414 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1416 /* 8888 DIB pattern brush */
1418 brush_bi->bmiHeader = dib_brush_header_8888;
1419 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1420 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1421 brush_bits[2] = 0xff;
1422 brush_bits[6] = 0xff;
1423 brush_bits[14] = 0xff;
1424 brush_bits[65] = 0xff;
1425 brush_bits[69] = 0xff;
1426 brush_bits[72] = 0xff;
1428 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1430 SelectObject(hdc, dib_brush);
1431 SetBrushOrgEx(hdc, 1, 1, NULL);
1433 for(i = 0, y = 10; i < 256; i++)
1435 if(!rop_uses_src(rop3[i]))
1437 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1438 ok(ret, "got FALSE for %x\n", rop3[i]);
1442 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1443 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1445 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1446 memset(bits, 0xcc, dib_size);
1448 SelectObject(hdc, orig_brush);
1449 DeleteObject(dib_brush);
1451 /* 8888 bottom-up DIB pattern brush */
1453 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1455 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1457 SelectObject(hdc, dib_brush);
1459 /* This used to set the x origin to 100 as well, but
1460 there's a Windows bug for 24 bpp where the brush's x offset
1461 is incorrectly calculated for rops that involve both D and P */
1462 SetBrushOrgEx(hdc, 4, 100, NULL);
1464 for(i = 0, y = 10; i < 256; i++)
1466 if(!rop_uses_src(rop3[i]))
1468 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1469 ok(ret, "got FALSE for %x\n", rop3[i]);
1473 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1474 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1476 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1477 memset(bits, 0xcc, dib_size);
1479 SelectObject(hdc, orig_brush);
1480 DeleteObject(dib_brush);
1482 /* 24 bpp dib pattern brush */
1484 brush_bi->bmiHeader = dib_brush_header_24;
1485 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1486 memset(brush_bits, 0, 16 * 16 * 3);
1487 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1488 brush_bits[49] = brush_bits[52] = 0xff;
1490 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1492 SelectObject(hdc, dib_brush);
1493 SetBrushOrgEx(hdc, 1, 1, NULL);
1495 for(i = 0, y = 10; i < 256; i++)
1497 if(!rop_uses_src(rop3[i]))
1499 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1500 ok(ret, "got FALSE for %x\n", rop3[i]);
1504 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1505 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1507 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1508 memset(bits, 0xcc, dib_size);
1510 SelectObject(hdc, orig_brush);
1511 DeleteObject(dib_brush);
1513 /* 555 dib pattern brush */
1515 brush_bi->bmiHeader = dib_brush_header_555;
1516 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1517 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1518 brush_bits[0] = brush_bits[1] = 0xff;
1519 brush_bits[32] = brush_bits[34] = 0x7c;
1521 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1523 SelectObject(hdc, dib_brush);
1524 SetBrushOrgEx(hdc, 1, 1, NULL);
1526 for(i = 0, y = 10; i < 256; i++)
1528 if(!rop_uses_src(rop3[i]))
1530 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1531 ok(ret, "got FALSE for %x\n", rop3[i]);
1535 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1536 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1538 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1539 memset(bits, 0xcc, dib_size);
1541 SelectObject(hdc, orig_brush);
1542 DeleteObject(dib_brush);
1544 SetBrushOrgEx(hdc, 0, 0, NULL);
1546 /* 8 bpp dib pattern brush */
1548 brush_bi->bmiHeader = dib_brush_header_8;
1549 brush_bi->bmiHeader.biClrUsed = 3;
1550 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1551 brush_colors[0].rgbRed = 0xff;
1552 brush_colors[1].rgbRed = 0xff;
1553 brush_colors[1].rgbGreen = 0xff;
1554 brush_colors[1].rgbBlue = 0xff;
1556 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1557 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1558 brush_bits[0] = brush_bits[1] = 1;
1559 brush_bits[16] = brush_bits[17] = 2;
1560 brush_bits[32] = brush_bits[33] = 6;
1562 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1564 SelectObject(hdc, dib_brush);
1565 SetBrushOrgEx(hdc, 1, 1, NULL);
1567 for(i = 0, y = 10; i < 256; i++)
1569 if(!rop_uses_src(rop3[i]))
1571 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1572 ok(ret, "got FALSE for %x\n", rop3[i]);
1576 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1577 memset(bits, 0xcc, dib_size);
1579 SelectObject(hdc, orig_brush);
1580 DeleteObject(dib_brush);
1582 /* 4 bpp dib pattern brush */
1584 brush_bi->bmiHeader = dib_brush_header_4;
1585 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1587 SelectObject(hdc, dib_brush);
1588 SetBrushOrgEx(hdc, 1, 1, NULL);
1590 for(i = 0, y = 10; i < 256; i++)
1592 if(!rop_uses_src(rop3[i]))
1594 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1595 ok(ret, "got FALSE for %x\n", rop3[i]);
1599 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1600 memset(bits, 0xcc, dib_size);
1602 SelectObject(hdc, orig_brush);
1603 DeleteObject(dib_brush);
1605 /* 1 bpp dib pattern brush */
1607 brush_bi->bmiHeader = dib_brush_header_1;
1608 brush_bi->bmiHeader.biClrUsed = 2;
1609 memset(brush_bits, 0, 16 * 4);
1610 brush_bits[0] = 0xf0;
1611 brush_bits[4] = 0xf0;
1612 brush_bits[8] = 0xf0;
1614 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1615 SelectObject(hdc, dib_brush);
1616 for(i = 0, y = 10; i < 256; i++)
1618 if(!rop_uses_src(rop3[i]))
1620 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1621 ok(ret, "got FALSE for %x\n", rop3[i]);
1626 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1627 memset(bits, 0xcc, dib_size);
1629 SelectObject(hdc, orig_brush);
1630 DeleteObject(dib_brush);
1632 /* 1 bpp ddb pattern brush */
1634 old_text = GetTextColor( hdc );
1635 old_bkgnd = GetBkColor( hdc );
1636 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1637 dib_brush = CreatePatternBrush( bmp );
1638 SelectObject(hdc, dib_brush);
1639 for(i = 0, y = 10; i < 256; i++)
1641 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1642 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1643 if(!rop_uses_src(rop3[i]))
1645 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1646 ok(ret, "got FALSE for %x\n", rop3[i]);
1651 compare_hash_broken_todo(bmi, bits, sha1, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1652 memset(bits, 0xcc, dib_size);
1655 SelectObject(hdc, orig_brush);
1656 SetBrushOrgEx(hdc, 0, 0, NULL);
1657 SetTextColor(hdc, old_text);
1658 SetBkColor(hdc, old_bkgnd);
1662 SelectObject(hdc, solid_pen);
1663 SelectObject(hdc, solid_brush);
1665 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1667 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1670 SelectObject(hdc, dashed_pen);
1671 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1673 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1676 compare_hash(bmi, bits, sha1, "rectangles");
1677 memset(bits, 0xcc, dib_size);
1678 SelectObject(hdc, solid_pen);
1682 PaintRgn(hdc, hrgn);
1683 compare_hash(bmi, bits, sha1, "PaintRgn");
1684 memset(bits, 0xcc, dib_size);
1686 /* RTL rectangles */
1690 win_skip("Don't have SetLayout\n");
1695 pSetLayout(hdc, LAYOUT_RTL);
1696 PaintRgn(hdc, hrgn);
1697 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1698 Rectangle(hdc, 100, 250, 110, 260);
1699 compare_hash(bmi, bits, sha1, "rtl");
1700 memset(bits, 0xcc, dib_size);
1702 pSetLayout(hdc, LAYOUT_LTR);
1705 for(i = 0, y = 10; i < 256; i++)
1707 if(!rop_uses_src(rop3[i]))
1709 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1711 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1712 SelectObject(hdc, hatch_brush);
1713 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1714 ok(ret, "got FALSE for %x\n", rop3[i]);
1715 SelectObject(hdc, orig_brush);
1716 DeleteObject(hatch_brush);
1722 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1723 memset(bits, 0xcc, dib_size);
1725 /* overlapping blits */
1727 orig_brush = SelectObject(hdc, solid_brush);
1729 Rectangle(hdc, 10, 10, 100, 100);
1730 Rectangle(hdc, 20, 15, 30, 40);
1731 Rectangle(hdc, 15, 15, 20, 20);
1732 Rectangle(hdc, 15, 20, 50, 45);
1733 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1734 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1735 memset(bits, 0xcc, dib_size);
1737 Rectangle(hdc, 10, 10, 100, 100);
1738 Rectangle(hdc, 20, 15, 30, 40);
1739 Rectangle(hdc, 15, 15, 20, 20);
1740 Rectangle(hdc, 15, 20, 50, 45);
1741 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1742 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1743 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1745 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1746 memset(bits, 0xcc, dib_size);
1748 Rectangle(hdc, 10, 10, 100, 100);
1749 Rectangle(hdc, 20, 15, 30, 40);
1750 Rectangle(hdc, 15, 15, 20, 20);
1751 Rectangle(hdc, 15, 20, 50, 45);
1752 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1753 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1754 memset(bits, 0xcc, dib_size);
1756 Rectangle(hdc, 10, 10, 100, 100);
1757 Rectangle(hdc, 20, 15, 30, 40);
1758 Rectangle(hdc, 15, 15, 20, 20);
1759 Rectangle(hdc, 15, 20, 50, 45);
1760 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1761 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1762 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1764 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1765 memset(bits, 0xcc, dib_size);
1767 Rectangle(hdc, 10, 10, 100, 100);
1768 Rectangle(hdc, 20, 15, 30, 40);
1769 Rectangle(hdc, 15, 15, 20, 20);
1770 Rectangle(hdc, 15, 20, 50, 45);
1771 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1772 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1773 memset(bits, 0xcc, dib_size);
1775 Rectangle(hdc, 10, 10, 100, 100);
1776 Rectangle(hdc, 20, 15, 30, 40);
1777 Rectangle(hdc, 15, 15, 20, 20);
1778 Rectangle(hdc, 15, 20, 50, 45);
1779 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1780 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1781 memset(bits, 0xcc, dib_size);
1783 Rectangle(hdc, 10, 10, 100, 100);
1784 Rectangle(hdc, 20, 15, 30, 40);
1785 Rectangle(hdc, 15, 15, 20, 20);
1786 Rectangle(hdc, 15, 20, 50, 45);
1787 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1788 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1789 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1791 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1792 memset(bits, 0xcc, dib_size);
1794 Rectangle(hdc, 10, 10, 100, 100);
1795 Rectangle(hdc, 20, 15, 30, 40);
1796 Rectangle(hdc, 15, 15, 20, 20);
1797 Rectangle(hdc, 15, 20, 50, 45);
1798 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1799 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1800 memset(bits, 0xcc, dib_size);
1802 /* blitting with 32-bpp BI_RGB source */
1804 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1805 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1806 src_bi->bmiHeader.biHeight = 256;
1807 src_bi->bmiHeader.biWidth = 256;
1808 src_bi->bmiHeader.biBitCount = 32;
1809 src_bi->bmiHeader.biPlanes = 1;
1810 src_bi->bmiHeader.biCompression = BI_RGB;
1811 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1812 SelectObject( src_dc, bmp );
1813 for (y = 0; y < 256; y++)
1814 for (x = 0; x < 256; x++)
1816 BYTE a = (x + y) * 2;
1817 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1818 BYTE g = (BYTE)(x + y / 3) * a / 255;
1819 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1820 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1823 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1824 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1825 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1827 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1828 memset(bits, 0xcc, dib_size);
1830 blend.SourceConstantAlpha = 0xd0;
1831 blend.AlphaFormat = 0;
1832 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1833 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1835 if (!pGdiAlphaBlend) (*sha1) += 2;
1836 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1840 if (!pGdiAlphaBlend) (*sha1)++;
1841 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1843 memset(bits, 0xcc, dib_size);
1845 blend.SourceConstantAlpha = 0xb0;
1846 blend.AlphaFormat = AC_SRC_ALPHA;
1847 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1848 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1850 if (!pGdiAlphaBlend) (*sha1) += 2;
1851 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1855 if (!pGdiAlphaBlend) (*sha1)++;
1856 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1858 memset(bits, 0xcc, dib_size);
1860 /* blitting with 32-bpp r10g10b10 source */
1862 src_bi->bmiHeader.biBitCount = 32;
1863 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1864 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1865 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1866 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1867 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1868 SelectObject( src_dc, bmp );
1869 for (y = 0; y < 256; y++)
1870 for (x = 0; x < 256; x++)
1872 WORD r = (7 * x + 3 * y) % 1024;
1873 WORD g = (11 * x + y / 3) % 1024;
1874 WORD b = (x / 3 + 9 * y) % 1024;
1875 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1878 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1879 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1880 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1882 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1883 memset(bits, 0xcc, dib_size);
1885 /* blitting with 32-bpp b6g6r6 source */
1887 src_bi->bmiHeader.biBitCount = 32;
1888 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1889 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1890 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1891 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1892 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1893 SelectObject( src_dc, bmp );
1894 for (y = 0; y < 256; y++)
1895 for (x = 0; x < 256; x++)
1897 BYTE r = (y + 2 * x) % 64;
1898 BYTE g = (x + y / 3) % 64;
1899 BYTE b = (x / 3 + 2 * y) % 64;
1900 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1903 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1904 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1905 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1907 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1908 memset(bits, 0xcc, dib_size);
1910 /* blitting with 24-bpp source */
1912 src_bi->bmiHeader.biBitCount = 24;
1913 src_bi->bmiHeader.biCompression = BI_RGB;
1914 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1915 DeleteObject( SelectObject( src_dc, bmp ) );
1916 for (y = 0; y < 256; y++)
1917 for (x = 0; x < 256; x++)
1919 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1920 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1921 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1924 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1925 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1926 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1928 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1929 memset(bits, 0xcc, dib_size);
1931 blend.SourceConstantAlpha = 0xe0;
1932 blend.AlphaFormat = 0;
1933 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1934 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1936 if (!pGdiAlphaBlend) (*sha1) += 2;
1937 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1941 if (!pGdiAlphaBlend) (*sha1)++;
1942 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1944 memset(bits, 0xcc, dib_size);
1946 /* blitting with 16-bpp BI_RGB source */
1948 src_bi->bmiHeader.biBitCount = 16;
1949 src_bi->bmiHeader.biCompression = BI_RGB;
1950 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1951 DeleteObject( SelectObject( src_dc, bmp ) );
1952 for (y = 0; y < 256; y++)
1953 for (x = 0; x < 256; x++)
1954 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1956 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1957 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1958 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1960 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1961 memset(bits, 0xcc, dib_size);
1963 /* blitting with 16-bpp b4g4r4 source */
1965 src_bi->bmiHeader.biBitCount = 16;
1966 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1967 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1968 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1969 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1970 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1971 DeleteObject( SelectObject( src_dc, bmp ) );
1972 for (y = 0; y < 256; y++)
1973 for (x = 0; x < 256; x++)
1974 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1976 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1977 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1978 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1980 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1981 memset(bits, 0xcc, dib_size);
1983 /* blitting with 8-bpp source */
1985 src_bi->bmiHeader.biBitCount = 8;
1986 src_bi->bmiHeader.biCompression = BI_RGB;
1987 src_bi->bmiHeader.biClrUsed = 160;
1988 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1989 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1990 DeleteObject( SelectObject( src_dc, bmp ) );
1991 for (y = 0; y < 256; y++)
1992 for (x = 0; x < 256; x++)
1993 src_bits[y * 256 + x] = 3 * x + 5 * y;
1995 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1996 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1997 memset(bits, 0xcc, dib_size);
1999 blend.SourceConstantAlpha = 0xd0;
2000 blend.AlphaFormat = 0;
2001 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2002 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2004 if (!pGdiAlphaBlend) (*sha1) += 2;
2005 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
2009 if (!pGdiAlphaBlend) (*sha1)++;
2010 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2012 memset(bits, 0xcc, dib_size);
2014 /* blitting with 4-bpp source */
2016 src_bi->bmiHeader.biBitCount = 4;
2017 src_bi->bmiHeader.biClrUsed = 12;
2018 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2019 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2020 DeleteObject( SelectObject( src_dc, bmp ) );
2021 for (y = 0; y < 256; y++)
2022 for (x = 0; x < 256; x += 2)
2023 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2025 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2026 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
2027 memset(bits, 0xcc, dib_size);
2029 /* blitting with 1-bpp source */
2031 src_bi->bmiHeader.biBitCount = 1;
2032 src_bi->bmiHeader.biClrUsed = 0;
2033 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2034 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2035 DeleteObject( SelectObject( src_dc, bmp ) );
2036 for (y = 0; y < 256; y++)
2037 for (x = 0; x < 256; x += 8)
2038 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2040 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2041 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
2042 memset(bits, 0xcc, dib_size);
2044 blend.SourceConstantAlpha = 0x90;
2045 blend.AlphaFormat = 0;
2046 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2047 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2049 if (!pGdiAlphaBlend) (*sha1) += 2;
2050 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
2054 if (!pGdiAlphaBlend) (*sha1)++;
2055 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
2057 memset(bits, 0xcc, dib_size);
2060 DeleteObject( bmp );
2062 /* RLE StretchDIBits */
2063 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2064 src_bi->bmiHeader.biWidth = 8;
2065 src_bi->bmiHeader.biHeight = 8;
2066 src_bi->bmiHeader.biPlanes = 1;
2067 src_bi->bmiHeader.biBitCount = 8;
2068 src_bi->bmiHeader.biCompression = BI_RLE8;
2069 src_bi->bmiHeader.biClrUsed = 0;
2070 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2072 for (i = 0; i < 256; i++)
2074 src_bi->bmiColors[i].rgbRed = i;
2075 src_bi->bmiColors[i].rgbGreen = i;
2076 src_bi->bmiColors[i].rgbBlue = i;
2077 src_bi->bmiColors[i].rgbReserved = 0;
2080 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2081 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2082 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2083 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2084 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2085 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
2086 memset(bits, 0xcc, dib_size);
2088 /* 32 bpp StretchDIBits */
2090 src_bi->bmiHeader.biWidth = 4;
2091 src_bi->bmiHeader.biHeight = 4;
2092 src_bi->bmiHeader.biPlanes = 1;
2093 src_bi->bmiHeader.biBitCount = 32;
2094 src_bi->bmiHeader.biCompression = BI_RGB;
2095 src_bi->bmiHeader.biClrUsed = 0;
2096 src_bi->bmiHeader.biSizeImage = 0;
2098 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2099 ok(ret == 4, "got %d\n", ret);
2100 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2101 ok(ret == 4, "got %d\n", ret);
2102 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2103 ok(ret == 4, "got %d\n", ret);
2104 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2105 ok(ret == 4, "got %d\n", ret);
2106 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2107 ok(ret == 4, "got %d\n", ret);
2108 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2109 ok(ret == 4, "got %d\n", ret);
2111 src_bi->bmiHeader.biHeight = -4;
2113 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2114 ok(ret == 4, "got %d\n", ret);
2115 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2116 ok(ret == -4, "got %d\n", ret);
2117 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2118 ok(ret == 4, "got %d\n", ret);
2119 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2120 ok(ret == -4, "got %d\n", ret);
2121 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2122 ok(ret == 4, "got %d\n", ret);
2123 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2124 ok(ret == -4, "got %d\n", ret);
2126 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2127 memset(bits, 0xcc, dib_size);
2130 for (i = 0; i < 256; i++)
2132 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2133 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2134 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2135 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2138 /* A few extra colors that are interesting in the 1bpp case */
2141 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2142 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2145 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2146 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2149 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2150 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2152 compare_hash(bmi, bits, sha1, "Colors");
2153 memset(bits, 0xcc, dib_size);
2155 for (i = 0; i < 256; i++)
2158 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2159 g = GetPixel( hdc, i * 2, 10 );
2160 ok( s == g, "got %08x and %08x\n", s, g );
2162 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2163 g = GetPixel( hdc, i * 2, 20 );
2164 ok( s == g, "got %08x and %08x\n", s, g );
2166 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2167 g = GetPixel( hdc, i * 2, 30 );
2168 ok( s == g, "got %08x and %08x\n", s, g );
2170 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2171 g = GetPixel( hdc, i * 2, 40 );
2172 ok( s == g, "got %08x and %08x\n", s, g );
2175 compare_hash(bmi, bits, sha1, "SetPixel");
2176 memset(bits, 0xcc, dib_size);
2180 if (pGdiGradientFill)
2184 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2185 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2186 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2187 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2189 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2193 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2194 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2195 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2197 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2198 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2199 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2201 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2202 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2203 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2205 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2206 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2207 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2209 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2210 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2211 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2213 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2214 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2215 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2217 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2218 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2219 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2221 GRADIENT_TRIANGLE tri[] =
2223 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2224 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2227 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2228 for (i = 0; i < 4; i++) vrect[i].y += 250;
2229 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2231 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2232 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2234 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2235 memset(bits, 0xcc, dib_size);
2237 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2238 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2239 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2240 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2241 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2243 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2244 memset(bits, 0xcc, dib_size);
2248 win_skip( "GdiGradientFill not supported\n" );
2254 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2255 SelectObject( hdc, wide_pen );
2257 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2259 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2260 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2263 compare_hash(bmi, bits, sha1, "wide pen" );
2264 memset(bits, 0xcc, dib_size);
2266 SelectObject(hdc, orig_brush);
2267 SelectObject(hdc, orig_pen);
2269 DeleteObject(dib_brush);
2270 DeleteObject(solid_brush);
2271 DeleteObject(wide_pen);
2272 DeleteObject(dashed_pen);
2273 DeleteObject(solid_pen);
2276 static const BYTE ramp[17] =
2278 0, 0x4d, 0x68, 0x7c,
2279 0x8c, 0x9a, 0xa7, 0xb2,
2280 0xbd, 0xc7, 0xd0, 0xd9,
2281 0xe1, 0xe9, 0xf0, 0xf8,
2285 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2287 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2288 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2291 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2293 BYTE min_comp, max_comp;
2295 if (alpha == 16) return text;
2296 if (alpha <= 1) return dst;
2297 if (text == dst) return dst;
2299 get_range( alpha, text, &min_comp, &max_comp );
2303 DWORD diff = dst - text;
2304 DWORD range = max_comp - text;
2305 dst = text + (diff * range ) / (0xff - text);
2310 DWORD diff = text - dst;
2311 DWORD range = text - min_comp ;
2312 dst = text - (diff * range) / text;
2317 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2321 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2322 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2323 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2327 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2329 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2331 DWORD dib_size = get_dib_size(bmi), ret;
2336 int i, stride, x, y;
2337 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2338 char *eto_hash = NULL, *diy_hash = NULL;
2339 static const char *str = "Hello Wine";
2340 POINT origin, g_org;
2341 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2343 COLORREF text_color;
2345 for(i = 0; i < dib_size; i++)
2346 bits[i] = vals[i % 4];
2348 memset( &lf, 0, sizeof(lf) );
2349 strcpy( lf.lfFaceName, "Tahoma" );
2351 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2353 font = CreateFontIndirect( &lf );
2354 font = SelectObject( hdc, font );
2356 GetTextMetrics( hdc, &tm );
2357 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2359 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2360 DeleteObject( SelectObject( hdc, font ) );
2364 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2365 SetTextAlign( hdc, TA_BASELINE );
2366 SetBkMode( hdc, TRANSPARENT );
2370 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2371 eto_hash = hash_dib( bmi, bits );
2373 for(i = 0; i < dib_size; i++)
2374 bits[i] = vals[i % 4];
2376 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2378 text_color = GetTextColor( hdc );
2379 for (i = 0; i < strlen(str); i++)
2381 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2383 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2385 if (ret == GDI_ERROR) continue;
2387 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2389 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2390 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2392 origin.x += gm.gmCellIncX;
2393 origin.y += gm.gmCellIncY;
2399 stride = (gm.gmBlackBoxX + 3) & ~3;
2401 for (y = 0; y < gm.gmBlackBoxY; y++)
2403 BYTE *g_ptr = g_buf + y * stride;
2406 for (x = 0; x < gm.gmBlackBoxX; x++)
2408 if (g_ptr[x] <= 1) continue;
2409 if (g_ptr[x] >= 16) val = text_color;
2412 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2413 val = aa_colorref( val, text_color, g_ptr[x] );
2415 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2421 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2423 for (y = 0; y < gm.gmBlackBoxY; y++)
2425 BYTE *g_ptr = g_buf + y * stride;
2426 for (x = 0; x < gm.gmBlackBoxX; x++)
2428 if (g_ptr[x / 8] & masks[x % 8])
2429 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2435 diy_hash = hash_dib( bmi, bits );
2436 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2438 HeapFree( GetProcessHeap(), 0, diy_hash );
2439 HeapFree( GetProcessHeap(), 0, eto_hash );
2441 font = SelectObject( hdc, font );
2442 DeleteObject( font );
2445 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2447 draw_text_2( hdc, bmi, bits, FALSE );
2449 /* Rounding errors make these cases hard to test */
2450 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2451 (bmi->bmiHeader.biBitCount == 16))
2454 draw_text_2( hdc, bmi, bits, TRUE );
2457 static void test_simple_graphics(void)
2459 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2460 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2461 RGBQUAD *colors = bmi->bmiColors;
2462 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2465 HBITMAP dib, orig_bm;
2470 mem_dc = CreateCompatibleDC(NULL);
2474 memset(bmi, 0, sizeof(bmibuf));
2475 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2476 bmi->bmiHeader.biHeight = 512;
2477 bmi->bmiHeader.biWidth = 512;
2478 bmi->bmiHeader.biBitCount = 32;
2479 bmi->bmiHeader.biPlanes = 1;
2480 bmi->bmiHeader.biCompression = BI_RGB;
2482 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2483 ok(dib != NULL, "ret NULL\n");
2484 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2485 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2486 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2487 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2488 ok(ds.dsBmih.biCompression == BI_RGB ||
2489 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2490 "got %x\n", ds.dsBmih.biCompression);
2492 orig_bm = SelectObject(mem_dc, dib);
2494 dst_format = "8888";
2495 sha1 = sha1_graphics_a8r8g8b8;
2496 draw_graphics(mem_dc, bmi, bits, &sha1);
2497 draw_text(mem_dc, bmi, bits);
2499 SelectObject(mem_dc, orig_bm);
2502 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2503 trace("8888 - bitfields\n");
2504 bmi->bmiHeader.biBitCount = 32;
2505 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2506 bit_fields[0] = 0xff0000;
2507 bit_fields[1] = 0x00ff00;
2508 bit_fields[2] = 0x0000ff;
2510 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2511 ok(dib != NULL, "ret NULL\n");
2512 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2513 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2514 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2515 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2516 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2518 orig_bm = SelectObject(mem_dc, dib);
2520 dst_format = "8888 - bitfields";
2521 sha1 = sha1_graphics_a8r8g8b8_bitfields;
2522 draw_graphics(mem_dc, bmi, bits, &sha1);
2523 draw_text(mem_dc, bmi, bits);
2525 SelectObject(mem_dc, orig_bm);
2529 trace("a8b8g8r8\n");
2530 bmi->bmiHeader.biBitCount = 32;
2531 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2532 bit_fields[0] = 0x0000ff;
2533 bit_fields[1] = 0x00ff00;
2534 bit_fields[2] = 0xff0000;
2536 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2537 ok(dib != NULL, "ret NULL\n");
2538 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2539 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2540 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2541 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2542 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2544 orig_bm = SelectObject(mem_dc, dib);
2546 dst_format = "a8b8g8r8";
2547 sha1 = sha1_graphics_a8b8g8r8;
2548 draw_graphics(mem_dc, bmi, bits, &sha1);
2549 draw_text(mem_dc, bmi, bits);
2551 SelectObject(mem_dc, orig_bm);
2555 trace("r10g10b10\n");
2556 bmi->bmiHeader.biBitCount = 32;
2557 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2558 bit_fields[0] = 0x3ff00000;
2559 bit_fields[1] = 0x000ffc00;
2560 bit_fields[2] = 0x000003ff;
2562 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2563 ok(dib != NULL, "ret NULL\n");
2564 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2565 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2566 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2567 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2568 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2570 orig_bm = SelectObject(mem_dc, dib);
2572 dst_format = "r10g10b10";
2573 sha1 = sha1_graphics_r10g10b10;
2574 draw_graphics(mem_dc, bmi, bits, &sha1);
2575 draw_text(mem_dc, bmi, bits);
2577 SelectObject(mem_dc, orig_bm);
2582 bmi->bmiHeader.biBitCount = 32;
2583 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2584 bit_fields[0] = 0x0003f000;
2585 bit_fields[1] = 0x00000fc0;
2586 bit_fields[2] = 0x0000003f;
2588 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2589 ok(dib != NULL, "ret NULL\n");
2590 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2591 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2592 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2593 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2594 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2596 orig_bm = SelectObject(mem_dc, dib);
2598 dst_format = "r6g6b6";
2599 sha1 = sha1_graphics_r6g6b6;
2600 draw_graphics(mem_dc, bmi, bits, &sha1);
2601 draw_text(mem_dc, bmi, bits);
2603 SelectObject(mem_dc, orig_bm);
2608 bmi->bmiHeader.biBitCount = 24;
2609 bmi->bmiHeader.biCompression = BI_RGB;
2611 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2612 ok(dib != NULL, "ret NULL\n");
2613 orig_bm = SelectObject(mem_dc, dib);
2616 sha1 = sha1_graphics_24;
2617 draw_graphics(mem_dc, bmi, bits, &sha1);
2618 draw_text(mem_dc, bmi, bits);
2620 SelectObject(mem_dc, orig_bm);
2625 bmi->bmiHeader.biBitCount = 16;
2626 bmi->bmiHeader.biCompression = BI_RGB;
2628 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2629 ok(dib != NULL, "ret NULL\n");
2630 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2631 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2632 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2633 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2634 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2636 orig_bm = SelectObject(mem_dc, dib);
2638 dst_format = "r5g5b5";
2639 sha1 = sha1_graphics_r5g5b5;
2640 draw_graphics(mem_dc, bmi, bits, &sha1);
2641 draw_text(mem_dc, bmi, bits);
2643 SelectObject(mem_dc, orig_bm);
2648 bmi->bmiHeader.biBitCount = 16;
2649 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2650 bit_fields[0] = 0x0f00;
2651 bit_fields[1] = 0x00f0;
2652 bit_fields[2] = 0x000f;
2653 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2654 ok(dib != NULL, "ret NULL\n");
2655 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2656 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2657 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2658 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2659 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2661 orig_bm = SelectObject(mem_dc, dib);
2663 dst_format = "r4g4b4";
2664 sha1 = sha1_graphics_r4g4b4;
2665 draw_graphics(mem_dc, bmi, bits, &sha1);
2666 draw_text(mem_dc, bmi, bits);
2668 SelectObject(mem_dc, orig_bm);
2673 bmi->bmiHeader.biBitCount = 8;
2674 bmi->bmiHeader.biCompression = BI_RGB;
2675 bmi->bmiHeader.biClrUsed = 236;
2676 for (i = 0; i < 236; i++)
2678 colors[i].rgbRed = (i & 0x07) << 5;
2679 colors[i].rgbGreen = (i & 0x38) << 2;
2680 colors[i].rgbBlue = i & 0xc0;
2682 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2683 ok(dib != NULL, "ret NULL\n");
2685 orig_bm = SelectObject(mem_dc, dib);
2687 dst_format = "8 color";
2688 sha1 = sha1_graphics_8_color;
2689 draw_graphics(mem_dc, bmi, bits, &sha1);
2690 draw_text(mem_dc, bmi, bits);
2692 SelectObject(mem_dc, orig_bm);
2696 trace("8 grayscale\n");
2697 bmi->bmiHeader.biBitCount = 8;
2698 bmi->bmiHeader.biCompression = BI_RGB;
2699 bmi->bmiHeader.biClrUsed = 256;
2700 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2702 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2703 ok(dib != NULL, "ret NULL\n");
2705 orig_bm = SelectObject(mem_dc, dib);
2707 dst_format = "8 grayscale";
2708 sha1 = sha1_graphics_8_grayscale;
2709 draw_graphics(mem_dc, bmi, bits, &sha1);
2710 draw_text(mem_dc, bmi, bits);
2712 SelectObject(mem_dc, orig_bm);
2717 bmi->bmiHeader.biBitCount = 8;
2718 bmi->bmiHeader.biCompression = BI_RGB;
2719 bmi->bmiHeader.biClrUsed = 5;
2720 colors[0].rgbRed = 0xff;
2721 colors[0].rgbGreen = 0xff;
2722 colors[0].rgbBlue = 0xff;
2723 colors[1].rgbRed = 0;
2724 colors[1].rgbGreen = 0;
2725 colors[1].rgbBlue = 0;
2726 colors[2].rgbRed = 0xff;
2727 colors[2].rgbGreen = 0;
2728 colors[2].rgbBlue = 0;
2729 colors[3].rgbRed = 0;
2730 colors[3].rgbGreen = 0xff;
2731 colors[3].rgbBlue = 0;
2732 colors[4].rgbRed = 0;
2733 colors[4].rgbGreen = 0;
2734 colors[4].rgbBlue = 0xff;
2736 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2737 ok(dib != NULL, "ret NULL\n");
2739 orig_bm = SelectObject(mem_dc, dib);
2742 sha1 = sha1_graphics_8;
2743 draw_graphics(mem_dc, bmi, bits, &sha1);
2744 draw_text(mem_dc, bmi, bits);
2746 SelectObject(mem_dc, orig_bm);
2751 bmi->bmiHeader.biBitCount = 4;
2753 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2754 ok(dib != NULL, "ret NULL\n");
2756 orig_bm = SelectObject(mem_dc, dib);
2759 sha1 = sha1_graphics_4;
2760 draw_graphics(mem_dc, bmi, bits, &sha1);
2761 draw_text(mem_dc, bmi, bits);
2763 SelectObject(mem_dc, orig_bm);
2767 trace("4 grayscale\n");
2768 bmi->bmiHeader.biClrUsed = 16;
2769 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2771 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2772 ok(dib != NULL, "ret NULL\n");
2774 orig_bm = SelectObject(mem_dc, dib);
2776 dst_format = "4 grayscale";
2777 sha1 = sha1_graphics_4_grayscale;
2778 draw_graphics(mem_dc, bmi, bits, &sha1);
2779 draw_text(mem_dc, bmi, bits);
2781 SelectObject(mem_dc, orig_bm);
2786 bmi->bmiHeader.biBitCount = 1;
2787 bmi->bmiHeader.biClrUsed = 2;
2789 colors[0].rgbRed = 0x00;
2790 colors[0].rgbGreen = 0x01;
2791 colors[0].rgbBlue = 0xff;
2792 colors[1].rgbRed = 0xff;
2793 colors[1].rgbGreen = 0x00;
2794 colors[1].rgbBlue = 0x00;
2796 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2797 ok(dib != NULL, "ret NULL\n");
2799 orig_bm = SelectObject(mem_dc, dib);
2802 sha1 = sha1_graphics_1;
2803 draw_graphics(mem_dc, bmi, bits, &sha1);
2804 draw_text(mem_dc, bmi, bits);
2806 SelectObject(mem_dc, orig_bm);
2814 HMODULE mod = GetModuleHandleA("gdi32.dll");
2815 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2816 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2817 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
2819 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2821 test_simple_graphics();
2823 CryptReleaseContext(crypt_prov, 0);