kernel32: Add GetConsoleFontInfo stub.
[wine.git] / dlls / gdi32 / tests / dib.c
blob693df4aaf69561a9d6f694fcabb29b77bc91746d
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 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
136 "50a09678c49c208f71d40452daca5411279aa674",
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 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
209 "50a09678c49c208f71d40452daca5411279aa674",
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 "849d4abf4b690128a5f70e9b8ac78f20c437de06",
282 "e768fc9f3167ef3144a4cfb1e20126a577f7dd5b",
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 "4782df8e24127e66a434b4e839adebf2dbb223fb",
355 "739707cc85ca63e0580c79618dc0bb8a4a338d95",
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 "2b3e87e0b705b03c7c08f403409ab82cce095ba1",
428 "45c08e11fffc78b2a3574263419e0cb7f8cd9b45",
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 "099c688a920f606655b485e8f0a433dc811bc976",
501 "9c044a733335bca43766bda2b317249309155079",
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 "904f1d82159bcf5485f323bd12b859dc5e83f8eb",
578 "5bd29f94844351e9a5bd01f25d85608b9b0701b2",
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 "f373a5f37b82e7523c64c08eb509b6191e49b173",
650 "9f0760a05190c9edf9ce2e8be6aaa5557601fe91",
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 "52e7c2f8b01592898c13f1e7633881e350244209",
728 "d9d5556b77301952b4caf113337720966bc8e1f5",
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 "5eb00252664ec39e61359adb1dade4906a87a248",
810 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854",
811 "dcad1a146c1d0ec2c4cc7f64bd4f45c57a604bfe",
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 "0025a440866a404523a8a20e79a8891e45a2ff56",
887 "c04d335933895f836f0a28c1e3f7f444352c3b8e",
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 "ccf8d11b1e81895e9781f17c227c821228d8714b",
959 "f751e26578193afe6a727ee2a52318c404c56555",
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 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f",
1031 "c47c2dc806b6b8ff28f300949695d013a46c0083",
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 "61ade9054d4477fb89cf830539a5e8b4e45f0688",
1052 "ac530c5dbaf837e15b2337347e974184fad73643",
1053 "95fdcda26262d5948a9ade77d83fd698e0031050",
1054 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13",
1055 "f6b61ecf03ad11752775faca1d4404c6bb5065f5",
1056 "d7ad44d6f377598268e9968333ae2cf23a0715ca",
1057 "5871339cd7e6cee12d4dc45934a89071c73efe6b",
1058 "69e9b85b34caf736069ba91e57a5c3fa7c891653",
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 "17468a3789f0a6d65c302bda735a01dc2c1a74d9",
1122 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1123 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1124 "55c26d22f11d80b73383fa57d0fac552d705b092",
1125 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1126 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1127 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1128 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1129 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1130 "74d01690e344bc22e7a0478e7a09ccd92354c486",
1131 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1132 "128eefd2ee043d59dc37918065f687e378e5ca95",
1133 "d7e2daab98ce1f698c4bfedfc01c0d79fcb76b8e",
1134 "8d34215487088b5d4ef63062270ce25c2862643d",
1135 "826562eb11a0d0bba77fa21245f7406a194e9225",
1136 "bbae6f0659e095a42b420082079663f937065813",
1137 "bbabe686a6955402c90530e7c67f1428868369b3",
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(const BITMAPINFO *bmi)
1215 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1218 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1220 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1223 static char *hash_dib(const BITMAPINFO *bmi, const 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, const 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 todo_wine_if(todo)
1322 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1323 dst_format, info, *current_sha1, hash );
1325 current_sha1 += num_broken + 1;
1327 HeapFree(GetProcessHeap(), 0, hash);
1329 compare_bounds( hdc, info );
1332 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1334 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1337 static const RECT bias_check[] =
1339 {100, 100, 200, 150},
1340 {100, 100, 150, 200},
1341 {100, 100, 50, 200},
1342 {100, 100, 0, 150},
1343 {100, 100, 0, 50},
1344 {100, 100, 50, 0},
1345 {100, 100, 150, 0},
1346 {100, 100, 200, 50}
1349 static const RECT hline_clips[] =
1351 {120, 120, 140, 120}, /* unclipped */
1352 {100, 122, 140, 122}, /* l edgecase */
1353 { 99, 124, 140, 124}, /* l edgecase clipped */
1354 {120, 126, 200, 126}, /* r edgecase */
1355 {120, 128, 201, 128}, /* r edgecase clipped */
1356 { 99, 130, 201, 130}, /* l and r clipped */
1357 {120, 100, 140, 100}, /* t edgecase */
1358 {120, 99, 140, 99}, /* t edgecase clipped */
1359 {120, 199, 140, 199}, /* b edgecase */
1360 {120, 200, 140, 200}, /* b edgecase clipped */
1361 {120, 132, 310, 132}, /* inside two clip rects */
1362 { 10, 134, 101, 134}, /* r end on l edgecase */
1363 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1364 {199, 138, 220, 138}, /* l end on r edgecase */
1365 {200, 140, 220, 140} /* l end on r edgecase clipped */
1368 static const RECT vline_clips[] =
1370 {120, 120, 120, 140}, /* unclipped */
1371 {100, 120, 100, 140}, /* l edgecase */
1372 { 99, 120, 99, 140}, /* l edgecase clipped */
1373 {199, 120, 199, 140}, /* r edgecase */
1374 {200, 120, 200, 140}, /* r edgecase clipped */
1375 {122, 99, 122, 201}, /* t and b clipped */
1376 {124, 100, 124, 140}, /* t edgecase */
1377 {126, 99, 126, 140}, /* t edgecase clipped */
1378 {128, 120, 128, 200}, /* b edgecase */
1379 {130, 120, 130, 201}, /* b edgecase clipped */
1380 {132, 12, 132, 140}, /* inside two clip rects */
1381 {134, 90, 134, 101}, /* b end on t edgecase */
1382 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1383 {138, 199, 138, 220}, /* t end on b edgecase */
1384 {140, 200, 140, 220} /* t end on b edgecase clipped */
1387 static const RECT line_clips[] =
1389 { 90, 110, 310, 120},
1390 { 90, 120, 295, 130},
1391 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1392 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1393 { 90, 132, 101, 137}, /* end pt just inside l edge */
1394 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1395 {199, 142, 210, 143} /* start pt just inside r edge */
1398 static const RECT wide_lines[] =
1400 {100, 10, 200, 10},
1401 {100, 21, 200, 21},
1402 {200, 40, 100, 40},
1403 {200, 61, 100, 61},
1404 { 10, 100, 10, 200},
1405 { 21, 100, 21, 200},
1406 { 40, 200, 40, 100},
1407 { 61, 200, 61, 100},
1410 static const POINT poly_lines[] =
1412 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1415 static const POINT polypoly_lines[] =
1417 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1420 static const DWORD polypoly_counts[] =
1422 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1425 static const RECT patblt_clips[] =
1427 {120, 120, 140, 126}, /* unclipped */
1428 {100, 130, 140, 136}, /* l edgecase */
1429 { 99, 140, 140, 146}, /* l edgecase clipped */
1430 {180, 130, 200, 136}, /* r edgecase */
1431 {180, 140, 201, 146}, /* r edgecase clipped */
1432 {120, 100, 130, 110}, /* t edgecase */
1433 {140, 99, 150, 110}, /* t edgecase clipped */
1434 {120, 180, 130, 200}, /* b edgecase */
1435 {140, 180, 150, 201}, /* b edgecase */
1436 {199, 150, 210, 156}, /* l edge on r edgecase */
1437 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1438 { 90, 150, 101, 156}, /* r edge on l edgecase */
1439 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1440 {160, 90, 166, 101}, /* b edge on t edgecase */
1441 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1442 {160, 199, 166, 210}, /* t edge on b edgecase */
1443 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1446 static const RECT rectangles[] =
1448 {10, 11, 100, 101},
1449 {250, 100, 350, 10},
1450 {120, 10, 120, 20}, /* zero width */
1451 {120, 10, 130, 10}, /* zero height */
1452 {120, 40, 121, 41}, /* 1 x 1 */
1453 {130, 50, 132, 52}, /* 2 x 2 */
1454 {140, 60, 143, 63}, /* 3 x 3 */
1455 {150, 70, 154, 74}, /* 4 x 4 */
1456 {120, 20, 121, 30}, /* width == 1 */
1457 {130, 20, 132, 30}, /* width == 2 */
1458 {140, 20, 143, 30}, /* width == 3 */
1459 {200, 20, 210, 21}, /* height == 1 */
1460 {200, 30, 210, 32}, /* height == 2 */
1461 {200, 40, 210, 43} /* height == 3 */
1464 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1465 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1466 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1467 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1468 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1469 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1471 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1472 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1473 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1474 0x00, 0x01 }; /* <eod> */
1476 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1477 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1478 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1479 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1481 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1482 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1484 static const RGBQUAD default_palette_1[2] =
1486 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1489 static const RGBQUAD default_palette_4[16] =
1491 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1492 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1493 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1494 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1497 static const RGBQUAD default_palette_8[256] =
1499 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1500 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1501 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1502 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1503 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1504 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1505 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1506 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1507 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1508 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1509 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1510 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1511 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1512 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1513 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1514 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1515 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1516 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1517 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1518 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1519 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1520 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1521 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1522 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1523 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1524 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1525 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1526 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1527 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1528 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1529 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1530 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1531 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1532 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1533 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1534 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1535 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1536 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1537 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1538 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1539 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1540 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1541 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1542 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1543 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1544 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1545 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1546 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1547 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1548 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1549 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1550 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1551 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1552 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1553 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1554 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1555 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1556 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1557 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1558 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1559 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1560 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1561 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1562 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1565 static HPALETTE create_default_palette( int bpp )
1567 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1568 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1569 PALETTEENTRY *entries = pal->palPalEntry;
1570 int i;
1572 pal->palVersion = 0x300;
1573 pal->palNumEntries = 1 << bpp;
1574 switch (bpp)
1576 case 1:
1577 for (i = 0; i < 2; i++)
1579 entries[i].peRed = default_palette_1[i].rgbRed;
1580 entries[i].peGreen = default_palette_1[i].rgbGreen;
1581 entries[i].peBlue = default_palette_1[i].rgbBlue;
1582 entries[i].peFlags = 0;
1584 break;
1585 case 4:
1586 for (i = 0; i < 16; i++)
1588 entries[i].peRed = default_palette_4[i].rgbRed;
1589 entries[i].peGreen = default_palette_4[i].rgbGreen;
1590 entries[i].peBlue = default_palette_4[i].rgbBlue;
1591 entries[i].peFlags = 0;
1593 break;
1594 case 8:
1595 for (i = 0; i < 256; i++)
1597 entries[i].peRed = default_palette_8[i].rgbRed;
1598 entries[i].peGreen = default_palette_8[i].rgbGreen;
1599 entries[i].peBlue = default_palette_8[i].rgbBlue;
1600 entries[i].peFlags = 0;
1602 break;
1604 return CreatePalette( pal );
1607 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1609 HBRUSH brush = CreateSolidBrush( color );
1610 brush = SelectObject( hdc, brush );
1611 PatBlt( hdc, x, y, width, height, PATCOPY );
1612 DeleteObject( SelectObject( hdc, brush ) );
1615 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1617 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1618 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1619 PALETTEENTRY *entries = pal->palPalEntry;
1620 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1621 LOGBRUSH log_brush;
1622 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1623 HBITMAP bmp;
1624 INT i, j, x, y, hatch_style;
1625 HDC src_dc;
1626 HRGN hrgn, hrgn2;
1627 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1628 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1629 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1630 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1631 RGBQUAD *brush_colors = brush_bi->bmiColors;
1632 BYTE *brush_bits, *src_bits;
1633 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1634 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1635 BLENDFUNCTION blend;
1636 COLORREF old_text, old_bkgnd;
1637 HPALETTE hpal, old_hpal;
1639 blend.BlendOp = AC_SRC_OVER;
1640 blend.BlendFlags = 0;
1642 reset_bounds( hdc );
1644 memset(bits, 0xcc, get_dib_size(bmi));
1645 compare_hash(hdc, bmi, bits, "empty");
1647 src_dc = CreateCompatibleDC( 0 );
1648 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1649 orig_pen = SelectObject(hdc, solid_pen);
1650 SetBrushOrgEx(hdc, 0, 0, NULL);
1652 /* horizontal and vertical lines */
1653 for(i = 1; i <= 16; i++)
1655 SetROP2(hdc, i);
1656 MoveToEx(hdc, 10, i * 3, NULL);
1657 LineTo(hdc, 100, i * 3); /* l -> r */
1658 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1659 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1660 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1661 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1662 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1663 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1665 compare_hash(hdc, bmi, bits, "h and v solid lines");
1667 /* diagonal lines */
1668 SetROP2(hdc, R2_COPYPEN);
1669 for(i = 0; i < 16; i++)
1671 double s = sin(M_PI * i / 8.0);
1672 double c = cos(M_PI * i / 8.0);
1674 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1675 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1677 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1679 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1681 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1682 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1684 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1686 /* solid brush PatBlt */
1687 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1688 orig_brush = SelectObject(hdc, solid_brush);
1690 for(i = 0, y = 10; i < 256; i++)
1692 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1694 if(rop_uses_src(rop3[i]))
1695 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1696 else
1698 ok(ret, "got FALSE for %x\n", rop3[i]);
1699 y += 20;
1703 compare_hash(hdc, bmi, bits, "solid patblt");
1705 /* clipped lines */
1706 hrgn = CreateRectRgn(10, 10, 200, 20);
1707 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1708 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1709 SetRectRgn(hrgn2, 290, 100, 300, 200);
1710 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1711 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1712 DeleteObject(hrgn2);
1714 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1716 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1717 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1719 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1721 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1723 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1724 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1726 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1728 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1730 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1731 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1733 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1735 /* clipped PatBlt */
1736 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1738 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1739 patblt_clips[i].right - patblt_clips[i].left,
1740 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1742 compare_hash(hdc, bmi, bits, "clipped patblt");
1744 /* clipped dashed lines */
1745 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1746 SelectObject(hdc, dashed_pen);
1747 SetBkMode(hdc, TRANSPARENT);
1748 SetBkColor(hdc, RGB(0, 0xff, 0));
1750 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1752 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1753 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1755 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1757 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1759 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1760 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1762 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1764 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1766 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1767 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1769 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1771 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1773 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1774 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1776 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1778 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1780 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1781 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1783 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1785 SetBkMode(hdc, OPAQUE);
1787 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1789 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1790 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1792 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1794 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1796 /* 8888 DIB pattern brush */
1798 brush_bi->bmiHeader = dib_brush_header_8888;
1799 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1800 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1801 brush_bits[2] = 0xff;
1802 brush_bits[6] = 0xff;
1803 brush_bits[14] = 0xff;
1804 brush_bits[65] = 0xff;
1805 brush_bits[69] = 0xff;
1806 brush_bits[72] = 0xff;
1808 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1810 SelectObject(hdc, dib_brush);
1811 SetBrushOrgEx(hdc, 1, 1, NULL);
1813 for(i = 0, y = 10; i < 256; i++)
1815 if(!rop_uses_src(rop3[i]))
1817 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1818 ok(ret, "got FALSE for %x\n", rop3[i]);
1819 y += 25;
1822 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1823 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1824 else
1825 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1827 SelectObject(hdc, orig_brush);
1828 DeleteObject(dib_brush);
1830 /* 8888 bottom-up DIB pattern brush */
1832 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1834 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1836 SelectObject(hdc, dib_brush);
1838 /* This used to set the x origin to 100 as well, but
1839 there's a Windows bug for 24 bpp where the brush's x offset
1840 is incorrectly calculated for rops that involve both D and P */
1841 SetBrushOrgEx(hdc, 4, 100, NULL);
1843 for(i = 0, y = 10; i < 256; i++)
1845 if(!rop_uses_src(rop3[i]))
1847 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1848 ok(ret, "got FALSE for %x\n", rop3[i]);
1849 y += 25;
1852 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1853 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1854 else
1855 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1857 SelectObject(hdc, orig_brush);
1858 DeleteObject(dib_brush);
1860 /* 24 bpp dib pattern brush */
1862 brush_bi->bmiHeader = dib_brush_header_24;
1863 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1864 memset(brush_bits, 0, 16 * 16 * 3);
1865 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1866 brush_bits[49] = brush_bits[52] = 0xff;
1868 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1870 SelectObject(hdc, dib_brush);
1871 SetBrushOrgEx(hdc, 1, 1, NULL);
1873 for(i = 0, y = 10; i < 256; i++)
1875 if(!rop_uses_src(rop3[i]))
1877 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1878 ok(ret, "got FALSE for %x\n", rop3[i]);
1879 y += 25;
1882 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1883 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1884 else
1885 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1887 SelectObject(hdc, orig_brush);
1888 DeleteObject(dib_brush);
1890 /* 555 dib pattern brush */
1892 brush_bi->bmiHeader = dib_brush_header_555;
1893 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1894 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1895 brush_bits[0] = brush_bits[1] = 0xff;
1896 brush_bits[32] = brush_bits[34] = 0x7c;
1898 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1900 SelectObject(hdc, dib_brush);
1901 SetBrushOrgEx(hdc, 1, 1, NULL);
1903 for(i = 0, y = 10; i < 256; i++)
1905 if(!rop_uses_src(rop3[i]))
1907 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1908 ok(ret, "got FALSE for %x\n", rop3[i]);
1909 y += 25;
1912 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1913 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1914 else
1915 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1917 SelectObject(hdc, orig_brush);
1918 DeleteObject(dib_brush);
1920 SetBrushOrgEx(hdc, 0, 0, NULL);
1922 /* 8 bpp dib pattern brush */
1924 brush_bi->bmiHeader = dib_brush_header_8;
1925 brush_bi->bmiHeader.biClrUsed = 3;
1926 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1927 brush_colors[0].rgbRed = 0xff;
1928 brush_colors[1].rgbRed = 0xff;
1929 brush_colors[1].rgbGreen = 0xff;
1930 brush_colors[1].rgbBlue = 0xff;
1932 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1933 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1934 brush_bits[0] = brush_bits[1] = 1;
1935 brush_bits[16] = brush_bits[17] = 2;
1936 brush_bits[32] = brush_bits[33] = 6;
1938 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1940 SelectObject(hdc, dib_brush);
1941 SetBrushOrgEx(hdc, 1, 1, NULL);
1943 for(i = 0, y = 10; i < 256; i++)
1945 if(!rop_uses_src(rop3[i]))
1947 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1948 ok(ret, "got FALSE for %x\n", rop3[i]);
1949 y += 25;
1952 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1954 SelectObject(hdc, orig_brush);
1955 DeleteObject(dib_brush);
1957 /* 4 bpp dib pattern brush */
1959 brush_bi->bmiHeader = dib_brush_header_4;
1960 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1962 SelectObject(hdc, dib_brush);
1963 SetBrushOrgEx(hdc, 1, 1, NULL);
1965 for(i = 0, y = 10; i < 256; i++)
1967 if(!rop_uses_src(rop3[i]))
1969 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1970 ok(ret, "got FALSE for %x\n", rop3[i]);
1971 y += 25;
1974 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1976 SelectObject(hdc, orig_brush);
1977 DeleteObject(dib_brush);
1979 /* 1 bpp dib pattern brush */
1981 brush_bi->bmiHeader = dib_brush_header_1;
1982 brush_bi->bmiHeader.biClrUsed = 2;
1983 memset(brush_bits, 0, 16 * 4);
1984 brush_bits[0] = 0xf0;
1985 brush_bits[4] = 0xf0;
1986 brush_bits[8] = 0xf0;
1988 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1989 SelectObject(hdc, dib_brush);
1990 for(i = 0, y = 10; i < 256; i++)
1992 if(!rop_uses_src(rop3[i]))
1994 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1995 ok(ret, "got FALSE for %x\n", rop3[i]);
1996 y += 25;
2000 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
2002 SelectObject(hdc, orig_brush);
2003 DeleteObject(dib_brush);
2005 /* 1 bpp ddb pattern brush */
2007 old_text = GetTextColor( hdc );
2008 old_bkgnd = GetBkColor( hdc );
2009 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2010 dib_brush = CreatePatternBrush( bmp );
2011 SelectObject(hdc, dib_brush);
2012 for(i = 0, y = 10; i < 256; i++)
2014 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2015 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2016 if(!rop_uses_src(rop3[i]))
2018 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2019 ok(ret, "got FALSE for %x\n", rop3[i]);
2020 y += 25;
2024 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
2026 DeleteObject(bmp);
2027 SelectObject(hdc, orig_brush);
2028 DeleteObject( dib_brush );
2029 SetBrushOrgEx(hdc, 0, 0, NULL);
2030 SetTextColor(hdc, old_text);
2031 SetBkColor(hdc, old_bkgnd);
2033 /* Rectangle */
2035 SelectObject(hdc, solid_pen);
2036 SelectObject(hdc, solid_brush);
2038 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2040 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
2043 SelectObject(hdc, dashed_pen);
2044 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2046 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
2049 compare_hash(hdc, bmi, bits, "rectangles");
2050 SelectObject(hdc, solid_pen);
2052 /* PaintRgn */
2054 PaintRgn(hdc, hrgn);
2055 compare_hash(hdc, bmi, bits, "PaintRgn");
2057 /* RTL rectangles */
2059 if( !pSetLayout )
2061 win_skip("Don't have SetLayout\n");
2062 skip_compare(1);
2064 else
2066 pSetLayout(hdc, LAYOUT_RTL);
2067 PaintRgn(hdc, hrgn);
2068 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
2069 Rectangle(hdc, 100, 250, 110, 260);
2070 compare_hash(hdc, bmi, bits, "rtl");
2072 pSetLayout(hdc, LAYOUT_LTR);
2074 DeleteObject( hrgn );
2076 for(i = 0, y = 10; i < 256; i++)
2078 if(!rop_uses_src(rop3[i]))
2080 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
2082 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
2083 SelectObject(hdc, hatch_brush);
2084 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
2085 ok(ret, "got FALSE for %x\n", rop3[i]);
2086 SelectObject(hdc, orig_brush);
2087 DeleteObject(hatch_brush);
2089 y += 25;
2093 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
2095 /* overlapping blits */
2097 orig_brush = SelectObject(hdc, solid_brush);
2099 Rectangle(hdc, 10, 10, 100, 100);
2100 Rectangle(hdc, 20, 15, 30, 40);
2101 Rectangle(hdc, 15, 15, 20, 20);
2102 Rectangle(hdc, 15, 20, 50, 45);
2103 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2104 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
2106 Rectangle(hdc, 10, 10, 100, 100);
2107 Rectangle(hdc, 20, 15, 30, 40);
2108 Rectangle(hdc, 15, 15, 20, 20);
2109 Rectangle(hdc, 15, 20, 50, 45);
2110 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2111 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2112 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
2113 else
2114 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2116 Rectangle(hdc, 10, 10, 100, 100);
2117 Rectangle(hdc, 20, 15, 30, 40);
2118 Rectangle(hdc, 15, 15, 20, 20);
2119 Rectangle(hdc, 15, 20, 50, 45);
2120 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2121 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2123 Rectangle(hdc, 10, 10, 100, 100);
2124 Rectangle(hdc, 20, 15, 30, 40);
2125 Rectangle(hdc, 15, 15, 20, 20);
2126 Rectangle(hdc, 15, 20, 50, 45);
2127 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2128 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2129 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2130 else
2131 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2133 Rectangle(hdc, 10, 10, 100, 100);
2134 Rectangle(hdc, 20, 15, 30, 40);
2135 Rectangle(hdc, 15, 15, 20, 20);
2136 Rectangle(hdc, 15, 20, 50, 45);
2137 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2138 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2140 Rectangle(hdc, 10, 10, 100, 100);
2141 Rectangle(hdc, 20, 15, 30, 40);
2142 Rectangle(hdc, 15, 15, 20, 20);
2143 Rectangle(hdc, 15, 20, 50, 45);
2144 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2145 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2147 Rectangle(hdc, 10, 10, 100, 100);
2148 Rectangle(hdc, 20, 15, 30, 40);
2149 Rectangle(hdc, 15, 15, 20, 20);
2150 Rectangle(hdc, 15, 20, 50, 45);
2151 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2152 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2153 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2154 else
2155 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2157 Rectangle(hdc, 10, 10, 100, 100);
2158 Rectangle(hdc, 20, 15, 30, 40);
2159 Rectangle(hdc, 15, 15, 20, 20);
2160 Rectangle(hdc, 15, 20, 50, 45);
2161 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2162 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2164 /* blitting with 32-bpp BI_RGB source */
2166 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2167 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2168 src_bi->bmiHeader.biHeight = 256;
2169 src_bi->bmiHeader.biWidth = 256;
2170 src_bi->bmiHeader.biBitCount = 32;
2171 src_bi->bmiHeader.biPlanes = 1;
2172 src_bi->bmiHeader.biCompression = BI_RGB;
2173 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2174 SelectObject( src_dc, bmp );
2175 for (y = 0; y < 256; y++)
2176 for (x = 0; x < 256; x++)
2178 BYTE a = (x + y) * 2;
2179 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2180 BYTE g = (BYTE)(x + y / 3) * a / 255;
2181 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2182 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2185 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2186 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2187 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2188 else
2189 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2191 blend.SourceConstantAlpha = 0xd0;
2192 blend.AlphaFormat = 0;
2193 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2194 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2196 if (!pGdiAlphaBlend) skip_compare(2);
2197 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2199 else
2201 if (!pGdiAlphaBlend) skip_compare(1);
2202 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2205 blend.SourceConstantAlpha = 0xb0;
2206 blend.AlphaFormat = AC_SRC_ALPHA;
2207 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2208 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2210 if (!pGdiAlphaBlend) skip_compare(2);
2211 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2213 else
2215 if (!pGdiAlphaBlend) skip_compare(1);
2216 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2219 /* blitting with 32-bpp r10g10b10 source */
2221 src_bi->bmiHeader.biBitCount = 32;
2222 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2223 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2224 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2225 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2226 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2227 SelectObject( src_dc, bmp );
2228 for (y = 0; y < 256; y++)
2229 for (x = 0; x < 256; x++)
2231 WORD r = (7 * x + 3 * y) % 1024;
2232 WORD g = (11 * x + y / 3) % 1024;
2233 WORD b = (x / 3 + 9 * y) % 1024;
2234 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2237 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2238 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2239 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2240 else
2241 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2243 /* blitting with 32-bpp b6g6r6 source */
2245 src_bi->bmiHeader.biBitCount = 32;
2246 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2247 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2248 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2249 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2250 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2251 SelectObject( src_dc, bmp );
2252 for (y = 0; y < 256; y++)
2253 for (x = 0; x < 256; x++)
2255 BYTE r = (y + 2 * x) % 64;
2256 BYTE g = (x + y / 3) % 64;
2257 BYTE b = (x / 3 + 2 * y) % 64;
2258 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2261 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2262 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2263 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2264 else
2265 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2267 /* blitting with 24-bpp source */
2269 src_bi->bmiHeader.biBitCount = 24;
2270 src_bi->bmiHeader.biCompression = BI_RGB;
2271 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2272 DeleteObject( SelectObject( src_dc, bmp ) );
2273 for (y = 0; y < 256; y++)
2274 for (x = 0; x < 256; x++)
2276 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2277 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2278 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2281 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2282 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2283 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2284 else
2285 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2287 blend.SourceConstantAlpha = 0xe0;
2288 blend.AlphaFormat = 0;
2289 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2290 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2292 if (!pGdiAlphaBlend) skip_compare(2);
2293 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2295 else
2297 if (!pGdiAlphaBlend) skip_compare(1);
2298 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2301 /* blitting with 16-bpp BI_RGB source */
2303 src_bi->bmiHeader.biBitCount = 16;
2304 src_bi->bmiHeader.biCompression = BI_RGB;
2305 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2306 DeleteObject( SelectObject( src_dc, bmp ) );
2307 for (y = 0; y < 256; y++)
2308 for (x = 0; x < 256; x++)
2309 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2311 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2312 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2313 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2314 else
2315 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2317 /* blitting with 16-bpp b4g4r4 source */
2319 src_bi->bmiHeader.biBitCount = 16;
2320 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2321 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2322 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2323 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2324 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2325 DeleteObject( SelectObject( src_dc, bmp ) );
2326 for (y = 0; y < 256; y++)
2327 for (x = 0; x < 256; x++)
2328 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2330 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2331 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2332 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2333 else
2334 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2336 /* blitting with 8-bpp source */
2338 src_bi->bmiHeader.biBitCount = 8;
2339 src_bi->bmiHeader.biCompression = BI_RGB;
2340 src_bi->bmiHeader.biClrUsed = 160;
2341 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2342 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2343 DeleteObject( SelectObject( src_dc, bmp ) );
2344 for (y = 0; y < 256; y++)
2345 for (x = 0; x < 256; x++)
2346 src_bits[y * 256 + x] = 3 * x + 5 * y;
2348 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2349 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2351 blend.SourceConstantAlpha = 0xd0;
2352 blend.AlphaFormat = 0;
2353 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2354 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2356 if (!pGdiAlphaBlend) skip_compare(2);
2357 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2359 else
2361 if (!pGdiAlphaBlend) skip_compare(1);
2362 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2365 /* blitting with 4-bpp source */
2367 src_bi->bmiHeader.biBitCount = 4;
2368 src_bi->bmiHeader.biClrUsed = 12;
2369 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2370 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2371 DeleteObject( SelectObject( src_dc, bmp ) );
2372 for (y = 0; y < 256; y++)
2373 for (x = 0; x < 256; x += 2)
2374 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2376 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2377 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2379 /* blitting with 1-bpp source */
2381 src_bi->bmiHeader.biBitCount = 1;
2382 src_bi->bmiHeader.biClrUsed = 0;
2383 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2384 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2385 DeleteObject( SelectObject( src_dc, bmp ) );
2386 for (y = 0; y < 256; y++)
2387 for (x = 0; x < 256; x += 8)
2388 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2390 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2391 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2393 blend.SourceConstantAlpha = 0x90;
2394 blend.AlphaFormat = 0;
2395 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2396 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2398 if (!pGdiAlphaBlend) skip_compare(2);
2399 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2401 else
2403 if (!pGdiAlphaBlend) skip_compare(1);
2404 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2407 DeleteDC( src_dc );
2408 DeleteObject( bmp );
2410 /* RLE StretchDIBits */
2411 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2412 src_bi->bmiHeader.biWidth = 8;
2413 src_bi->bmiHeader.biHeight = 8;
2414 src_bi->bmiHeader.biPlanes = 1;
2415 src_bi->bmiHeader.biBitCount = 8;
2416 src_bi->bmiHeader.biCompression = BI_RLE8;
2417 src_bi->bmiHeader.biClrUsed = 0;
2418 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2420 for (i = 0; i < 256; i++)
2422 src_bi->bmiColors[i].rgbRed = i;
2423 src_bi->bmiColors[i].rgbGreen = i;
2424 src_bi->bmiColors[i].rgbBlue = i;
2425 src_bi->bmiColors[i].rgbReserved = 0;
2428 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2429 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2430 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2431 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2432 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2433 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2435 /* 32 bpp StretchDIBits */
2437 src_bi->bmiHeader.biWidth = 4;
2438 src_bi->bmiHeader.biHeight = 4;
2439 src_bi->bmiHeader.biPlanes = 1;
2440 src_bi->bmiHeader.biBitCount = 32;
2441 src_bi->bmiHeader.biCompression = BI_RGB;
2442 src_bi->bmiHeader.biClrUsed = 0;
2443 src_bi->bmiHeader.biSizeImage = 0;
2445 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2446 ok(ret == 4, "got %d\n", ret);
2447 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2448 ok(ret == 4, "got %d\n", ret);
2449 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2450 ok(ret == 4, "got %d\n", ret);
2451 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2452 ok(ret == 4, "got %d\n", ret);
2453 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2454 ok(ret == 4, "got %d\n", ret);
2455 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2456 ok(ret == 4, "got %d\n", ret);
2458 src_bi->bmiHeader.biHeight = -4;
2460 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2461 ok(ret == 4, "got %d\n", ret);
2462 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2463 ok(ret == -4, "got %d\n", ret);
2464 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2465 ok(ret == 4, "got %d\n", ret);
2466 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2467 ok(ret == -4, "got %d\n", ret);
2468 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2469 ok(ret == 4, "got %d\n", ret);
2470 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2471 ok(ret == -4, "got %d\n", ret);
2473 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2475 /* Solid colors */
2476 for (i = 0; i < 256; i++)
2478 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2479 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2480 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2481 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2482 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2485 /* A few extra colors that are interesting in the 1bpp case */
2487 /* bk color */
2488 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2489 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2491 /* color 0 */
2492 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2493 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2495 /* color 1 */
2496 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2497 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2499 compare_hash(hdc, bmi, bits, "Colors");
2501 for (i = 0; i < 256; i++)
2503 COLORREF s, g;
2504 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2505 g = GetPixel( hdc, i * 2, 10 );
2506 ok( s == g, "got %08x and %08x\n", s, g );
2508 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2509 g = GetPixel( hdc, i * 2, 20 );
2510 ok( s == g, "got %08x and %08x\n", s, g );
2512 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2513 g = GetPixel( hdc, i * 2, 30 );
2514 ok( s == g, "got %08x and %08x\n", s, g );
2516 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2517 g = GetPixel( hdc, i * 2, 40 );
2518 ok( s == g, "got %08x and %08x\n", s, g );
2520 for (j = 0; j < 256; j++)
2522 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2523 g = GetPixel( hdc, i * 2, 50+j );
2524 ok( s == g, "got %08x and %08x\n", s, g );
2526 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2527 g = GetPixel( hdc, i * 2 + 1, 50+j );
2528 ok( s == g, "got %08x and %08x\n", s, g );
2532 compare_hash(hdc, bmi, bits, "SetPixel");
2534 /* gradients */
2536 if (pGdiGradientFill)
2538 TRIVERTEX vrect[] =
2540 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2541 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2542 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2543 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2545 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2547 TRIVERTEX vtri[] =
2549 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2550 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2551 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2553 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2554 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2555 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2557 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2558 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2559 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2561 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2562 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2563 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2565 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2566 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2567 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2569 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2570 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2571 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2573 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2574 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2575 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2577 GRADIENT_TRIANGLE tri[] =
2579 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2580 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2583 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2584 for (i = 0; i < 4; i++) vrect[i].y += 250;
2585 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2587 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2588 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2589 else
2590 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2592 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2593 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2594 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2595 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2596 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2597 else
2598 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2600 else
2602 win_skip( "GdiGradientFill not supported\n" );
2603 skip_compare(1);
2604 skip_compare(1);
2607 /* wide pen */
2609 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2610 SelectObject( hdc, wide_pen );
2612 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2614 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2615 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2618 compare_hash(hdc, bmi, bits, "wide pen" );
2620 SelectObject( hdc, orig_pen );
2621 DeleteObject( wide_pen );
2623 log_brush.lbStyle = BS_SOLID;
2624 log_brush.lbColor = RGB(0xff, 0, 0);
2625 log_brush.lbHatch = 0;
2627 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2628 9, &log_brush, 0, NULL );
2629 SelectObject( hdc, wide_pen );
2631 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2632 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2634 SelectObject( hdc, orig_pen );
2635 DeleteObject( wide_pen );
2637 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2638 16, &log_brush, 0, NULL );
2639 SelectObject( hdc, wide_pen );
2641 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2642 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2644 SelectObject( hdc, orig_pen );
2645 DeleteObject( wide_pen );
2647 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2648 9, &log_brush, 0, NULL );
2649 SelectObject( hdc, wide_pen );
2651 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2652 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2654 SelectObject( hdc, orig_pen );
2655 DeleteObject( wide_pen );
2657 /* brushed wide pen */
2659 old_text = GetTextColor( hdc );
2660 old_bkgnd = GetBkColor( hdc );
2661 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2662 log_brush.lbStyle = BS_PATTERN;
2663 log_brush.lbColor = 0;
2664 log_brush.lbHatch = (ULONG_PTR)bmp;
2665 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2666 12, &log_brush, 0, NULL );
2667 ok( wide_pen != 0, "failed to create pen\n" );
2668 SelectObject( hdc, wide_pen );
2669 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2671 for (i = 1; i < 20; i++)
2673 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2674 i, &log_brush, 0, NULL );
2675 ok( wide_pen != 0, "failed to create pen\n" );
2676 DeleteObject( SelectObject( hdc, wide_pen ));
2677 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2678 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2679 MoveToEx( hdc, 10 * i, 10, NULL );
2680 LineTo( hdc, 10 * i, 200 + i );
2681 LineTo( hdc, 20 * i, 200 + i );
2683 /* NT4 broken for all cases, W2K for 1 bpp only */
2684 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2686 for (i = 1; i < 20; i++)
2688 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2689 i, &log_brush, 0, NULL );
2690 DeleteObject( SelectObject( hdc, wide_pen ));
2691 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2692 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2693 MoveToEx( hdc, 10 * i, 10, NULL );
2694 LineTo( hdc, 10 * i, 200 + i );
2695 LineTo( hdc, 20 * i, 200 + i );
2697 /* NT4 broken for all cases, W2K for 1 bpp only */
2698 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2700 DeleteObject(bmp);
2701 SetTextColor(hdc, old_text);
2702 SetBkColor(hdc, old_bkgnd);
2703 SelectObject( hdc, orig_pen );
2705 /* PALETTEINDEX */
2707 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2708 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2709 SetTextColor( hdc, PALETTEINDEX(38) );
2710 SetBkColor( hdc, PALETTEINDEX(9) );
2711 SelectObject( hdc, solid_brush );
2712 SelectObject( hdc, solid_pen );
2714 pal->palVersion = 0x300;
2715 pal->palNumEntries = 40;
2716 for (i = 0; i < 80; i++)
2718 entries[i].peRed = i * 3;
2719 entries[i].peGreen = i * 7;
2720 entries[i].peBlue = 128 - i;
2721 entries[i].peFlags = 0;
2723 hpal = CreatePalette( pal );
2724 old_hpal = SelectPalette( hdc, hpal, FALSE );
2726 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2727 Rectangle( hdc, 0, 0, 10, 10 );
2728 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2729 Rectangle( hdc, 10, 0, 10, 10 );
2730 SelectObject( hdc, orig_brush );
2731 DeleteObject( solid_brush );
2733 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2734 DeleteObject( SelectObject( hdc, solid_brush ));
2735 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2736 SetPaletteEntries( hpal, 0, 40, entries );
2737 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2738 SelectObject( hdc, orig_brush );
2739 DeleteObject( solid_brush );
2741 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2742 dib_brush = CreatePatternBrush( bmp );
2743 SelectObject( hdc, dib_brush );
2744 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2745 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2746 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2747 DeleteObject( bmp );
2748 SelectObject( hdc, orig_brush );
2749 DeleteObject( dib_brush );
2751 SelectPalette( hdc, old_hpal, FALSE );
2752 DeleteObject( hpal );
2754 /* NT4 broken for all cases, W2K for 1 bpp only */
2755 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2757 /* ExtFloodFill */
2759 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2760 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2761 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2762 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2763 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2765 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2766 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2767 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2768 DeleteObject( hrgn );
2770 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2771 SelectObject( hdc, solid_brush );
2773 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2774 ok (ret, "got ret %d\n", ret);
2775 compare_hash(hdc, bmi, bits, "flood fill" );
2777 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2779 SelectObject(hdc, orig_brush);
2780 SelectObject(hdc, orig_pen);
2781 DeleteObject(solid_brush);
2782 DeleteObject(wide_pen);
2783 DeleteObject(dashed_pen);
2784 DeleteObject(solid_pen);
2787 static const BYTE ramp[17] =
2789 0, 0x4d, 0x68, 0x7c,
2790 0x8c, 0x9a, 0xa7, 0xb2,
2791 0xbd, 0xc7, 0xd0, 0xd9,
2792 0xe1, 0xe9, 0xf0, 0xf8,
2793 0xff
2796 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2798 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2799 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2802 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2804 BYTE min_comp, max_comp;
2806 if (alpha == 16) return text;
2807 if (alpha <= 1) return dst;
2808 if (text == dst) return dst;
2810 get_range( alpha, text, &min_comp, &max_comp );
2812 if (dst > text)
2814 DWORD diff = dst - text;
2815 DWORD range = max_comp - text;
2816 dst = text + (diff * range ) / (0xff - text);
2817 return dst;
2819 else
2821 DWORD diff = text - dst;
2822 DWORD range = text - min_comp ;
2823 dst = text - (diff * range) / text;
2824 return dst;
2828 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2830 COLORREF ret;
2832 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2833 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2834 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2835 return ret;
2838 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2840 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2842 DWORD dib_size = get_dib_size(bmi), ret;
2843 LOGFONTA lf;
2844 HFONT font;
2845 GLYPHMETRICS gm;
2846 BYTE g_buf[10000];
2847 int i, stride, x, y;
2848 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2849 char *eto_hash = NULL, *diy_hash = NULL;
2850 static const char str[] = "Hello Wine";
2851 POINT origin, g_org;
2852 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2853 TEXTMETRICA tm;
2854 COLORREF text_color;
2856 for(i = 0; i < dib_size; i++)
2857 bits[i] = vals[i % 4];
2859 memset( &lf, 0, sizeof(lf) );
2860 strcpy( lf.lfFaceName, "Tahoma" );
2861 lf.lfHeight = 24;
2862 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2864 font = CreateFontIndirectA( &lf );
2865 font = SelectObject( hdc, font );
2867 GetTextMetricsA( hdc, &tm );
2868 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2870 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2871 DeleteObject( SelectObject( hdc, font ) );
2872 return;
2875 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2876 SetTextAlign( hdc, TA_BASELINE );
2877 SetBkMode( hdc, TRANSPARENT );
2878 origin.x = 10;
2879 origin.y = 100;
2881 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2882 eto_hash = hash_dib( bmi, bits );
2884 for(i = 0; i < dib_size; i++)
2885 bits[i] = vals[i % 4];
2887 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2889 text_color = GetTextColor( hdc );
2890 for (i = 0; i < strlen(str); i++)
2892 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2894 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2896 if (ret == GDI_ERROR) continue;
2898 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2900 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2901 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2903 origin.x += gm.gmCellIncX;
2904 origin.y += gm.gmCellIncY;
2906 if (!ret) continue;
2908 if (aa)
2910 stride = (gm.gmBlackBoxX + 3) & ~3;
2912 for (y = 0; y < gm.gmBlackBoxY; y++)
2914 BYTE *g_ptr = g_buf + y * stride;
2915 COLORREF val;
2917 for (x = 0; x < gm.gmBlackBoxX; x++)
2919 if (g_ptr[x] <= 1) continue;
2920 if (g_ptr[x] >= 16) val = text_color;
2921 else
2923 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2924 val = aa_colorref( val, text_color, g_ptr[x] );
2926 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2930 else
2932 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2934 for (y = 0; y < gm.gmBlackBoxY; y++)
2936 BYTE *g_ptr = g_buf + y * stride;
2937 for (x = 0; x < gm.gmBlackBoxX; x++)
2939 if (g_ptr[x / 8] & masks[x % 8])
2940 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2946 diy_hash = hash_dib( bmi, bits );
2947 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2949 HeapFree( GetProcessHeap(), 0, diy_hash );
2950 HeapFree( GetProcessHeap(), 0, eto_hash );
2952 font = SelectObject( hdc, font );
2953 DeleteObject( font );
2956 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
2958 draw_text_2( hdc, bmi, bits, FALSE );
2960 /* Rounding errors make these cases hard to test */
2961 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2962 (bmi->bmiHeader.biBitCount == 16))
2963 return;
2965 draw_text_2( hdc, bmi, bits, TRUE );
2968 static void test_simple_graphics(void)
2970 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2971 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2972 RGBQUAD *colors = bmi->bmiColors;
2973 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2974 HDC mem_dc;
2975 BYTE *bits;
2976 HBITMAP dib, orig_bm;
2977 DIBSECTION ds;
2978 HPALETTE default_palette, old_hpal;
2979 int i;
2981 mem_dc = CreateCompatibleDC(NULL);
2983 /* a8r8g8b8 */
2984 trace("8888\n");
2985 memset(bmi, 0, sizeof(bmibuf));
2986 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2987 bmi->bmiHeader.biHeight = 512;
2988 bmi->bmiHeader.biWidth = 512;
2989 bmi->bmiHeader.biBitCount = 32;
2990 bmi->bmiHeader.biPlanes = 1;
2991 bmi->bmiHeader.biCompression = BI_RGB;
2993 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2994 ok(dib != NULL, "ret NULL\n");
2995 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2996 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2997 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2998 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2999 ok(ds.dsBmih.biCompression == BI_RGB ||
3000 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
3001 "got %x\n", ds.dsBmih.biCompression);
3003 orig_bm = SelectObject(mem_dc, dib);
3005 default_palette = create_default_palette( 8 );
3006 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
3008 dst_format = "8888";
3009 current_sha1 = sha1_graphics_a8r8g8b8;
3010 draw_graphics(mem_dc, bmi, bits);
3011 draw_text(mem_dc, bmi, bits);
3013 SelectObject(mem_dc, orig_bm);
3014 DeleteObject(dib);
3016 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
3017 trace("8888 - bitfields\n");
3018 bmi->bmiHeader.biBitCount = 32;
3019 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3020 bit_fields[0] = 0xff0000;
3021 bit_fields[1] = 0x00ff00;
3022 bit_fields[2] = 0x0000ff;
3024 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3025 ok(dib != NULL, "ret NULL\n");
3026 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3027 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
3028 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3029 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
3030 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3032 orig_bm = SelectObject(mem_dc, dib);
3033 SelectPalette( mem_dc, default_palette, FALSE );
3035 dst_format = "8888 - bitfields";
3036 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
3037 draw_graphics(mem_dc, bmi, bits);
3038 draw_text(mem_dc, bmi, bits);
3040 SelectObject(mem_dc, orig_bm);
3041 DeleteObject(dib);
3043 /* a8b8g8r8. */
3044 trace("a8b8g8r8\n");
3045 bmi->bmiHeader.biBitCount = 32;
3046 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3047 bit_fields[0] = 0x0000ff;
3048 bit_fields[1] = 0x00ff00;
3049 bit_fields[2] = 0xff0000;
3051 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3052 ok(dib != NULL, "ret NULL\n");
3053 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3054 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
3055 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3056 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
3057 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3059 orig_bm = SelectObject(mem_dc, dib);
3061 dst_format = "a8b8g8r8";
3062 current_sha1 = sha1_graphics_a8b8g8r8;
3063 draw_graphics(mem_dc, bmi, bits);
3064 draw_text(mem_dc, bmi, bits);
3066 SelectObject(mem_dc, orig_bm);
3067 DeleteObject(dib);
3069 /* r10g10b10. */
3070 trace("r10g10b10\n");
3071 bmi->bmiHeader.biBitCount = 32;
3072 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3073 bit_fields[0] = 0x3ff00000;
3074 bit_fields[1] = 0x000ffc00;
3075 bit_fields[2] = 0x000003ff;
3077 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3078 ok(dib != NULL, "ret NULL\n");
3079 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3080 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3081 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3082 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3083 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3085 orig_bm = SelectObject(mem_dc, dib);
3087 dst_format = "r10g10b10";
3088 current_sha1 = sha1_graphics_r10g10b10;
3089 draw_graphics(mem_dc, bmi, bits);
3090 draw_text(mem_dc, bmi, bits);
3092 SelectObject(mem_dc, orig_bm);
3093 DeleteObject(dib);
3095 /* r6g6b6. */
3096 trace("r6g6b6\n");
3097 bmi->bmiHeader.biBitCount = 32;
3098 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3099 bit_fields[0] = 0x0003f000;
3100 bit_fields[1] = 0x00000fc0;
3101 bit_fields[2] = 0x0000003f;
3103 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3104 ok(dib != NULL, "ret NULL\n");
3105 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3106 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3107 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3108 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3109 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3111 orig_bm = SelectObject(mem_dc, dib);
3113 dst_format = "r6g6b6";
3114 current_sha1 = sha1_graphics_r6g6b6;
3115 draw_graphics(mem_dc, bmi, bits);
3116 draw_text(mem_dc, bmi, bits);
3118 SelectObject(mem_dc, orig_bm);
3119 DeleteObject(dib);
3121 /* 24 */
3122 trace("24\n");
3123 bmi->bmiHeader.biBitCount = 24;
3124 bmi->bmiHeader.biCompression = BI_RGB;
3126 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3127 ok(dib != NULL, "ret NULL\n");
3128 orig_bm = SelectObject(mem_dc, dib);
3130 dst_format = "24";
3131 current_sha1 = sha1_graphics_24;
3132 draw_graphics(mem_dc, bmi, bits);
3133 draw_text(mem_dc, bmi, bits);
3135 SelectObject(mem_dc, orig_bm);
3136 DeleteObject(dib);
3138 /* r5g5b5 */
3139 trace("555\n");
3140 bmi->bmiHeader.biBitCount = 16;
3141 bmi->bmiHeader.biCompression = BI_RGB;
3143 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3144 ok(dib != NULL, "ret NULL\n");
3145 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3146 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3147 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3148 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3149 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3151 orig_bm = SelectObject(mem_dc, dib);
3153 dst_format = "r5g5b5";
3154 current_sha1 = sha1_graphics_r5g5b5;
3155 draw_graphics(mem_dc, bmi, bits);
3156 draw_text(mem_dc, bmi, bits);
3158 SelectObject(mem_dc, orig_bm);
3159 DeleteObject(dib);
3161 /* r4g4b4 */
3162 trace("444\n");
3163 bmi->bmiHeader.biBitCount = 16;
3164 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3165 bit_fields[0] = 0x0f00;
3166 bit_fields[1] = 0x00f0;
3167 bit_fields[2] = 0x000f;
3168 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3169 ok(dib != NULL, "ret NULL\n");
3170 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3171 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3172 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3173 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3174 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3176 orig_bm = SelectObject(mem_dc, dib);
3178 dst_format = "r4g4b4";
3179 current_sha1 = sha1_graphics_r4g4b4;
3180 draw_graphics(mem_dc, bmi, bits);
3181 draw_text(mem_dc, bmi, bits);
3183 SelectObject(mem_dc, orig_bm);
3184 DeleteObject(dib);
3186 /* 8 color */
3187 trace("8 color\n");
3188 bmi->bmiHeader.biBitCount = 8;
3189 bmi->bmiHeader.biCompression = BI_RGB;
3190 bmi->bmiHeader.biClrUsed = 236;
3191 for (i = 0; i < 236; i++)
3193 colors[i].rgbRed = (i & 0x07) << 5;
3194 colors[i].rgbGreen = (i & 0x38) << 2;
3195 colors[i].rgbBlue = i & 0xc0;
3197 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3198 ok(dib != NULL, "ret NULL\n");
3200 orig_bm = SelectObject(mem_dc, dib);
3202 dst_format = "8 color";
3203 current_sha1 = sha1_graphics_8_color;
3204 draw_graphics(mem_dc, bmi, bits);
3205 draw_text(mem_dc, bmi, bits);
3207 SelectObject(mem_dc, orig_bm);
3208 DeleteObject(dib);
3210 /* 8 grayscale */
3211 trace("8 grayscale\n");
3212 bmi->bmiHeader.biBitCount = 8;
3213 bmi->bmiHeader.biCompression = BI_RGB;
3214 bmi->bmiHeader.biClrUsed = 256;
3215 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3217 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3218 ok(dib != NULL, "ret NULL\n");
3220 orig_bm = SelectObject(mem_dc, dib);
3222 dst_format = "8 grayscale";
3223 current_sha1 = sha1_graphics_8_grayscale;
3224 draw_graphics(mem_dc, bmi, bits);
3225 draw_text(mem_dc, bmi, bits);
3227 SelectObject(mem_dc, orig_bm);
3228 DeleteObject(dib);
3230 /* 8 */
3231 trace("8\n");
3232 bmi->bmiHeader.biBitCount = 8;
3233 bmi->bmiHeader.biCompression = BI_RGB;
3234 bmi->bmiHeader.biClrUsed = 5;
3235 colors[0].rgbRed = 0xff;
3236 colors[0].rgbGreen = 0xff;
3237 colors[0].rgbBlue = 0xff;
3238 colors[1].rgbRed = 0;
3239 colors[1].rgbGreen = 0;
3240 colors[1].rgbBlue = 0;
3241 colors[2].rgbRed = 0xff;
3242 colors[2].rgbGreen = 0;
3243 colors[2].rgbBlue = 0;
3244 colors[3].rgbRed = 0;
3245 colors[3].rgbGreen = 0xff;
3246 colors[3].rgbBlue = 0;
3247 colors[4].rgbRed = 0;
3248 colors[4].rgbGreen = 0;
3249 colors[4].rgbBlue = 0xff;
3251 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3252 ok(dib != NULL, "ret NULL\n");
3254 orig_bm = SelectObject(mem_dc, dib);
3256 dst_format = "8";
3257 current_sha1 = sha1_graphics_8;
3258 draw_graphics(mem_dc, bmi, bits);
3259 draw_text(mem_dc, bmi, bits);
3261 SelectObject(mem_dc, orig_bm);
3262 DeleteObject(dib);
3264 /* 4 */
3265 trace("4\n");
3266 bmi->bmiHeader.biBitCount = 4;
3268 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3269 ok(dib != NULL, "ret NULL\n");
3271 orig_bm = SelectObject(mem_dc, dib);
3272 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3274 dst_format = "4";
3275 current_sha1 = sha1_graphics_4;
3276 draw_graphics(mem_dc, bmi, bits);
3277 draw_text(mem_dc, bmi, bits);
3279 SelectObject(mem_dc, orig_bm);
3280 DeleteObject(dib);
3282 /* 4 grayscale */
3283 trace("4 grayscale\n");
3284 bmi->bmiHeader.biClrUsed = 16;
3285 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3287 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3288 ok(dib != NULL, "ret NULL\n");
3290 orig_bm = SelectObject(mem_dc, dib);
3292 dst_format = "4 grayscale";
3293 current_sha1 = sha1_graphics_4_grayscale;
3294 draw_graphics(mem_dc, bmi, bits);
3295 draw_text(mem_dc, bmi, bits);
3297 SelectObject(mem_dc, orig_bm);
3298 DeleteObject(dib);
3300 /* 1 */
3301 trace("1\n");
3302 bmi->bmiHeader.biBitCount = 1;
3303 bmi->bmiHeader.biClrUsed = 2;
3305 colors[0].rgbRed = 0x00;
3306 colors[0].rgbGreen = 0x01;
3307 colors[0].rgbBlue = 0xff;
3308 colors[1].rgbRed = 0xff;
3309 colors[1].rgbGreen = 0x00;
3310 colors[1].rgbBlue = 0x00;
3312 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3313 ok(dib != NULL, "ret NULL\n");
3315 orig_bm = SelectObject(mem_dc, dib);
3316 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3318 dst_format = "1";
3319 current_sha1 = sha1_graphics_1;
3320 draw_graphics(mem_dc, bmi, bits);
3321 draw_text(mem_dc, bmi, bits);
3323 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3324 SelectObject(mem_dc, orig_bm);
3325 DeleteObject(dib);
3327 DeleteDC(mem_dc);
3330 START_TEST(dib)
3332 HMODULE mod = GetModuleHandleA("gdi32.dll");
3333 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3334 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3335 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3337 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3339 test_simple_graphics();
3341 CryptReleaseContext(crypt_prov, 0);