d3d9/tests: Add test for regression in IDirect3DDevice9_Reset().
[wine.git] / dlls / gdi32 / tests / dib.c
blobb59c0dd2f742d0559431d3c6dfcab5e87ea5481e
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 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
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 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
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 "9b81ccc2d956d1de019085f971ba19435fe5feae",
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 "1cb0c7d9d89cdbce7b47d19ef0365bb6b2adc831",
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 "c0c41390270ba082ee8211576fee39c676813c42",
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 "33bb75c12f083d799d287fe9caddedbb3892e6fa",
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 "8720478d904a84c24071e97c731c1ba7882b131e",
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 "60c0752f592c6426a2f4a71173b44c5c086f4f2a",
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 "7a9c326a56a94621377a7258be70ba50042ca9a2",
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 "b83f78ae85df87fc7af565db276c60c102274f20",
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 "f751a55fb738b63b6fd7c229c33ef92605d0c9c1",
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 "c93a86adfe58dc2d461f2ed962883d6b90888848",
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 "71a1705ee14068ee8c6c6680c1bd99703fb6abd7",
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 "399e988c922b7fad1c8f6907541c5dda65e60408",
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 { 0, 4, 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 %s,\n", wine_dbgstr_rect( &rect ));
1275 return;
1278 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1279 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect ));
1280 current_bounds++;
1283 static void skip_compare( int count )
1285 current_sha1 += count;
1286 current_bounds++;
1289 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1291 char *hash = hash_dib(bmi, bits);
1292 BOOL ok_cond;
1293 int i;
1295 /* reset the bits for the next test */
1296 memset( bits, 0xcc, get_dib_size(bmi) );
1298 if(!hash)
1300 skip("SHA1 hashing unavailable on this platform\n");
1301 return;
1304 for(i = 0; i <= num_broken; i++)
1306 if(current_sha1[i] == NULL)
1308 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1309 HeapFree(GetProcessHeap(), 0, hash);
1310 return;
1314 ok_cond = !strcmp(hash, *current_sha1);
1316 for(i = 1; i <= num_broken; i++)
1317 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1319 todo_wine_if(todo)
1320 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1321 dst_format, info, *current_sha1, hash );
1323 current_sha1 += num_broken + 1;
1325 HeapFree(GetProcessHeap(), 0, hash);
1327 compare_bounds( hdc, info );
1330 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1332 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1335 static const RECT bias_check[] =
1337 {100, 100, 200, 150},
1338 {100, 100, 150, 200},
1339 {100, 100, 50, 200},
1340 {100, 100, 0, 150},
1341 {100, 100, 0, 50},
1342 {100, 100, 50, 0},
1343 {100, 100, 150, 0},
1344 {100, 100, 200, 50}
1347 static const RECT hline_clips[] =
1349 {120, 120, 140, 120}, /* unclipped */
1350 {100, 122, 140, 122}, /* l edgecase */
1351 { 99, 124, 140, 124}, /* l edgecase clipped */
1352 {120, 126, 200, 126}, /* r edgecase */
1353 {120, 128, 201, 128}, /* r edgecase clipped */
1354 { 99, 130, 201, 130}, /* l and r clipped */
1355 {120, 100, 140, 100}, /* t edgecase */
1356 {120, 99, 140, 99}, /* t edgecase clipped */
1357 {120, 199, 140, 199}, /* b edgecase */
1358 {120, 200, 140, 200}, /* b edgecase clipped */
1359 {120, 132, 310, 132}, /* inside two clip rects */
1360 { 10, 134, 101, 134}, /* r end on l edgecase */
1361 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1362 {199, 138, 220, 138}, /* l end on r edgecase */
1363 {200, 140, 220, 140} /* l end on r edgecase clipped */
1366 static const RECT vline_clips[] =
1368 {120, 120, 120, 140}, /* unclipped */
1369 {100, 120, 100, 140}, /* l edgecase */
1370 { 99, 120, 99, 140}, /* l edgecase clipped */
1371 {199, 120, 199, 140}, /* r edgecase */
1372 {200, 120, 200, 140}, /* r edgecase clipped */
1373 {122, 99, 122, 201}, /* t and b clipped */
1374 {124, 100, 124, 140}, /* t edgecase */
1375 {126, 99, 126, 140}, /* t edgecase clipped */
1376 {128, 120, 128, 200}, /* b edgecase */
1377 {130, 120, 130, 201}, /* b edgecase clipped */
1378 {132, 12, 132, 140}, /* inside two clip rects */
1379 {134, 90, 134, 101}, /* b end on t edgecase */
1380 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1381 {138, 199, 138, 220}, /* t end on b edgecase */
1382 {140, 200, 140, 220} /* t end on b edgecase clipped */
1385 static const RECT line_clips[] =
1387 { 90, 110, 310, 120},
1388 { 90, 120, 295, 130},
1389 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1390 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1391 { 90, 132, 101, 137}, /* end pt just inside l edge */
1392 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1393 {199, 142, 210, 143} /* start pt just inside r edge */
1396 static const RECT wide_lines[] =
1398 {100, 10, 200, 10},
1399 {100, 21, 200, 21},
1400 {200, 40, 100, 40},
1401 {200, 61, 100, 61},
1402 { 10, 100, 10, 200},
1403 { 21, 100, 21, 200},
1404 { 40, 200, 40, 100},
1405 { 61, 200, 61, 100},
1408 static const POINT poly_lines[] =
1410 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1413 static const POINT polypoly_lines[] =
1415 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1418 static const DWORD polypoly_counts[] =
1420 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1423 static const RECT patblt_clips[] =
1425 {120, 120, 140, 126}, /* unclipped */
1426 {100, 130, 140, 136}, /* l edgecase */
1427 { 99, 140, 140, 146}, /* l edgecase clipped */
1428 {180, 130, 200, 136}, /* r edgecase */
1429 {180, 140, 201, 146}, /* r edgecase clipped */
1430 {120, 100, 130, 110}, /* t edgecase */
1431 {140, 99, 150, 110}, /* t edgecase clipped */
1432 {120, 180, 130, 200}, /* b edgecase */
1433 {140, 180, 150, 201}, /* b edgecase */
1434 {199, 150, 210, 156}, /* l edge on r edgecase */
1435 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1436 { 90, 150, 101, 156}, /* r edge on l edgecase */
1437 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1438 {160, 90, 166, 101}, /* b edge on t edgecase */
1439 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1440 {160, 199, 166, 210}, /* t edge on b edgecase */
1441 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1444 static const RECT rectangles[] =
1446 {10, 11, 100, 101},
1447 {250, 100, 350, 10},
1448 {120, 10, 120, 20}, /* zero width */
1449 {120, 10, 130, 10}, /* zero height */
1450 {120, 40, 121, 41}, /* 1 x 1 */
1451 {130, 50, 132, 52}, /* 2 x 2 */
1452 {140, 60, 143, 63}, /* 3 x 3 */
1453 {150, 70, 154, 74}, /* 4 x 4 */
1454 {120, 20, 121, 30}, /* width == 1 */
1455 {130, 20, 132, 30}, /* width == 2 */
1456 {140, 20, 143, 30}, /* width == 3 */
1457 {200, 20, 210, 21}, /* height == 1 */
1458 {200, 30, 210, 32}, /* height == 2 */
1459 {200, 40, 210, 43} /* height == 3 */
1462 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1463 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1464 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1465 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1466 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1467 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1469 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1470 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1471 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1472 0x00, 0x01 }; /* <eod> */
1474 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1475 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1476 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1477 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1479 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1480 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1482 static const RGBQUAD default_palette_1[2] =
1484 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1487 static const RGBQUAD default_palette_4[16] =
1489 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1490 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1491 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1492 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1495 static const RGBQUAD default_palette_8[256] =
1497 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1498 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1499 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1500 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1501 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1502 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1503 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1504 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1505 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1506 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1507 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1508 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1509 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1510 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1511 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1512 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1513 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1514 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1515 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1516 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1517 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1518 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1519 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1520 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1521 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1522 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1523 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1524 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1525 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1526 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1527 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1528 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1529 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1530 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1531 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1532 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1533 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1534 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1535 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1536 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1537 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1538 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1539 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1540 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1541 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1542 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1543 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1544 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1545 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1546 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1547 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1548 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1549 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1550 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1551 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1552 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1553 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1554 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1555 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1556 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1557 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1558 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1559 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1560 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1563 static HPALETTE create_default_palette( int bpp )
1565 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1566 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1567 PALETTEENTRY *entries = pal->palPalEntry;
1568 int i;
1570 pal->palVersion = 0x300;
1571 pal->palNumEntries = 1 << bpp;
1572 switch (bpp)
1574 case 1:
1575 for (i = 0; i < 2; i++)
1577 entries[i].peRed = default_palette_1[i].rgbRed;
1578 entries[i].peGreen = default_palette_1[i].rgbGreen;
1579 entries[i].peBlue = default_palette_1[i].rgbBlue;
1580 entries[i].peFlags = 0;
1582 break;
1583 case 4:
1584 for (i = 0; i < 16; i++)
1586 entries[i].peRed = default_palette_4[i].rgbRed;
1587 entries[i].peGreen = default_palette_4[i].rgbGreen;
1588 entries[i].peBlue = default_palette_4[i].rgbBlue;
1589 entries[i].peFlags = 0;
1591 break;
1592 case 8:
1593 for (i = 0; i < 256; i++)
1595 entries[i].peRed = default_palette_8[i].rgbRed;
1596 entries[i].peGreen = default_palette_8[i].rgbGreen;
1597 entries[i].peBlue = default_palette_8[i].rgbBlue;
1598 entries[i].peFlags = 0;
1600 break;
1602 return CreatePalette( pal );
1605 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1607 HBRUSH brush = CreateSolidBrush( color );
1608 brush = SelectObject( hdc, brush );
1609 PatBlt( hdc, x, y, width, height, PATCOPY );
1610 DeleteObject( SelectObject( hdc, brush ) );
1613 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1615 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1616 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1617 PALETTEENTRY *entries = pal->palPalEntry;
1618 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1619 LOGBRUSH log_brush;
1620 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1621 HBITMAP bmp;
1622 INT i, j, x, y, hatch_style;
1623 HDC src_dc;
1624 HRGN hrgn, hrgn2;
1625 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1626 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1627 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1628 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1629 RGBQUAD *brush_colors = brush_bi->bmiColors;
1630 BYTE *brush_bits, *src_bits;
1631 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1632 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1633 BLENDFUNCTION blend;
1634 COLORREF old_text, old_bkgnd;
1635 HPALETTE hpal, old_hpal;
1637 blend.BlendOp = AC_SRC_OVER;
1638 blend.BlendFlags = 0;
1640 reset_bounds( hdc );
1642 memset(bits, 0xcc, get_dib_size(bmi));
1643 compare_hash(hdc, bmi, bits, "empty");
1645 src_dc = CreateCompatibleDC( 0 );
1646 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1647 orig_pen = SelectObject(hdc, solid_pen);
1648 SetBrushOrgEx(hdc, 0, 0, NULL);
1650 /* horizontal and vertical lines */
1651 for(i = 1; i <= 16; i++)
1653 SetROP2(hdc, i);
1654 MoveToEx(hdc, 10, i * 3, NULL);
1655 LineTo(hdc, 100, i * 3); /* l -> r */
1656 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1657 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1658 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1659 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1660 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1661 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1663 compare_hash(hdc, bmi, bits, "h and v solid lines");
1665 /* diagonal lines */
1666 SetROP2(hdc, R2_COPYPEN);
1667 for(i = 0; i < 16; i++)
1669 double s = sin(M_PI * i / 8.0);
1670 double c = cos(M_PI * i / 8.0);
1672 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1673 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1675 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1677 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1679 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1680 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1682 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1684 /* solid brush PatBlt */
1685 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1686 orig_brush = SelectObject(hdc, solid_brush);
1688 for(i = 0, y = 10; i < 256; i++)
1690 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1692 if(rop_uses_src(rop3[i]))
1693 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1694 else
1696 ok(ret, "got FALSE for %x\n", rop3[i]);
1697 y += 20;
1701 compare_hash(hdc, bmi, bits, "solid patblt");
1703 /* clipped lines */
1704 hrgn = CreateRectRgn(10, 10, 200, 20);
1705 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1706 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1707 SetRectRgn(hrgn2, 290, 100, 300, 200);
1708 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1709 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1710 DeleteObject(hrgn2);
1712 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1714 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1715 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1717 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1719 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1721 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1722 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1724 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1726 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1728 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1729 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1731 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1733 /* clipped PatBlt */
1734 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1736 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1737 patblt_clips[i].right - patblt_clips[i].left,
1738 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1740 compare_hash(hdc, bmi, bits, "clipped patblt");
1742 /* clipped dashed lines */
1743 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1744 SelectObject(hdc, dashed_pen);
1745 SetBkMode(hdc, TRANSPARENT);
1746 SetBkColor(hdc, RGB(0, 0xff, 0));
1748 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1750 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1751 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1753 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1755 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1757 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1758 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1760 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1762 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1764 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1765 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1767 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1769 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1771 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1772 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1774 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1776 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1778 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1779 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1781 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1783 SetBkMode(hdc, OPAQUE);
1785 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1787 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1788 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1790 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1792 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1794 /* 8888 DIB pattern brush */
1796 brush_bi->bmiHeader = dib_brush_header_8888;
1797 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1798 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1799 brush_bits[2] = 0xff;
1800 brush_bits[6] = 0xff;
1801 brush_bits[14] = 0xff;
1802 brush_bits[65] = 0xff;
1803 brush_bits[69] = 0xff;
1804 brush_bits[72] = 0xff;
1806 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1808 SelectObject(hdc, dib_brush);
1809 SetBrushOrgEx(hdc, 1, 1, NULL);
1811 for(i = 0, y = 10; i < 256; i++)
1813 if(!rop_uses_src(rop3[i]))
1815 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1816 ok(ret, "got FALSE for %x\n", rop3[i]);
1817 y += 25;
1820 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1821 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 1, FALSE);
1822 else
1823 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1825 SelectObject(hdc, orig_brush);
1826 DeleteObject(dib_brush);
1828 /* 8888 bottom-up DIB pattern brush */
1830 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1832 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1834 SelectObject(hdc, dib_brush);
1836 /* This used to set the x origin to 100 as well, but
1837 there's a Windows bug for 24 bpp where the brush's x offset
1838 is incorrectly calculated for rops that involve both D and P */
1839 SetBrushOrgEx(hdc, 4, 100, NULL);
1841 for(i = 0, y = 10; i < 256; i++)
1843 if(!rop_uses_src(rop3[i]))
1845 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1846 ok(ret, "got FALSE for %x\n", rop3[i]);
1847 y += 25;
1850 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1851 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", 1, FALSE);
1852 else
1853 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1855 SelectObject(hdc, orig_brush);
1856 DeleteObject(dib_brush);
1858 /* 24 bpp dib pattern brush */
1860 brush_bi->bmiHeader = dib_brush_header_24;
1861 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1862 memset(brush_bits, 0, 16 * 16 * 3);
1863 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1864 brush_bits[49] = brush_bits[52] = 0xff;
1866 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1868 SelectObject(hdc, dib_brush);
1869 SetBrushOrgEx(hdc, 1, 1, NULL);
1871 for(i = 0, y = 10; i < 256; i++)
1873 if(!rop_uses_src(rop3[i]))
1875 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1876 ok(ret, "got FALSE for %x\n", rop3[i]);
1877 y += 25;
1880 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1881 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", 1, FALSE);
1882 else
1883 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1885 SelectObject(hdc, orig_brush);
1886 DeleteObject(dib_brush);
1888 /* 555 dib pattern brush */
1890 brush_bi->bmiHeader = dib_brush_header_555;
1891 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1892 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1893 brush_bits[0] = brush_bits[1] = 0xff;
1894 brush_bits[32] = brush_bits[34] = 0x7c;
1896 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1898 SelectObject(hdc, dib_brush);
1899 SetBrushOrgEx(hdc, 1, 1, NULL);
1901 for(i = 0, y = 10; i < 256; i++)
1903 if(!rop_uses_src(rop3[i]))
1905 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1906 ok(ret, "got FALSE for %x\n", rop3[i]);
1907 y += 25;
1910 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1911 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1912 else
1913 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1915 SelectObject(hdc, orig_brush);
1916 DeleteObject(dib_brush);
1918 SetBrushOrgEx(hdc, 0, 0, NULL);
1920 /* 8 bpp dib pattern brush */
1922 brush_bi->bmiHeader = dib_brush_header_8;
1923 brush_bi->bmiHeader.biClrUsed = 3;
1924 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1925 brush_colors[0].rgbRed = 0xff;
1926 brush_colors[1].rgbRed = 0xff;
1927 brush_colors[1].rgbGreen = 0xff;
1928 brush_colors[1].rgbBlue = 0xff;
1930 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1931 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1932 brush_bits[0] = brush_bits[1] = 1;
1933 brush_bits[16] = brush_bits[17] = 2;
1934 brush_bits[32] = brush_bits[33] = 6;
1936 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1938 SelectObject(hdc, dib_brush);
1939 SetBrushOrgEx(hdc, 1, 1, NULL);
1941 for(i = 0, y = 10; i < 256; i++)
1943 if(!rop_uses_src(rop3[i]))
1945 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1946 ok(ret, "got FALSE for %x\n", rop3[i]);
1947 y += 25;
1950 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1952 SelectObject(hdc, orig_brush);
1953 DeleteObject(dib_brush);
1955 /* 4 bpp dib pattern brush */
1957 brush_bi->bmiHeader = dib_brush_header_4;
1958 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1960 SelectObject(hdc, dib_brush);
1961 SetBrushOrgEx(hdc, 1, 1, NULL);
1963 for(i = 0, y = 10; i < 256; i++)
1965 if(!rop_uses_src(rop3[i]))
1967 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1968 ok(ret, "got FALSE for %x\n", rop3[i]);
1969 y += 25;
1972 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1974 SelectObject(hdc, orig_brush);
1975 DeleteObject(dib_brush);
1977 /* 1 bpp dib pattern brush */
1979 brush_bi->bmiHeader = dib_brush_header_1;
1980 brush_bi->bmiHeader.biClrUsed = 2;
1981 memset(brush_bits, 0, 16 * 4);
1982 brush_bits[0] = 0xf0;
1983 brush_bits[4] = 0xf0;
1984 brush_bits[8] = 0xf0;
1986 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1987 SelectObject(hdc, dib_brush);
1988 for(i = 0, y = 10; i < 256; i++)
1990 if(!rop_uses_src(rop3[i]))
1992 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1993 ok(ret, "got FALSE for %x\n", rop3[i]);
1994 y += 25;
1998 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
2000 SelectObject(hdc, orig_brush);
2001 DeleteObject(dib_brush);
2003 /* 1 bpp ddb pattern brush */
2005 old_text = GetTextColor( hdc );
2006 old_bkgnd = GetBkColor( hdc );
2007 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2008 dib_brush = CreatePatternBrush( bmp );
2009 SelectObject(hdc, dib_brush);
2010 for(i = 0, y = 10; i < 256; i++)
2012 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2013 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2014 if(!rop_uses_src(rop3[i]))
2016 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2017 ok(ret, "got FALSE for %x\n", rop3[i]);
2018 y += 25;
2022 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
2024 DeleteObject(bmp);
2025 SelectObject(hdc, orig_brush);
2026 DeleteObject( dib_brush );
2027 SetBrushOrgEx(hdc, 0, 0, NULL);
2028 SetTextColor(hdc, old_text);
2029 SetBkColor(hdc, old_bkgnd);
2031 /* Rectangle */
2033 SelectObject(hdc, solid_pen);
2034 SelectObject(hdc, solid_brush);
2036 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2038 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
2041 SelectObject(hdc, dashed_pen);
2042 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2044 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
2047 compare_hash(hdc, bmi, bits, "rectangles");
2048 SelectObject(hdc, solid_pen);
2050 /* PaintRgn */
2052 PaintRgn(hdc, hrgn);
2053 compare_hash(hdc, bmi, bits, "PaintRgn");
2055 /* RTL rectangles */
2057 if( !pSetLayout )
2059 win_skip("Don't have SetLayout\n");
2060 skip_compare(1);
2062 else
2064 pSetLayout(hdc, LAYOUT_RTL);
2065 PaintRgn(hdc, hrgn);
2066 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
2067 Rectangle(hdc, 100, 250, 110, 260);
2068 compare_hash(hdc, bmi, bits, "rtl");
2070 pSetLayout(hdc, LAYOUT_LTR);
2072 DeleteObject( hrgn );
2074 for(i = 0, y = 10; i < 256; i++)
2076 if(!rop_uses_src(rop3[i]))
2078 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
2080 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
2081 SelectObject(hdc, hatch_brush);
2082 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
2083 ok(ret, "got FALSE for %x\n", rop3[i]);
2084 SelectObject(hdc, orig_brush);
2085 DeleteObject(hatch_brush);
2087 y += 25;
2091 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
2093 /* overlapping blits */
2095 orig_brush = SelectObject(hdc, solid_brush);
2097 Rectangle(hdc, 10, 10, 100, 100);
2098 Rectangle(hdc, 20, 15, 30, 40);
2099 Rectangle(hdc, 15, 15, 20, 20);
2100 Rectangle(hdc, 15, 20, 50, 45);
2101 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2102 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
2104 Rectangle(hdc, 10, 10, 100, 100);
2105 Rectangle(hdc, 20, 15, 30, 40);
2106 Rectangle(hdc, 15, 15, 20, 20);
2107 Rectangle(hdc, 15, 20, 50, 45);
2108 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2109 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2110 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
2111 else
2112 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2114 Rectangle(hdc, 10, 10, 100, 100);
2115 Rectangle(hdc, 20, 15, 30, 40);
2116 Rectangle(hdc, 15, 15, 20, 20);
2117 Rectangle(hdc, 15, 20, 50, 45);
2118 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2119 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2121 Rectangle(hdc, 10, 10, 100, 100);
2122 Rectangle(hdc, 20, 15, 30, 40);
2123 Rectangle(hdc, 15, 15, 20, 20);
2124 Rectangle(hdc, 15, 20, 50, 45);
2125 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2126 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2127 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2128 else
2129 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2131 Rectangle(hdc, 10, 10, 100, 100);
2132 Rectangle(hdc, 20, 15, 30, 40);
2133 Rectangle(hdc, 15, 15, 20, 20);
2134 Rectangle(hdc, 15, 20, 50, 45);
2135 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2136 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2138 Rectangle(hdc, 10, 10, 100, 100);
2139 Rectangle(hdc, 20, 15, 30, 40);
2140 Rectangle(hdc, 15, 15, 20, 20);
2141 Rectangle(hdc, 15, 20, 50, 45);
2142 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2143 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2145 Rectangle(hdc, 10, 10, 100, 100);
2146 Rectangle(hdc, 20, 15, 30, 40);
2147 Rectangle(hdc, 15, 15, 20, 20);
2148 Rectangle(hdc, 15, 20, 50, 45);
2149 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2150 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2151 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2152 else
2153 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2155 Rectangle(hdc, 10, 10, 100, 100);
2156 Rectangle(hdc, 20, 15, 30, 40);
2157 Rectangle(hdc, 15, 15, 20, 20);
2158 Rectangle(hdc, 15, 20, 50, 45);
2159 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2160 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2162 /* blitting with 32-bpp BI_RGB source */
2164 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2165 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2166 src_bi->bmiHeader.biHeight = 256;
2167 src_bi->bmiHeader.biWidth = 256;
2168 src_bi->bmiHeader.biBitCount = 32;
2169 src_bi->bmiHeader.biPlanes = 1;
2170 src_bi->bmiHeader.biCompression = BI_RGB;
2171 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2172 SelectObject( src_dc, bmp );
2173 for (y = 0; y < 256; y++)
2174 for (x = 0; x < 256; x++)
2176 BYTE a = (x + y) * 2;
2177 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2178 BYTE g = (BYTE)(x + y / 3) * a / 255;
2179 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2180 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2183 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2185 /* Interesting cases for 1-bpp dst */
2186 BitBlt( hdc, 1, 4, 2, 2, src_dc, 0, 0, SRCCOPY );
2187 BitBlt( hdc, 1, 8, 16, 2, src_dc, 0, 0, SRCCOPY );
2188 BitBlt( hdc, 1, 12, 15, 2, src_dc, 0, 0, SRCCOPY );
2189 BitBlt( hdc, 0, 16, 8, 2, src_dc, 0, 0, SRCCOPY );
2190 BitBlt( hdc, 0, 20, 9, 2, src_dc, 0, 0, SRCCOPY );
2191 BitBlt( hdc, 7, 24, 1, 2, src_dc, 0, 0, SRCCOPY );
2192 BitBlt( hdc, 7, 28, 2, 2, src_dc, 0, 0, SRCCOPY );
2193 BitBlt( hdc, 7, 32, 9, 2, src_dc, 0, 0, SRCCOPY );
2194 BitBlt( hdc, 7, 36, 10, 2, src_dc, 0, 0, SRCCOPY );
2196 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2197 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2198 else
2199 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2201 blend.SourceConstantAlpha = 0xd0;
2202 blend.AlphaFormat = 0;
2203 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2204 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2206 if (!pGdiAlphaBlend) skip_compare(2);
2207 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2209 else
2211 if (!pGdiAlphaBlend) skip_compare(1);
2212 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2215 blend.SourceConstantAlpha = 0xb0;
2216 blend.AlphaFormat = AC_SRC_ALPHA;
2217 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2218 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2220 if (!pGdiAlphaBlend) skip_compare(2);
2221 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2223 else
2225 if (!pGdiAlphaBlend) skip_compare(1);
2226 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2229 /* blitting with 32-bpp r10g10b10 source */
2231 src_bi->bmiHeader.biBitCount = 32;
2232 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2233 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2234 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2235 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2236 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2237 SelectObject( src_dc, bmp );
2238 for (y = 0; y < 256; y++)
2239 for (x = 0; x < 256; x++)
2241 WORD r = (7 * x + 3 * y) % 1024;
2242 WORD g = (11 * x + y / 3) % 1024;
2243 WORD b = (x / 3 + 9 * y) % 1024;
2244 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2247 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2248 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2249 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2250 else
2251 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2253 /* blitting with 32-bpp b6g6r6 source */
2255 src_bi->bmiHeader.biBitCount = 32;
2256 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2257 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2258 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2259 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2260 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2261 SelectObject( src_dc, bmp );
2262 for (y = 0; y < 256; y++)
2263 for (x = 0; x < 256; x++)
2265 BYTE r = (y + 2 * x) % 64;
2266 BYTE g = (x + y / 3) % 64;
2267 BYTE b = (x / 3 + 2 * y) % 64;
2268 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2271 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2272 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2273 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2274 else
2275 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2277 /* blitting with 24-bpp source */
2279 src_bi->bmiHeader.biBitCount = 24;
2280 src_bi->bmiHeader.biCompression = BI_RGB;
2281 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2282 DeleteObject( SelectObject( src_dc, bmp ) );
2283 for (y = 0; y < 256; y++)
2284 for (x = 0; x < 256; x++)
2286 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2287 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2288 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2291 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2292 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2293 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2294 else
2295 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2297 blend.SourceConstantAlpha = 0xe0;
2298 blend.AlphaFormat = 0;
2299 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2300 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2302 if (!pGdiAlphaBlend) skip_compare(2);
2303 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2305 else
2307 if (!pGdiAlphaBlend) skip_compare(1);
2308 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2311 /* blitting with 16-bpp BI_RGB source */
2313 src_bi->bmiHeader.biBitCount = 16;
2314 src_bi->bmiHeader.biCompression = BI_RGB;
2315 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2316 DeleteObject( SelectObject( src_dc, bmp ) );
2317 for (y = 0; y < 256; y++)
2318 for (x = 0; x < 256; x++)
2319 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2321 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2322 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2323 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2324 else
2325 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2327 /* blitting with 16-bpp b4g4r4 source */
2329 src_bi->bmiHeader.biBitCount = 16;
2330 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2331 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2332 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2333 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2334 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2335 DeleteObject( SelectObject( src_dc, bmp ) );
2336 for (y = 0; y < 256; y++)
2337 for (x = 0; x < 256; x++)
2338 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2340 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2341 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2342 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2343 else
2344 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2346 /* blitting with 8-bpp source */
2348 src_bi->bmiHeader.biBitCount = 8;
2349 src_bi->bmiHeader.biCompression = BI_RGB;
2350 src_bi->bmiHeader.biClrUsed = 160;
2351 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2352 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2353 DeleteObject( SelectObject( src_dc, bmp ) );
2354 for (y = 0; y < 256; y++)
2355 for (x = 0; x < 256; x++)
2356 src_bits[y * 256 + x] = 3 * x + 5 * y;
2358 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2359 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2361 blend.SourceConstantAlpha = 0xd0;
2362 blend.AlphaFormat = 0;
2363 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2364 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2366 if (!pGdiAlphaBlend) skip_compare(2);
2367 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2369 else
2371 if (!pGdiAlphaBlend) skip_compare(1);
2372 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2375 /* blitting with 4-bpp source */
2377 src_bi->bmiHeader.biBitCount = 4;
2378 src_bi->bmiHeader.biClrUsed = 12;
2379 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2380 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2381 DeleteObject( SelectObject( src_dc, bmp ) );
2382 for (y = 0; y < 256; y++)
2383 for (x = 0; x < 256; x += 2)
2384 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2386 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2387 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2389 /* blitting with 1-bpp source */
2391 src_bi->bmiHeader.biBitCount = 1;
2392 src_bi->bmiHeader.biClrUsed = 0;
2393 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2394 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2395 DeleteObject( SelectObject( src_dc, bmp ) );
2396 for (y = 0; y < 256; y++)
2397 for (x = 0; x < 256; x += 8)
2398 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2400 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2401 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2403 blend.SourceConstantAlpha = 0x90;
2404 blend.AlphaFormat = 0;
2405 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2406 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2408 if (!pGdiAlphaBlend) skip_compare(2);
2409 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2411 else
2413 if (!pGdiAlphaBlend) skip_compare(1);
2414 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2417 DeleteDC( src_dc );
2418 DeleteObject( bmp );
2420 /* RLE StretchDIBits */
2421 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2422 src_bi->bmiHeader.biWidth = 8;
2423 src_bi->bmiHeader.biHeight = 8;
2424 src_bi->bmiHeader.biPlanes = 1;
2425 src_bi->bmiHeader.biBitCount = 8;
2426 src_bi->bmiHeader.biCompression = BI_RLE8;
2427 src_bi->bmiHeader.biClrUsed = 0;
2428 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2430 for (i = 0; i < 256; i++)
2432 src_bi->bmiColors[i].rgbRed = i;
2433 src_bi->bmiColors[i].rgbGreen = i;
2434 src_bi->bmiColors[i].rgbBlue = i;
2435 src_bi->bmiColors[i].rgbReserved = 0;
2438 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2439 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2440 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2441 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2442 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2443 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2445 /* 32 bpp StretchDIBits */
2447 src_bi->bmiHeader.biWidth = 4;
2448 src_bi->bmiHeader.biHeight = 4;
2449 src_bi->bmiHeader.biPlanes = 1;
2450 src_bi->bmiHeader.biBitCount = 32;
2451 src_bi->bmiHeader.biCompression = BI_RGB;
2452 src_bi->bmiHeader.biClrUsed = 0;
2453 src_bi->bmiHeader.biSizeImage = 0;
2455 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2456 ok(ret == 4, "got %d\n", ret);
2457 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2458 ok(ret == 4, "got %d\n", ret);
2459 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2460 ok(ret == 4, "got %d\n", ret);
2461 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2462 ok(ret == 4, "got %d\n", ret);
2463 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2464 ok(ret == 4, "got %d\n", ret);
2465 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2466 ok(ret == 4, "got %d\n", ret);
2468 src_bi->bmiHeader.biHeight = -4;
2470 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2471 ok(ret == 4, "got %d\n", ret);
2472 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2473 ok(ret == -4, "got %d\n", ret);
2474 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2475 ok(ret == 4, "got %d\n", ret);
2476 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2477 ok(ret == -4, "got %d\n", ret);
2478 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2479 ok(ret == 4, "got %d\n", ret);
2480 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2481 ok(ret == -4, "got %d\n", ret);
2483 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2485 /* Solid colors */
2486 for (i = 0; i < 256; i++)
2488 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2489 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2490 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2491 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2492 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2495 /* A few extra colors that are interesting in the 1bpp case */
2497 /* bk color */
2498 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2499 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2501 /* color 0 */
2502 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2503 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2505 /* color 1 */
2506 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2507 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2509 compare_hash(hdc, bmi, bits, "Colors");
2511 for (i = 0; i < 256; i++)
2513 COLORREF s, g;
2514 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2515 g = GetPixel( hdc, i * 2, 10 );
2516 ok( s == g, "got %08x and %08x\n", s, g );
2518 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2519 g = GetPixel( hdc, i * 2, 20 );
2520 ok( s == g, "got %08x and %08x\n", s, g );
2522 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2523 g = GetPixel( hdc, i * 2, 30 );
2524 ok( s == g, "got %08x and %08x\n", s, g );
2526 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2527 g = GetPixel( hdc, i * 2, 40 );
2528 ok( s == g, "got %08x and %08x\n", s, g );
2530 for (j = 0; j < 256; j++)
2532 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2533 g = GetPixel( hdc, i * 2, 50+j );
2534 ok( s == g, "got %08x and %08x\n", s, g );
2536 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2537 g = GetPixel( hdc, i * 2 + 1, 50+j );
2538 ok( s == g, "got %08x and %08x\n", s, g );
2542 compare_hash(hdc, bmi, bits, "SetPixel");
2544 /* gradients */
2546 if (pGdiGradientFill)
2548 TRIVERTEX vrect[] =
2550 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2551 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2552 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2553 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2555 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2557 TRIVERTEX vtri[] =
2559 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2560 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2561 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2563 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2564 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2565 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2567 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2568 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2569 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2571 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2572 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2573 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2575 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2576 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2577 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2579 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2580 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2581 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2583 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2584 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2585 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2587 GRADIENT_TRIANGLE tri[] =
2589 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2590 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2593 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2594 for (i = 0; i < 4; i++) vrect[i].y += 250;
2595 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2597 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2598 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2599 else
2600 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2602 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2603 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2604 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2605 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2606 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2607 else
2608 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2610 else
2612 win_skip( "GdiGradientFill not supported\n" );
2613 skip_compare(1);
2614 skip_compare(1);
2617 /* wide pen */
2619 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2620 SelectObject( hdc, wide_pen );
2622 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2624 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2625 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2628 compare_hash(hdc, bmi, bits, "wide pen" );
2630 SelectObject( hdc, orig_pen );
2631 DeleteObject( wide_pen );
2633 log_brush.lbStyle = BS_SOLID;
2634 log_brush.lbColor = RGB(0xff, 0, 0);
2635 log_brush.lbHatch = 0;
2637 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2638 9, &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 - flat caps, mitred" );
2644 SelectObject( hdc, orig_pen );
2645 DeleteObject( wide_pen );
2647 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2648 16, &log_brush, 0, NULL );
2649 SelectObject( hdc, wide_pen );
2651 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2652 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2654 SelectObject( hdc, orig_pen );
2655 DeleteObject( wide_pen );
2657 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2658 9, &log_brush, 0, NULL );
2659 SelectObject( hdc, wide_pen );
2661 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2662 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2664 SelectObject( hdc, orig_pen );
2665 DeleteObject( wide_pen );
2667 /* brushed wide pen */
2669 old_text = GetTextColor( hdc );
2670 old_bkgnd = GetBkColor( hdc );
2671 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2672 log_brush.lbStyle = BS_PATTERN;
2673 log_brush.lbColor = 0;
2674 log_brush.lbHatch = (ULONG_PTR)bmp;
2675 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2676 12, &log_brush, 0, NULL );
2677 ok( wide_pen != 0, "failed to create pen\n" );
2678 SelectObject( hdc, wide_pen );
2679 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2681 for (i = 1; i < 20; i++)
2683 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2684 i, &log_brush, 0, NULL );
2685 ok( wide_pen != 0, "failed to create pen\n" );
2686 DeleteObject( SelectObject( hdc, wide_pen ));
2687 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2688 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2689 MoveToEx( hdc, 10 * i, 10, NULL );
2690 LineTo( hdc, 10 * i, 200 + i );
2691 LineTo( hdc, 20 * i, 200 + i );
2693 /* NT4 broken for all cases, W2K for 1 bpp only */
2694 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2696 for (i = 1; i < 20; i++)
2698 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2699 i, &log_brush, 0, NULL );
2700 DeleteObject( SelectObject( hdc, wide_pen ));
2701 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2702 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2703 MoveToEx( hdc, 10 * i, 10, NULL );
2704 LineTo( hdc, 10 * i, 200 + i );
2705 LineTo( hdc, 20 * i, 200 + i );
2707 /* NT4 broken for all cases, W2K for 1 bpp only */
2708 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2710 DeleteObject(bmp);
2711 SetTextColor(hdc, old_text);
2712 SetBkColor(hdc, old_bkgnd);
2713 SelectObject( hdc, orig_pen );
2715 /* PALETTEINDEX */
2717 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2718 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2719 SetTextColor( hdc, PALETTEINDEX(38) );
2720 SetBkColor( hdc, PALETTEINDEX(9) );
2721 SelectObject( hdc, solid_brush );
2722 SelectObject( hdc, solid_pen );
2724 pal->palVersion = 0x300;
2725 pal->palNumEntries = 40;
2726 for (i = 0; i < 80; i++)
2728 entries[i].peRed = i * 3;
2729 entries[i].peGreen = i * 7;
2730 entries[i].peBlue = 128 - i;
2731 entries[i].peFlags = 0;
2733 hpal = CreatePalette( pal );
2734 old_hpal = SelectPalette( hdc, hpal, FALSE );
2736 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2737 Rectangle( hdc, 0, 0, 10, 10 );
2738 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2739 Rectangle( hdc, 10, 0, 10, 10 );
2740 SelectObject( hdc, orig_brush );
2741 DeleteObject( solid_brush );
2743 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2744 DeleteObject( SelectObject( hdc, solid_brush ));
2745 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2746 SetPaletteEntries( hpal, 0, 40, entries );
2747 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2748 SelectObject( hdc, orig_brush );
2749 DeleteObject( solid_brush );
2751 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2752 dib_brush = CreatePatternBrush( bmp );
2753 SelectObject( hdc, dib_brush );
2754 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2755 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2756 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2757 DeleteObject( bmp );
2758 SelectObject( hdc, orig_brush );
2759 DeleteObject( dib_brush );
2761 SelectPalette( hdc, old_hpal, FALSE );
2762 DeleteObject( hpal );
2764 /* NT4 broken for all cases, W2K for 1 bpp only */
2765 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2767 /* ExtFloodFill */
2769 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2770 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2771 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2772 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2773 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2775 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2776 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2777 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2778 DeleteObject( hrgn );
2780 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2781 SelectObject( hdc, solid_brush );
2783 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2784 ok (ret, "got ret %d\n", ret);
2785 compare_hash(hdc, bmi, bits, "flood fill" );
2787 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2789 SelectObject(hdc, orig_brush);
2790 SelectObject(hdc, orig_pen);
2791 DeleteObject(solid_brush);
2792 DeleteObject(wide_pen);
2793 DeleteObject(dashed_pen);
2794 DeleteObject(solid_pen);
2797 static const BYTE ramp[17] =
2799 0, 0x4d, 0x68, 0x7c,
2800 0x8c, 0x9a, 0xa7, 0xb2,
2801 0xbd, 0xc7, 0xd0, 0xd9,
2802 0xe1, 0xe9, 0xf0, 0xf8,
2803 0xff
2806 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2808 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2809 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2812 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2814 BYTE min_comp, max_comp;
2816 if (alpha == 16) return text;
2817 if (alpha <= 1) return dst;
2818 if (text == dst) return dst;
2820 get_range( alpha, text, &min_comp, &max_comp );
2822 if (dst > text)
2824 DWORD diff = dst - text;
2825 DWORD range = max_comp - text;
2826 dst = text + (diff * range ) / (0xff - text);
2827 return dst;
2829 else
2831 DWORD diff = text - dst;
2832 DWORD range = text - min_comp ;
2833 dst = text - (diff * range) / text;
2834 return dst;
2838 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2840 COLORREF ret;
2842 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2843 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2844 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2845 return ret;
2848 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2850 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2852 DWORD dib_size = get_dib_size(bmi), ret;
2853 LOGFONTA lf;
2854 HFONT font;
2855 GLYPHMETRICS gm;
2856 BYTE g_buf[10000];
2857 int i, stride, x, y;
2858 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2859 char *eto_hash = NULL, *diy_hash = NULL;
2860 static const char str[] = "Hello Wine";
2861 POINT origin, g_org;
2862 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2863 TEXTMETRICA tm;
2864 COLORREF text_color;
2866 for(i = 0; i < dib_size; i++)
2867 bits[i] = vals[i % 4];
2869 memset( &lf, 0, sizeof(lf) );
2870 strcpy( lf.lfFaceName, "Tahoma" );
2871 lf.lfHeight = 24;
2872 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2874 font = CreateFontIndirectA( &lf );
2875 font = SelectObject( hdc, font );
2877 GetTextMetricsA( hdc, &tm );
2878 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2880 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2881 DeleteObject( SelectObject( hdc, font ) );
2882 return;
2885 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2886 SetTextAlign( hdc, TA_BASELINE );
2887 SetBkMode( hdc, TRANSPARENT );
2888 origin.x = 10;
2889 origin.y = 100;
2891 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2892 eto_hash = hash_dib( bmi, bits );
2894 for(i = 0; i < dib_size; i++)
2895 bits[i] = vals[i % 4];
2897 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2899 text_color = GetTextColor( hdc );
2900 for (i = 0; i < strlen(str); i++)
2902 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2904 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2906 if (ret == GDI_ERROR) continue;
2908 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2910 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2911 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2913 origin.x += gm.gmCellIncX;
2914 origin.y += gm.gmCellIncY;
2916 if (!ret) continue;
2918 if (aa)
2920 stride = (gm.gmBlackBoxX + 3) & ~3;
2922 for (y = 0; y < gm.gmBlackBoxY; y++)
2924 BYTE *g_ptr = g_buf + y * stride;
2925 COLORREF val;
2927 for (x = 0; x < gm.gmBlackBoxX; x++)
2929 if (g_ptr[x] <= 1) continue;
2930 if (g_ptr[x] >= 16) val = text_color;
2931 else
2933 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2934 val = aa_colorref( val, text_color, g_ptr[x] );
2936 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2940 else
2942 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2944 for (y = 0; y < gm.gmBlackBoxY; y++)
2946 BYTE *g_ptr = g_buf + y * stride;
2947 for (x = 0; x < gm.gmBlackBoxX; x++)
2949 if (g_ptr[x / 8] & masks[x % 8])
2950 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2956 diy_hash = hash_dib( bmi, bits );
2957 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2959 HeapFree( GetProcessHeap(), 0, diy_hash );
2960 HeapFree( GetProcessHeap(), 0, eto_hash );
2962 font = SelectObject( hdc, font );
2963 DeleteObject( font );
2966 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
2968 draw_text_2( hdc, bmi, bits, FALSE );
2970 /* Rounding errors make these cases hard to test */
2971 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2972 (bmi->bmiHeader.biBitCount == 16))
2973 return;
2975 draw_text_2( hdc, bmi, bits, TRUE );
2978 static void test_simple_graphics(void)
2980 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2981 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2982 RGBQUAD *colors = bmi->bmiColors;
2983 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2984 HDC mem_dc;
2985 BYTE *bits;
2986 HBITMAP dib, orig_bm;
2987 DIBSECTION ds;
2988 HPALETTE default_palette, old_hpal;
2989 int i;
2991 mem_dc = CreateCompatibleDC(NULL);
2993 /* a8r8g8b8 */
2994 trace("8888\n");
2995 memset(bmi, 0, sizeof(bmibuf));
2996 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2997 bmi->bmiHeader.biHeight = 512;
2998 bmi->bmiHeader.biWidth = 512;
2999 bmi->bmiHeader.biBitCount = 32;
3000 bmi->bmiHeader.biPlanes = 1;
3001 bmi->bmiHeader.biCompression = BI_RGB;
3003 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3004 ok(dib != NULL, "ret NULL\n");
3005 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3006 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
3007 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
3008 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
3009 ok(ds.dsBmih.biCompression == BI_RGB ||
3010 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
3011 "got %x\n", ds.dsBmih.biCompression);
3013 orig_bm = SelectObject(mem_dc, dib);
3015 default_palette = create_default_palette( 8 );
3016 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
3018 dst_format = "8888";
3019 current_sha1 = sha1_graphics_a8r8g8b8;
3020 draw_graphics(mem_dc, bmi, bits);
3021 draw_text(mem_dc, bmi, bits);
3023 SelectObject(mem_dc, orig_bm);
3024 DeleteObject(dib);
3026 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
3027 trace("8888 - bitfields\n");
3028 bmi->bmiHeader.biBitCount = 32;
3029 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3030 bit_fields[0] = 0xff0000;
3031 bit_fields[1] = 0x00ff00;
3032 bit_fields[2] = 0x0000ff;
3034 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3035 ok(dib != NULL, "ret NULL\n");
3036 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3037 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
3038 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3039 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
3040 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3042 orig_bm = SelectObject(mem_dc, dib);
3043 SelectPalette( mem_dc, default_palette, FALSE );
3045 dst_format = "8888 - bitfields";
3046 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
3047 draw_graphics(mem_dc, bmi, bits);
3048 draw_text(mem_dc, bmi, bits);
3050 SelectObject(mem_dc, orig_bm);
3051 DeleteObject(dib);
3053 /* a8b8g8r8. */
3054 trace("a8b8g8r8\n");
3055 bmi->bmiHeader.biBitCount = 32;
3056 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3057 bit_fields[0] = 0x0000ff;
3058 bit_fields[1] = 0x00ff00;
3059 bit_fields[2] = 0xff0000;
3061 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3062 ok(dib != NULL, "ret NULL\n");
3063 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3064 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
3065 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3066 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
3067 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3069 orig_bm = SelectObject(mem_dc, dib);
3071 dst_format = "a8b8g8r8";
3072 current_sha1 = sha1_graphics_a8b8g8r8;
3073 draw_graphics(mem_dc, bmi, bits);
3074 draw_text(mem_dc, bmi, bits);
3076 SelectObject(mem_dc, orig_bm);
3077 DeleteObject(dib);
3079 /* r10g10b10. */
3080 trace("r10g10b10\n");
3081 bmi->bmiHeader.biBitCount = 32;
3082 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3083 bit_fields[0] = 0x3ff00000;
3084 bit_fields[1] = 0x000ffc00;
3085 bit_fields[2] = 0x000003ff;
3087 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3088 ok(dib != NULL, "ret NULL\n");
3089 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3090 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3091 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3092 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3093 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3095 orig_bm = SelectObject(mem_dc, dib);
3097 dst_format = "r10g10b10";
3098 current_sha1 = sha1_graphics_r10g10b10;
3099 draw_graphics(mem_dc, bmi, bits);
3100 draw_text(mem_dc, bmi, bits);
3102 SelectObject(mem_dc, orig_bm);
3103 DeleteObject(dib);
3105 /* r6g6b6. */
3106 trace("r6g6b6\n");
3107 bmi->bmiHeader.biBitCount = 32;
3108 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3109 bit_fields[0] = 0x0003f000;
3110 bit_fields[1] = 0x00000fc0;
3111 bit_fields[2] = 0x0000003f;
3113 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3114 ok(dib != NULL, "ret NULL\n");
3115 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3116 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3117 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3118 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3119 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3121 orig_bm = SelectObject(mem_dc, dib);
3123 dst_format = "r6g6b6";
3124 current_sha1 = sha1_graphics_r6g6b6;
3125 draw_graphics(mem_dc, bmi, bits);
3126 draw_text(mem_dc, bmi, bits);
3128 SelectObject(mem_dc, orig_bm);
3129 DeleteObject(dib);
3131 /* 24 */
3132 trace("24\n");
3133 bmi->bmiHeader.biBitCount = 24;
3134 bmi->bmiHeader.biCompression = BI_RGB;
3136 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3137 ok(dib != NULL, "ret NULL\n");
3138 orig_bm = SelectObject(mem_dc, dib);
3140 dst_format = "24";
3141 current_sha1 = sha1_graphics_24;
3142 draw_graphics(mem_dc, bmi, bits);
3143 draw_text(mem_dc, bmi, bits);
3145 SelectObject(mem_dc, orig_bm);
3146 DeleteObject(dib);
3148 /* r5g5b5 */
3149 trace("555\n");
3150 bmi->bmiHeader.biBitCount = 16;
3151 bmi->bmiHeader.biCompression = BI_RGB;
3153 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3154 ok(dib != NULL, "ret NULL\n");
3155 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3156 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3157 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3158 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3159 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3161 orig_bm = SelectObject(mem_dc, dib);
3163 dst_format = "r5g5b5";
3164 current_sha1 = sha1_graphics_r5g5b5;
3165 draw_graphics(mem_dc, bmi, bits);
3166 draw_text(mem_dc, bmi, bits);
3168 SelectObject(mem_dc, orig_bm);
3169 DeleteObject(dib);
3171 /* r4g4b4 */
3172 trace("444\n");
3173 bmi->bmiHeader.biBitCount = 16;
3174 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3175 bit_fields[0] = 0x0f00;
3176 bit_fields[1] = 0x00f0;
3177 bit_fields[2] = 0x000f;
3178 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3179 ok(dib != NULL, "ret NULL\n");
3180 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3181 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3182 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3183 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3184 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3186 orig_bm = SelectObject(mem_dc, dib);
3188 dst_format = "r4g4b4";
3189 current_sha1 = sha1_graphics_r4g4b4;
3190 draw_graphics(mem_dc, bmi, bits);
3191 draw_text(mem_dc, bmi, bits);
3193 SelectObject(mem_dc, orig_bm);
3194 DeleteObject(dib);
3196 /* 8 color */
3197 trace("8 color\n");
3198 bmi->bmiHeader.biBitCount = 8;
3199 bmi->bmiHeader.biCompression = BI_RGB;
3200 bmi->bmiHeader.biClrUsed = 236;
3201 for (i = 0; i < 236; i++)
3203 colors[i].rgbRed = (i & 0x07) << 5;
3204 colors[i].rgbGreen = (i & 0x38) << 2;
3205 colors[i].rgbBlue = i & 0xc0;
3207 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3208 ok(dib != NULL, "ret NULL\n");
3210 orig_bm = SelectObject(mem_dc, dib);
3212 dst_format = "8 color";
3213 current_sha1 = sha1_graphics_8_color;
3214 draw_graphics(mem_dc, bmi, bits);
3215 draw_text(mem_dc, bmi, bits);
3217 SelectObject(mem_dc, orig_bm);
3218 DeleteObject(dib);
3220 /* 8 grayscale */
3221 trace("8 grayscale\n");
3222 bmi->bmiHeader.biBitCount = 8;
3223 bmi->bmiHeader.biCompression = BI_RGB;
3224 bmi->bmiHeader.biClrUsed = 256;
3225 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3227 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3228 ok(dib != NULL, "ret NULL\n");
3230 orig_bm = SelectObject(mem_dc, dib);
3232 dst_format = "8 grayscale";
3233 current_sha1 = sha1_graphics_8_grayscale;
3234 draw_graphics(mem_dc, bmi, bits);
3235 draw_text(mem_dc, bmi, bits);
3237 SelectObject(mem_dc, orig_bm);
3238 DeleteObject(dib);
3240 /* 8 */
3241 trace("8\n");
3242 bmi->bmiHeader.biBitCount = 8;
3243 bmi->bmiHeader.biCompression = BI_RGB;
3244 bmi->bmiHeader.biClrUsed = 5;
3245 colors[0].rgbRed = 0xff;
3246 colors[0].rgbGreen = 0xff;
3247 colors[0].rgbBlue = 0xff;
3248 colors[1].rgbRed = 0;
3249 colors[1].rgbGreen = 0;
3250 colors[1].rgbBlue = 0;
3251 colors[2].rgbRed = 0xff;
3252 colors[2].rgbGreen = 0;
3253 colors[2].rgbBlue = 0;
3254 colors[3].rgbRed = 0;
3255 colors[3].rgbGreen = 0xff;
3256 colors[3].rgbBlue = 0;
3257 colors[4].rgbRed = 0;
3258 colors[4].rgbGreen = 0;
3259 colors[4].rgbBlue = 0xff;
3261 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3262 ok(dib != NULL, "ret NULL\n");
3264 orig_bm = SelectObject(mem_dc, dib);
3266 dst_format = "8";
3267 current_sha1 = sha1_graphics_8;
3268 draw_graphics(mem_dc, bmi, bits);
3269 draw_text(mem_dc, bmi, bits);
3271 SelectObject(mem_dc, orig_bm);
3272 DeleteObject(dib);
3274 /* 4 */
3275 trace("4\n");
3276 bmi->bmiHeader.biBitCount = 4;
3278 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3279 ok(dib != NULL, "ret NULL\n");
3281 orig_bm = SelectObject(mem_dc, dib);
3282 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3284 dst_format = "4";
3285 current_sha1 = sha1_graphics_4;
3286 draw_graphics(mem_dc, bmi, bits);
3287 draw_text(mem_dc, bmi, bits);
3289 SelectObject(mem_dc, orig_bm);
3290 DeleteObject(dib);
3292 /* 4 grayscale */
3293 trace("4 grayscale\n");
3294 bmi->bmiHeader.biClrUsed = 16;
3295 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3297 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3298 ok(dib != NULL, "ret NULL\n");
3300 orig_bm = SelectObject(mem_dc, dib);
3302 dst_format = "4 grayscale";
3303 current_sha1 = sha1_graphics_4_grayscale;
3304 draw_graphics(mem_dc, bmi, bits);
3305 draw_text(mem_dc, bmi, bits);
3307 SelectObject(mem_dc, orig_bm);
3308 DeleteObject(dib);
3310 /* 1 */
3311 trace("1\n");
3312 bmi->bmiHeader.biBitCount = 1;
3313 bmi->bmiHeader.biClrUsed = 2;
3315 colors[0].rgbRed = 0x00;
3316 colors[0].rgbGreen = 0x01;
3317 colors[0].rgbBlue = 0xff;
3318 colors[1].rgbRed = 0xff;
3319 colors[1].rgbGreen = 0x00;
3320 colors[1].rgbBlue = 0x00;
3322 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3323 ok(dib != NULL, "ret NULL\n");
3325 orig_bm = SelectObject(mem_dc, dib);
3326 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3328 dst_format = "1";
3329 current_sha1 = sha1_graphics_1;
3330 draw_graphics(mem_dc, bmi, bits);
3331 draw_text(mem_dc, bmi, bits);
3333 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3334 SelectObject(mem_dc, orig_bm);
3335 DeleteObject(dib);
3337 DeleteDC(mem_dc);
3340 START_TEST(dib)
3342 HMODULE mod = GetModuleHandleA("gdi32.dll");
3343 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3344 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3345 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3347 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3349 test_simple_graphics();
3351 CryptReleaseContext(crypt_prov, 0);