gdi32: Don't add_join if points are coincident in wide_line_segments.
[wine/multimedia.git] / dlls / gdi32 / tests / dib.c
blobb431adde91ed8c0181d43bc8516c6fce250ef6de
1 /*
2 * DIB driver tests.
4 * Copyright 2011 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <math.h>
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wingdi.h"
28 #include "winuser.h"
29 #include "wincrypt.h"
30 #include "mmsystem.h" /* DIBINDEX */
32 #include "wine/test.h"
34 static HCRYPTPROV crypt_prov;
35 static BOOL (WINAPI *pGdiAlphaBlend)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
36 static BOOL (WINAPI *pGdiGradientFill)(HDC,TRIVERTEX*,ULONG,void*,ULONG,ULONG);
37 static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
39 static const DWORD rop3[256] =
41 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
42 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
43 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
44 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
45 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
46 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
47 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
48 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
49 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
50 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
51 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
52 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
53 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
54 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
55 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
56 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
57 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
58 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
59 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
60 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
61 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
62 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
63 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
64 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
65 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
66 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
67 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
68 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
69 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
70 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
71 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
72 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
75 static inline BOOL rop_uses_src(DWORD rop)
77 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
80 static const char *sha1_graphics_a8r8g8b8[] =
82 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
83 "2426172d9e8fec27d9228088f382ef3c93717da9",
84 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
85 "664fac17803859a4015c6ae29e5538e314d5c827",
86 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
87 "fe6cc678fb13a3ead67839481bf22348adc69f52",
88 "d51bd330cec510cdccf5394328bd8e5411901e9e",
89 "df4aebf98d91f11be560dd232123b3ae327303d7",
90 "f2af53dd073a09b1031d0032d28da35c82adc566",
91 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
92 "c387917268455017aa0b28bed73aa6554044bbb3",
93 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
94 "6c530622a025d872a642e8f950867884d7b136cb",
95 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
96 "b2261353decda2712b83538ab434a49ce21f3172",
97 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
98 "9b9874c1c1d92afa554137e191d34ea33acc322f",
99 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
100 "d7398de15b2837a58a62a701ca1b3384625afec4",
101 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
102 "5246ef357e7317b9d141a3294d300c195da76cb7",
103 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
104 "3d8244b665ecdb104087bad171b0b0f83545133c",
105 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
106 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
107 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
108 "e358efb1c11172e40855de620bdb8a8e545cd790",
109 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
110 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
111 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
112 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
113 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
114 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
115 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
116 "94645300d6eb51020a7ef8261dee2941cd51b5df",
117 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
118 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
119 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
120 "68c18db6abfda626cab12d198298d4c39264bfbc",
121 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
122 "39c31de73aafcfcadf0bf414da4495be9de54417",
123 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
124 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
125 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
126 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
127 "3d2ccbe51408232a04769546b1bdd74f84558a41",
128 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
129 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
130 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
131 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
132 "d7dd4700f49808541bba99244b7eb5840e0a2439",
133 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
134 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
135 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
136 "a1fde1094d2c19ddb20871842dae1da73618709e",
137 "e462052a03dbe4ec3814db7700e166d00d4d686f",
138 "a27917d4db49ce77989fae246015aeb2a28520ee",
139 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
140 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
141 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
142 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
143 "2b3198bd5c0a87db5dab13df8bbe14363d02acec",
144 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
145 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
146 "f451a05f699ac3bbe155d059e7871a2636887b5f",
147 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
148 "dccaef62738ff90da4554a85d8cb846d6436799e",
149 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
150 NULL
153 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
155 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
156 "2426172d9e8fec27d9228088f382ef3c93717da9",
157 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
158 "664fac17803859a4015c6ae29e5538e314d5c827",
159 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
160 "fe6cc678fb13a3ead67839481bf22348adc69f52",
161 "d51bd330cec510cdccf5394328bd8e5411901e9e",
162 "df4aebf98d91f11be560dd232123b3ae327303d7",
163 "f2af53dd073a09b1031d0032d28da35c82adc566",
164 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
165 "c387917268455017aa0b28bed73aa6554044bbb3",
166 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
167 "6c530622a025d872a642e8f950867884d7b136cb",
168 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
169 "b2261353decda2712b83538ab434a49ce21f3172",
170 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
171 "9b9874c1c1d92afa554137e191d34ea33acc322f",
172 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
173 "d7398de15b2837a58a62a701ca1b3384625afec4",
174 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
175 "5246ef357e7317b9d141a3294d300c195da76cb7",
176 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
177 "3d8244b665ecdb104087bad171b0b0f83545133c",
178 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
179 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
180 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
181 "e358efb1c11172e40855de620bdb8a8e545cd790",
182 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
183 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
184 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
185 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
186 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
187 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
188 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
189 "94645300d6eb51020a7ef8261dee2941cd51b5df",
190 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
191 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
192 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
193 "68c18db6abfda626cab12d198298d4c39264bfbc",
194 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
195 "39c31de73aafcfcadf0bf414da4495be9de54417",
196 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
197 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
198 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
199 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
200 "3d2ccbe51408232a04769546b1bdd74f84558a41",
201 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
202 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
203 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
204 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
205 "d7dd4700f49808541bba99244b7eb5840e0a2439",
206 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
207 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
208 "50d19fe68b2ab4fdbb5d590cdca6dc84a95bab68",
209 "a1fde1094d2c19ddb20871842dae1da73618709e",
210 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
211 "b2c8e1ebb9435031fe068442f479d1304096e79f",
212 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
213 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
214 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
215 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
216 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
217 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
218 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
219 "f451a05f699ac3bbe155d059e7871a2636887b5f",
220 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
221 "dccaef62738ff90da4554a85d8cb846d6436799e",
222 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
223 NULL
226 static const char *sha1_graphics_a8b8g8r8[] =
228 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
229 "e0bc877697093ed440e125154e247ca9d65e933c",
230 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
231 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
232 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
233 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
234 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
235 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
236 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
237 "b753ebb39d90210cc717f57b53dd439f7de6b077",
238 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
239 "94368cea5033b435454daa56d55546310675131e",
240 "bf57a6a37fb107d29ed3d45695919887abcb7902",
241 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
242 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
243 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
244 "b0178632775d29bec2b16de7b9b8287115c40d0f",
245 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
246 "3369889a67d6c79a24ee15f7d14374f9995215e4",
247 "473a1fd07df800c87a5d3286b642ace10c61c6af",
248 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
249 "b8951d2b20518fd129e5113a5f429626893913bf",
250 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
251 "4851c5b7d5bc18590e787c0c218a592ef504e738",
252 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
253 "abdf003699364fe45fab7dc61e67c606d0063b40",
254 "89abaadff4e68c738cf9251c51e3609564843381",
255 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
256 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
257 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
258 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
259 "71b9756fdfeedce1e6db201176d21a981b881662",
260 "5319528d9af750c172ae62ee85ddb2eaef73b193",
261 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
262 "19b32a0daa91201725b5e13820c343d0a84ff698",
263 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
264 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
265 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
266 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
267 "8566c1110ab5cb8f754787b47923c8bff38f790c",
268 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
269 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
270 "d01071c44259adc94b89978b7d51a058b6dad665",
271 "e6d33b106bcda374e662d338c57a457dbcaa108a",
272 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
273 "339908a568f384e1f384a3e1b0dd415779203b02",
274 "88fd743d00bd37d2ed722092146795b044d08a6e",
275 "c0537ec24147e74939219213d864ee113cad9967",
276 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
277 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
278 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
279 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
280 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
281 "1cb1810b127f509117b38d62a15b67b2347b9145",
282 "f05b3294f25de5fa6d1114104bca97871052ea5a",
283 "87f57a31253a38dbf3dc3070473328fa04b68a48",
284 "db64cc4d830fc35ed170b53943e722b2342954d4",
285 "9988ceca44dafbee247aece1f027c06c27c01652",
286 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
287 "b76e0724496e471b01ef8b34f8beba69f5bde261",
288 "34201d3d3583f89ce3267d3d0c4e01c64463de4b",
289 "693f5c5fbaeaadb5928d34b035499626fecb8394",
290 "8a9aa84c42dedc3e681191a1229846887ed262ec",
291 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
292 "707bc44fc9fed68ff1f537f0473e0cd825dd660f",
293 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
294 "175a7bcb73c74eceecc000657a0100bccf158ff4",
295 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
296 NULL
299 static const char *sha1_graphics_r10g10b10[] =
301 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
302 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
303 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
304 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
305 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
306 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
307 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
308 "0ad27de0c916c073d0d18484fff899bbdb258db7",
309 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
310 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
311 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
312 "2986b431a0022153e5f875da77cc792e3825ebd5",
313 "ca4b25a5459885ce1e0a36844612087893d425b1",
314 "181bd4616796d89174cedc0332fb320b65aeb0e2",
315 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
316 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
317 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
318 "536eaaa901d652805a8977ecb2dc73f651094c5b",
319 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
320 "92cddcabf5365eef1e037f488af52b31669d987f",
321 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
322 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
323 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
324 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
325 "d578210815e27fe210eb678a71e6d22ba4b4c196",
326 "c7a027c7079dfcc831ca8bc134a509958273073c",
327 "19cf978596195b848df8709aaf637f83f92b8336",
328 "798a835fe50156eeb478c0a6085b088f53409d52",
329 "86ddf268d854f37e5b478c48792b551b57635db6",
330 "8259d388e02542207b6a08d65d553871ce1c4a09",
331 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
332 "66f8d78d4971934794478afee28b3a50e97f1b82",
333 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
334 "63798fb175afef78fa8fe8133d9de97a0cc80651",
335 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
336 "1ceb85697f649a62b1753438daa14944af7f450c",
337 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
338 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
339 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
340 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
341 "ada202d2f526f6995f83412479891c1764b66e5a",
342 "68348e8f54883f4fe295354b024e291c85f1038f",
343 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
344 "e9167564031ead3459eee6a3ebb2f58f100d931f",
345 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
346 "46196f50297260df2863e2fa76d2dfcf72006c23",
347 "0790585dfaef94f912b1ee81477d4ac448708708",
348 "589fb8a85d924ad19ed78409ae89475ba479c30a",
349 "43d67bc61ef54014b022891e5c024fc24b1fe797",
350 "e8783644428b637adbe80bcd084a33428cb69983",
351 "fc0c32afb719295f28bcfef22803bef94f798e20",
352 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
353 "d3f08946300e1700865042aed121870e292d1095",
354 "467ff4af1e105855874f27fbf84d1d2b0417ab5d",
355 "fb0dcff8a67a88313557ee8b588aaa2004fe7b8b",
356 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
357 "317521e576801acaea62c76fe16813cdfe20f4ad",
358 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
359 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
360 "555b6f04ba8dec9e2a60693dcaac594227052727",
361 "c199b96a71c3aab2d49ccb5b6294bf14eb0dd1eb",
362 "4238fe9d296b5c72b0a8745cc761f308605b2094",
363 "943dc6033ab335a6a63e666f70a6bb3a0677e157",
364 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
365 "88cfa7b7c1487f8eda05fce92b622942c9fb7ca4",
366 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
367 "ad91dde8566dceaadc3523cdc8149cd7415a1b70",
368 "1936661eee8073068506131c9e89265b2f8403e8",
369 NULL
372 static const char *sha1_graphics_r6g6b6[] =
374 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
375 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
376 "5b9dab3d8411afb25fbbeba0313db526815ac189",
377 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
378 "2028d1b0d1acef35dc07027135023f35fb9746b9",
379 "378713720dcb5aadb730435ad0989a68ab189114",
380 "084152773feb01a85df6006f2f4f288a1442d37a",
381 "97b824953f60fc9a91028045baacbe7b7dc82b14",
382 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
383 "287d755448e72e29e4812193e2b6f8098a214d82",
384 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
385 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
386 "e51bcf80211cd06e7d10225534b7a79b5454be27",
387 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
388 "0b94e0a5b739ab0020130646522e53da35a149ad",
389 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
390 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
391 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
392 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
393 "2128157e601ef0d6b3636b7387d3b28e876de728",
394 "8bdcdcd463f0052279d070ac763757f4db975483",
395 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
396 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
397 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
398 "66b130f83381957cfc4763558c5f5cddf2e3b564",
399 "d548135ce2320499277ce12b80bc35004f8a9787",
400 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
401 "1906ddfd829e735af49245171f8eb7673295d399",
402 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
403 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
404 "defd95a10d44cad6e736542920b74efd53e9e7eb",
405 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
406 "3f11a735e52030aa3d0f024d83803698293d10e5",
407 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
408 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
409 "3231c4d87faefb7ec5bd377613969c05b70343fc",
410 "00394e438e9edde978e88602c9ad2a572e965bf6",
411 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
412 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
413 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
414 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
415 "3d6cf3753390a05504b1f50302f767df443f0f40",
416 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
417 "da9e896a3a98b330980152b2e4a43cb6e686c730",
418 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
419 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
420 "47499ad13b719de18c59c2bc9b38ed578db50b95",
421 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
422 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
423 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
424 "49341c297a887186bd47d7465d827ab3147f05e3",
425 "325279e76367200d3fd7194d81c09fd139988ece",
426 "c3def160a1e847605ff0fc7edd30397fa90635a0",
427 "a9c2158329c207638cfd2c82cd8a6218efdb28d2",
428 "7f0c4e6874f0c36cee64ff5dec76258ca8822cb2",
429 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
430 "77ea86e51a94b11a8081b29696cb4115687843e3",
431 "d67b897cad72d31e75359094007b1346fd8806ea",
432 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
433 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
434 "1e5a4ef7f8634847a251d1fcce298c409fd13d87",
435 "481337fbedf181d4324bf7f8299b0327197ff468",
436 "9ab957870fa4e17aec6a79bc1a4fdb42a5ffcc30",
437 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
438 "8e32ea3614c3b20899d748db48258761c7158d2b",
439 "5da35bad12e3e9b26a0444d30820099481281e45",
440 "94f004e98ae8035af948611770a4a2dd6643f510",
441 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
442 NULL
445 static const char *sha1_graphics_24[] =
447 "e993b15c9bd14fb45a15310450b7083c44e42665",
448 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
449 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
450 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
451 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
452 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
453 "fd4be592483623dbc800fe28210a1f0daa71999b",
454 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
455 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
456 "883bc8f305c602edca785e21cd00f488583fb13f",
457 "3bac4e80993f49dc3926e30524115fca9d7a8026",
458 "91369e35be29059a0665782541db4c8b324c6bb2",
459 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
460 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
461 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
462 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
463 "5068bff794553cf5a3145ae407c9a2984357844c",
464 "413a7989969c229dee4ab1798362f32f96cf0a10",
465 "0bb222e540b82720d4971e4a2fc626899af03e03",
466 "adc20832d8c43f1cf372d8392535492013cd2306",
467 "45649794dcbcabda487f66f7a80fc1bec79047a1",
468 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
469 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
470 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
471 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
472 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
473 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
474 "92a1ab214dd8027c407814420449119466c92840",
475 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
476 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
477 "955390669afed2369b15b32fa519f2f921cdf1a0",
478 "201906f7d763b930a98c97f8eeab417f2b65e723",
479 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
480 "701c5af1d0c28294ce7d804b5697643c430d22a0",
481 "b0a959745b2db1d9f449e68e4479a4f36301879c",
482 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
483 "e171f6ec77bca91d6b8559911bce296c0bac469e",
484 "9725669042ef68acb408404d196496d10340bb5a",
485 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
486 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
487 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
488 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
489 "0f79500eda467cd3cbc220abdd37b5dba695d654",
490 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
491 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
492 "7d479beeb6758c164566638b5c873c188d6a91e7",
493 "80086808fca03e757d812e31d1ae576bf90dac9d",
494 "9560096f1b85ae6d939d736165c44df00a47c424",
495 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
496 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
497 "b25ba91487ec945410deb2b51bc1156890c032a8",
498 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
499 "ee315634ed92da3a32c2675ecd1b369471c60936",
500 "6776e0612410e7e200c853721b4ab6ad8b6b81f5",
501 "620a5a520d81971a2d9c30b8d836ba696e11b8dd",
502 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
503 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
504 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
505 "bf5ec23456efe00e1e0931c17de9040ab2092858",
506 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
507 "9d86b1b2bbce90efd3c0b9fe20d23ffa3eeecd20",
508 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
509 "e96b79bf88988b5694a04dfc3bd0029361b39801",
510 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
511 "09cb4ab070083144bed4271c0a2a34ccb6ed13c0",
512 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
513 "c95afd0a020e68a76982fe8663b5d64113987233",
514 "48658ff76c137185c56a53f3ccf0e958d0296742",
515 NULL
518 static const char *sha1_graphics_r5g5b5[] =
520 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
521 "847005cf7371f511bcc837251cde07b1796f6113",
522 "a8f75743a930843ec14d516cd048b6e0468e5d89",
523 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
524 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
525 "a9034a905daa91757b4f63345c0e40638cd53ca8",
526 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
527 "99474fecf11df7b7035c35be6b8b697be9889418",
528 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
529 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
530 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
531 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
532 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
533 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
534 "449092689226a1172b6086ba1181d6b6d6499f26",
535 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
536 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
537 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
538 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
539 "6daaf945a955928c5c124c880522ca4634fb2343",
540 "12a288390d16e1efa99d4185301de48a4d433b14",
541 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
542 "1d3af561605fd61433035600d8962cb8d266fdd0",
543 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
544 "d7d97e28ed316f6596c737eb83baa5948d86b673",
545 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
546 "656bf3b7121bcd620a0a3ad488f0d66604824577",
547 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
548 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
549 "a49530722328ae88fd765792ac0c657efbcce75d",
550 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
551 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
552 "a6fd83542c3826132e88d3f5e304d604c0056fad",
553 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
554 "e428d213ad02651287894f093413949dcb369208",
555 "7df915bedcc5951a1b6f828490f7dbb93212e835",
556 "645dc251d205139282b17eb7bece1055fff3bcd0",
557 "76215275593631f5900aad3616d725733dc39493",
558 "81655a550703849a616d4a16504bb9c6f999285f",
559 "573d65665d20f00d36d9782ae2b89772140524ab",
560 "619414c1b33ac60cb0c0de61df86245d472259b0",
561 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
562 "2a66dae03890ff791eabb982949435adb19af02b",
563 "24ac219478ba406f30794550690486b14cbac5e8",
564 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
565 "db8c34882ddd46716d14bbf569d530f80db65ed4",
566 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
567 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
568 "a92942269911a88793b3460b6f2a2cd56e48eec1",
569 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
570 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
571 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
572 "585061e403d9cac1603a38af420efe87338f381a",
573 "8f447a3820c83662086dfa836da2205b0130fd5f",
574 "3772003c7fb420003512d0c437b3659d96d89ce4",
575 "dab47c9dc149e570045d699598b14a613bf319b3",
576 "2daca4d26a086ed34894693be0b0374402232809",
577 "e313ae8f7261b88999757ed0c6f26df85b4f01a5",
578 "47d0bab8664ae0aaa927495d07bb3537cce35f16",
579 "295ec16530126046790fb734e99f86f5b3b74ed8",
580 "d98b0561010606b55a1b9b85fbc93640f681d256",
581 "1c1499051860b7caa25173b328ca9c862f01dd1a",
582 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
583 "2230f36f12d4becb242e2962fa1b3694db2496ca",
584 "d81e41a765d7a2d68073f5fde3f74f09df84001d",
585 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
586 "5950f7d00cd8692872377df0e869a7d5ea5e4420",
587 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
588 "7de23c68ca224818fdf127c5e96729dcd0de2b8b",
589 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
590 "1a0fd0df17fa4c455a4a91cad30b5242f77fd233",
591 "af45bf81d119be5cf6845ad41191ba52637e65e9",
592 NULL
595 static const char *sha1_graphics_r4g4b4[] =
597 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
598 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
599 "8bd18697d1ef27492805667a0bc956343ac08667",
600 "e8501c830321584474654f90e40eaf27dc21e6a8",
601 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
602 "821177710961d2cb5f7e7dfc0e06e767b6042753",
603 "667124365ffadeea1d8791bedda77a0c7b898de8",
604 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
605 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
606 "fb52b0c373a5f2a60b981604b120962942d2447a",
607 "5ab8dd07436681d762fa04ad7c6d71291c488924",
608 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
609 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
610 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
611 "25fcb75aa687aac35b8f72640889fe92413e00c5",
612 "3bddf9d53e89560b083302b146cd33791b13d941",
613 "a81504498c7a7bb46340ce74476a42f70f2730b1",
614 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
615 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
616 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
617 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
618 "57ebf8becac1524543da120e88e9cc57ecfdec49",
619 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
620 "d591232bbc2592462c819a9486750f64180518fd",
621 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
622 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
623 "8933450132bf949ba4bc28626968425b5ed2867d",
624 "9928a8f28a66c00069a124f7171b248817005763",
625 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
626 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
627 "233e588cf660e2c9b552cf02065cf63fa6655864",
628 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
629 "a3345acaf272f2e288626906e3056cd0ced70499",
630 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
631 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
632 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
633 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
634 "9dd123938b0a02601d8d458ecbd6535ddefea724",
635 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
636 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
637 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
638 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
639 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
640 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
641 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
642 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
643 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
644 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
645 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
646 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
647 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
648 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
649 "7d80b8289da8a65931f03c74a9ef0aff5f8eb551",
650 "a7a986097e5b553c71bd93fd0ec6037e6bd0f2d1",
651 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
652 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
653 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
654 "9f72be4467219a345b1164205d1fbfda2d64271e",
655 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
656 "a79e4cc419b9e1735e275e2823da52875536943a",
657 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
658 "3830cd728c1e72837310940bcdac4e294d6c9843",
659 "f571c7c4aac92491017963032194690c0fa06b42",
660 "6fd751b7328c02954bce98bed94b3ce3c73db118",
661 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
662 "8585783d0373e9696b508776b6e6b18a80b09888",
663 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
664 NULL
667 static const char *sha1_graphics_8_color[] =
669 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
670 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
671 "49024d6cbdf1614327dfda9eda17675e76805f7e",
672 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
673 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
674 "84d85009d35ae10abbc435f3913422544105cea2",
675 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
676 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
677 "f3aa8d89430748178952de56643069d80b40aad6",
678 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
679 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
680 "52b1363e821bf604d9df260bfa97e26d428c33fd",
681 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
682 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
683 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
684 "89711289be6d5c55734878410e4923d5cca9aca9",
685 "8355caf57d51ad4e14275943088392e37dc75d33",
686 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
687 "6f0570da9dea7f043f678088f8362ee458cd79fa",
688 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
689 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
690 "5092b22af85a08f10a2899888bb9d552f25f828e",
691 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
692 "e91973be2651eeef568700463652838d8cbba976",
693 "1df851515ecf46df5c2d3279535c1763f72353dd",
694 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
695 "359bd76088a965bb0cee7c44800bc46b2638807e",
696 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
697 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
698 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
699 "91f988f575338505ba8a40727865a8d3f2298624",
700 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
701 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
702 "3b7488731da48635d86be551ab7c8c0f91c78219",
703 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
704 "e15a355fc09bfd22267917898e2266168ff410e3",
705 "b9688566bddf18586787c00e68724e51e97dfb72",
706 "5e38e03310f1c66f2052af2a745d8c60515707c5",
707 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
708 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
709 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
710 "6376234f542467e5887adfece62f753e998dc19d",
711 "add949d009217ef2b847e34772ba363e4be7b1b8",
712 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
713 "0b58666deb3615e912896a764e5c6475989e95e4",
714 "bf460cc44c0edee851d72587c8425c3f06a62c55",
715 "ea74c00c45569007383b632d7f1d2adc82645717",
716 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
717 "284abed096637c80bb50844e393da9dd4b3f19ac",
718 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
719 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
720 "46f772c2832b3aad584674db666bd63e48b4f338",
721 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
722 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
723 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
724 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
725 "678979a45126a76eb629992cd64734862f53a555",
726 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
727 "9b1cc7b24f8ce15db2af7f4aa8cde8687784dfa2",
728 "cc4a4cea622d825700bccef7d90a5a447d9ca39d",
729 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
730 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
731 "2c07272462c68cf5944b03e2aa049475b99143c5",
732 "07ca369fb875d37b9cf855045f528af1827edec4",
733 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
734 "153ae5c9fc2a31b38c4878b25d9026b9f51f132d",
735 "488341e88810d737de0b26de4e4d4fa0e78eb482",
736 "bd1e7f40e3971e2ff6c5561286901193a1557527",
737 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
738 "d7ffa3893c6fa937569791cf49986518a4a4d96e",
739 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
740 "8771d5ff7b93b9dd9d077e672b342235dfb28472",
741 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
742 NULL
745 static const char *sha1_graphics_8_grayscale[] =
747 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
748 "df35491dd5038187c05bac06921402ba6d7773a8",
749 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
750 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
751 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
752 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
753 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
754 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
755 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
756 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
757 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
758 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
759 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
760 "114bb377b4e78a1978e1ac09388c48861b5223a3",
761 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
762 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
763 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
764 "216388ddf6b563dd2058a9df65b40b6f72df1715",
765 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
766 "47f72be971bd2d3399dabd018201f4f5075e96fe",
767 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
768 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
769 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
770 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
771 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
772 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
773 "b6785a410048bb85e7ea3f0492459972103c935e",
774 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
775 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
776 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
777 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
778 "0000000000000000000000000000000000000000",
779 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
780 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
781 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
782 "6d41e6168662e75baacf74d911d7419d54c8d73c",
783 "2404952157ba1519094a2da6bfbf2b0f1356432d",
784 "24caede65b40815a60b83c4edfa06bdc542388cd",
785 "650a51bedd1af92469d2950eb95220db35f95c6e",
786 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
787 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
788 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
789 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
790 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
791 "85425940daf119125deb52421b2057acebe6d1cf",
792 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
793 "9869b6f088822fb423996f9968e5a931301fc2c3",
794 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
795 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
796 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
797 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
798 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
799 "f543efc84e638afbaa456e629100f0274de1a35b",
800 "1bd2587399006eed0d46beff397d32081f6bc58e",
801 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
802 "640a49455acabca6954a7fbb6af4e872af342d11",
803 "589e7911e09332ee090371deae17b0120ff990b5",
804 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
805 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
806 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
807 "3685c9ae95118a83db3569832c29753276fa1264",
808 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
809 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
810 "a4b04ed35484de0de61832a8a28bbc7def645622",
811 "515897610714251dd3b54f54fe76a9ed3fd12c53",
812 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
813 "17ae603c199a5d6695d198a7f36e6d7263990951",
814 "1918a33f59d3500204ffc573318a39e9ff754221",
815 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
816 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
817 "a6a29836291f9dbca85e25cee60f62ef5faca6d7",
818 "3494a23633405e46af96cb57715617fef1ac252e",
819 "5a3ae1da30d83cc157e6a4a5617c85598309f4ac",
820 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
821 "87eab8f81fb2a036080e099760f628037f9306e7",
822 "a3eac75d30f681b3898ee469d368960529634d7d",
823 "cd5caeabdb71241766d24f038cfc5f1e91e11256",
824 "e2b393dc3f5833f7868668ea31369e90348768cd",
825 NULL
828 static const char *sha1_graphics_8[] =
830 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
831 "512246d4886ab889a090b167ba194577cb95272e",
832 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
833 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
834 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
835 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
836 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
837 "390b2bf70daba36310683f46af9cd50b9a061396",
838 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
839 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
840 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
841 "da1cc34a9d9b779fc7849e03e214096026506464",
842 "5ba8f99ca034666effa556748c49a0f5a015125f",
843 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
844 "73e2859ce849f756f954718ce3c90f02e31712b6",
845 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
846 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
847 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
848 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
849 "7262364067e03c7fa498af1d59d228d6c63b460e",
850 "5241241a355a667ef0834049adf4218e8b3f16b8",
851 "db22d666690948eb966f75b796c72c7150a5c4b9",
852 "af21fb2645b568b049549de375584c4aa3055143",
853 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
854 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
855 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
856 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
857 "bdc0a354635b879871077c5b712570e469863c99",
858 "d599bf210423fe3adbb4f1de87d9360de97827d0",
859 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
860 "cc01f17928f7780cefd423ea653b072eea723a1b",
861 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
862 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
863 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
864 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
865 "f4a334e69535de74ee5ed54be93a75120a66e54a",
866 "559fd1d15447745527c61fe43a94c6708bff3e39",
867 "995f77f2f53398399f09d1365cb4dfd105764e5c",
868 "61907a6685bba93077da40cfb28cf2ab74552fd2",
869 "122015e5e17c1c317c6e51c0e207826b606a4077",
870 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
871 "8c609921d4a3ed89a994a75482b27496bf103cf5",
872 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
873 "66493ee117719e172f327a426af601996025f28c",
874 "acead2745fec0b6c817fa601353bdf2d197b64f7",
875 "a6b858b2d125c159529d3f3ec45b31925a79acff",
876 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
877 "d83adc669c0dea0dc4812b93f998514b6f02d805",
878 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
879 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
880 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
881 "7d1bfff706b0713e53209407889f83a0da26a81d",
882 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
883 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
884 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
885 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
886 "d4f3a5ea033adc405c44e1ca137dc908c606dad6",
887 "7103d428ec9a959778120fd6f0dc62dd608ddd63",
888 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
889 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
890 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
891 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
892 "293c41a7ed923a4617560481ae8815cebf83701a",
893 "ec06b56f3abe277be42650ebd49dabeaae9e756d",
894 "750c923785ba2afb9ce597516c072f90f014bf95",
895 "80089132f8a11d86e8038f2f8e12dfba46624ee5",
896 "bde5a62a065c027561226fbec5155e938ba7f6b3",
897 "a6311d74fc058079a327abb536e69353be719925",
898 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
899 "0000000000000000000000000000000000000000",
900 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
901 NULL
904 static const char *sha1_graphics_4[] =
906 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
907 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
908 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
909 "9401799e6116c35e5f0e5bdca07ea25316757a72",
910 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
911 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
912 "2505598845fa026ea7187582461efbf06cb6904f",
913 "3981a19363beca8f28d32a5928ac296fd22a5296",
914 "01404024ebb2c266d17d734059524d874491650f",
915 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
916 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
917 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
918 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
919 "1f26a01730f67d40ea711a50d9d801bac15a642e",
920 "3b53d24178cfacba53103a44dfd5d072b15a6781",
921 "c52cfd57f26037723d37192722fc3a217f280c9e",
922 "e34da6500cf2e424d980714d92737cf6c31a7bda",
923 "d17f4358ae529f920960ed89e535902ee13b0033",
924 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
925 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
926 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
927 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
928 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
929 "39c16648cf6c261be71a33cec41867f28e119b94",
930 "26ad5116562e7b58c76a26eaf521e2e40899e944",
931 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
932 "4f827ca6927f15191588456f985bf29d2a3b3c24",
933 "e7de769c3d12ea9dd223bef4881c578823bec67e",
934 "6fb102d020e5554116feefc8482104f3ae2036d2",
935 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
936 "20c9eb3276c08fdce35755e349bec94b04929812",
937 "628d837163a25c6520f19c0602383176dbad528e",
938 "b5a12cff7100290ad43f5ed17a321b42de048893",
939 "b672afbeeafb44194a821f0def81a8892872937e",
940 "db0124045882b598feea192186cf7eb7a0387866",
941 "602d91471378fe24a2d0248bd8a92b624f099fea",
942 "e772873b87a0f55ea51a3da323f64bf8814c6703",
943 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
944 "1a579cd280422131c35e907a023ee0e80749b5a4",
945 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
946 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
947 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
948 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
949 "3e411b004a5be84451860c6da6a4a1a482b77862",
950 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
951 "7811c536a6527112b438a6413f3927f2c79086a7",
952 "525ef3615040225752a2fe646ab99ee64e360630",
953 "46760975993f9881b7bbe94123173e6a683d3f25",
954 "df5feb905a31c288008cf5e82d73ac818a160d82",
955 "df5feb905a31c288008cf5e82d73ac818a160d82",
956 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
957 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
958 "1a23839d71d2379ed4e709a5ae6c14639fbe3ab8",
959 "09f8416a780d80be61cbda3d8a05aee418d0ea00",
960 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
961 "029552113292cc110fd6b7888e766628950aaeef",
962 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
963 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
964 "287ea7db721e641439888cb9f4bac3a5f16124eb",
965 "dd9eaa5325cdf250e89162ac84207978ebb6458e",
966 "42466aab11852741d937c1ff6f3bb711e58415a6",
967 "0663cf6330591fcf744aba96664e05d90243d07a",
968 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
969 "6fe7d0d17b892032cfd171c3d7c365f030b5be38",
970 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
971 "0000000000000000000000000000000000000000",
972 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
973 NULL
976 static const char *sha1_graphics_4_grayscale[] =
978 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
979 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
980 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
981 "1c201d149c0bd886ff8a427ad513f15a70991174",
982 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
983 "315189097a02024d2eae61d524c4de07a396aee7",
984 "73ac786015dea36ac466a6524dba757d5d238ece",
985 "6e328cc4d53627f034b23706d8bf26afe18512ae",
986 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
987 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
988 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
989 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
990 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
991 "ec3879342b5a44f6de6efe946243ae5ade00980d",
992 "6e328cc4d53627f034b23706d8bf26afe18512ae",
993 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
994 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
995 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
996 "b2bda683edef912957845a33edc055902a801fed",
997 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
998 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
999 "43ee3e187dda14b86aef12371041ae70313b5a65",
1000 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
1001 "d4930552a7845111ffd9db57260be1ab97967c06",
1002 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
1003 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
1004 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
1005 "0000000000000000000000000000000000000000",
1006 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
1007 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
1008 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
1009 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
1010 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
1011 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
1012 "f8224430462f6a93f85ef33b8aa7299525990708",
1013 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
1014 "d58b8760ef01c12e691651c932d683c66fde3654",
1015 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
1016 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
1017 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
1018 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
1019 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
1020 "027b05bc82ce4f897c4bf812610a641547368939",
1021 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
1022 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
1023 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
1024 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
1025 "5eeb56afea8040a8fb18c11f29931b836474126d",
1026 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
1027 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
1028 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
1029 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
1030 "43560b856907f552df3b9dd1f91e1aa8ab9ff17e",
1031 "8cefa6dcb658487d0715598d5d120677dbfdab42",
1032 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
1033 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
1034 "58f400c9bb78e49a879276fb049edfc9c981740a",
1035 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
1036 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
1037 "c96a998be5c1d588ef1243cfd2610d056d16947e",
1038 "68bee638d59a373f33f308751471b3ef41849582",
1039 "be0501175cc3cbb61217fca76356f761117fb40f",
1040 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1041 "3efe128a5bf250f2c460664e8f543f5ec54d5dc2",
1042 "2d5123e757cf00e423a89160d7dc4997c3688829",
1043 "0000000000000000000000000000000000000000",
1044 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
1045 NULL
1048 static const char *sha1_graphics_1[] =
1050 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1051 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
1052 "a7cc69f957d7b533a0a330859a143d701daac73c",
1053 "a955bf088c5edb129289ce65caace48ec95632e4",
1054 "5316d3c558c254479883133cf58cd07ab521d3f0",
1055 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
1056 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
1057 "121423a38b4ac4743bd516e0a7e88a3863796313",
1058 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
1059 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1060 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1061 "39ff81f77ef4ee772367ed1a63785987c060126e",
1062 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1063 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1064 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1065 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1066 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
1067 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
1068 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1069 "0ff4b49797e30e3555aab45219adf449a9a560ff",
1070 "280327328ca940c212ce24fe72e0b00014072767",
1071 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1072 "b85463875f755b85f1464b1b6275912bcbad6c9f",
1073 "816f200969feecc788b61dfeecf05b1790984401",
1074 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1075 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
1076 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1077 "0a76e0121facb103857130bc6e12185ad77fc3fa",
1078 "02aede714773d654d0fc2f640afaa133ec718ad5",
1079 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1080 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
1081 "b26699f62661e16a1dc452d24c88ce363a1f2998",
1082 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1083 "c14832e69ec3585c15987b3d69d5007236fa9814",
1084 "e44ea620b0c47125a34193537ab9d219a52ad028",
1085 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1086 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
1087 "8819bf7a43295161fe045a42936000b3a51fe200",
1088 "e08dbc26469c229f75ccbf1a38a133401f270b84",
1089 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1090 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1091 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1092 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1093 "ffc78c075d4be66806f6c59180772d5eed963dc0",
1094 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1095 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1096 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1097 "b71ca46be287598f716bb04fac0a52ad139c70db",
1098 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1099 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1100 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1101 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1102 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1103 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1104 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
1105 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1106 "655cfadeb157233c804d42b58195569c8846e3c1",
1107 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1108 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1109 "0d180c37bc26d83a1a11f66168757f3de2493243",
1110 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1111 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1112 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1113 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1114 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1115 "a2a928de9007d765da496abec8c21b23601f8c45",
1116 "28ded40e72d4327b9413571476b167fb28a1f420",
1117 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1118 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1119 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1120 "44a28536466dc895feb824b23dfd4a47c6948af8",
1121 "f0316a5765a0404760e94cd05b7dc956cae07d26",
1122 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1123 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1124 "55c26d22f11d80b73383fa57d0fac552d705b092",
1125 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1126 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1127 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1128 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1129 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1130 "1ee4e951743efc8764249fbc7adecefbfec0428e",
1131 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1132 "128eefd2ee043d59dc37918065f687e378e5ca95",
1133 "c642abc651f525332d9d635049646d309e877839",
1134 "8d34215487088b5d4ef63062270ce25c2862643d",
1135 "3dc3075b0c87fdcaabbbae8928303fb2358c15c2",
1136 "bbae6f0659e095a42b420082079663f937065813",
1137 "ca711c69165e1fa5be72993b9a7870ef6d485249",
1138 NULL
1141 static const RECT graphics_bounds[] =
1143 { 0, 0, 0, 0 },
1144 { 10, 3, 219, 101 },
1145 { 100, 100, 301, 301 },
1146 { 0, 0, 201, 201 },
1147 { 10, 10, 110, 320 },
1148 { 10, 99, 300, 200 },
1149 { 99, 12, 201, 200 },
1150 { 90, 110, 300, 200 },
1151 { 90, 90, 210, 200 },
1152 { 10, 99, 300, 200 },
1153 { 10, 99, 300, 200 },
1154 { 99, 12, 201, 200 },
1155 { 99, 11, 201, 200 },
1156 { 90, 110, 300, 200 },
1157 { 90, 110, 300, 200 },
1158 { 10, 10, 365, 405 },
1159 { 10, 10, 365, 405 },
1160 { 10, 10, 365, 405 },
1161 { 10, 10, 365, 405 },
1162 { 10, 10, 365, 405 },
1163 { 10, 10, 365, 405 },
1164 { 10, 10, 365, 405 },
1165 { 10, 10, 365, 405 },
1166 { 10, 10, 350, 251 },
1167 { 10, 10, 300, 200 },
1168 { 300, 10, 9, 260 },
1169 { 10, 10, 435, 405 },
1170 { 10, 10, 120, 120 },
1171 { 10, 10, 110, 110 },
1172 { 10, 10, 120, 110 },
1173 { 10, 10, 110, 120 },
1174 { 10, 10, 120, 120 },
1175 { 10, 10, 110, 110 },
1176 { 10, 10, 120, 110 },
1177 { 10, 10, 110, 120 },
1178 { 100, 100, 356, 356 },
1179 { 100, 100, 356, 356 },
1180 { 50, 50, 306, 306 },
1181 { 100, 100, 356, 356 },
1182 { 100, 100, 356, 356 },
1183 { 100, 100, 356, 356 },
1184 { 100, 100, 356, 356 },
1185 { 100, 100, 356, 356 },
1186 { 100, 100, 356, 356 },
1187 { 100, 100, 356, 356 },
1188 { 100, 100, 356, 356 },
1189 { 100, 100, 356, 356 },
1190 { 100, 100, 356, 356 },
1191 { 100, 100, 356, 356 },
1192 { 10, 10, 416, 26 },
1193 { 10, 8, 60, 104 },
1194 { 0, 10, 511, 306 },
1195 { 0, 10, 512, 306 },
1196 { 1, 1, 300, 512 },
1197 { 0, 0, 500, 512 },
1198 { 5, 5, 206, 206 },
1199 { 45, 45, 256, 256 },
1200 { 86, 86, 215, 215 },
1201 { 45, 45, 256, 256 },
1202 { 8, 0, 392, 231 },
1203 { 8, 0, 392, 231 },
1204 { 0, 0, 60, 20 },
1205 { 0, 0, 512, 512 },
1206 { -1, -1, -1, -1 } /* the end */
1209 static const char **current_sha1;
1210 static const RECT *current_bounds;
1211 static const char *dst_format;
1213 static inline DWORD get_stride(BITMAPINFO *bmi)
1215 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1218 static inline DWORD get_dib_size(BITMAPINFO *bmi)
1220 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1223 static char *hash_dib(BITMAPINFO *bmi, void *bits)
1225 DWORD dib_size = get_dib_size(bmi);
1226 HCRYPTHASH hash;
1227 char *buf;
1228 BYTE hash_buf[20];
1229 DWORD hash_size = sizeof(hash_buf);
1230 int i;
1231 static const char *hex = "0123456789abcdef";
1233 if(!crypt_prov) return NULL;
1235 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1237 CryptHashData(hash, bits, dib_size, 0);
1239 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1240 if(hash_size != sizeof(hash_buf)) return NULL;
1242 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1243 CryptDestroyHash(hash);
1245 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1247 for(i = 0; i < hash_size; i++)
1249 buf[i * 2] = hex[hash_buf[i] >> 4];
1250 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1252 buf[i * 2] = '\0';
1254 return buf;
1257 static void reset_bounds( HDC hdc )
1259 current_bounds = graphics_bounds;
1260 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
1263 static void compare_bounds( HDC hdc, const char *info )
1265 RECT rect;
1267 GetBoundsRect( hdc, &rect, DCB_RESET );
1269 if (current_bounds->left == -1 &&
1270 current_bounds->top == -1 &&
1271 current_bounds->right == -1 &&
1272 current_bounds->bottom == -1)
1274 ok( 0, "missing bounds, got { %d, %d, %d, %d },\n", rect.left, rect.top, rect.right, rect.bottom );
1275 return;
1278 ok( !memcmp( current_bounds, &rect, sizeof(RECT) ),
1279 "%s: %s: expected bounds %d,%d,%d,%d got %d,%d,%d,%d\n", dst_format, info,
1280 current_bounds->left, current_bounds->top, current_bounds->right, current_bounds->bottom,
1281 rect.left, rect.top, rect.right, rect.bottom );
1282 current_bounds++;
1285 static void skip_compare( int count )
1287 current_sha1 += count;
1288 current_bounds++;
1291 static void compare_hash_broken_todo(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1293 char *hash = hash_dib(bmi, bits);
1294 BOOL ok_cond;
1295 int i;
1297 /* reset the bits for the next test */
1298 memset( bits, 0xcc, get_dib_size(bmi) );
1300 if(!hash)
1302 skip("SHA1 hashing unavailable on this platform\n");
1303 return;
1306 for(i = 0; i <= num_broken; i++)
1308 if(current_sha1[i] == NULL)
1310 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1311 return;
1315 ok_cond = !strcmp(hash, *current_sha1);
1317 for(i = 1; i <= num_broken; i++)
1318 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1320 if(todo)
1321 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1322 dst_format, info, *current_sha1, hash );
1323 else
1324 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1325 dst_format, info, *current_sha1, hash );
1327 current_sha1 += num_broken + 1;
1329 HeapFree(GetProcessHeap(), 0, hash);
1331 compare_bounds( hdc, info );
1334 static void compare_hash(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char *info)
1336 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1339 static const RECT bias_check[] =
1341 {100, 100, 200, 150},
1342 {100, 100, 150, 200},
1343 {100, 100, 50, 200},
1344 {100, 100, 0, 150},
1345 {100, 100, 0, 50},
1346 {100, 100, 50, 0},
1347 {100, 100, 150, 0},
1348 {100, 100, 200, 50}
1351 static const RECT hline_clips[] =
1353 {120, 120, 140, 120}, /* unclipped */
1354 {100, 122, 140, 122}, /* l edgecase */
1355 { 99, 124, 140, 124}, /* l edgecase clipped */
1356 {120, 126, 200, 126}, /* r edgecase */
1357 {120, 128, 201, 128}, /* r edgecase clipped */
1358 { 99, 130, 201, 130}, /* l and r clipped */
1359 {120, 100, 140, 100}, /* t edgecase */
1360 {120, 99, 140, 99}, /* t edgecase clipped */
1361 {120, 199, 140, 199}, /* b edgecase */
1362 {120, 200, 140, 200}, /* b edgecase clipped */
1363 {120, 132, 310, 132}, /* inside two clip rects */
1364 { 10, 134, 101, 134}, /* r end on l edgecase */
1365 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1366 {199, 138, 220, 138}, /* l end on r edgecase */
1367 {200, 140, 220, 140} /* l end on r edgecase clipped */
1370 static const RECT vline_clips[] =
1372 {120, 120, 120, 140}, /* unclipped */
1373 {100, 120, 100, 140}, /* l edgecase */
1374 { 99, 120, 99, 140}, /* l edgecase clipped */
1375 {199, 120, 199, 140}, /* r edgecase */
1376 {200, 120, 200, 140}, /* r edgecase clipped */
1377 {122, 99, 122, 201}, /* t and b clipped */
1378 {124, 100, 124, 140}, /* t edgecase */
1379 {126, 99, 126, 140}, /* t edgecase clipped */
1380 {128, 120, 128, 200}, /* b edgecase */
1381 {130, 120, 130, 201}, /* b edgecase clipped */
1382 {132, 12, 132, 140}, /* inside two clip rects */
1383 {134, 90, 134, 101}, /* b end on t edgecase */
1384 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1385 {138, 199, 138, 220}, /* t end on b edgecase */
1386 {140, 200, 140, 220} /* t end on b edgecase clipped */
1389 static const RECT line_clips[] =
1391 { 90, 110, 310, 120},
1392 { 90, 120, 295, 130},
1393 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1394 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1395 { 90, 132, 101, 137}, /* end pt just inside l edge */
1396 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1397 {199, 142, 210, 143} /* start pt just inside r edge */
1400 static const RECT wide_lines[] =
1402 {100, 10, 200, 10},
1403 {100, 21, 200, 21},
1404 {200, 40, 100, 40},
1405 {200, 61, 100, 61},
1406 { 10, 100, 10, 200},
1407 { 21, 100, 21, 200},
1408 { 40, 200, 40, 100},
1409 { 61, 200, 61, 100},
1412 static const POINT poly_lines[] =
1414 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1417 static const POINT polypoly_lines[] =
1419 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1422 static const DWORD polypoly_counts[] =
1424 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1427 static const RECT patblt_clips[] =
1429 {120, 120, 140, 126}, /* unclipped */
1430 {100, 130, 140, 136}, /* l edgecase */
1431 { 99, 140, 140, 146}, /* l edgecase clipped */
1432 {180, 130, 200, 136}, /* r edgecase */
1433 {180, 140, 201, 146}, /* r edgecase clipped */
1434 {120, 100, 130, 110}, /* t edgecase */
1435 {140, 99, 150, 110}, /* t edgecase clipped */
1436 {120, 180, 130, 200}, /* b edgecase */
1437 {140, 180, 150, 201}, /* b edgecase */
1438 {199, 150, 210, 156}, /* l edge on r edgecase */
1439 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1440 { 90, 150, 101, 156}, /* r edge on l edgecase */
1441 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1442 {160, 90, 166, 101}, /* b edge on t edgecase */
1443 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1444 {160, 199, 166, 210}, /* t edge on b edgecase */
1445 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1448 static const RECT rectangles[] =
1450 {10, 11, 100, 101},
1451 {250, 100, 350, 10},
1452 {120, 10, 120, 20}, /* zero width */
1453 {120, 10, 130, 10}, /* zero height */
1454 {120, 40, 121, 41}, /* 1 x 1 */
1455 {130, 50, 132, 52}, /* 2 x 2 */
1456 {140, 60, 143, 63}, /* 3 x 3 */
1457 {150, 70, 154, 74}, /* 4 x 4 */
1458 {120, 20, 121, 30}, /* width == 1 */
1459 {130, 20, 132, 30}, /* width == 2 */
1460 {140, 20, 143, 30}, /* width == 3 */
1461 {200, 20, 210, 21}, /* height == 1 */
1462 {200, 30, 210, 32}, /* height == 2 */
1463 {200, 40, 210, 43} /* height == 3 */
1466 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1467 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1468 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1469 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1470 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1471 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1473 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1474 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1475 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1476 0x00, 0x01 }; /* <eod> */
1478 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1479 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1480 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1481 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1483 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1484 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1486 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1488 HBRUSH brush = CreateSolidBrush( color );
1489 brush = SelectObject( hdc, brush );
1490 PatBlt( hdc, x, y, width, height, PATCOPY );
1491 DeleteObject( SelectObject( hdc, brush ) );
1494 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits)
1496 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1497 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1498 PALETTEENTRY *entries = pal->palPalEntry;
1499 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1500 LOGBRUSH log_brush;
1501 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1502 HBITMAP bmp;
1503 INT i, j, x, y, hatch_style;
1504 HDC src_dc;
1505 HRGN hrgn, hrgn2;
1506 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1507 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1508 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1509 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1510 RGBQUAD *brush_colors = brush_bi->bmiColors;
1511 BYTE *brush_bits, *src_bits;
1512 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1513 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1514 BLENDFUNCTION blend;
1515 COLORREF old_text, old_bkgnd;
1516 HPALETTE hpal;
1518 blend.BlendOp = AC_SRC_OVER;
1519 blend.BlendFlags = 0;
1521 reset_bounds( hdc );
1523 memset(bits, 0xcc, get_dib_size(bmi));
1524 compare_hash(hdc, bmi, bits, "empty");
1526 src_dc = CreateCompatibleDC( 0 );
1527 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1528 orig_pen = SelectObject(hdc, solid_pen);
1529 SetBrushOrgEx(hdc, 0, 0, NULL);
1531 /* horizontal and vertical lines */
1532 for(i = 1; i <= 16; i++)
1534 SetROP2(hdc, i);
1535 MoveToEx(hdc, 10, i * 3, NULL);
1536 LineTo(hdc, 100, i * 3); /* l -> r */
1537 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1538 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1539 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1540 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1541 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1542 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1544 compare_hash(hdc, bmi, bits, "h and v solid lines");
1546 /* diagonal lines */
1547 SetROP2(hdc, R2_COPYPEN);
1548 for(i = 0; i < 16; i++)
1550 double s = sin(M_PI * i / 8.0);
1551 double c = cos(M_PI * i / 8.0);
1553 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1554 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1556 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1558 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1560 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1561 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1563 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1565 /* solid brush PatBlt */
1566 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1567 orig_brush = SelectObject(hdc, solid_brush);
1569 for(i = 0, y = 10; i < 256; i++)
1571 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1573 if(rop_uses_src(rop3[i]))
1574 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1575 else
1577 ok(ret, "got FALSE for %x\n", rop3[i]);
1578 y += 20;
1582 compare_hash(hdc, bmi, bits, "solid patblt");
1584 /* clipped lines */
1585 hrgn = CreateRectRgn(10, 10, 200, 20);
1586 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1587 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1588 SetRectRgn(hrgn2, 290, 100, 300, 200);
1589 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1590 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1591 DeleteObject(hrgn2);
1593 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1595 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1596 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1598 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1600 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1602 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1603 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1605 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1607 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1609 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1610 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1612 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1614 /* clipped PatBlt */
1615 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1617 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1618 patblt_clips[i].right - patblt_clips[i].left,
1619 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1621 compare_hash(hdc, bmi, bits, "clipped patblt");
1623 /* clipped dashed lines */
1624 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1625 SelectObject(hdc, dashed_pen);
1626 SetBkMode(hdc, TRANSPARENT);
1627 SetBkColor(hdc, RGB(0, 0xff, 0));
1629 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1631 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1632 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1634 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1636 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1638 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1639 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1641 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1643 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1645 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1646 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1648 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1650 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1652 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1653 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1655 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1657 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1659 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1660 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1662 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1664 SetBkMode(hdc, OPAQUE);
1666 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1668 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1669 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1671 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1673 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1675 /* 8888 DIB pattern brush */
1677 brush_bi->bmiHeader = dib_brush_header_8888;
1678 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1679 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1680 brush_bits[2] = 0xff;
1681 brush_bits[6] = 0xff;
1682 brush_bits[14] = 0xff;
1683 brush_bits[65] = 0xff;
1684 brush_bits[69] = 0xff;
1685 brush_bits[72] = 0xff;
1687 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1689 SelectObject(hdc, dib_brush);
1690 SetBrushOrgEx(hdc, 1, 1, NULL);
1692 for(i = 0, y = 10; i < 256; i++)
1694 if(!rop_uses_src(rop3[i]))
1696 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1697 ok(ret, "got FALSE for %x\n", rop3[i]);
1698 y += 25;
1701 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1702 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1703 else
1704 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1706 SelectObject(hdc, orig_brush);
1707 DeleteObject(dib_brush);
1709 /* 8888 bottom-up DIB pattern brush */
1711 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1713 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1715 SelectObject(hdc, dib_brush);
1717 /* This used to set the x origin to 100 as well, but
1718 there's a Windows bug for 24 bpp where the brush's x offset
1719 is incorrectly calculated for rops that involve both D and P */
1720 SetBrushOrgEx(hdc, 4, 100, NULL);
1722 for(i = 0, y = 10; i < 256; i++)
1724 if(!rop_uses_src(rop3[i]))
1726 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1727 ok(ret, "got FALSE for %x\n", rop3[i]);
1728 y += 25;
1731 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1732 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1733 else
1734 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1736 SelectObject(hdc, orig_brush);
1737 DeleteObject(dib_brush);
1739 /* 24 bpp dib pattern brush */
1741 brush_bi->bmiHeader = dib_brush_header_24;
1742 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1743 memset(brush_bits, 0, 16 * 16 * 3);
1744 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1745 brush_bits[49] = brush_bits[52] = 0xff;
1747 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1749 SelectObject(hdc, dib_brush);
1750 SetBrushOrgEx(hdc, 1, 1, NULL);
1752 for(i = 0, y = 10; i < 256; i++)
1754 if(!rop_uses_src(rop3[i]))
1756 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1757 ok(ret, "got FALSE for %x\n", rop3[i]);
1758 y += 25;
1761 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1762 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1763 else
1764 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1766 SelectObject(hdc, orig_brush);
1767 DeleteObject(dib_brush);
1769 /* 555 dib pattern brush */
1771 brush_bi->bmiHeader = dib_brush_header_555;
1772 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1773 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1774 brush_bits[0] = brush_bits[1] = 0xff;
1775 brush_bits[32] = brush_bits[34] = 0x7c;
1777 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1779 SelectObject(hdc, dib_brush);
1780 SetBrushOrgEx(hdc, 1, 1, NULL);
1782 for(i = 0, y = 10; i < 256; i++)
1784 if(!rop_uses_src(rop3[i]))
1786 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1787 ok(ret, "got FALSE for %x\n", rop3[i]);
1788 y += 25;
1791 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1792 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1793 else
1794 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1796 SelectObject(hdc, orig_brush);
1797 DeleteObject(dib_brush);
1799 SetBrushOrgEx(hdc, 0, 0, NULL);
1801 /* 8 bpp dib pattern brush */
1803 brush_bi->bmiHeader = dib_brush_header_8;
1804 brush_bi->bmiHeader.biClrUsed = 3;
1805 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1806 brush_colors[0].rgbRed = 0xff;
1807 brush_colors[1].rgbRed = 0xff;
1808 brush_colors[1].rgbGreen = 0xff;
1809 brush_colors[1].rgbBlue = 0xff;
1811 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1812 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1813 brush_bits[0] = brush_bits[1] = 1;
1814 brush_bits[16] = brush_bits[17] = 2;
1815 brush_bits[32] = brush_bits[33] = 6;
1817 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1819 SelectObject(hdc, dib_brush);
1820 SetBrushOrgEx(hdc, 1, 1, NULL);
1822 for(i = 0, y = 10; i < 256; i++)
1824 if(!rop_uses_src(rop3[i]))
1826 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1827 ok(ret, "got FALSE for %x\n", rop3[i]);
1828 y += 25;
1831 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1833 SelectObject(hdc, orig_brush);
1834 DeleteObject(dib_brush);
1836 /* 4 bpp dib pattern brush */
1838 brush_bi->bmiHeader = dib_brush_header_4;
1839 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1841 SelectObject(hdc, dib_brush);
1842 SetBrushOrgEx(hdc, 1, 1, NULL);
1844 for(i = 0, y = 10; i < 256; i++)
1846 if(!rop_uses_src(rop3[i]))
1848 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1849 ok(ret, "got FALSE for %x\n", rop3[i]);
1850 y += 25;
1853 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1855 SelectObject(hdc, orig_brush);
1856 DeleteObject(dib_brush);
1858 /* 1 bpp dib pattern brush */
1860 brush_bi->bmiHeader = dib_brush_header_1;
1861 brush_bi->bmiHeader.biClrUsed = 2;
1862 memset(brush_bits, 0, 16 * 4);
1863 brush_bits[0] = 0xf0;
1864 brush_bits[4] = 0xf0;
1865 brush_bits[8] = 0xf0;
1867 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1868 SelectObject(hdc, dib_brush);
1869 for(i = 0, y = 10; i < 256; i++)
1871 if(!rop_uses_src(rop3[i]))
1873 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1874 ok(ret, "got FALSE for %x\n", rop3[i]);
1875 y += 25;
1879 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1881 SelectObject(hdc, orig_brush);
1882 DeleteObject(dib_brush);
1884 /* 1 bpp ddb pattern brush */
1886 old_text = GetTextColor( hdc );
1887 old_bkgnd = GetBkColor( hdc );
1888 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1889 dib_brush = CreatePatternBrush( bmp );
1890 SelectObject(hdc, dib_brush);
1891 for(i = 0, y = 10; i < 256; i++)
1893 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1894 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1895 if(!rop_uses_src(rop3[i]))
1897 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1898 ok(ret, "got FALSE for %x\n", rop3[i]);
1899 y += 25;
1903 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1905 DeleteObject(bmp);
1906 SelectObject(hdc, orig_brush);
1907 SetBrushOrgEx(hdc, 0, 0, NULL);
1908 SetTextColor(hdc, old_text);
1909 SetBkColor(hdc, old_bkgnd);
1911 /* Rectangle */
1913 SelectObject(hdc, solid_pen);
1914 SelectObject(hdc, solid_brush);
1916 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1918 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1921 SelectObject(hdc, dashed_pen);
1922 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1924 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1927 compare_hash(hdc, bmi, bits, "rectangles");
1928 SelectObject(hdc, solid_pen);
1930 /* PaintRgn */
1932 PaintRgn(hdc, hrgn);
1933 compare_hash(hdc, bmi, bits, "PaintRgn");
1935 /* RTL rectangles */
1937 if( !pSetLayout )
1939 win_skip("Don't have SetLayout\n");
1940 skip_compare(1);
1942 else
1944 pSetLayout(hdc, LAYOUT_RTL);
1945 PaintRgn(hdc, hrgn);
1946 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1947 Rectangle(hdc, 100, 250, 110, 260);
1948 compare_hash(hdc, bmi, bits, "rtl");
1950 pSetLayout(hdc, LAYOUT_LTR);
1952 DeleteObject( hrgn );
1954 for(i = 0, y = 10; i < 256; i++)
1956 if(!rop_uses_src(rop3[i]))
1958 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1960 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1961 SelectObject(hdc, hatch_brush);
1962 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1963 ok(ret, "got FALSE for %x\n", rop3[i]);
1964 SelectObject(hdc, orig_brush);
1965 DeleteObject(hatch_brush);
1967 y += 25;
1971 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
1973 /* overlapping blits */
1975 orig_brush = SelectObject(hdc, solid_brush);
1977 Rectangle(hdc, 10, 10, 100, 100);
1978 Rectangle(hdc, 20, 15, 30, 40);
1979 Rectangle(hdc, 15, 15, 20, 20);
1980 Rectangle(hdc, 15, 20, 50, 45);
1981 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1982 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
1984 Rectangle(hdc, 10, 10, 100, 100);
1985 Rectangle(hdc, 20, 15, 30, 40);
1986 Rectangle(hdc, 15, 15, 20, 20);
1987 Rectangle(hdc, 15, 20, 50, 45);
1988 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1989 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1990 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1991 else
1992 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
1994 Rectangle(hdc, 10, 10, 100, 100);
1995 Rectangle(hdc, 20, 15, 30, 40);
1996 Rectangle(hdc, 15, 15, 20, 20);
1997 Rectangle(hdc, 15, 20, 50, 45);
1998 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1999 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2001 Rectangle(hdc, 10, 10, 100, 100);
2002 Rectangle(hdc, 20, 15, 30, 40);
2003 Rectangle(hdc, 15, 15, 20, 20);
2004 Rectangle(hdc, 15, 20, 50, 45);
2005 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2006 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2007 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2008 else
2009 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2011 Rectangle(hdc, 10, 10, 100, 100);
2012 Rectangle(hdc, 20, 15, 30, 40);
2013 Rectangle(hdc, 15, 15, 20, 20);
2014 Rectangle(hdc, 15, 20, 50, 45);
2015 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2016 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2018 Rectangle(hdc, 10, 10, 100, 100);
2019 Rectangle(hdc, 20, 15, 30, 40);
2020 Rectangle(hdc, 15, 15, 20, 20);
2021 Rectangle(hdc, 15, 20, 50, 45);
2022 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2023 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2025 Rectangle(hdc, 10, 10, 100, 100);
2026 Rectangle(hdc, 20, 15, 30, 40);
2027 Rectangle(hdc, 15, 15, 20, 20);
2028 Rectangle(hdc, 15, 20, 50, 45);
2029 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2030 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2031 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2032 else
2033 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2035 Rectangle(hdc, 10, 10, 100, 100);
2036 Rectangle(hdc, 20, 15, 30, 40);
2037 Rectangle(hdc, 15, 15, 20, 20);
2038 Rectangle(hdc, 15, 20, 50, 45);
2039 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2040 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2042 /* blitting with 32-bpp BI_RGB source */
2044 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2045 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2046 src_bi->bmiHeader.biHeight = 256;
2047 src_bi->bmiHeader.biWidth = 256;
2048 src_bi->bmiHeader.biBitCount = 32;
2049 src_bi->bmiHeader.biPlanes = 1;
2050 src_bi->bmiHeader.biCompression = BI_RGB;
2051 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2052 SelectObject( src_dc, bmp );
2053 for (y = 0; y < 256; y++)
2054 for (x = 0; x < 256; x++)
2056 BYTE a = (x + y) * 2;
2057 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2058 BYTE g = (BYTE)(x + y / 3) * a / 255;
2059 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2060 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2063 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2064 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2065 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2066 else
2067 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2069 blend.SourceConstantAlpha = 0xd0;
2070 blend.AlphaFormat = 0;
2071 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2072 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2074 if (!pGdiAlphaBlend) skip_compare(2);
2075 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2077 else
2079 if (!pGdiAlphaBlend) skip_compare(1);
2080 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2083 blend.SourceConstantAlpha = 0xb0;
2084 blend.AlphaFormat = AC_SRC_ALPHA;
2085 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2086 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2088 if (!pGdiAlphaBlend) skip_compare(2);
2089 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2091 else
2093 if (!pGdiAlphaBlend) skip_compare(1);
2094 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2097 /* blitting with 32-bpp r10g10b10 source */
2099 src_bi->bmiHeader.biBitCount = 32;
2100 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2101 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2102 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2103 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2104 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2105 SelectObject( src_dc, bmp );
2106 for (y = 0; y < 256; y++)
2107 for (x = 0; x < 256; x++)
2109 WORD r = (7 * x + 3 * y) % 1024;
2110 WORD g = (11 * x + y / 3) % 1024;
2111 WORD b = (x / 3 + 9 * y) % 1024;
2112 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2115 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2116 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2117 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2118 else
2119 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2121 /* blitting with 32-bpp b6g6r6 source */
2123 src_bi->bmiHeader.biBitCount = 32;
2124 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2125 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2126 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2127 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2128 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2129 SelectObject( src_dc, bmp );
2130 for (y = 0; y < 256; y++)
2131 for (x = 0; x < 256; x++)
2133 BYTE r = (y + 2 * x) % 64;
2134 BYTE g = (x + y / 3) % 64;
2135 BYTE b = (x / 3 + 2 * y) % 64;
2136 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2139 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2140 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2141 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2142 else
2143 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2145 /* blitting with 24-bpp source */
2147 src_bi->bmiHeader.biBitCount = 24;
2148 src_bi->bmiHeader.biCompression = BI_RGB;
2149 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2150 DeleteObject( SelectObject( src_dc, bmp ) );
2151 for (y = 0; y < 256; y++)
2152 for (x = 0; x < 256; x++)
2154 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2155 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2156 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2159 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2160 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2161 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2162 else
2163 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2165 blend.SourceConstantAlpha = 0xe0;
2166 blend.AlphaFormat = 0;
2167 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2168 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2170 if (!pGdiAlphaBlend) skip_compare(2);
2171 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2173 else
2175 if (!pGdiAlphaBlend) skip_compare(1);
2176 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2179 /* blitting with 16-bpp BI_RGB source */
2181 src_bi->bmiHeader.biBitCount = 16;
2182 src_bi->bmiHeader.biCompression = BI_RGB;
2183 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2184 DeleteObject( SelectObject( src_dc, bmp ) );
2185 for (y = 0; y < 256; y++)
2186 for (x = 0; x < 256; x++)
2187 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2189 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2190 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2191 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2192 else
2193 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2195 /* blitting with 16-bpp b4g4r4 source */
2197 src_bi->bmiHeader.biBitCount = 16;
2198 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2199 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2200 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2201 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2202 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2203 DeleteObject( SelectObject( src_dc, bmp ) );
2204 for (y = 0; y < 256; y++)
2205 for (x = 0; x < 256; x++)
2206 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2208 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2209 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2210 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2211 else
2212 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2214 /* blitting with 8-bpp source */
2216 src_bi->bmiHeader.biBitCount = 8;
2217 src_bi->bmiHeader.biCompression = BI_RGB;
2218 src_bi->bmiHeader.biClrUsed = 160;
2219 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2220 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2221 DeleteObject( SelectObject( src_dc, bmp ) );
2222 for (y = 0; y < 256; y++)
2223 for (x = 0; x < 256; x++)
2224 src_bits[y * 256 + x] = 3 * x + 5 * y;
2226 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2227 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2229 blend.SourceConstantAlpha = 0xd0;
2230 blend.AlphaFormat = 0;
2231 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2232 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2234 if (!pGdiAlphaBlend) skip_compare(2);
2235 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2237 else
2239 if (!pGdiAlphaBlend) skip_compare(1);
2240 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2243 /* blitting with 4-bpp source */
2245 src_bi->bmiHeader.biBitCount = 4;
2246 src_bi->bmiHeader.biClrUsed = 12;
2247 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2248 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2249 DeleteObject( SelectObject( src_dc, bmp ) );
2250 for (y = 0; y < 256; y++)
2251 for (x = 0; x < 256; x += 2)
2252 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2254 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2255 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2257 /* blitting with 1-bpp source */
2259 src_bi->bmiHeader.biBitCount = 1;
2260 src_bi->bmiHeader.biClrUsed = 0;
2261 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2262 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2263 DeleteObject( SelectObject( src_dc, bmp ) );
2264 for (y = 0; y < 256; y++)
2265 for (x = 0; x < 256; x += 8)
2266 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2268 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2269 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2271 blend.SourceConstantAlpha = 0x90;
2272 blend.AlphaFormat = 0;
2273 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2274 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2276 if (!pGdiAlphaBlend) skip_compare(2);
2277 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2279 else
2281 if (!pGdiAlphaBlend) skip_compare(1);
2282 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2285 DeleteDC( src_dc );
2286 DeleteObject( bmp );
2288 /* RLE StretchDIBits */
2289 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2290 src_bi->bmiHeader.biWidth = 8;
2291 src_bi->bmiHeader.biHeight = 8;
2292 src_bi->bmiHeader.biPlanes = 1;
2293 src_bi->bmiHeader.biBitCount = 8;
2294 src_bi->bmiHeader.biCompression = BI_RLE8;
2295 src_bi->bmiHeader.biClrUsed = 0;
2296 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2298 for (i = 0; i < 256; i++)
2300 src_bi->bmiColors[i].rgbRed = i;
2301 src_bi->bmiColors[i].rgbGreen = i;
2302 src_bi->bmiColors[i].rgbBlue = i;
2303 src_bi->bmiColors[i].rgbReserved = 0;
2306 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2307 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2308 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2309 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2310 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2311 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2313 /* 32 bpp StretchDIBits */
2315 src_bi->bmiHeader.biWidth = 4;
2316 src_bi->bmiHeader.biHeight = 4;
2317 src_bi->bmiHeader.biPlanes = 1;
2318 src_bi->bmiHeader.biBitCount = 32;
2319 src_bi->bmiHeader.biCompression = BI_RGB;
2320 src_bi->bmiHeader.biClrUsed = 0;
2321 src_bi->bmiHeader.biSizeImage = 0;
2323 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2324 ok(ret == 4, "got %d\n", ret);
2325 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2326 ok(ret == 4, "got %d\n", ret);
2327 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2328 ok(ret == 4, "got %d\n", ret);
2329 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2330 ok(ret == 4, "got %d\n", ret);
2331 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2332 ok(ret == 4, "got %d\n", ret);
2333 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2334 ok(ret == 4, "got %d\n", ret);
2336 src_bi->bmiHeader.biHeight = -4;
2338 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2339 ok(ret == 4, "got %d\n", ret);
2340 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2341 ok(ret == -4, "got %d\n", ret);
2342 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2343 ok(ret == 4, "got %d\n", ret);
2344 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2345 ok(ret == -4, "got %d\n", ret);
2346 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2347 ok(ret == 4, "got %d\n", ret);
2348 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2349 ok(ret == -4, "got %d\n", ret);
2351 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2353 /* Solid colors */
2354 for (i = 0; i < 256; i++)
2356 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2357 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2358 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2359 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2360 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2363 /* A few extra colors that are interesting in the 1bpp case */
2365 /* bk color */
2366 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2367 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2369 /* color 0 */
2370 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2371 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2373 /* color 1 */
2374 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2375 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2377 compare_hash(hdc, bmi, bits, "Colors");
2379 for (i = 0; i < 256; i++)
2381 COLORREF s, g;
2382 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2383 g = GetPixel( hdc, i * 2, 10 );
2384 ok( s == g, "got %08x and %08x\n", s, g );
2386 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2387 g = GetPixel( hdc, i * 2, 20 );
2388 ok( s == g, "got %08x and %08x\n", s, g );
2390 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2391 g = GetPixel( hdc, i * 2, 30 );
2392 ok( s == g, "got %08x and %08x\n", s, g );
2394 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2395 g = GetPixel( hdc, i * 2, 40 );
2396 ok( s == g, "got %08x and %08x\n", s, g );
2398 for (j = 0; j < 256; j++)
2400 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2401 g = GetPixel( hdc, i * 2, 50+j );
2402 ok( s == g, "got %08x and %08x\n", s, g );
2404 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2405 g = GetPixel( hdc, i * 2 + 1, 50+j );
2406 ok( s == g, "got %08x and %08x\n", s, g );
2410 compare_hash(hdc, bmi, bits, "SetPixel");
2412 /* gradients */
2414 if (pGdiGradientFill)
2416 TRIVERTEX vrect[] =
2418 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2419 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2420 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2421 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2423 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2425 TRIVERTEX vtri[] =
2427 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2428 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2429 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2431 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2432 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2433 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2435 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2436 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2437 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2439 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2440 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2441 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2443 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2444 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2445 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2447 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2448 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2449 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2451 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2452 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2453 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2455 GRADIENT_TRIANGLE tri[] =
2457 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2458 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2461 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2462 for (i = 0; i < 4; i++) vrect[i].y += 250;
2463 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2465 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2466 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2467 else
2468 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2470 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2471 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2472 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2473 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2474 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2475 else
2476 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2478 else
2480 win_skip( "GdiGradientFill not supported\n" );
2481 skip_compare(1);
2482 skip_compare(1);
2485 /* wide pen */
2487 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2488 SelectObject( hdc, wide_pen );
2490 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2492 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2493 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2496 compare_hash(hdc, bmi, bits, "wide pen" );
2498 SelectObject( hdc, orig_pen );
2499 DeleteObject( wide_pen );
2501 log_brush.lbStyle = BS_SOLID;
2502 log_brush.lbColor = RGB(0xff, 0, 0);
2503 log_brush.lbHatch = 0;
2505 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2506 9, &log_brush, 0, NULL );
2507 SelectObject( hdc, wide_pen );
2509 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2510 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2512 SelectObject( hdc, orig_pen );
2513 DeleteObject( wide_pen );
2515 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2516 16, &log_brush, 0, NULL );
2517 SelectObject( hdc, wide_pen );
2519 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2520 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2522 SelectObject( hdc, orig_pen );
2523 DeleteObject( wide_pen );
2525 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2526 9, &log_brush, 0, NULL );
2527 SelectObject( hdc, wide_pen );
2529 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2530 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2532 SelectObject( hdc, orig_pen );
2533 DeleteObject( wide_pen );
2535 /* brushed wide pen */
2537 old_text = GetTextColor( hdc );
2538 old_bkgnd = GetBkColor( hdc );
2539 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2540 log_brush.lbStyle = BS_PATTERN;
2541 log_brush.lbColor = 0;
2542 log_brush.lbHatch = (ULONG_PTR)bmp;
2543 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2544 12, &log_brush, 0, NULL );
2545 ok( wide_pen != 0, "failed to create pen\n" );
2546 SelectObject( hdc, wide_pen );
2547 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2549 for (i = 1; i < 20; i++)
2551 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2552 i, &log_brush, 0, NULL );
2553 ok( wide_pen != 0, "failed to create pen\n" );
2554 DeleteObject( SelectObject( hdc, wide_pen ));
2555 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2556 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2557 MoveToEx( hdc, 10 * i, 10, NULL );
2558 LineTo( hdc, 10 * i, 200 + i );
2559 LineTo( hdc, 20 * i, 200 + i );
2561 /* NT4 broken for all cases, W2K for 1 bpp only */
2562 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2564 for (i = 1; i < 20; i++)
2566 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2567 i, &log_brush, 0, NULL );
2568 DeleteObject( SelectObject( hdc, wide_pen ));
2569 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2570 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2571 MoveToEx( hdc, 10 * i, 10, NULL );
2572 LineTo( hdc, 10 * i, 200 + i );
2573 LineTo( hdc, 20 * i, 200 + i );
2575 /* NT4 broken for all cases, W2K for 1 bpp only */
2576 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2578 DeleteObject(bmp);
2579 SetTextColor(hdc, old_text);
2580 SetBkColor(hdc, old_bkgnd);
2581 SelectObject( hdc, orig_pen );
2583 /* PALETTEINDEX */
2585 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2586 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2587 SetTextColor( hdc, PALETTEINDEX(38) );
2588 SetBkColor( hdc, PALETTEINDEX(9) );
2589 SelectObject( hdc, solid_brush );
2590 SelectObject( hdc, solid_pen );
2592 pal->palVersion = 0x300;
2593 pal->palNumEntries = 40;
2594 for (i = 0; i < 80; i++)
2596 entries[i].peRed = i * 3;
2597 entries[i].peGreen = i * 7;
2598 entries[i].peBlue = 128 - i;
2599 entries[i].peFlags = 0;
2601 hpal = CreatePalette( pal );
2602 SelectPalette( hdc, hpal, FALSE );
2604 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2605 Rectangle( hdc, 0, 0, 10, 10 );
2606 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2607 Rectangle( hdc, 10, 0, 10, 10 );
2608 SelectObject( hdc, orig_brush );
2609 DeleteObject( solid_brush );
2611 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2612 DeleteObject( SelectObject( hdc, solid_brush ));
2613 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2614 SetPaletteEntries( hpal, 0, 40, entries );
2615 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2616 SelectObject( hdc, orig_brush );
2617 DeleteObject( solid_brush );
2619 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2620 dib_brush = CreatePatternBrush( bmp );
2621 SelectObject( hdc, dib_brush );
2622 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2623 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2624 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2625 DeleteObject( bmp );
2626 SelectObject( hdc, orig_brush );
2627 DeleteObject( dib_brush );
2629 SelectPalette( hdc, GetStockObject(DEFAULT_PALETTE), FALSE );
2630 DeleteObject( hpal );
2632 /* NT4 broken for all cases, W2K for 1 bpp only */
2633 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2635 /* ExtFloodFill */
2637 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2638 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2639 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2640 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2641 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2643 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2644 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2645 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2646 DeleteObject( hrgn );
2648 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2649 SelectObject( hdc, solid_brush );
2651 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2652 ok (!ret == !!dib_is_1bpp, "got ret %d\n", ret);
2653 compare_hash(hdc, bmi, bits, "flood fill" );
2655 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2657 SelectObject(hdc, orig_brush);
2658 SelectObject(hdc, orig_pen);
2659 DeleteObject(dib_brush);
2660 DeleteObject(solid_brush);
2661 DeleteObject(wide_pen);
2662 DeleteObject(dashed_pen);
2663 DeleteObject(solid_pen);
2666 static const BYTE ramp[17] =
2668 0, 0x4d, 0x68, 0x7c,
2669 0x8c, 0x9a, 0xa7, 0xb2,
2670 0xbd, 0xc7, 0xd0, 0xd9,
2671 0xe1, 0xe9, 0xf0, 0xf8,
2672 0xff
2675 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2677 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2678 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2681 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2683 BYTE min_comp, max_comp;
2685 if (alpha == 16) return text;
2686 if (alpha <= 1) return dst;
2687 if (text == dst) return dst;
2689 get_range( alpha, text, &min_comp, &max_comp );
2691 if (dst > text)
2693 DWORD diff = dst - text;
2694 DWORD range = max_comp - text;
2695 dst = text + (diff * range ) / (0xff - text);
2696 return dst;
2698 else
2700 DWORD diff = text - dst;
2701 DWORD range = text - min_comp ;
2702 dst = text - (diff * range) / text;
2703 return dst;
2707 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2709 COLORREF ret;
2711 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2712 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2713 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2714 return ret;
2717 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2719 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2721 DWORD dib_size = get_dib_size(bmi), ret;
2722 LOGFONT lf;
2723 HFONT font;
2724 GLYPHMETRICS gm;
2725 BYTE g_buf[10000];
2726 int i, stride, x, y;
2727 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2728 char *eto_hash = NULL, *diy_hash = NULL;
2729 static const char *str = "Hello Wine";
2730 POINT origin, g_org;
2731 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2732 TEXTMETRIC tm;
2733 COLORREF text_color;
2735 for(i = 0; i < dib_size; i++)
2736 bits[i] = vals[i % 4];
2738 memset( &lf, 0, sizeof(lf) );
2739 strcpy( lf.lfFaceName, "Tahoma" );
2740 lf.lfHeight = 24;
2741 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2743 font = CreateFontIndirect( &lf );
2744 font = SelectObject( hdc, font );
2746 GetTextMetrics( hdc, &tm );
2747 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2749 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2750 DeleteObject( SelectObject( hdc, font ) );
2751 return;
2754 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2755 SetTextAlign( hdc, TA_BASELINE );
2756 SetBkMode( hdc, TRANSPARENT );
2757 origin.x = 10;
2758 origin.y = 100;
2760 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2761 eto_hash = hash_dib( bmi, bits );
2763 for(i = 0; i < dib_size; i++)
2764 bits[i] = vals[i % 4];
2766 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2768 text_color = GetTextColor( hdc );
2769 for (i = 0; i < strlen(str); i++)
2771 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2773 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2775 if (ret == GDI_ERROR) continue;
2777 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2779 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2780 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2782 origin.x += gm.gmCellIncX;
2783 origin.y += gm.gmCellIncY;
2785 if (!ret) continue;
2787 if (aa)
2789 stride = (gm.gmBlackBoxX + 3) & ~3;
2791 for (y = 0; y < gm.gmBlackBoxY; y++)
2793 BYTE *g_ptr = g_buf + y * stride;
2794 COLORREF val;
2796 for (x = 0; x < gm.gmBlackBoxX; x++)
2798 if (g_ptr[x] <= 1) continue;
2799 if (g_ptr[x] >= 16) val = text_color;
2800 else
2802 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2803 val = aa_colorref( val, text_color, g_ptr[x] );
2805 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2809 else
2811 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2813 for (y = 0; y < gm.gmBlackBoxY; y++)
2815 BYTE *g_ptr = g_buf + y * stride;
2816 for (x = 0; x < gm.gmBlackBoxX; x++)
2818 if (g_ptr[x / 8] & masks[x % 8])
2819 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2825 diy_hash = hash_dib( bmi, bits );
2826 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2828 HeapFree( GetProcessHeap(), 0, diy_hash );
2829 HeapFree( GetProcessHeap(), 0, eto_hash );
2831 font = SelectObject( hdc, font );
2832 DeleteObject( font );
2835 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2837 draw_text_2( hdc, bmi, bits, FALSE );
2839 /* Rounding errors make these cases hard to test */
2840 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2841 (bmi->bmiHeader.biBitCount == 16))
2842 return;
2844 draw_text_2( hdc, bmi, bits, TRUE );
2847 static void test_simple_graphics(void)
2849 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2850 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2851 RGBQUAD *colors = bmi->bmiColors;
2852 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2853 HDC mem_dc;
2854 BYTE *bits;
2855 HBITMAP dib, orig_bm;
2856 DIBSECTION ds;
2857 int i;
2859 mem_dc = CreateCompatibleDC(NULL);
2861 /* a8r8g8b8 */
2862 trace("8888\n");
2863 memset(bmi, 0, sizeof(bmibuf));
2864 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2865 bmi->bmiHeader.biHeight = 512;
2866 bmi->bmiHeader.biWidth = 512;
2867 bmi->bmiHeader.biBitCount = 32;
2868 bmi->bmiHeader.biPlanes = 1;
2869 bmi->bmiHeader.biCompression = BI_RGB;
2871 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2872 ok(dib != NULL, "ret NULL\n");
2873 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2874 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2875 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2876 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2877 ok(ds.dsBmih.biCompression == BI_RGB ||
2878 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2879 "got %x\n", ds.dsBmih.biCompression);
2881 orig_bm = SelectObject(mem_dc, dib);
2883 dst_format = "8888";
2884 current_sha1 = sha1_graphics_a8r8g8b8;
2885 draw_graphics(mem_dc, bmi, bits);
2886 draw_text(mem_dc, bmi, bits);
2888 SelectObject(mem_dc, orig_bm);
2889 DeleteObject(dib);
2891 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2892 trace("8888 - bitfields\n");
2893 bmi->bmiHeader.biBitCount = 32;
2894 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2895 bit_fields[0] = 0xff0000;
2896 bit_fields[1] = 0x00ff00;
2897 bit_fields[2] = 0x0000ff;
2899 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2900 ok(dib != NULL, "ret NULL\n");
2901 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2902 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2903 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2904 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2905 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2907 orig_bm = SelectObject(mem_dc, dib);
2909 dst_format = "8888 - bitfields";
2910 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
2911 draw_graphics(mem_dc, bmi, bits);
2912 draw_text(mem_dc, bmi, bits);
2914 SelectObject(mem_dc, orig_bm);
2915 DeleteObject(dib);
2917 /* a8b8g8r8. */
2918 trace("a8b8g8r8\n");
2919 bmi->bmiHeader.biBitCount = 32;
2920 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2921 bit_fields[0] = 0x0000ff;
2922 bit_fields[1] = 0x00ff00;
2923 bit_fields[2] = 0xff0000;
2925 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2926 ok(dib != NULL, "ret NULL\n");
2927 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2928 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2929 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2930 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2931 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2933 orig_bm = SelectObject(mem_dc, dib);
2935 dst_format = "a8b8g8r8";
2936 current_sha1 = sha1_graphics_a8b8g8r8;
2937 draw_graphics(mem_dc, bmi, bits);
2938 draw_text(mem_dc, bmi, bits);
2940 SelectObject(mem_dc, orig_bm);
2941 DeleteObject(dib);
2943 /* r10g10b10. */
2944 trace("r10g10b10\n");
2945 bmi->bmiHeader.biBitCount = 32;
2946 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2947 bit_fields[0] = 0x3ff00000;
2948 bit_fields[1] = 0x000ffc00;
2949 bit_fields[2] = 0x000003ff;
2951 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2952 ok(dib != NULL, "ret NULL\n");
2953 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2954 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2955 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2956 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2957 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2959 orig_bm = SelectObject(mem_dc, dib);
2961 dst_format = "r10g10b10";
2962 current_sha1 = sha1_graphics_r10g10b10;
2963 draw_graphics(mem_dc, bmi, bits);
2964 draw_text(mem_dc, bmi, bits);
2966 SelectObject(mem_dc, orig_bm);
2967 DeleteObject(dib);
2969 /* r6g6b6. */
2970 trace("r6g6b6\n");
2971 bmi->bmiHeader.biBitCount = 32;
2972 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2973 bit_fields[0] = 0x0003f000;
2974 bit_fields[1] = 0x00000fc0;
2975 bit_fields[2] = 0x0000003f;
2977 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2978 ok(dib != NULL, "ret NULL\n");
2979 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2980 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2981 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2982 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2983 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2985 orig_bm = SelectObject(mem_dc, dib);
2987 dst_format = "r6g6b6";
2988 current_sha1 = sha1_graphics_r6g6b6;
2989 draw_graphics(mem_dc, bmi, bits);
2990 draw_text(mem_dc, bmi, bits);
2992 SelectObject(mem_dc, orig_bm);
2993 DeleteObject(dib);
2995 /* 24 */
2996 trace("24\n");
2997 bmi->bmiHeader.biBitCount = 24;
2998 bmi->bmiHeader.biCompression = BI_RGB;
3000 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3001 ok(dib != NULL, "ret NULL\n");
3002 orig_bm = SelectObject(mem_dc, dib);
3004 dst_format = "24";
3005 current_sha1 = sha1_graphics_24;
3006 draw_graphics(mem_dc, bmi, bits);
3007 draw_text(mem_dc, bmi, bits);
3009 SelectObject(mem_dc, orig_bm);
3010 DeleteObject(dib);
3012 /* r5g5b5 */
3013 trace("555\n");
3014 bmi->bmiHeader.biBitCount = 16;
3015 bmi->bmiHeader.biCompression = BI_RGB;
3017 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3018 ok(dib != NULL, "ret NULL\n");
3019 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3020 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3021 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3022 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3023 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3025 orig_bm = SelectObject(mem_dc, dib);
3027 dst_format = "r5g5b5";
3028 current_sha1 = sha1_graphics_r5g5b5;
3029 draw_graphics(mem_dc, bmi, bits);
3030 draw_text(mem_dc, bmi, bits);
3032 SelectObject(mem_dc, orig_bm);
3033 DeleteObject(dib);
3035 /* r4g4b4 */
3036 trace("444\n");
3037 bmi->bmiHeader.biBitCount = 16;
3038 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3039 bit_fields[0] = 0x0f00;
3040 bit_fields[1] = 0x00f0;
3041 bit_fields[2] = 0x000f;
3042 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3043 ok(dib != NULL, "ret NULL\n");
3044 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3045 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3046 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3047 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3048 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3050 orig_bm = SelectObject(mem_dc, dib);
3052 dst_format = "r4g4b4";
3053 current_sha1 = sha1_graphics_r4g4b4;
3054 draw_graphics(mem_dc, bmi, bits);
3055 draw_text(mem_dc, bmi, bits);
3057 SelectObject(mem_dc, orig_bm);
3058 DeleteObject(dib);
3060 /* 8 color */
3061 trace("8 color\n");
3062 bmi->bmiHeader.biBitCount = 8;
3063 bmi->bmiHeader.biCompression = BI_RGB;
3064 bmi->bmiHeader.biClrUsed = 236;
3065 for (i = 0; i < 236; i++)
3067 colors[i].rgbRed = (i & 0x07) << 5;
3068 colors[i].rgbGreen = (i & 0x38) << 2;
3069 colors[i].rgbBlue = i & 0xc0;
3071 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3072 ok(dib != NULL, "ret NULL\n");
3074 orig_bm = SelectObject(mem_dc, dib);
3076 dst_format = "8 color";
3077 current_sha1 = sha1_graphics_8_color;
3078 draw_graphics(mem_dc, bmi, bits);
3079 draw_text(mem_dc, bmi, bits);
3081 SelectObject(mem_dc, orig_bm);
3082 DeleteObject(dib);
3084 /* 8 grayscale */
3085 trace("8 grayscale\n");
3086 bmi->bmiHeader.biBitCount = 8;
3087 bmi->bmiHeader.biCompression = BI_RGB;
3088 bmi->bmiHeader.biClrUsed = 256;
3089 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3091 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3092 ok(dib != NULL, "ret NULL\n");
3094 orig_bm = SelectObject(mem_dc, dib);
3096 dst_format = "8 grayscale";
3097 current_sha1 = sha1_graphics_8_grayscale;
3098 draw_graphics(mem_dc, bmi, bits);
3099 draw_text(mem_dc, bmi, bits);
3101 SelectObject(mem_dc, orig_bm);
3102 DeleteObject(dib);
3104 /* 8 */
3105 trace("8\n");
3106 bmi->bmiHeader.biBitCount = 8;
3107 bmi->bmiHeader.biCompression = BI_RGB;
3108 bmi->bmiHeader.biClrUsed = 5;
3109 colors[0].rgbRed = 0xff;
3110 colors[0].rgbGreen = 0xff;
3111 colors[0].rgbBlue = 0xff;
3112 colors[1].rgbRed = 0;
3113 colors[1].rgbGreen = 0;
3114 colors[1].rgbBlue = 0;
3115 colors[2].rgbRed = 0xff;
3116 colors[2].rgbGreen = 0;
3117 colors[2].rgbBlue = 0;
3118 colors[3].rgbRed = 0;
3119 colors[3].rgbGreen = 0xff;
3120 colors[3].rgbBlue = 0;
3121 colors[4].rgbRed = 0;
3122 colors[4].rgbGreen = 0;
3123 colors[4].rgbBlue = 0xff;
3125 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3126 ok(dib != NULL, "ret NULL\n");
3128 orig_bm = SelectObject(mem_dc, dib);
3130 dst_format = "8";
3131 current_sha1 = sha1_graphics_8;
3132 draw_graphics(mem_dc, bmi, bits);
3133 draw_text(mem_dc, bmi, bits);
3135 SelectObject(mem_dc, orig_bm);
3136 DeleteObject(dib);
3138 /* 4 */
3139 trace("4\n");
3140 bmi->bmiHeader.biBitCount = 4;
3142 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3143 ok(dib != NULL, "ret NULL\n");
3145 orig_bm = SelectObject(mem_dc, dib);
3147 dst_format = "4";
3148 current_sha1 = sha1_graphics_4;
3149 draw_graphics(mem_dc, bmi, bits);
3150 draw_text(mem_dc, bmi, bits);
3152 SelectObject(mem_dc, orig_bm);
3153 DeleteObject(dib);
3155 /* 4 grayscale */
3156 trace("4 grayscale\n");
3157 bmi->bmiHeader.biClrUsed = 16;
3158 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3160 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3161 ok(dib != NULL, "ret NULL\n");
3163 orig_bm = SelectObject(mem_dc, dib);
3165 dst_format = "4 grayscale";
3166 current_sha1 = sha1_graphics_4_grayscale;
3167 draw_graphics(mem_dc, bmi, bits);
3168 draw_text(mem_dc, bmi, bits);
3170 SelectObject(mem_dc, orig_bm);
3171 DeleteObject(dib);
3173 /* 1 */
3174 trace("1\n");
3175 bmi->bmiHeader.biBitCount = 1;
3176 bmi->bmiHeader.biClrUsed = 2;
3178 colors[0].rgbRed = 0x00;
3179 colors[0].rgbGreen = 0x01;
3180 colors[0].rgbBlue = 0xff;
3181 colors[1].rgbRed = 0xff;
3182 colors[1].rgbGreen = 0x00;
3183 colors[1].rgbBlue = 0x00;
3185 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3186 ok(dib != NULL, "ret NULL\n");
3188 orig_bm = SelectObject(mem_dc, dib);
3190 dst_format = "1";
3191 current_sha1 = sha1_graphics_1;
3192 draw_graphics(mem_dc, bmi, bits);
3193 draw_text(mem_dc, bmi, bits);
3195 SelectObject(mem_dc, orig_bm);
3196 DeleteObject(dib);
3198 DeleteDC(mem_dc);
3201 START_TEST(dib)
3203 HMODULE mod = GetModuleHandleA("gdi32.dll");
3204 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3205 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3206 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3208 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3210 test_simple_graphics();
3212 CryptReleaseContext(crypt_prov, 0);