Release 1.6-rc2.
[wine/testsucceed.git] / dlls / gdi32 / tests / dib.c
blob18c106732876d3d6faede09472f31e10d899e487
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 HeapFree(GetProcessHeap(), 0, hash);
1312 return;
1316 ok_cond = !strcmp(hash, *current_sha1);
1318 for(i = 1; i <= num_broken; i++)
1319 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1321 if(todo)
1322 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1323 dst_format, info, *current_sha1, hash );
1324 else
1325 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1326 dst_format, info, *current_sha1, hash );
1328 current_sha1 += num_broken + 1;
1330 HeapFree(GetProcessHeap(), 0, hash);
1332 compare_bounds( hdc, info );
1335 static void compare_hash(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char *info)
1337 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1340 static const RECT bias_check[] =
1342 {100, 100, 200, 150},
1343 {100, 100, 150, 200},
1344 {100, 100, 50, 200},
1345 {100, 100, 0, 150},
1346 {100, 100, 0, 50},
1347 {100, 100, 50, 0},
1348 {100, 100, 150, 0},
1349 {100, 100, 200, 50}
1352 static const RECT hline_clips[] =
1354 {120, 120, 140, 120}, /* unclipped */
1355 {100, 122, 140, 122}, /* l edgecase */
1356 { 99, 124, 140, 124}, /* l edgecase clipped */
1357 {120, 126, 200, 126}, /* r edgecase */
1358 {120, 128, 201, 128}, /* r edgecase clipped */
1359 { 99, 130, 201, 130}, /* l and r clipped */
1360 {120, 100, 140, 100}, /* t edgecase */
1361 {120, 99, 140, 99}, /* t edgecase clipped */
1362 {120, 199, 140, 199}, /* b edgecase */
1363 {120, 200, 140, 200}, /* b edgecase clipped */
1364 {120, 132, 310, 132}, /* inside two clip rects */
1365 { 10, 134, 101, 134}, /* r end on l edgecase */
1366 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1367 {199, 138, 220, 138}, /* l end on r edgecase */
1368 {200, 140, 220, 140} /* l end on r edgecase clipped */
1371 static const RECT vline_clips[] =
1373 {120, 120, 120, 140}, /* unclipped */
1374 {100, 120, 100, 140}, /* l edgecase */
1375 { 99, 120, 99, 140}, /* l edgecase clipped */
1376 {199, 120, 199, 140}, /* r edgecase */
1377 {200, 120, 200, 140}, /* r edgecase clipped */
1378 {122, 99, 122, 201}, /* t and b clipped */
1379 {124, 100, 124, 140}, /* t edgecase */
1380 {126, 99, 126, 140}, /* t edgecase clipped */
1381 {128, 120, 128, 200}, /* b edgecase */
1382 {130, 120, 130, 201}, /* b edgecase clipped */
1383 {132, 12, 132, 140}, /* inside two clip rects */
1384 {134, 90, 134, 101}, /* b end on t edgecase */
1385 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1386 {138, 199, 138, 220}, /* t end on b edgecase */
1387 {140, 200, 140, 220} /* t end on b edgecase clipped */
1390 static const RECT line_clips[] =
1392 { 90, 110, 310, 120},
1393 { 90, 120, 295, 130},
1394 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1395 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1396 { 90, 132, 101, 137}, /* end pt just inside l edge */
1397 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1398 {199, 142, 210, 143} /* start pt just inside r edge */
1401 static const RECT wide_lines[] =
1403 {100, 10, 200, 10},
1404 {100, 21, 200, 21},
1405 {200, 40, 100, 40},
1406 {200, 61, 100, 61},
1407 { 10, 100, 10, 200},
1408 { 21, 100, 21, 200},
1409 { 40, 200, 40, 100},
1410 { 61, 200, 61, 100},
1413 static const POINT poly_lines[] =
1415 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1418 static const POINT polypoly_lines[] =
1420 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1423 static const DWORD polypoly_counts[] =
1425 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1428 static const RECT patblt_clips[] =
1430 {120, 120, 140, 126}, /* unclipped */
1431 {100, 130, 140, 136}, /* l edgecase */
1432 { 99, 140, 140, 146}, /* l edgecase clipped */
1433 {180, 130, 200, 136}, /* r edgecase */
1434 {180, 140, 201, 146}, /* r edgecase clipped */
1435 {120, 100, 130, 110}, /* t edgecase */
1436 {140, 99, 150, 110}, /* t edgecase clipped */
1437 {120, 180, 130, 200}, /* b edgecase */
1438 {140, 180, 150, 201}, /* b edgecase */
1439 {199, 150, 210, 156}, /* l edge on r edgecase */
1440 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1441 { 90, 150, 101, 156}, /* r edge on l edgecase */
1442 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1443 {160, 90, 166, 101}, /* b edge on t edgecase */
1444 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1445 {160, 199, 166, 210}, /* t edge on b edgecase */
1446 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1449 static const RECT rectangles[] =
1451 {10, 11, 100, 101},
1452 {250, 100, 350, 10},
1453 {120, 10, 120, 20}, /* zero width */
1454 {120, 10, 130, 10}, /* zero height */
1455 {120, 40, 121, 41}, /* 1 x 1 */
1456 {130, 50, 132, 52}, /* 2 x 2 */
1457 {140, 60, 143, 63}, /* 3 x 3 */
1458 {150, 70, 154, 74}, /* 4 x 4 */
1459 {120, 20, 121, 30}, /* width == 1 */
1460 {130, 20, 132, 30}, /* width == 2 */
1461 {140, 20, 143, 30}, /* width == 3 */
1462 {200, 20, 210, 21}, /* height == 1 */
1463 {200, 30, 210, 32}, /* height == 2 */
1464 {200, 40, 210, 43} /* height == 3 */
1467 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1468 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1469 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1470 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1471 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1472 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1474 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1475 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1476 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1477 0x00, 0x01 }; /* <eod> */
1479 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1480 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1481 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1482 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1484 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1485 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1487 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1489 HBRUSH brush = CreateSolidBrush( color );
1490 brush = SelectObject( hdc, brush );
1491 PatBlt( hdc, x, y, width, height, PATCOPY );
1492 DeleteObject( SelectObject( hdc, brush ) );
1495 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits)
1497 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1498 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1499 PALETTEENTRY *entries = pal->palPalEntry;
1500 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1501 LOGBRUSH log_brush;
1502 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1503 HBITMAP bmp;
1504 INT i, j, x, y, hatch_style;
1505 HDC src_dc;
1506 HRGN hrgn, hrgn2;
1507 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1508 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1509 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1510 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1511 RGBQUAD *brush_colors = brush_bi->bmiColors;
1512 BYTE *brush_bits, *src_bits;
1513 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1514 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1515 BLENDFUNCTION blend;
1516 COLORREF old_text, old_bkgnd;
1517 HPALETTE hpal;
1519 blend.BlendOp = AC_SRC_OVER;
1520 blend.BlendFlags = 0;
1522 reset_bounds( hdc );
1524 memset(bits, 0xcc, get_dib_size(bmi));
1525 compare_hash(hdc, bmi, bits, "empty");
1527 src_dc = CreateCompatibleDC( 0 );
1528 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1529 orig_pen = SelectObject(hdc, solid_pen);
1530 SetBrushOrgEx(hdc, 0, 0, NULL);
1532 /* horizontal and vertical lines */
1533 for(i = 1; i <= 16; i++)
1535 SetROP2(hdc, i);
1536 MoveToEx(hdc, 10, i * 3, NULL);
1537 LineTo(hdc, 100, i * 3); /* l -> r */
1538 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1539 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1540 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1541 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1542 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1543 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1545 compare_hash(hdc, bmi, bits, "h and v solid lines");
1547 /* diagonal lines */
1548 SetROP2(hdc, R2_COPYPEN);
1549 for(i = 0; i < 16; i++)
1551 double s = sin(M_PI * i / 8.0);
1552 double c = cos(M_PI * i / 8.0);
1554 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1555 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1557 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1559 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1561 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1562 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1564 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1566 /* solid brush PatBlt */
1567 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1568 orig_brush = SelectObject(hdc, solid_brush);
1570 for(i = 0, y = 10; i < 256; i++)
1572 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1574 if(rop_uses_src(rop3[i]))
1575 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1576 else
1578 ok(ret, "got FALSE for %x\n", rop3[i]);
1579 y += 20;
1583 compare_hash(hdc, bmi, bits, "solid patblt");
1585 /* clipped lines */
1586 hrgn = CreateRectRgn(10, 10, 200, 20);
1587 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1588 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1589 SetRectRgn(hrgn2, 290, 100, 300, 200);
1590 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1591 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1592 DeleteObject(hrgn2);
1594 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1596 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1597 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1599 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1601 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1603 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1604 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1606 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1608 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1610 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1611 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1613 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1615 /* clipped PatBlt */
1616 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1618 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1619 patblt_clips[i].right - patblt_clips[i].left,
1620 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1622 compare_hash(hdc, bmi, bits, "clipped patblt");
1624 /* clipped dashed lines */
1625 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1626 SelectObject(hdc, dashed_pen);
1627 SetBkMode(hdc, TRANSPARENT);
1628 SetBkColor(hdc, RGB(0, 0xff, 0));
1630 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1632 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1633 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1635 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1637 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1639 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1640 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1642 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1644 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1646 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1647 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1649 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1651 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1653 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1654 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1656 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1658 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1660 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1661 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1663 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1665 SetBkMode(hdc, OPAQUE);
1667 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1669 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1670 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1672 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1674 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1676 /* 8888 DIB pattern brush */
1678 brush_bi->bmiHeader = dib_brush_header_8888;
1679 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1680 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1681 brush_bits[2] = 0xff;
1682 brush_bits[6] = 0xff;
1683 brush_bits[14] = 0xff;
1684 brush_bits[65] = 0xff;
1685 brush_bits[69] = 0xff;
1686 brush_bits[72] = 0xff;
1688 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1690 SelectObject(hdc, dib_brush);
1691 SetBrushOrgEx(hdc, 1, 1, NULL);
1693 for(i = 0, y = 10; i < 256; i++)
1695 if(!rop_uses_src(rop3[i]))
1697 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1698 ok(ret, "got FALSE for %x\n", rop3[i]);
1699 y += 25;
1702 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1703 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1704 else
1705 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1707 SelectObject(hdc, orig_brush);
1708 DeleteObject(dib_brush);
1710 /* 8888 bottom-up DIB pattern brush */
1712 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1714 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1716 SelectObject(hdc, dib_brush);
1718 /* This used to set the x origin to 100 as well, but
1719 there's a Windows bug for 24 bpp where the brush's x offset
1720 is incorrectly calculated for rops that involve both D and P */
1721 SetBrushOrgEx(hdc, 4, 100, NULL);
1723 for(i = 0, y = 10; i < 256; i++)
1725 if(!rop_uses_src(rop3[i]))
1727 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1728 ok(ret, "got FALSE for %x\n", rop3[i]);
1729 y += 25;
1732 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1733 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1734 else
1735 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1737 SelectObject(hdc, orig_brush);
1738 DeleteObject(dib_brush);
1740 /* 24 bpp dib pattern brush */
1742 brush_bi->bmiHeader = dib_brush_header_24;
1743 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1744 memset(brush_bits, 0, 16 * 16 * 3);
1745 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1746 brush_bits[49] = brush_bits[52] = 0xff;
1748 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1750 SelectObject(hdc, dib_brush);
1751 SetBrushOrgEx(hdc, 1, 1, NULL);
1753 for(i = 0, y = 10; i < 256; i++)
1755 if(!rop_uses_src(rop3[i]))
1757 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1758 ok(ret, "got FALSE for %x\n", rop3[i]);
1759 y += 25;
1762 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1763 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1764 else
1765 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1767 SelectObject(hdc, orig_brush);
1768 DeleteObject(dib_brush);
1770 /* 555 dib pattern brush */
1772 brush_bi->bmiHeader = dib_brush_header_555;
1773 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1774 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1775 brush_bits[0] = brush_bits[1] = 0xff;
1776 brush_bits[32] = brush_bits[34] = 0x7c;
1778 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1780 SelectObject(hdc, dib_brush);
1781 SetBrushOrgEx(hdc, 1, 1, NULL);
1783 for(i = 0, y = 10; i < 256; i++)
1785 if(!rop_uses_src(rop3[i]))
1787 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1788 ok(ret, "got FALSE for %x\n", rop3[i]);
1789 y += 25;
1792 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1793 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1794 else
1795 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1797 SelectObject(hdc, orig_brush);
1798 DeleteObject(dib_brush);
1800 SetBrushOrgEx(hdc, 0, 0, NULL);
1802 /* 8 bpp dib pattern brush */
1804 brush_bi->bmiHeader = dib_brush_header_8;
1805 brush_bi->bmiHeader.biClrUsed = 3;
1806 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1807 brush_colors[0].rgbRed = 0xff;
1808 brush_colors[1].rgbRed = 0xff;
1809 brush_colors[1].rgbGreen = 0xff;
1810 brush_colors[1].rgbBlue = 0xff;
1812 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1813 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1814 brush_bits[0] = brush_bits[1] = 1;
1815 brush_bits[16] = brush_bits[17] = 2;
1816 brush_bits[32] = brush_bits[33] = 6;
1818 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1820 SelectObject(hdc, dib_brush);
1821 SetBrushOrgEx(hdc, 1, 1, NULL);
1823 for(i = 0, y = 10; i < 256; i++)
1825 if(!rop_uses_src(rop3[i]))
1827 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1828 ok(ret, "got FALSE for %x\n", rop3[i]);
1829 y += 25;
1832 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1834 SelectObject(hdc, orig_brush);
1835 DeleteObject(dib_brush);
1837 /* 4 bpp dib pattern brush */
1839 brush_bi->bmiHeader = dib_brush_header_4;
1840 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1842 SelectObject(hdc, dib_brush);
1843 SetBrushOrgEx(hdc, 1, 1, NULL);
1845 for(i = 0, y = 10; i < 256; i++)
1847 if(!rop_uses_src(rop3[i]))
1849 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1850 ok(ret, "got FALSE for %x\n", rop3[i]);
1851 y += 25;
1854 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1856 SelectObject(hdc, orig_brush);
1857 DeleteObject(dib_brush);
1859 /* 1 bpp dib pattern brush */
1861 brush_bi->bmiHeader = dib_brush_header_1;
1862 brush_bi->bmiHeader.biClrUsed = 2;
1863 memset(brush_bits, 0, 16 * 4);
1864 brush_bits[0] = 0xf0;
1865 brush_bits[4] = 0xf0;
1866 brush_bits[8] = 0xf0;
1868 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1869 SelectObject(hdc, dib_brush);
1870 for(i = 0, y = 10; i < 256; i++)
1872 if(!rop_uses_src(rop3[i]))
1874 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1875 ok(ret, "got FALSE for %x\n", rop3[i]);
1876 y += 25;
1880 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1882 SelectObject(hdc, orig_brush);
1883 DeleteObject(dib_brush);
1885 /* 1 bpp ddb pattern brush */
1887 old_text = GetTextColor( hdc );
1888 old_bkgnd = GetBkColor( hdc );
1889 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
1890 dib_brush = CreatePatternBrush( bmp );
1891 SelectObject(hdc, dib_brush);
1892 for(i = 0, y = 10; i < 256; i++)
1894 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
1895 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
1896 if(!rop_uses_src(rop3[i]))
1898 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1899 ok(ret, "got FALSE for %x\n", rop3[i]);
1900 y += 25;
1904 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
1906 DeleteObject(bmp);
1907 SelectObject(hdc, orig_brush);
1908 DeleteObject( dib_brush );
1909 SetBrushOrgEx(hdc, 0, 0, NULL);
1910 SetTextColor(hdc, old_text);
1911 SetBkColor(hdc, old_bkgnd);
1913 /* Rectangle */
1915 SelectObject(hdc, solid_pen);
1916 SelectObject(hdc, solid_brush);
1918 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1920 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1923 SelectObject(hdc, dashed_pen);
1924 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1926 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1929 compare_hash(hdc, bmi, bits, "rectangles");
1930 SelectObject(hdc, solid_pen);
1932 /* PaintRgn */
1934 PaintRgn(hdc, hrgn);
1935 compare_hash(hdc, bmi, bits, "PaintRgn");
1937 /* RTL rectangles */
1939 if( !pSetLayout )
1941 win_skip("Don't have SetLayout\n");
1942 skip_compare(1);
1944 else
1946 pSetLayout(hdc, LAYOUT_RTL);
1947 PaintRgn(hdc, hrgn);
1948 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1949 Rectangle(hdc, 100, 250, 110, 260);
1950 compare_hash(hdc, bmi, bits, "rtl");
1952 pSetLayout(hdc, LAYOUT_LTR);
1954 DeleteObject( hrgn );
1956 for(i = 0, y = 10; i < 256; i++)
1958 if(!rop_uses_src(rop3[i]))
1960 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1962 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1963 SelectObject(hdc, hatch_brush);
1964 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1965 ok(ret, "got FALSE for %x\n", rop3[i]);
1966 SelectObject(hdc, orig_brush);
1967 DeleteObject(hatch_brush);
1969 y += 25;
1973 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
1975 /* overlapping blits */
1977 orig_brush = SelectObject(hdc, solid_brush);
1979 Rectangle(hdc, 10, 10, 100, 100);
1980 Rectangle(hdc, 20, 15, 30, 40);
1981 Rectangle(hdc, 15, 15, 20, 20);
1982 Rectangle(hdc, 15, 20, 50, 45);
1983 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1984 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
1986 Rectangle(hdc, 10, 10, 100, 100);
1987 Rectangle(hdc, 20, 15, 30, 40);
1988 Rectangle(hdc, 15, 15, 20, 20);
1989 Rectangle(hdc, 15, 20, 50, 45);
1990 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1991 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1992 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1993 else
1994 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
1996 Rectangle(hdc, 10, 10, 100, 100);
1997 Rectangle(hdc, 20, 15, 30, 40);
1998 Rectangle(hdc, 15, 15, 20, 20);
1999 Rectangle(hdc, 15, 20, 50, 45);
2000 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2001 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2003 Rectangle(hdc, 10, 10, 100, 100);
2004 Rectangle(hdc, 20, 15, 30, 40);
2005 Rectangle(hdc, 15, 15, 20, 20);
2006 Rectangle(hdc, 15, 20, 50, 45);
2007 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2008 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2009 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2010 else
2011 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2013 Rectangle(hdc, 10, 10, 100, 100);
2014 Rectangle(hdc, 20, 15, 30, 40);
2015 Rectangle(hdc, 15, 15, 20, 20);
2016 Rectangle(hdc, 15, 20, 50, 45);
2017 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2018 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2020 Rectangle(hdc, 10, 10, 100, 100);
2021 Rectangle(hdc, 20, 15, 30, 40);
2022 Rectangle(hdc, 15, 15, 20, 20);
2023 Rectangle(hdc, 15, 20, 50, 45);
2024 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2025 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2027 Rectangle(hdc, 10, 10, 100, 100);
2028 Rectangle(hdc, 20, 15, 30, 40);
2029 Rectangle(hdc, 15, 15, 20, 20);
2030 Rectangle(hdc, 15, 20, 50, 45);
2031 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2032 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2033 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2034 else
2035 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2037 Rectangle(hdc, 10, 10, 100, 100);
2038 Rectangle(hdc, 20, 15, 30, 40);
2039 Rectangle(hdc, 15, 15, 20, 20);
2040 Rectangle(hdc, 15, 20, 50, 45);
2041 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2042 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2044 /* blitting with 32-bpp BI_RGB source */
2046 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2047 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2048 src_bi->bmiHeader.biHeight = 256;
2049 src_bi->bmiHeader.biWidth = 256;
2050 src_bi->bmiHeader.biBitCount = 32;
2051 src_bi->bmiHeader.biPlanes = 1;
2052 src_bi->bmiHeader.biCompression = BI_RGB;
2053 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2054 SelectObject( src_dc, bmp );
2055 for (y = 0; y < 256; y++)
2056 for (x = 0; x < 256; x++)
2058 BYTE a = (x + y) * 2;
2059 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2060 BYTE g = (BYTE)(x + y / 3) * a / 255;
2061 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2062 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2065 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2066 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2067 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2068 else
2069 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2071 blend.SourceConstantAlpha = 0xd0;
2072 blend.AlphaFormat = 0;
2073 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2074 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2076 if (!pGdiAlphaBlend) skip_compare(2);
2077 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2079 else
2081 if (!pGdiAlphaBlend) skip_compare(1);
2082 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2085 blend.SourceConstantAlpha = 0xb0;
2086 blend.AlphaFormat = AC_SRC_ALPHA;
2087 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2088 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2090 if (!pGdiAlphaBlend) skip_compare(2);
2091 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2093 else
2095 if (!pGdiAlphaBlend) skip_compare(1);
2096 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2099 /* blitting with 32-bpp r10g10b10 source */
2101 src_bi->bmiHeader.biBitCount = 32;
2102 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2103 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2104 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2105 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2106 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2107 SelectObject( src_dc, bmp );
2108 for (y = 0; y < 256; y++)
2109 for (x = 0; x < 256; x++)
2111 WORD r = (7 * x + 3 * y) % 1024;
2112 WORD g = (11 * x + y / 3) % 1024;
2113 WORD b = (x / 3 + 9 * y) % 1024;
2114 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2117 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2118 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2119 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2120 else
2121 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2123 /* blitting with 32-bpp b6g6r6 source */
2125 src_bi->bmiHeader.biBitCount = 32;
2126 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2127 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2128 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2129 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2130 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2131 SelectObject( src_dc, bmp );
2132 for (y = 0; y < 256; y++)
2133 for (x = 0; x < 256; x++)
2135 BYTE r = (y + 2 * x) % 64;
2136 BYTE g = (x + y / 3) % 64;
2137 BYTE b = (x / 3 + 2 * y) % 64;
2138 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2141 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2142 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2143 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2144 else
2145 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2147 /* blitting with 24-bpp source */
2149 src_bi->bmiHeader.biBitCount = 24;
2150 src_bi->bmiHeader.biCompression = BI_RGB;
2151 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2152 DeleteObject( SelectObject( src_dc, bmp ) );
2153 for (y = 0; y < 256; y++)
2154 for (x = 0; x < 256; x++)
2156 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2157 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2158 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2161 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2162 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2163 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2164 else
2165 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2167 blend.SourceConstantAlpha = 0xe0;
2168 blend.AlphaFormat = 0;
2169 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2170 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2172 if (!pGdiAlphaBlend) skip_compare(2);
2173 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2175 else
2177 if (!pGdiAlphaBlend) skip_compare(1);
2178 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2181 /* blitting with 16-bpp BI_RGB source */
2183 src_bi->bmiHeader.biBitCount = 16;
2184 src_bi->bmiHeader.biCompression = BI_RGB;
2185 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2186 DeleteObject( SelectObject( src_dc, bmp ) );
2187 for (y = 0; y < 256; y++)
2188 for (x = 0; x < 256; x++)
2189 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2191 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2192 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2193 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2194 else
2195 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2197 /* blitting with 16-bpp b4g4r4 source */
2199 src_bi->bmiHeader.biBitCount = 16;
2200 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2201 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2202 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2203 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2204 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2205 DeleteObject( SelectObject( src_dc, bmp ) );
2206 for (y = 0; y < 256; y++)
2207 for (x = 0; x < 256; x++)
2208 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2210 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2211 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2212 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2213 else
2214 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2216 /* blitting with 8-bpp source */
2218 src_bi->bmiHeader.biBitCount = 8;
2219 src_bi->bmiHeader.biCompression = BI_RGB;
2220 src_bi->bmiHeader.biClrUsed = 160;
2221 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2222 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2223 DeleteObject( SelectObject( src_dc, bmp ) );
2224 for (y = 0; y < 256; y++)
2225 for (x = 0; x < 256; x++)
2226 src_bits[y * 256 + x] = 3 * x + 5 * y;
2228 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2229 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2231 blend.SourceConstantAlpha = 0xd0;
2232 blend.AlphaFormat = 0;
2233 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2234 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2236 if (!pGdiAlphaBlend) skip_compare(2);
2237 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2239 else
2241 if (!pGdiAlphaBlend) skip_compare(1);
2242 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2245 /* blitting with 4-bpp source */
2247 src_bi->bmiHeader.biBitCount = 4;
2248 src_bi->bmiHeader.biClrUsed = 12;
2249 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2250 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2251 DeleteObject( SelectObject( src_dc, bmp ) );
2252 for (y = 0; y < 256; y++)
2253 for (x = 0; x < 256; x += 2)
2254 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2256 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2257 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2259 /* blitting with 1-bpp source */
2261 src_bi->bmiHeader.biBitCount = 1;
2262 src_bi->bmiHeader.biClrUsed = 0;
2263 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2264 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2265 DeleteObject( SelectObject( src_dc, bmp ) );
2266 for (y = 0; y < 256; y++)
2267 for (x = 0; x < 256; x += 8)
2268 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2270 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2271 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2273 blend.SourceConstantAlpha = 0x90;
2274 blend.AlphaFormat = 0;
2275 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2276 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2278 if (!pGdiAlphaBlend) skip_compare(2);
2279 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2281 else
2283 if (!pGdiAlphaBlend) skip_compare(1);
2284 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2287 DeleteDC( src_dc );
2288 DeleteObject( bmp );
2290 /* RLE StretchDIBits */
2291 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2292 src_bi->bmiHeader.biWidth = 8;
2293 src_bi->bmiHeader.biHeight = 8;
2294 src_bi->bmiHeader.biPlanes = 1;
2295 src_bi->bmiHeader.biBitCount = 8;
2296 src_bi->bmiHeader.biCompression = BI_RLE8;
2297 src_bi->bmiHeader.biClrUsed = 0;
2298 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2300 for (i = 0; i < 256; i++)
2302 src_bi->bmiColors[i].rgbRed = i;
2303 src_bi->bmiColors[i].rgbGreen = i;
2304 src_bi->bmiColors[i].rgbBlue = i;
2305 src_bi->bmiColors[i].rgbReserved = 0;
2308 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2309 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2310 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2311 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2312 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2313 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2315 /* 32 bpp StretchDIBits */
2317 src_bi->bmiHeader.biWidth = 4;
2318 src_bi->bmiHeader.biHeight = 4;
2319 src_bi->bmiHeader.biPlanes = 1;
2320 src_bi->bmiHeader.biBitCount = 32;
2321 src_bi->bmiHeader.biCompression = BI_RGB;
2322 src_bi->bmiHeader.biClrUsed = 0;
2323 src_bi->bmiHeader.biSizeImage = 0;
2325 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2326 ok(ret == 4, "got %d\n", ret);
2327 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2328 ok(ret == 4, "got %d\n", ret);
2329 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2330 ok(ret == 4, "got %d\n", ret);
2331 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2332 ok(ret == 4, "got %d\n", ret);
2333 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2334 ok(ret == 4, "got %d\n", ret);
2335 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2336 ok(ret == 4, "got %d\n", ret);
2338 src_bi->bmiHeader.biHeight = -4;
2340 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2341 ok(ret == 4, "got %d\n", ret);
2342 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2343 ok(ret == -4, "got %d\n", ret);
2344 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2345 ok(ret == 4, "got %d\n", ret);
2346 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2347 ok(ret == -4, "got %d\n", ret);
2348 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2349 ok(ret == 4, "got %d\n", ret);
2350 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2351 ok(ret == -4, "got %d\n", ret);
2353 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2355 /* Solid colors */
2356 for (i = 0; i < 256; i++)
2358 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2359 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2360 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2361 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2362 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2365 /* A few extra colors that are interesting in the 1bpp case */
2367 /* bk color */
2368 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2369 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2371 /* color 0 */
2372 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2373 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2375 /* color 1 */
2376 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2377 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2379 compare_hash(hdc, bmi, bits, "Colors");
2381 for (i = 0; i < 256; i++)
2383 COLORREF s, g;
2384 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2385 g = GetPixel( hdc, i * 2, 10 );
2386 ok( s == g, "got %08x and %08x\n", s, g );
2388 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2389 g = GetPixel( hdc, i * 2, 20 );
2390 ok( s == g, "got %08x and %08x\n", s, g );
2392 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2393 g = GetPixel( hdc, i * 2, 30 );
2394 ok( s == g, "got %08x and %08x\n", s, g );
2396 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2397 g = GetPixel( hdc, i * 2, 40 );
2398 ok( s == g, "got %08x and %08x\n", s, g );
2400 for (j = 0; j < 256; j++)
2402 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2403 g = GetPixel( hdc, i * 2, 50+j );
2404 ok( s == g, "got %08x and %08x\n", s, g );
2406 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2407 g = GetPixel( hdc, i * 2 + 1, 50+j );
2408 ok( s == g, "got %08x and %08x\n", s, g );
2412 compare_hash(hdc, bmi, bits, "SetPixel");
2414 /* gradients */
2416 if (pGdiGradientFill)
2418 TRIVERTEX vrect[] =
2420 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2421 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2422 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2423 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2425 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2427 TRIVERTEX vtri[] =
2429 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2430 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2431 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2433 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2434 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2435 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2437 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2438 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2439 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2441 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2442 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2443 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2445 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2446 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2447 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2449 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2450 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2451 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2453 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2454 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2455 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2457 GRADIENT_TRIANGLE tri[] =
2459 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2460 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2463 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2464 for (i = 0; i < 4; i++) vrect[i].y += 250;
2465 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2467 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2468 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2469 else
2470 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2472 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2473 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2474 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2475 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2476 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2477 else
2478 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2480 else
2482 win_skip( "GdiGradientFill not supported\n" );
2483 skip_compare(1);
2484 skip_compare(1);
2487 /* wide pen */
2489 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2490 SelectObject( hdc, wide_pen );
2492 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2494 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2495 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2498 compare_hash(hdc, bmi, bits, "wide pen" );
2500 SelectObject( hdc, orig_pen );
2501 DeleteObject( wide_pen );
2503 log_brush.lbStyle = BS_SOLID;
2504 log_brush.lbColor = RGB(0xff, 0, 0);
2505 log_brush.lbHatch = 0;
2507 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2508 9, &log_brush, 0, NULL );
2509 SelectObject( hdc, wide_pen );
2511 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2512 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2514 SelectObject( hdc, orig_pen );
2515 DeleteObject( wide_pen );
2517 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2518 16, &log_brush, 0, NULL );
2519 SelectObject( hdc, wide_pen );
2521 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2522 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2524 SelectObject( hdc, orig_pen );
2525 DeleteObject( wide_pen );
2527 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2528 9, &log_brush, 0, NULL );
2529 SelectObject( hdc, wide_pen );
2531 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2532 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2534 SelectObject( hdc, orig_pen );
2535 DeleteObject( wide_pen );
2537 /* brushed wide pen */
2539 old_text = GetTextColor( hdc );
2540 old_bkgnd = GetBkColor( hdc );
2541 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2542 log_brush.lbStyle = BS_PATTERN;
2543 log_brush.lbColor = 0;
2544 log_brush.lbHatch = (ULONG_PTR)bmp;
2545 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2546 12, &log_brush, 0, NULL );
2547 ok( wide_pen != 0, "failed to create pen\n" );
2548 SelectObject( hdc, wide_pen );
2549 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2551 for (i = 1; i < 20; i++)
2553 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2554 i, &log_brush, 0, NULL );
2555 ok( wide_pen != 0, "failed to create pen\n" );
2556 DeleteObject( SelectObject( hdc, wide_pen ));
2557 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2558 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2559 MoveToEx( hdc, 10 * i, 10, NULL );
2560 LineTo( hdc, 10 * i, 200 + i );
2561 LineTo( hdc, 20 * i, 200 + i );
2563 /* NT4 broken for all cases, W2K for 1 bpp only */
2564 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2566 for (i = 1; i < 20; i++)
2568 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2569 i, &log_brush, 0, NULL );
2570 DeleteObject( SelectObject( hdc, wide_pen ));
2571 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2572 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2573 MoveToEx( hdc, 10 * i, 10, NULL );
2574 LineTo( hdc, 10 * i, 200 + i );
2575 LineTo( hdc, 20 * i, 200 + i );
2577 /* NT4 broken for all cases, W2K for 1 bpp only */
2578 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2580 DeleteObject(bmp);
2581 SetTextColor(hdc, old_text);
2582 SetBkColor(hdc, old_bkgnd);
2583 SelectObject( hdc, orig_pen );
2585 /* PALETTEINDEX */
2587 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2588 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2589 SetTextColor( hdc, PALETTEINDEX(38) );
2590 SetBkColor( hdc, PALETTEINDEX(9) );
2591 SelectObject( hdc, solid_brush );
2592 SelectObject( hdc, solid_pen );
2594 pal->palVersion = 0x300;
2595 pal->palNumEntries = 40;
2596 for (i = 0; i < 80; i++)
2598 entries[i].peRed = i * 3;
2599 entries[i].peGreen = i * 7;
2600 entries[i].peBlue = 128 - i;
2601 entries[i].peFlags = 0;
2603 hpal = CreatePalette( pal );
2604 SelectPalette( hdc, hpal, FALSE );
2606 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2607 Rectangle( hdc, 0, 0, 10, 10 );
2608 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2609 Rectangle( hdc, 10, 0, 10, 10 );
2610 SelectObject( hdc, orig_brush );
2611 DeleteObject( solid_brush );
2613 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2614 DeleteObject( SelectObject( hdc, solid_brush ));
2615 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2616 SetPaletteEntries( hpal, 0, 40, entries );
2617 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2618 SelectObject( hdc, orig_brush );
2619 DeleteObject( solid_brush );
2621 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2622 dib_brush = CreatePatternBrush( bmp );
2623 SelectObject( hdc, dib_brush );
2624 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2625 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2626 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2627 DeleteObject( bmp );
2628 SelectObject( hdc, orig_brush );
2629 DeleteObject( dib_brush );
2631 SelectPalette( hdc, GetStockObject(DEFAULT_PALETTE), FALSE );
2632 DeleteObject( hpal );
2634 /* NT4 broken for all cases, W2K for 1 bpp only */
2635 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2637 /* ExtFloodFill */
2639 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2640 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2641 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2642 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2643 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2645 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2646 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2647 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2648 DeleteObject( hrgn );
2650 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2651 SelectObject( hdc, solid_brush );
2653 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2654 ok (!ret == !!dib_is_1bpp, "got ret %d\n", ret);
2655 compare_hash(hdc, bmi, bits, "flood fill" );
2657 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2659 SelectObject(hdc, orig_brush);
2660 SelectObject(hdc, orig_pen);
2661 DeleteObject(solid_brush);
2662 DeleteObject(wide_pen);
2663 DeleteObject(dashed_pen);
2664 DeleteObject(solid_pen);
2667 static const BYTE ramp[17] =
2669 0, 0x4d, 0x68, 0x7c,
2670 0x8c, 0x9a, 0xa7, 0xb2,
2671 0xbd, 0xc7, 0xd0, 0xd9,
2672 0xe1, 0xe9, 0xf0, 0xf8,
2673 0xff
2676 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2678 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2679 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2682 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2684 BYTE min_comp, max_comp;
2686 if (alpha == 16) return text;
2687 if (alpha <= 1) return dst;
2688 if (text == dst) return dst;
2690 get_range( alpha, text, &min_comp, &max_comp );
2692 if (dst > text)
2694 DWORD diff = dst - text;
2695 DWORD range = max_comp - text;
2696 dst = text + (diff * range ) / (0xff - text);
2697 return dst;
2699 else
2701 DWORD diff = text - dst;
2702 DWORD range = text - min_comp ;
2703 dst = text - (diff * range) / text;
2704 return dst;
2708 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2710 COLORREF ret;
2712 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2713 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2714 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2715 return ret;
2718 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2720 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2722 DWORD dib_size = get_dib_size(bmi), ret;
2723 LOGFONT lf;
2724 HFONT font;
2725 GLYPHMETRICS gm;
2726 BYTE g_buf[10000];
2727 int i, stride, x, y;
2728 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2729 char *eto_hash = NULL, *diy_hash = NULL;
2730 static const char *str = "Hello Wine";
2731 POINT origin, g_org;
2732 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2733 TEXTMETRIC tm;
2734 COLORREF text_color;
2736 for(i = 0; i < dib_size; i++)
2737 bits[i] = vals[i % 4];
2739 memset( &lf, 0, sizeof(lf) );
2740 strcpy( lf.lfFaceName, "Tahoma" );
2741 lf.lfHeight = 24;
2742 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2744 font = CreateFontIndirect( &lf );
2745 font = SelectObject( hdc, font );
2747 GetTextMetrics( hdc, &tm );
2748 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2750 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2751 DeleteObject( SelectObject( hdc, font ) );
2752 return;
2755 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2756 SetTextAlign( hdc, TA_BASELINE );
2757 SetBkMode( hdc, TRANSPARENT );
2758 origin.x = 10;
2759 origin.y = 100;
2761 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2762 eto_hash = hash_dib( bmi, bits );
2764 for(i = 0; i < dib_size; i++)
2765 bits[i] = vals[i % 4];
2767 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2769 text_color = GetTextColor( hdc );
2770 for (i = 0; i < strlen(str); i++)
2772 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2774 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2776 if (ret == GDI_ERROR) continue;
2778 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2780 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2781 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2783 origin.x += gm.gmCellIncX;
2784 origin.y += gm.gmCellIncY;
2786 if (!ret) continue;
2788 if (aa)
2790 stride = (gm.gmBlackBoxX + 3) & ~3;
2792 for (y = 0; y < gm.gmBlackBoxY; y++)
2794 BYTE *g_ptr = g_buf + y * stride;
2795 COLORREF val;
2797 for (x = 0; x < gm.gmBlackBoxX; x++)
2799 if (g_ptr[x] <= 1) continue;
2800 if (g_ptr[x] >= 16) val = text_color;
2801 else
2803 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2804 val = aa_colorref( val, text_color, g_ptr[x] );
2806 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2810 else
2812 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2814 for (y = 0; y < gm.gmBlackBoxY; y++)
2816 BYTE *g_ptr = g_buf + y * stride;
2817 for (x = 0; x < gm.gmBlackBoxX; x++)
2819 if (g_ptr[x / 8] & masks[x % 8])
2820 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2826 diy_hash = hash_dib( bmi, bits );
2827 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2829 HeapFree( GetProcessHeap(), 0, diy_hash );
2830 HeapFree( GetProcessHeap(), 0, eto_hash );
2832 font = SelectObject( hdc, font );
2833 DeleteObject( font );
2836 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2838 draw_text_2( hdc, bmi, bits, FALSE );
2840 /* Rounding errors make these cases hard to test */
2841 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2842 (bmi->bmiHeader.biBitCount == 16))
2843 return;
2845 draw_text_2( hdc, bmi, bits, TRUE );
2848 static void test_simple_graphics(void)
2850 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2851 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2852 RGBQUAD *colors = bmi->bmiColors;
2853 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2854 HDC mem_dc;
2855 BYTE *bits;
2856 HBITMAP dib, orig_bm;
2857 DIBSECTION ds;
2858 int i;
2860 mem_dc = CreateCompatibleDC(NULL);
2862 /* a8r8g8b8 */
2863 trace("8888\n");
2864 memset(bmi, 0, sizeof(bmibuf));
2865 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2866 bmi->bmiHeader.biHeight = 512;
2867 bmi->bmiHeader.biWidth = 512;
2868 bmi->bmiHeader.biBitCount = 32;
2869 bmi->bmiHeader.biPlanes = 1;
2870 bmi->bmiHeader.biCompression = BI_RGB;
2872 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2873 ok(dib != NULL, "ret NULL\n");
2874 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2875 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2876 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2877 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2878 ok(ds.dsBmih.biCompression == BI_RGB ||
2879 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2880 "got %x\n", ds.dsBmih.biCompression);
2882 orig_bm = SelectObject(mem_dc, dib);
2884 dst_format = "8888";
2885 current_sha1 = sha1_graphics_a8r8g8b8;
2886 draw_graphics(mem_dc, bmi, bits);
2887 draw_text(mem_dc, bmi, bits);
2889 SelectObject(mem_dc, orig_bm);
2890 DeleteObject(dib);
2892 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2893 trace("8888 - bitfields\n");
2894 bmi->bmiHeader.biBitCount = 32;
2895 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2896 bit_fields[0] = 0xff0000;
2897 bit_fields[1] = 0x00ff00;
2898 bit_fields[2] = 0x0000ff;
2900 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2901 ok(dib != NULL, "ret NULL\n");
2902 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2903 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2904 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2905 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2906 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2908 orig_bm = SelectObject(mem_dc, dib);
2910 dst_format = "8888 - bitfields";
2911 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
2912 draw_graphics(mem_dc, bmi, bits);
2913 draw_text(mem_dc, bmi, bits);
2915 SelectObject(mem_dc, orig_bm);
2916 DeleteObject(dib);
2918 /* a8b8g8r8. */
2919 trace("a8b8g8r8\n");
2920 bmi->bmiHeader.biBitCount = 32;
2921 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2922 bit_fields[0] = 0x0000ff;
2923 bit_fields[1] = 0x00ff00;
2924 bit_fields[2] = 0xff0000;
2926 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2927 ok(dib != NULL, "ret NULL\n");
2928 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2929 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2930 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2931 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2932 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2934 orig_bm = SelectObject(mem_dc, dib);
2936 dst_format = "a8b8g8r8";
2937 current_sha1 = sha1_graphics_a8b8g8r8;
2938 draw_graphics(mem_dc, bmi, bits);
2939 draw_text(mem_dc, bmi, bits);
2941 SelectObject(mem_dc, orig_bm);
2942 DeleteObject(dib);
2944 /* r10g10b10. */
2945 trace("r10g10b10\n");
2946 bmi->bmiHeader.biBitCount = 32;
2947 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2948 bit_fields[0] = 0x3ff00000;
2949 bit_fields[1] = 0x000ffc00;
2950 bit_fields[2] = 0x000003ff;
2952 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2953 ok(dib != NULL, "ret NULL\n");
2954 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2955 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2956 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2957 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2958 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2960 orig_bm = SelectObject(mem_dc, dib);
2962 dst_format = "r10g10b10";
2963 current_sha1 = sha1_graphics_r10g10b10;
2964 draw_graphics(mem_dc, bmi, bits);
2965 draw_text(mem_dc, bmi, bits);
2967 SelectObject(mem_dc, orig_bm);
2968 DeleteObject(dib);
2970 /* r6g6b6. */
2971 trace("r6g6b6\n");
2972 bmi->bmiHeader.biBitCount = 32;
2973 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2974 bit_fields[0] = 0x0003f000;
2975 bit_fields[1] = 0x00000fc0;
2976 bit_fields[2] = 0x0000003f;
2978 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2979 ok(dib != NULL, "ret NULL\n");
2980 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2981 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2982 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2983 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2984 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2986 orig_bm = SelectObject(mem_dc, dib);
2988 dst_format = "r6g6b6";
2989 current_sha1 = sha1_graphics_r6g6b6;
2990 draw_graphics(mem_dc, bmi, bits);
2991 draw_text(mem_dc, bmi, bits);
2993 SelectObject(mem_dc, orig_bm);
2994 DeleteObject(dib);
2996 /* 24 */
2997 trace("24\n");
2998 bmi->bmiHeader.biBitCount = 24;
2999 bmi->bmiHeader.biCompression = BI_RGB;
3001 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3002 ok(dib != NULL, "ret NULL\n");
3003 orig_bm = SelectObject(mem_dc, dib);
3005 dst_format = "24";
3006 current_sha1 = sha1_graphics_24;
3007 draw_graphics(mem_dc, bmi, bits);
3008 draw_text(mem_dc, bmi, bits);
3010 SelectObject(mem_dc, orig_bm);
3011 DeleteObject(dib);
3013 /* r5g5b5 */
3014 trace("555\n");
3015 bmi->bmiHeader.biBitCount = 16;
3016 bmi->bmiHeader.biCompression = BI_RGB;
3018 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3019 ok(dib != NULL, "ret NULL\n");
3020 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3021 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3022 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3023 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3024 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3026 orig_bm = SelectObject(mem_dc, dib);
3028 dst_format = "r5g5b5";
3029 current_sha1 = sha1_graphics_r5g5b5;
3030 draw_graphics(mem_dc, bmi, bits);
3031 draw_text(mem_dc, bmi, bits);
3033 SelectObject(mem_dc, orig_bm);
3034 DeleteObject(dib);
3036 /* r4g4b4 */
3037 trace("444\n");
3038 bmi->bmiHeader.biBitCount = 16;
3039 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3040 bit_fields[0] = 0x0f00;
3041 bit_fields[1] = 0x00f0;
3042 bit_fields[2] = 0x000f;
3043 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3044 ok(dib != NULL, "ret NULL\n");
3045 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3046 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3047 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3048 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3049 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3051 orig_bm = SelectObject(mem_dc, dib);
3053 dst_format = "r4g4b4";
3054 current_sha1 = sha1_graphics_r4g4b4;
3055 draw_graphics(mem_dc, bmi, bits);
3056 draw_text(mem_dc, bmi, bits);
3058 SelectObject(mem_dc, orig_bm);
3059 DeleteObject(dib);
3061 /* 8 color */
3062 trace("8 color\n");
3063 bmi->bmiHeader.biBitCount = 8;
3064 bmi->bmiHeader.biCompression = BI_RGB;
3065 bmi->bmiHeader.biClrUsed = 236;
3066 for (i = 0; i < 236; i++)
3068 colors[i].rgbRed = (i & 0x07) << 5;
3069 colors[i].rgbGreen = (i & 0x38) << 2;
3070 colors[i].rgbBlue = i & 0xc0;
3072 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3073 ok(dib != NULL, "ret NULL\n");
3075 orig_bm = SelectObject(mem_dc, dib);
3077 dst_format = "8 color";
3078 current_sha1 = sha1_graphics_8_color;
3079 draw_graphics(mem_dc, bmi, bits);
3080 draw_text(mem_dc, bmi, bits);
3082 SelectObject(mem_dc, orig_bm);
3083 DeleteObject(dib);
3085 /* 8 grayscale */
3086 trace("8 grayscale\n");
3087 bmi->bmiHeader.biBitCount = 8;
3088 bmi->bmiHeader.biCompression = BI_RGB;
3089 bmi->bmiHeader.biClrUsed = 256;
3090 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3092 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3093 ok(dib != NULL, "ret NULL\n");
3095 orig_bm = SelectObject(mem_dc, dib);
3097 dst_format = "8 grayscale";
3098 current_sha1 = sha1_graphics_8_grayscale;
3099 draw_graphics(mem_dc, bmi, bits);
3100 draw_text(mem_dc, bmi, bits);
3102 SelectObject(mem_dc, orig_bm);
3103 DeleteObject(dib);
3105 /* 8 */
3106 trace("8\n");
3107 bmi->bmiHeader.biBitCount = 8;
3108 bmi->bmiHeader.biCompression = BI_RGB;
3109 bmi->bmiHeader.biClrUsed = 5;
3110 colors[0].rgbRed = 0xff;
3111 colors[0].rgbGreen = 0xff;
3112 colors[0].rgbBlue = 0xff;
3113 colors[1].rgbRed = 0;
3114 colors[1].rgbGreen = 0;
3115 colors[1].rgbBlue = 0;
3116 colors[2].rgbRed = 0xff;
3117 colors[2].rgbGreen = 0;
3118 colors[2].rgbBlue = 0;
3119 colors[3].rgbRed = 0;
3120 colors[3].rgbGreen = 0xff;
3121 colors[3].rgbBlue = 0;
3122 colors[4].rgbRed = 0;
3123 colors[4].rgbGreen = 0;
3124 colors[4].rgbBlue = 0xff;
3126 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3127 ok(dib != NULL, "ret NULL\n");
3129 orig_bm = SelectObject(mem_dc, dib);
3131 dst_format = "8";
3132 current_sha1 = sha1_graphics_8;
3133 draw_graphics(mem_dc, bmi, bits);
3134 draw_text(mem_dc, bmi, bits);
3136 SelectObject(mem_dc, orig_bm);
3137 DeleteObject(dib);
3139 /* 4 */
3140 trace("4\n");
3141 bmi->bmiHeader.biBitCount = 4;
3143 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3144 ok(dib != NULL, "ret NULL\n");
3146 orig_bm = SelectObject(mem_dc, dib);
3148 dst_format = "4";
3149 current_sha1 = sha1_graphics_4;
3150 draw_graphics(mem_dc, bmi, bits);
3151 draw_text(mem_dc, bmi, bits);
3153 SelectObject(mem_dc, orig_bm);
3154 DeleteObject(dib);
3156 /* 4 grayscale */
3157 trace("4 grayscale\n");
3158 bmi->bmiHeader.biClrUsed = 16;
3159 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3161 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3162 ok(dib != NULL, "ret NULL\n");
3164 orig_bm = SelectObject(mem_dc, dib);
3166 dst_format = "4 grayscale";
3167 current_sha1 = sha1_graphics_4_grayscale;
3168 draw_graphics(mem_dc, bmi, bits);
3169 draw_text(mem_dc, bmi, bits);
3171 SelectObject(mem_dc, orig_bm);
3172 DeleteObject(dib);
3174 /* 1 */
3175 trace("1\n");
3176 bmi->bmiHeader.biBitCount = 1;
3177 bmi->bmiHeader.biClrUsed = 2;
3179 colors[0].rgbRed = 0x00;
3180 colors[0].rgbGreen = 0x01;
3181 colors[0].rgbBlue = 0xff;
3182 colors[1].rgbRed = 0xff;
3183 colors[1].rgbGreen = 0x00;
3184 colors[1].rgbBlue = 0x00;
3186 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3187 ok(dib != NULL, "ret NULL\n");
3189 orig_bm = SelectObject(mem_dc, dib);
3191 dst_format = "1";
3192 current_sha1 = sha1_graphics_1;
3193 draw_graphics(mem_dc, bmi, bits);
3194 draw_text(mem_dc, bmi, bits);
3196 SelectObject(mem_dc, orig_bm);
3197 DeleteObject(dib);
3199 DeleteDC(mem_dc);
3202 START_TEST(dib)
3204 HMODULE mod = GetModuleHandleA("gdi32.dll");
3205 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3206 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3207 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3209 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3211 test_simple_graphics();
3213 CryptReleaseContext(crypt_prov, 0);