gdi32: Add support for DIBINDEX colors in 1-bpp blits.
[wine.git] / dlls / gdi32 / tests / dib.c
blob188001e560634d4c8013640e959c4639712a48d0
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 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
132 "d7dd4700f49808541bba99244b7eb5840e0a2439",
133 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
134 "8eb1f99d21a84153e88e7958707049d517ab7641",
135 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
136 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
137 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
138 "50a09678c49c208f71d40452daca5411279aa674",
139 "e462052a03dbe4ec3814db7700e166d00d4d686f",
140 "a27917d4db49ce77989fae246015aeb2a28520ee",
141 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
142 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
143 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
144 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
145 "2b3198bd5c0a87db5dab13df8bbe14363d02acec",
146 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
147 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
148 "f451a05f699ac3bbe155d059e7871a2636887b5f",
149 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
150 "dccaef62738ff90da4554a85d8cb846d6436799e",
151 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
152 NULL
155 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
157 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
158 "2426172d9e8fec27d9228088f382ef3c93717da9",
159 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
160 "664fac17803859a4015c6ae29e5538e314d5c827",
161 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
162 "fe6cc678fb13a3ead67839481bf22348adc69f52",
163 "d51bd330cec510cdccf5394328bd8e5411901e9e",
164 "df4aebf98d91f11be560dd232123b3ae327303d7",
165 "f2af53dd073a09b1031d0032d28da35c82adc566",
166 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
167 "c387917268455017aa0b28bed73aa6554044bbb3",
168 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
169 "6c530622a025d872a642e8f950867884d7b136cb",
170 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
171 "b2261353decda2712b83538ab434a49ce21f3172",
172 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
173 "9b9874c1c1d92afa554137e191d34ea33acc322f",
174 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
175 "d7398de15b2837a58a62a701ca1b3384625afec4",
176 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
177 "5246ef357e7317b9d141a3294d300c195da76cb7",
178 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
179 "3d8244b665ecdb104087bad171b0b0f83545133c",
180 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
181 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
182 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
183 "e358efb1c11172e40855de620bdb8a8e545cd790",
184 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
185 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
186 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
187 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
188 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
189 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
190 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
191 "94645300d6eb51020a7ef8261dee2941cd51b5df",
192 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
193 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
194 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
195 "68c18db6abfda626cab12d198298d4c39264bfbc",
196 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
197 "39c31de73aafcfcadf0bf414da4495be9de54417",
198 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
199 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
200 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
201 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
202 "3d2ccbe51408232a04769546b1bdd74f84558a41",
203 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
204 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
205 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
206 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
207 "d7dd4700f49808541bba99244b7eb5840e0a2439",
208 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
209 "8eb1f99d21a84153e88e7958707049d517ab7641",
210 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
211 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
212 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
213 "50a09678c49c208f71d40452daca5411279aa674",
214 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
215 "b2c8e1ebb9435031fe068442f479d1304096e79f",
216 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
217 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
218 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
219 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
220 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
221 "f115ef8392ba82d8cd6e7a039320edcd812c1d28",
222 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
223 "f451a05f699ac3bbe155d059e7871a2636887b5f",
224 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
225 "dccaef62738ff90da4554a85d8cb846d6436799e",
226 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
227 NULL
230 static const char *sha1_graphics_a8b8g8r8[] =
232 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
233 "e0bc877697093ed440e125154e247ca9d65e933c",
234 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
235 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
236 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
237 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
238 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
239 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
240 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
241 "b753ebb39d90210cc717f57b53dd439f7de6b077",
242 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
243 "94368cea5033b435454daa56d55546310675131e",
244 "bf57a6a37fb107d29ed3d45695919887abcb7902",
245 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
246 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
247 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
248 "b0178632775d29bec2b16de7b9b8287115c40d0f",
249 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
250 "3369889a67d6c79a24ee15f7d14374f9995215e4",
251 "473a1fd07df800c87a5d3286b642ace10c61c6af",
252 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
253 "b8951d2b20518fd129e5113a5f429626893913bf",
254 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
255 "4851c5b7d5bc18590e787c0c218a592ef504e738",
256 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
257 "abdf003699364fe45fab7dc61e67c606d0063b40",
258 "89abaadff4e68c738cf9251c51e3609564843381",
259 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
260 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
261 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
262 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
263 "71b9756fdfeedce1e6db201176d21a981b881662",
264 "5319528d9af750c172ae62ee85ddb2eaef73b193",
265 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
266 "19b32a0daa91201725b5e13820c343d0a84ff698",
267 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
268 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
269 "9b81ccc2d956d1de019085f971ba19435fe5feae",
270 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
271 "8566c1110ab5cb8f754787b47923c8bff38f790c",
272 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
273 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
274 "d01071c44259adc94b89978b7d51a058b6dad665",
275 "e6d33b106bcda374e662d338c57a457dbcaa108a",
276 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
277 "339908a568f384e1f384a3e1b0dd415779203b02",
278 "88fd743d00bd37d2ed722092146795b044d08a6e",
279 "c0537ec24147e74939219213d864ee113cad9967",
280 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
281 "eac5d164b83edf2cf85bac242686f9f617ec1fa4",
282 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
283 "698d6393e97539806351368f95be478c6fbc62b0",
284 "c272d1e0342e6089a0182dc42b37e47889116a9b",
285 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
286 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
287 "849d4abf4b690128a5f70e9b8ac78f20c437de06",
288 "e768fc9f3167ef3144a4cfb1e20126a577f7dd5b",
289 "87f57a31253a38dbf3dc3070473328fa04b68a48",
290 "db64cc4d830fc35ed170b53943e722b2342954d4",
291 "9988ceca44dafbee247aece1f027c06c27c01652",
292 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
293 "b76e0724496e471b01ef8b34f8beba69f5bde261",
294 "34201d3d3583f89ce3267d3d0c4e01c64463de4b",
295 "693f5c5fbaeaadb5928d34b035499626fecb8394",
296 "8a9aa84c42dedc3e681191a1229846887ed262ec",
297 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
298 "707bc44fc9fed68ff1f537f0473e0cd825dd660f",
299 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
300 "175a7bcb73c74eceecc000657a0100bccf158ff4",
301 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
302 NULL
305 static const char *sha1_graphics_r10g10b10[] =
307 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
308 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
309 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
310 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
311 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
312 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
313 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
314 "0ad27de0c916c073d0d18484fff899bbdb258db7",
315 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
316 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
317 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
318 "2986b431a0022153e5f875da77cc792e3825ebd5",
319 "ca4b25a5459885ce1e0a36844612087893d425b1",
320 "181bd4616796d89174cedc0332fb320b65aeb0e2",
321 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
322 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
323 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
324 "536eaaa901d652805a8977ecb2dc73f651094c5b",
325 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
326 "92cddcabf5365eef1e037f488af52b31669d987f",
327 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
328 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
329 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
330 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
331 "d578210815e27fe210eb678a71e6d22ba4b4c196",
332 "c7a027c7079dfcc831ca8bc134a509958273073c",
333 "19cf978596195b848df8709aaf637f83f92b8336",
334 "798a835fe50156eeb478c0a6085b088f53409d52",
335 "86ddf268d854f37e5b478c48792b551b57635db6",
336 "8259d388e02542207b6a08d65d553871ce1c4a09",
337 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
338 "66f8d78d4971934794478afee28b3a50e97f1b82",
339 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
340 "63798fb175afef78fa8fe8133d9de97a0cc80651",
341 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
342 "1ceb85697f649a62b1753438daa14944af7f450c",
343 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
344 "1cb0c7d9d89cdbce7b47d19ef0365bb6b2adc831",
345 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
346 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
347 "ada202d2f526f6995f83412479891c1764b66e5a",
348 "68348e8f54883f4fe295354b024e291c85f1038f",
349 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
350 "e9167564031ead3459eee6a3ebb2f58f100d931f",
351 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
352 "46196f50297260df2863e2fa76d2dfcf72006c23",
353 "0790585dfaef94f912b1ee81477d4ac448708708",
354 "589fb8a85d924ad19ed78409ae89475ba479c30a",
355 "43d67bc61ef54014b022891e5c024fc24b1fe797",
356 "5a713a91fd471fd331bd13b0868c994aa2ffe2b2",
357 "fc0c32afb719295f28bcfef22803bef94f798e20",
358 "bb2a421bab95f9b5420704ef44c0f3214a0b5a11",
359 "7735098af7535d8c57266190a13f92d8869e8529",
360 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
361 "d3f08946300e1700865042aed121870e292d1095",
362 "4782df8e24127e66a434b4e839adebf2dbb223fb",
363 "739707cc85ca63e0580c79618dc0bb8a4a338d95",
364 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
365 "317521e576801acaea62c76fe16813cdfe20f4ad",
366 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
367 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
368 "555b6f04ba8dec9e2a60693dcaac594227052727",
369 "c199b96a71c3aab2d49ccb5b6294bf14eb0dd1eb",
370 "4238fe9d296b5c72b0a8745cc761f308605b2094",
371 "943dc6033ab335a6a63e666f70a6bb3a0677e157",
372 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
373 "88cfa7b7c1487f8eda05fce92b622942c9fb7ca4",
374 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
375 "ad91dde8566dceaadc3523cdc8149cd7415a1b70",
376 "1936661eee8073068506131c9e89265b2f8403e8",
377 NULL
380 static const char *sha1_graphics_r6g6b6[] =
382 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
383 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
384 "5b9dab3d8411afb25fbbeba0313db526815ac189",
385 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
386 "2028d1b0d1acef35dc07027135023f35fb9746b9",
387 "378713720dcb5aadb730435ad0989a68ab189114",
388 "084152773feb01a85df6006f2f4f288a1442d37a",
389 "97b824953f60fc9a91028045baacbe7b7dc82b14",
390 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
391 "287d755448e72e29e4812193e2b6f8098a214d82",
392 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
393 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
394 "e51bcf80211cd06e7d10225534b7a79b5454be27",
395 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
396 "0b94e0a5b739ab0020130646522e53da35a149ad",
397 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
398 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
399 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
400 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
401 "2128157e601ef0d6b3636b7387d3b28e876de728",
402 "8bdcdcd463f0052279d070ac763757f4db975483",
403 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
404 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
405 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
406 "66b130f83381957cfc4763558c5f5cddf2e3b564",
407 "d548135ce2320499277ce12b80bc35004f8a9787",
408 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
409 "1906ddfd829e735af49245171f8eb7673295d399",
410 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
411 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
412 "defd95a10d44cad6e736542920b74efd53e9e7eb",
413 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
414 "3f11a735e52030aa3d0f024d83803698293d10e5",
415 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
416 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
417 "3231c4d87faefb7ec5bd377613969c05b70343fc",
418 "00394e438e9edde978e88602c9ad2a572e965bf6",
419 "c0c41390270ba082ee8211576fee39c676813c42",
420 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
421 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
422 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
423 "3d6cf3753390a05504b1f50302f767df443f0f40",
424 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
425 "da9e896a3a98b330980152b2e4a43cb6e686c730",
426 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
427 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
428 "47499ad13b719de18c59c2bc9b38ed578db50b95",
429 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
430 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
431 "8ad5cd520cd628b76d2e5a3f318ae1bbb6b4c994",
432 "49341c297a887186bd47d7465d827ab3147f05e3",
433 "514c07281ef6702c35e68b230e897303a8cdec81",
434 "4b41865829b50b2e29beda51b055bd1f908a649c",
435 "325279e76367200d3fd7194d81c09fd139988ece",
436 "c3def160a1e847605ff0fc7edd30397fa90635a0",
437 "2b3e87e0b705b03c7c08f403409ab82cce095ba1",
438 "45c08e11fffc78b2a3574263419e0cb7f8cd9b45",
439 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
440 "77ea86e51a94b11a8081b29696cb4115687843e3",
441 "d67b897cad72d31e75359094007b1346fd8806ea",
442 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
443 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
444 "1e5a4ef7f8634847a251d1fcce298c409fd13d87",
445 "481337fbedf181d4324bf7f8299b0327197ff468",
446 "9ab957870fa4e17aec6a79bc1a4fdb42a5ffcc30",
447 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
448 "8e32ea3614c3b20899d748db48258761c7158d2b",
449 "5da35bad12e3e9b26a0444d30820099481281e45",
450 "94f004e98ae8035af948611770a4a2dd6643f510",
451 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
452 NULL
455 static const char *sha1_graphics_24[] =
457 "e993b15c9bd14fb45a15310450b7083c44e42665",
458 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
459 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
460 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
461 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
462 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
463 "fd4be592483623dbc800fe28210a1f0daa71999b",
464 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
465 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
466 "883bc8f305c602edca785e21cd00f488583fb13f",
467 "3bac4e80993f49dc3926e30524115fca9d7a8026",
468 "91369e35be29059a0665782541db4c8b324c6bb2",
469 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
470 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
471 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
472 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
473 "5068bff794553cf5a3145ae407c9a2984357844c",
474 "413a7989969c229dee4ab1798362f32f96cf0a10",
475 "0bb222e540b82720d4971e4a2fc626899af03e03",
476 "adc20832d8c43f1cf372d8392535492013cd2306",
477 "45649794dcbcabda487f66f7a80fc1bec79047a1",
478 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
479 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
480 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
481 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
482 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
483 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
484 "92a1ab214dd8027c407814420449119466c92840",
485 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
486 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
487 "955390669afed2369b15b32fa519f2f921cdf1a0",
488 "201906f7d763b930a98c97f8eeab417f2b65e723",
489 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
490 "701c5af1d0c28294ce7d804b5697643c430d22a0",
491 "b0a959745b2db1d9f449e68e4479a4f36301879c",
492 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
493 "e171f6ec77bca91d6b8559911bce296c0bac469e",
494 "33bb75c12f083d799d287fe9caddedbb3892e6fa",
495 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
496 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
497 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
498 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
499 "0f79500eda467cd3cbc220abdd37b5dba695d654",
500 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
501 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
502 "7d479beeb6758c164566638b5c873c188d6a91e7",
503 "80086808fca03e757d812e31d1ae576bf90dac9d",
504 "9560096f1b85ae6d939d736165c44df00a47c424",
505 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
506 "5578c80048520732557abf3a3a3fa22c85015d7d",
507 "b25ba91487ec945410deb2b51bc1156890c032a8",
508 "4c8c936372755f95051f1159b7ff65a484e1a555",
509 "bf55d4bdb26ae0f358bd67ef01932563519aab98",
510 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
511 "ee315634ed92da3a32c2675ecd1b369471c60936",
512 "099c688a920f606655b485e8f0a433dc811bc976",
513 "9c044a733335bca43766bda2b317249309155079",
514 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
515 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
516 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
517 "bf5ec23456efe00e1e0931c17de9040ab2092858",
518 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
519 "9d86b1b2bbce90efd3c0b9fe20d23ffa3eeecd20",
520 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
521 "e96b79bf88988b5694a04dfc3bd0029361b39801",
522 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
523 "09cb4ab070083144bed4271c0a2a34ccb6ed13c0",
524 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
525 "c95afd0a020e68a76982fe8663b5d64113987233",
526 "48658ff76c137185c56a53f3ccf0e958d0296742",
527 NULL
530 static const char *sha1_graphics_r5g5b5[] =
532 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
533 "847005cf7371f511bcc837251cde07b1796f6113",
534 "a8f75743a930843ec14d516cd048b6e0468e5d89",
535 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
536 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
537 "a9034a905daa91757b4f63345c0e40638cd53ca8",
538 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
539 "99474fecf11df7b7035c35be6b8b697be9889418",
540 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
541 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
542 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
543 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
544 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
545 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
546 "449092689226a1172b6086ba1181d6b6d6499f26",
547 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
548 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
549 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
550 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
551 "6daaf945a955928c5c124c880522ca4634fb2343",
552 "12a288390d16e1efa99d4185301de48a4d433b14",
553 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
554 "1d3af561605fd61433035600d8962cb8d266fdd0",
555 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
556 "d7d97e28ed316f6596c737eb83baa5948d86b673",
557 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
558 "656bf3b7121bcd620a0a3ad488f0d66604824577",
559 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
560 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
561 "a49530722328ae88fd765792ac0c657efbcce75d",
562 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
563 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
564 "a6fd83542c3826132e88d3f5e304d604c0056fad",
565 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
566 "e428d213ad02651287894f093413949dcb369208",
567 "7df915bedcc5951a1b6f828490f7dbb93212e835",
568 "8720478d904a84c24071e97c731c1ba7882b131e",
569 "76215275593631f5900aad3616d725733dc39493",
570 "81655a550703849a616d4a16504bb9c6f999285f",
571 "573d65665d20f00d36d9782ae2b89772140524ab",
572 "619414c1b33ac60cb0c0de61df86245d472259b0",
573 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
574 "2a66dae03890ff791eabb982949435adb19af02b",
575 "24ac219478ba406f30794550690486b14cbac5e8",
576 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
577 "db8c34882ddd46716d14bbf569d530f80db65ed4",
578 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
579 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
580 "a92942269911a88793b3460b6f2a2cd56e48eec1",
581 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
582 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
583 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
584 "a7506e2c001d271593297c9eda9b984d4d894774",
585 "8f447a3820c83662086dfa836da2205b0130fd5f",
586 "3772003c7fb420003512d0c437b3659d96d89ce4",
587 "2ebf37d81da3f11434652d06bf65d55e96b090aa",
588 "ace2c60bd76b11a002bee852686e8783f102eba1",
589 "dab47c9dc149e570045d699598b14a613bf319b3",
590 "2daca4d26a086ed34894693be0b0374402232809",
591 "904f1d82159bcf5485f323bd12b859dc5e83f8eb",
592 "5bd29f94844351e9a5bd01f25d85608b9b0701b2",
593 "295ec16530126046790fb734e99f86f5b3b74ed8",
594 "d98b0561010606b55a1b9b85fbc93640f681d256",
595 "1c1499051860b7caa25173b328ca9c862f01dd1a",
596 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
597 "2230f36f12d4becb242e2962fa1b3694db2496ca",
598 "d81e41a765d7a2d68073f5fde3f74f09df84001d",
599 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
600 "5950f7d00cd8692872377df0e869a7d5ea5e4420",
601 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
602 "7de23c68ca224818fdf127c5e96729dcd0de2b8b",
603 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
604 "1a0fd0df17fa4c455a4a91cad30b5242f77fd233",
605 "af45bf81d119be5cf6845ad41191ba52637e65e9",
606 NULL
609 static const char *sha1_graphics_r4g4b4[] =
611 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
612 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
613 "8bd18697d1ef27492805667a0bc956343ac08667",
614 "e8501c830321584474654f90e40eaf27dc21e6a8",
615 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
616 "821177710961d2cb5f7e7dfc0e06e767b6042753",
617 "667124365ffadeea1d8791bedda77a0c7b898de8",
618 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
619 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
620 "fb52b0c373a5f2a60b981604b120962942d2447a",
621 "5ab8dd07436681d762fa04ad7c6d71291c488924",
622 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
623 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
624 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
625 "25fcb75aa687aac35b8f72640889fe92413e00c5",
626 "3bddf9d53e89560b083302b146cd33791b13d941",
627 "a81504498c7a7bb46340ce74476a42f70f2730b1",
628 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
629 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
630 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
631 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
632 "57ebf8becac1524543da120e88e9cc57ecfdec49",
633 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
634 "d591232bbc2592462c819a9486750f64180518fd",
635 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
636 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
637 "8933450132bf949ba4bc28626968425b5ed2867d",
638 "9928a8f28a66c00069a124f7171b248817005763",
639 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
640 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
641 "233e588cf660e2c9b552cf02065cf63fa6655864",
642 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
643 "a3345acaf272f2e288626906e3056cd0ced70499",
644 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
645 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
646 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
647 "60c0752f592c6426a2f4a71173b44c5c086f4f2a",
648 "9dd123938b0a02601d8d458ecbd6535ddefea724",
649 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
650 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
651 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
652 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
653 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
654 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
655 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
656 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
657 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
658 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
659 "104e85bad287a62dfe25f0e78280179f18bac765",
660 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
661 "fde993dfce1551ef220f5a07ce4acd66e8524ac5",
662 "a80f3df0aea1e1b30d9833039157bca658218f48",
663 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
664 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
665 "f373a5f37b82e7523c64c08eb509b6191e49b173",
666 "9f0760a05190c9edf9ce2e8be6aaa5557601fe91",
667 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
668 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
669 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
670 "9f72be4467219a345b1164205d1fbfda2d64271e",
671 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
672 "a79e4cc419b9e1735e275e2823da52875536943a",
673 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
674 "3830cd728c1e72837310940bcdac4e294d6c9843",
675 "f571c7c4aac92491017963032194690c0fa06b42",
676 "6fd751b7328c02954bce98bed94b3ce3c73db118",
677 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
678 "8585783d0373e9696b508776b6e6b18a80b09888",
679 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
680 NULL
683 static const char *sha1_graphics_8_color[] =
685 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
686 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
687 "49024d6cbdf1614327dfda9eda17675e76805f7e",
688 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
689 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
690 "84d85009d35ae10abbc435f3913422544105cea2",
691 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
692 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
693 "f3aa8d89430748178952de56643069d80b40aad6",
694 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
695 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
696 "52b1363e821bf604d9df260bfa97e26d428c33fd",
697 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
698 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
699 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
700 "89711289be6d5c55734878410e4923d5cca9aca9",
701 "8355caf57d51ad4e14275943088392e37dc75d33",
702 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
703 "6f0570da9dea7f043f678088f8362ee458cd79fa",
704 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
705 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
706 "5092b22af85a08f10a2899888bb9d552f25f828e",
707 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
708 "e91973be2651eeef568700463652838d8cbba976",
709 "1df851515ecf46df5c2d3279535c1763f72353dd",
710 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
711 "359bd76088a965bb0cee7c44800bc46b2638807e",
712 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
713 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
714 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
715 "91f988f575338505ba8a40727865a8d3f2298624",
716 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
717 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
718 "3b7488731da48635d86be551ab7c8c0f91c78219",
719 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
720 "e15a355fc09bfd22267917898e2266168ff410e3",
721 "7a9c326a56a94621377a7258be70ba50042ca9a2",
722 "5e38e03310f1c66f2052af2a745d8c60515707c5",
723 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
724 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
725 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
726 "6376234f542467e5887adfece62f753e998dc19d",
727 "add949d009217ef2b847e34772ba363e4be7b1b8",
728 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
729 "0b58666deb3615e912896a764e5c6475989e95e4",
730 "bf460cc44c0edee851d72587c8425c3f06a62c55",
731 "ea74c00c45569007383b632d7f1d2adc82645717",
732 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
733 "284abed096637c80bb50844e393da9dd4b3f19ac",
734 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
735 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
736 "46f772c2832b3aad584674db666bd63e48b4f338",
737 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
738 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
739 "abd2fff80f74b311072ecdb91ce9ceba268fa6e9",
740 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
741 "8269b32b4a34440f1fa37927308debc7eb85f3fa",
742 "65b2c868790806be7ab4aaa6114d445c42a31f98",
743 "678979a45126a76eb629992cd64734862f53a555",
744 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
745 "52e7c2f8b01592898c13f1e7633881e350244209",
746 "d9d5556b77301952b4caf113337720966bc8e1f5",
747 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
748 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
749 "2c07272462c68cf5944b03e2aa049475b99143c5",
750 "07ca369fb875d37b9cf855045f528af1827edec4",
751 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
752 "153ae5c9fc2a31b38c4878b25d9026b9f51f132d",
753 "488341e88810d737de0b26de4e4d4fa0e78eb482",
754 "bd1e7f40e3971e2ff6c5561286901193a1557527",
755 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
756 "d7ffa3893c6fa937569791cf49986518a4a4d96e",
757 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
758 "8771d5ff7b93b9dd9d077e672b342235dfb28472",
759 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
760 NULL
763 static const char *sha1_graphics_8_grayscale[] =
765 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
766 "df35491dd5038187c05bac06921402ba6d7773a8",
767 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
768 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
769 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
770 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
771 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
772 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
773 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
774 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
775 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
776 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
777 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
778 "114bb377b4e78a1978e1ac09388c48861b5223a3",
779 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
780 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
781 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
782 "216388ddf6b563dd2058a9df65b40b6f72df1715",
783 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
784 "47f72be971bd2d3399dabd018201f4f5075e96fe",
785 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
786 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
787 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
788 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
789 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
790 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
791 "b6785a410048bb85e7ea3f0492459972103c935e",
792 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
793 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
794 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
795 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
796 "0000000000000000000000000000000000000000",
797 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
798 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
799 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
800 "6d41e6168662e75baacf74d911d7419d54c8d73c",
801 "2404952157ba1519094a2da6bfbf2b0f1356432d",
802 "24caede65b40815a60b83c4edfa06bdc542388cd",
803 "650a51bedd1af92469d2950eb95220db35f95c6e",
804 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
805 "b83f78ae85df87fc7af565db276c60c102274f20",
806 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
807 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
808 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
809 "85425940daf119125deb52421b2057acebe6d1cf",
810 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
811 "9869b6f088822fb423996f9968e5a931301fc2c3",
812 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
813 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
814 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
815 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
816 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
817 "f543efc84e638afbaa456e629100f0274de1a35b",
818 "1bd2587399006eed0d46beff397d32081f6bc58e",
819 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
820 "640a49455acabca6954a7fbb6af4e872af342d11",
821 "589e7911e09332ee090371deae17b0120ff990b5",
822 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
823 "115c90df05b1ff754dbdfe2a712ef126034d952d",
824 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
825 "ae45f0d463ff916f3cb630103969fd49e8d09ef4",
826 "2becf041f83d22ac072fef5e0efd9bc1572796fd",
827 "3685c9ae95118a83db3569832c29753276fa1264",
828 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
829 "5eb00252664ec39e61359adb1dade4906a87a248",
830 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854",
831 "dcad1a146c1d0ec2c4cc7f64bd4f45c57a604bfe",
832 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
833 "17ae603c199a5d6695d198a7f36e6d7263990951",
834 "1918a33f59d3500204ffc573318a39e9ff754221",
835 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
836 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
837 "a6a29836291f9dbca85e25cee60f62ef5faca6d7",
838 "3494a23633405e46af96cb57715617fef1ac252e",
839 "5a3ae1da30d83cc157e6a4a5617c85598309f4ac",
840 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
841 "87eab8f81fb2a036080e099760f628037f9306e7",
842 "a3eac75d30f681b3898ee469d368960529634d7d",
843 "cd5caeabdb71241766d24f038cfc5f1e91e11256",
844 "e2b393dc3f5833f7868668ea31369e90348768cd",
845 NULL
848 static const char *sha1_graphics_8[] =
850 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
851 "512246d4886ab889a090b167ba194577cb95272e",
852 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
853 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
854 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
855 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
856 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
857 "390b2bf70daba36310683f46af9cd50b9a061396",
858 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
859 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
860 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
861 "da1cc34a9d9b779fc7849e03e214096026506464",
862 "5ba8f99ca034666effa556748c49a0f5a015125f",
863 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
864 "73e2859ce849f756f954718ce3c90f02e31712b6",
865 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
866 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
867 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
868 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
869 "7262364067e03c7fa498af1d59d228d6c63b460e",
870 "5241241a355a667ef0834049adf4218e8b3f16b8",
871 "db22d666690948eb966f75b796c72c7150a5c4b9",
872 "af21fb2645b568b049549de375584c4aa3055143",
873 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
874 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
875 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
876 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
877 "bdc0a354635b879871077c5b712570e469863c99",
878 "d599bf210423fe3adbb4f1de87d9360de97827d0",
879 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
880 "cc01f17928f7780cefd423ea653b072eea723a1b",
881 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
882 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
883 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
884 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
885 "f4a334e69535de74ee5ed54be93a75120a66e54a",
886 "f751a55fb738b63b6fd7c229c33ef92605d0c9c1",
887 "995f77f2f53398399f09d1365cb4dfd105764e5c",
888 "61907a6685bba93077da40cfb28cf2ab74552fd2",
889 "122015e5e17c1c317c6e51c0e207826b606a4077",
890 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
891 "8c609921d4a3ed89a994a75482b27496bf103cf5",
892 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
893 "66493ee117719e172f327a426af601996025f28c",
894 "acead2745fec0b6c817fa601353bdf2d197b64f7",
895 "a6b858b2d125c159529d3f3ec45b31925a79acff",
896 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
897 "d83adc669c0dea0dc4812b93f998514b6f02d805",
898 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
899 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
900 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
901 "7d1bfff706b0713e53209407889f83a0da26a81d",
902 "5a1d8f9ea978b820edbc5c9e1c6f1cac022620ad",
903 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
904 "c404446958788fac00ee1eff571d682bc21dd7ac",
905 "95060f3dc9e6d01ada42f09a871b69f0699cb77c",
906 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
907 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
908 "0025a440866a404523a8a20e79a8891e45a2ff56",
909 "c04d335933895f836f0a28c1e3f7f444352c3b8e",
910 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
911 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
912 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
913 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
914 "293c41a7ed923a4617560481ae8815cebf83701a",
915 "ec06b56f3abe277be42650ebd49dabeaae9e756d",
916 "750c923785ba2afb9ce597516c072f90f014bf95",
917 "80089132f8a11d86e8038f2f8e12dfba46624ee5",
918 "bde5a62a065c027561226fbec5155e938ba7f6b3",
919 "a6311d74fc058079a327abb536e69353be719925",
920 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
921 "0000000000000000000000000000000000000000",
922 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
923 NULL
926 static const char *sha1_graphics_4[] =
928 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
929 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
930 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
931 "9401799e6116c35e5f0e5bdca07ea25316757a72",
932 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
933 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
934 "2505598845fa026ea7187582461efbf06cb6904f",
935 "3981a19363beca8f28d32a5928ac296fd22a5296",
936 "01404024ebb2c266d17d734059524d874491650f",
937 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
938 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
939 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
940 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
941 "1f26a01730f67d40ea711a50d9d801bac15a642e",
942 "3b53d24178cfacba53103a44dfd5d072b15a6781",
943 "c52cfd57f26037723d37192722fc3a217f280c9e",
944 "e34da6500cf2e424d980714d92737cf6c31a7bda",
945 "d17f4358ae529f920960ed89e535902ee13b0033",
946 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
947 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
948 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
949 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
950 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
951 "39c16648cf6c261be71a33cec41867f28e119b94",
952 "26ad5116562e7b58c76a26eaf521e2e40899e944",
953 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
954 "4f827ca6927f15191588456f985bf29d2a3b3c24",
955 "e7de769c3d12ea9dd223bef4881c578823bec67e",
956 "6fb102d020e5554116feefc8482104f3ae2036d2",
957 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
958 "20c9eb3276c08fdce35755e349bec94b04929812",
959 "628d837163a25c6520f19c0602383176dbad528e",
960 "b5a12cff7100290ad43f5ed17a321b42de048893",
961 "b672afbeeafb44194a821f0def81a8892872937e",
962 "db0124045882b598feea192186cf7eb7a0387866",
963 "602d91471378fe24a2d0248bd8a92b624f099fea",
964 "c93a86adfe58dc2d461f2ed962883d6b90888848",
965 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
966 "1a579cd280422131c35e907a023ee0e80749b5a4",
967 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
968 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
969 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
970 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
971 "3e411b004a5be84451860c6da6a4a1a482b77862",
972 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
973 "7811c536a6527112b438a6413f3927f2c79086a7",
974 "525ef3615040225752a2fe646ab99ee64e360630",
975 "46760975993f9881b7bbe94123173e6a683d3f25",
976 "c644f460937107214a88d5eb9e846d27abd8c874",
977 "df5feb905a31c288008cf5e82d73ac818a160d82",
978 "4f9658dde0432a711a4d783c1b5aa3365fb7d54b",
979 "09438163dcbede3890a0e6d8e614c97a06759380",
980 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
981 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
982 "ccf8d11b1e81895e9781f17c227c821228d8714b",
983 "f751e26578193afe6a727ee2a52318c404c56555",
984 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
985 "029552113292cc110fd6b7888e766628950aaeef",
986 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
987 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
988 "287ea7db721e641439888cb9f4bac3a5f16124eb",
989 "dd9eaa5325cdf250e89162ac84207978ebb6458e",
990 "42466aab11852741d937c1ff6f3bb711e58415a6",
991 "0663cf6330591fcf744aba96664e05d90243d07a",
992 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
993 "6fe7d0d17b892032cfd171c3d7c365f030b5be38",
994 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
995 "0000000000000000000000000000000000000000",
996 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
997 NULL
1000 static const char *sha1_graphics_4_grayscale[] =
1002 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
1003 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
1004 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
1005 "1c201d149c0bd886ff8a427ad513f15a70991174",
1006 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
1007 "315189097a02024d2eae61d524c4de07a396aee7",
1008 "73ac786015dea36ac466a6524dba757d5d238ece",
1009 "6e328cc4d53627f034b23706d8bf26afe18512ae",
1010 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
1011 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
1012 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
1013 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
1014 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
1015 "ec3879342b5a44f6de6efe946243ae5ade00980d",
1016 "6e328cc4d53627f034b23706d8bf26afe18512ae",
1017 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
1018 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
1019 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
1020 "b2bda683edef912957845a33edc055902a801fed",
1021 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
1022 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
1023 "43ee3e187dda14b86aef12371041ae70313b5a65",
1024 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
1025 "d4930552a7845111ffd9db57260be1ab97967c06",
1026 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
1027 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
1028 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
1029 "0000000000000000000000000000000000000000",
1030 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
1031 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
1032 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
1033 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
1034 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
1035 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
1036 "f8224430462f6a93f85ef33b8aa7299525990708",
1037 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
1038 "71a1705ee14068ee8c6c6680c1bd99703fb6abd7",
1039 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
1040 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
1041 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
1042 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
1043 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
1044 "027b05bc82ce4f897c4bf812610a641547368939",
1045 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
1046 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
1047 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
1048 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
1049 "5eeb56afea8040a8fb18c11f29931b836474126d",
1050 "30c256a783c4874261667bb31307eb282ab9470e",
1051 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
1052 "0ba7e5d68419702605739acb52fcc01c96cb63d4",
1053 "f8d2f196ba8a16f54acb934e61a759ab7d3f2f05",
1054 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
1055 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
1056 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f",
1057 "c47c2dc806b6b8ff28f300949695d013a46c0083",
1058 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
1059 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
1060 "58f400c9bb78e49a879276fb049edfc9c981740a",
1061 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
1062 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
1063 "c96a998be5c1d588ef1243cfd2610d056d16947e",
1064 "68bee638d59a373f33f308751471b3ef41849582",
1065 "be0501175cc3cbb61217fca76356f761117fb40f",
1066 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
1067 "3efe128a5bf250f2c460664e8f543f5ec54d5dc2",
1068 "2d5123e757cf00e423a89160d7dc4997c3688829",
1069 "0000000000000000000000000000000000000000",
1070 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
1071 NULL
1074 static const char *sha1_graphics_1[] =
1076 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1077 "61ade9054d4477fb89cf830539a5e8b4e45f0688",
1078 "ac530c5dbaf837e15b2337347e974184fad73643",
1079 "95fdcda26262d5948a9ade77d83fd698e0031050",
1080 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13",
1081 "f6b61ecf03ad11752775faca1d4404c6bb5065f5",
1082 "d7ad44d6f377598268e9968333ae2cf23a0715ca",
1083 "5871339cd7e6cee12d4dc45934a89071c73efe6b",
1084 "69e9b85b34caf736069ba91e57a5c3fa7c891653",
1085 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1086 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1087 "39ff81f77ef4ee772367ed1a63785987c060126e",
1088 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1089 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1090 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1091 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1092 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
1093 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
1094 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1095 "0ff4b49797e30e3555aab45219adf449a9a560ff",
1096 "280327328ca940c212ce24fe72e0b00014072767",
1097 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1098 "b85463875f755b85f1464b1b6275912bcbad6c9f",
1099 "816f200969feecc788b61dfeecf05b1790984401",
1100 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1101 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
1102 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1103 "0a76e0121facb103857130bc6e12185ad77fc3fa",
1104 "02aede714773d654d0fc2f640afaa133ec718ad5",
1105 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1106 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
1107 "b26699f62661e16a1dc452d24c88ce363a1f2998",
1108 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1109 "c14832e69ec3585c15987b3d69d5007236fa9814",
1110 "e44ea620b0c47125a34193537ab9d219a52ad028",
1111 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1112 "df81db2a9b3942a82e0dc5e57247b642f9b42702",
1113 "8819bf7a43295161fe045a42936000b3a51fe200",
1114 "e08dbc26469c229f75ccbf1a38a133401f270b84",
1115 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1116 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1117 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1118 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1119 "ffc78c075d4be66806f6c59180772d5eed963dc0",
1120 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1121 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1122 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1123 "b71ca46be287598f716bb04fac0a52ad139c70db",
1124 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1125 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1126 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1127 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1128 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1129 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1130 "399e988c922b7fad1c8f6907541c5dda65e60408",
1131 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1132 "655cfadeb157233c804d42b58195569c8846e3c1",
1133 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1134 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1135 "0d180c37bc26d83a1a11f66168757f3de2493243",
1136 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1137 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1138 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1139 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1140 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1141 "a2a928de9007d765da496abec8c21b23601f8c45",
1142 "41a417c1f25f2619301afa44bfcde85198985792",
1143 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1144 "ba682eb15c0ddffb942e6086e0ccad2353ed7241",
1145 "58273e1fbf961ff2c772d57160d60170e258d3fe",
1146 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1147 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1148 "44a28536466dc895feb824b23dfd4a47c6948af8",
1149 "17468a3789f0a6d65c302bda735a01dc2c1a74d9",
1150 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1151 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1152 "55c26d22f11d80b73383fa57d0fac552d705b092",
1153 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1154 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1155 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1156 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1157 "014f477664a7f4ce4a948d6359a2707119afc8e2",
1158 "74d01690e344bc22e7a0478e7a09ccd92354c486",
1159 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1160 "128eefd2ee043d59dc37918065f687e378e5ca95",
1161 "d7e2daab98ce1f698c4bfedfc01c0d79fcb76b8e",
1162 "8d34215487088b5d4ef63062270ce25c2862643d",
1163 "826562eb11a0d0bba77fa21245f7406a194e9225",
1164 "bbae6f0659e095a42b420082079663f937065813",
1165 "bbabe686a6955402c90530e7c67f1428868369b3",
1166 NULL
1169 static const RECT graphics_bounds[] =
1171 { 0, 0, 0, 0 },
1172 { 10, 3, 219, 101 },
1173 { 100, 100, 301, 301 },
1174 { 0, 0, 201, 201 },
1175 { 10, 10, 110, 320 },
1176 { 10, 99, 300, 200 },
1177 { 99, 12, 201, 200 },
1178 { 90, 110, 300, 200 },
1179 { 90, 90, 210, 200 },
1180 { 10, 99, 300, 200 },
1181 { 10, 99, 300, 200 },
1182 { 99, 12, 201, 200 },
1183 { 99, 11, 201, 200 },
1184 { 90, 110, 300, 200 },
1185 { 90, 110, 300, 200 },
1186 { 10, 10, 365, 405 },
1187 { 10, 10, 365, 405 },
1188 { 10, 10, 365, 405 },
1189 { 10, 10, 365, 405 },
1190 { 10, 10, 365, 405 },
1191 { 10, 10, 365, 405 },
1192 { 10, 10, 365, 405 },
1193 { 10, 10, 365, 405 },
1194 { 10, 10, 350, 251 },
1195 { 10, 10, 300, 200 },
1196 { 300, 10, 9, 260 },
1197 { 10, 10, 435, 405 },
1198 { 10, 10, 120, 120 },
1199 { 10, 10, 110, 110 },
1200 { 10, 10, 120, 110 },
1201 { 10, 10, 110, 120 },
1202 { 10, 10, 120, 120 },
1203 { 10, 10, 110, 110 },
1204 { 10, 10, 120, 110 },
1205 { 10, 10, 110, 120 },
1206 { 0, 4, 356, 356 },
1207 { 100, 100, 356, 356 },
1208 { 50, 50, 306, 306 },
1209 { 100, 100, 356, 356 },
1210 { 100, 100, 356, 356 },
1211 { 100, 100, 356, 356 },
1212 { 100, 100, 356, 356 },
1213 { 100, 100, 356, 356 },
1214 { 100, 100, 356, 356 },
1215 { 100, 100, 356, 356 },
1216 { 100, 100, 356, 356 },
1217 { 100, 100, 356, 356 },
1218 { 10, 10, 356, 356 },
1219 { 100, 100, 356, 356 },
1220 { 0, 0, 260, 39 },
1221 { 0, 0, 16, 16 },
1222 { 10, 10, 416, 26 },
1223 { 10, 8, 60, 104 },
1224 { 0, 10, 511, 306 },
1225 { 0, 10, 512, 306 },
1226 { 1, 1, 300, 512 },
1227 { 0, 0, 500, 512 },
1228 { 5, 5, 206, 206 },
1229 { 45, 45, 256, 256 },
1230 { 86, 86, 215, 215 },
1231 { 45, 45, 256, 256 },
1232 { 8, 0, 392, 231 },
1233 { 8, 0, 392, 231 },
1234 { 0, 0, 60, 20 },
1235 { 0, 0, 512, 512 },
1236 { -1, -1, -1, -1 } /* the end */
1239 static const char **current_sha1;
1240 static const RECT *current_bounds;
1241 static const char *dst_format;
1243 static inline DWORD get_stride(const BITMAPINFO *bmi)
1245 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1248 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1250 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1253 static char *hash_dib(const BITMAPINFO *bmi, const void *bits)
1255 DWORD dib_size = get_dib_size(bmi);
1256 HCRYPTHASH hash;
1257 char *buf;
1258 BYTE hash_buf[20];
1259 DWORD hash_size = sizeof(hash_buf);
1260 int i;
1261 static const char *hex = "0123456789abcdef";
1263 if(!crypt_prov) return NULL;
1265 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1267 CryptHashData(hash, bits, dib_size, 0);
1269 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1270 if(hash_size != sizeof(hash_buf)) return NULL;
1272 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1273 CryptDestroyHash(hash);
1275 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1277 for(i = 0; i < hash_size; i++)
1279 buf[i * 2] = hex[hash_buf[i] >> 4];
1280 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1282 buf[i * 2] = '\0';
1284 return buf;
1287 static void reset_bounds( HDC hdc )
1289 current_bounds = graphics_bounds;
1290 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE );
1293 static void compare_bounds( HDC hdc, const char *info )
1295 RECT rect;
1297 GetBoundsRect( hdc, &rect, DCB_RESET );
1299 if (current_bounds->left == -1 &&
1300 current_bounds->top == -1 &&
1301 current_bounds->right == -1 &&
1302 current_bounds->bottom == -1)
1304 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect ));
1305 return;
1308 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1309 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect ));
1310 current_bounds++;
1313 static void skip_compare( int count )
1315 current_sha1 += count;
1316 current_bounds++;
1319 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1321 char *hash = hash_dib(bmi, bits);
1322 BOOL ok_cond;
1323 int i;
1325 /* reset the bits for the next test */
1326 memset( bits, 0xcc, get_dib_size(bmi) );
1328 if(!hash)
1330 skip("SHA1 hashing unavailable on this platform\n");
1331 return;
1334 for(i = 0; i <= num_broken; i++)
1336 if(current_sha1[i] == NULL)
1338 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1339 HeapFree(GetProcessHeap(), 0, hash);
1340 return;
1344 ok_cond = !strcmp(hash, *current_sha1);
1346 for(i = 1; i <= num_broken; i++)
1347 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1349 todo_wine_if(todo)
1350 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1351 dst_format, info, *current_sha1, hash );
1353 current_sha1 += num_broken + 1;
1355 HeapFree(GetProcessHeap(), 0, hash);
1357 compare_bounds( hdc, info );
1360 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1362 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE);
1365 static const RECT bias_check[] =
1367 {100, 100, 200, 150},
1368 {100, 100, 150, 200},
1369 {100, 100, 50, 200},
1370 {100, 100, 0, 150},
1371 {100, 100, 0, 50},
1372 {100, 100, 50, 0},
1373 {100, 100, 150, 0},
1374 {100, 100, 200, 50}
1377 static const RECT hline_clips[] =
1379 {120, 120, 140, 120}, /* unclipped */
1380 {100, 122, 140, 122}, /* l edgecase */
1381 { 99, 124, 140, 124}, /* l edgecase clipped */
1382 {120, 126, 200, 126}, /* r edgecase */
1383 {120, 128, 201, 128}, /* r edgecase clipped */
1384 { 99, 130, 201, 130}, /* l and r clipped */
1385 {120, 100, 140, 100}, /* t edgecase */
1386 {120, 99, 140, 99}, /* t edgecase clipped */
1387 {120, 199, 140, 199}, /* b edgecase */
1388 {120, 200, 140, 200}, /* b edgecase clipped */
1389 {120, 132, 310, 132}, /* inside two clip rects */
1390 { 10, 134, 101, 134}, /* r end on l edgecase */
1391 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1392 {199, 138, 220, 138}, /* l end on r edgecase */
1393 {200, 140, 220, 140} /* l end on r edgecase clipped */
1396 static const RECT vline_clips[] =
1398 {120, 120, 120, 140}, /* unclipped */
1399 {100, 120, 100, 140}, /* l edgecase */
1400 { 99, 120, 99, 140}, /* l edgecase clipped */
1401 {199, 120, 199, 140}, /* r edgecase */
1402 {200, 120, 200, 140}, /* r edgecase clipped */
1403 {122, 99, 122, 201}, /* t and b clipped */
1404 {124, 100, 124, 140}, /* t edgecase */
1405 {126, 99, 126, 140}, /* t edgecase clipped */
1406 {128, 120, 128, 200}, /* b edgecase */
1407 {130, 120, 130, 201}, /* b edgecase clipped */
1408 {132, 12, 132, 140}, /* inside two clip rects */
1409 {134, 90, 134, 101}, /* b end on t edgecase */
1410 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1411 {138, 199, 138, 220}, /* t end on b edgecase */
1412 {140, 200, 140, 220} /* t end on b edgecase clipped */
1415 static const RECT line_clips[] =
1417 { 90, 110, 310, 120},
1418 { 90, 120, 295, 130},
1419 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1420 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1421 { 90, 132, 101, 137}, /* end pt just inside l edge */
1422 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1423 {199, 142, 210, 143} /* start pt just inside r edge */
1426 static const RECT wide_lines[] =
1428 {100, 10, 200, 10},
1429 {100, 21, 200, 21},
1430 {200, 40, 100, 40},
1431 {200, 61, 100, 61},
1432 { 10, 100, 10, 200},
1433 { 21, 100, 21, 200},
1434 { 40, 200, 40, 100},
1435 { 61, 200, 61, 100},
1438 static const POINT poly_lines[] =
1440 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1443 static const POINT polypoly_lines[] =
1445 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1448 static const DWORD polypoly_counts[] =
1450 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1453 static const RECT patblt_clips[] =
1455 {120, 120, 140, 126}, /* unclipped */
1456 {100, 130, 140, 136}, /* l edgecase */
1457 { 99, 140, 140, 146}, /* l edgecase clipped */
1458 {180, 130, 200, 136}, /* r edgecase */
1459 {180, 140, 201, 146}, /* r edgecase clipped */
1460 {120, 100, 130, 110}, /* t edgecase */
1461 {140, 99, 150, 110}, /* t edgecase clipped */
1462 {120, 180, 130, 200}, /* b edgecase */
1463 {140, 180, 150, 201}, /* b edgecase */
1464 {199, 150, 210, 156}, /* l edge on r edgecase */
1465 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1466 { 90, 150, 101, 156}, /* r edge on l edgecase */
1467 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1468 {160, 90, 166, 101}, /* b edge on t edgecase */
1469 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1470 {160, 199, 166, 210}, /* t edge on b edgecase */
1471 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1474 static const RECT rectangles[] =
1476 {10, 11, 100, 101},
1477 {250, 100, 350, 10},
1478 {120, 10, 120, 20}, /* zero width */
1479 {120, 10, 130, 10}, /* zero height */
1480 {120, 40, 121, 41}, /* 1 x 1 */
1481 {130, 50, 132, 52}, /* 2 x 2 */
1482 {140, 60, 143, 63}, /* 3 x 3 */
1483 {150, 70, 154, 74}, /* 4 x 4 */
1484 {120, 20, 121, 30}, /* width == 1 */
1485 {130, 20, 132, 30}, /* width == 2 */
1486 {140, 20, 143, 30}, /* width == 3 */
1487 {200, 20, 210, 21}, /* height == 1 */
1488 {200, 30, 210, 32}, /* height == 2 */
1489 {200, 40, 210, 43} /* height == 3 */
1492 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1493 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1494 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1495 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1496 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1497 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1499 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1500 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1501 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1502 0x00, 0x01 }; /* <eod> */
1504 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1505 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1506 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1507 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1509 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1510 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1512 static const RGBQUAD default_palette_1[2] =
1514 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1517 static const RGBQUAD default_palette_4[16] =
1519 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1520 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1521 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1522 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1525 static const RGBQUAD default_palette_8[256] =
1527 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1528 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1529 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1530 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1531 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1532 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1533 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1534 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1535 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1536 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1537 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1538 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1539 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1540 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1541 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1542 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1543 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1544 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1545 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1546 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1547 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1548 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1549 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1550 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1551 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1552 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1553 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1554 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1555 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1556 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1557 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1558 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1559 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1560 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1561 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1562 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1563 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1564 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1565 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1566 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1567 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1568 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1569 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1570 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1571 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1572 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1573 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1574 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1575 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1576 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1577 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1578 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1579 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1580 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1581 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1582 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1583 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1584 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1585 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1586 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1587 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1588 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1589 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1590 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1593 static HPALETTE create_default_palette( int bpp )
1595 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1596 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1597 PALETTEENTRY *entries = pal->palPalEntry;
1598 int i;
1600 pal->palVersion = 0x300;
1601 pal->palNumEntries = 1 << bpp;
1602 switch (bpp)
1604 case 1:
1605 for (i = 0; i < 2; i++)
1607 entries[i].peRed = default_palette_1[i].rgbRed;
1608 entries[i].peGreen = default_palette_1[i].rgbGreen;
1609 entries[i].peBlue = default_palette_1[i].rgbBlue;
1610 entries[i].peFlags = 0;
1612 break;
1613 case 4:
1614 for (i = 0; i < 16; i++)
1616 entries[i].peRed = default_palette_4[i].rgbRed;
1617 entries[i].peGreen = default_palette_4[i].rgbGreen;
1618 entries[i].peBlue = default_palette_4[i].rgbBlue;
1619 entries[i].peFlags = 0;
1621 break;
1622 case 8:
1623 for (i = 0; i < 256; i++)
1625 entries[i].peRed = default_palette_8[i].rgbRed;
1626 entries[i].peGreen = default_palette_8[i].rgbGreen;
1627 entries[i].peBlue = default_palette_8[i].rgbBlue;
1628 entries[i].peFlags = 0;
1630 break;
1632 return CreatePalette( pal );
1635 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1637 HBRUSH brush = CreateSolidBrush( color );
1638 brush = SelectObject( hdc, brush );
1639 PatBlt( hdc, x, y, width, height, PATCOPY );
1640 DeleteObject( SelectObject( hdc, brush ) );
1643 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1645 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1646 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1647 PALETTEENTRY *entries = pal->palPalEntry;
1648 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1649 LOGBRUSH log_brush;
1650 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1651 HBITMAP bmp;
1652 INT i, j, x, y, hatch_style;
1653 HDC src_dc;
1654 HRGN hrgn, hrgn2;
1655 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1656 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1657 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1658 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1659 RGBQUAD *brush_colors = brush_bi->bmiColors;
1660 BYTE *brush_bits, *src_bits;
1661 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1662 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1663 BLENDFUNCTION blend;
1664 COLORREF old_text, old_bkgnd;
1665 HPALETTE hpal, old_hpal;
1667 blend.BlendOp = AC_SRC_OVER;
1668 blend.BlendFlags = 0;
1670 reset_bounds( hdc );
1672 memset(bits, 0xcc, get_dib_size(bmi));
1673 compare_hash(hdc, bmi, bits, "empty");
1675 src_dc = CreateCompatibleDC( 0 );
1676 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1677 orig_pen = SelectObject(hdc, solid_pen);
1678 SetBrushOrgEx(hdc, 0, 0, NULL);
1680 /* horizontal and vertical lines */
1681 for(i = 1; i <= 16; i++)
1683 SetROP2(hdc, i);
1684 MoveToEx(hdc, 10, i * 3, NULL);
1685 LineTo(hdc, 100, i * 3); /* l -> r */
1686 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1687 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1688 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1689 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1690 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1691 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1693 compare_hash(hdc, bmi, bits, "h and v solid lines");
1695 /* diagonal lines */
1696 SetROP2(hdc, R2_COPYPEN);
1697 for(i = 0; i < 16; i++)
1699 double s = sin(M_PI * i / 8.0);
1700 double c = cos(M_PI * i / 8.0);
1702 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1703 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1705 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1707 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1709 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1710 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1712 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1714 /* solid brush PatBlt */
1715 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1716 orig_brush = SelectObject(hdc, solid_brush);
1718 for(i = 0, y = 10; i < 256; i++)
1720 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1722 if(rop_uses_src(rop3[i]))
1723 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1724 else
1726 ok(ret, "got FALSE for %x\n", rop3[i]);
1727 y += 20;
1731 compare_hash(hdc, bmi, bits, "solid patblt");
1733 /* clipped lines */
1734 hrgn = CreateRectRgn(10, 10, 200, 20);
1735 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1736 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1737 SetRectRgn(hrgn2, 290, 100, 300, 200);
1738 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1739 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1740 DeleteObject(hrgn2);
1742 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1744 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1745 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1747 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1749 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1751 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1752 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1754 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1756 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1758 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1759 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1761 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1763 /* clipped PatBlt */
1764 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1766 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1767 patblt_clips[i].right - patblt_clips[i].left,
1768 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1770 compare_hash(hdc, bmi, bits, "clipped patblt");
1772 /* clipped dashed lines */
1773 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1774 SelectObject(hdc, dashed_pen);
1775 SetBkMode(hdc, TRANSPARENT);
1776 SetBkColor(hdc, RGB(0, 0xff, 0));
1778 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1780 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1781 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1783 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1785 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1787 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1788 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1790 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1792 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1794 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1795 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1797 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1799 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1801 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1802 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1804 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1806 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1808 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1809 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1811 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1813 SetBkMode(hdc, OPAQUE);
1815 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1817 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1818 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1820 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1822 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1824 /* 8888 DIB pattern brush */
1826 brush_bi->bmiHeader = dib_brush_header_8888;
1827 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1828 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1829 brush_bits[2] = 0xff;
1830 brush_bits[6] = 0xff;
1831 brush_bits[14] = 0xff;
1832 brush_bits[65] = 0xff;
1833 brush_bits[69] = 0xff;
1834 brush_bits[72] = 0xff;
1836 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1838 SelectObject(hdc, dib_brush);
1839 SetBrushOrgEx(hdc, 1, 1, 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, "top-down 8888 dib brush patblt", 1, FALSE);
1852 else
1853 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1855 SelectObject(hdc, orig_brush);
1856 DeleteObject(dib_brush);
1858 /* 8888 bottom-up DIB pattern brush */
1860 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1862 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1864 SelectObject(hdc, dib_brush);
1866 /* This used to set the x origin to 100 as well, but
1867 there's a Windows bug for 24 bpp where the brush's x offset
1868 is incorrectly calculated for rops that involve both D and P */
1869 SetBrushOrgEx(hdc, 4, 100, 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, "bottom-up 8888 dib brush patblt", 1, FALSE);
1882 else
1883 compare_hash_broken_todo(hdc, bmi, bits, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1885 SelectObject(hdc, orig_brush);
1886 DeleteObject(dib_brush);
1888 /* 24 bpp dib pattern brush */
1890 brush_bi->bmiHeader = dib_brush_header_24;
1891 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1892 memset(brush_bits, 0, 16 * 16 * 3);
1893 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1894 brush_bits[49] = brush_bits[52] = 0xff;
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 24 bpp brush patblt", 1, FALSE);
1912 else
1913 compare_hash_broken_todo(hdc, bmi, bits, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1915 SelectObject(hdc, orig_brush);
1916 DeleteObject(dib_brush);
1918 /* 555 dib pattern brush */
1920 brush_bi->bmiHeader = dib_brush_header_555;
1921 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1922 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1923 brush_bits[0] = brush_bits[1] = 0xff;
1924 brush_bits[32] = brush_bits[34] = 0x7c;
1926 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1928 SelectObject(hdc, dib_brush);
1929 SetBrushOrgEx(hdc, 1, 1, NULL);
1931 for(i = 0, y = 10; i < 256; i++)
1933 if(!rop_uses_src(rop3[i]))
1935 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1936 ok(ret, "got FALSE for %x\n", rop3[i]);
1937 y += 25;
1940 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1941 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 1, FALSE);
1942 else
1943 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1945 SelectObject(hdc, orig_brush);
1946 DeleteObject(dib_brush);
1948 SetBrushOrgEx(hdc, 0, 0, NULL);
1950 /* 8 bpp dib pattern brush */
1952 brush_bi->bmiHeader = dib_brush_header_8;
1953 brush_bi->bmiHeader.biClrUsed = 3;
1954 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1955 brush_colors[0].rgbRed = 0xff;
1956 brush_colors[1].rgbRed = 0xff;
1957 brush_colors[1].rgbGreen = 0xff;
1958 brush_colors[1].rgbBlue = 0xff;
1960 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1961 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1962 brush_bits[0] = brush_bits[1] = 1;
1963 brush_bits[16] = brush_bits[17] = 2;
1964 brush_bits[32] = brush_bits[33] = 6;
1966 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1968 SelectObject(hdc, dib_brush);
1969 SetBrushOrgEx(hdc, 1, 1, NULL);
1971 for(i = 0, y = 10; i < 256; i++)
1973 if(!rop_uses_src(rop3[i]))
1975 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1976 ok(ret, "got FALSE for %x\n", rop3[i]);
1977 y += 25;
1980 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1982 SelectObject(hdc, orig_brush);
1983 DeleteObject(dib_brush);
1985 /* 4 bpp dib pattern brush */
1987 brush_bi->bmiHeader = dib_brush_header_4;
1988 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1990 SelectObject(hdc, dib_brush);
1991 SetBrushOrgEx(hdc, 1, 1, NULL);
1993 for(i = 0, y = 10; i < 256; i++)
1995 if(!rop_uses_src(rop3[i]))
1997 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1998 ok(ret, "got FALSE for %x\n", rop3[i]);
1999 y += 25;
2002 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
2004 SelectObject(hdc, orig_brush);
2005 DeleteObject(dib_brush);
2007 /* 1 bpp dib pattern brush */
2009 brush_bi->bmiHeader = dib_brush_header_1;
2010 brush_bi->bmiHeader.biClrUsed = 2;
2011 memset(brush_bits, 0, 16 * 4);
2012 brush_bits[0] = 0xf0;
2013 brush_bits[4] = 0xf0;
2014 brush_bits[8] = 0xf0;
2016 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
2017 SelectObject(hdc, dib_brush);
2018 for(i = 0, y = 10; i < 256; i++)
2020 if(!rop_uses_src(rop3[i]))
2022 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2023 ok(ret, "got FALSE for %x\n", rop3[i]);
2024 y += 25;
2028 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
2030 SelectObject(hdc, orig_brush);
2031 DeleteObject(dib_brush);
2033 /* 1 bpp ddb pattern brush */
2035 old_text = GetTextColor( hdc );
2036 old_bkgnd = GetBkColor( hdc );
2037 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2038 dib_brush = CreatePatternBrush( bmp );
2039 SelectObject(hdc, dib_brush);
2040 for(i = 0, y = 10; i < 256; i++)
2042 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2043 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2044 if(!rop_uses_src(rop3[i]))
2046 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
2047 ok(ret, "got FALSE for %x\n", rop3[i]);
2048 y += 25;
2052 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", dib_is_1bpp ? 3 : 0, dib_is_1bpp);
2054 DeleteObject(bmp);
2055 SelectObject(hdc, orig_brush);
2056 DeleteObject( dib_brush );
2057 SetBrushOrgEx(hdc, 0, 0, NULL);
2058 SetTextColor(hdc, old_text);
2059 SetBkColor(hdc, old_bkgnd);
2061 /* Rectangle */
2063 SelectObject(hdc, solid_pen);
2064 SelectObject(hdc, solid_brush);
2066 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2068 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
2071 SelectObject(hdc, dashed_pen);
2072 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
2074 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
2077 compare_hash(hdc, bmi, bits, "rectangles");
2078 SelectObject(hdc, solid_pen);
2080 /* PaintRgn */
2082 PaintRgn(hdc, hrgn);
2083 compare_hash(hdc, bmi, bits, "PaintRgn");
2085 /* RTL rectangles */
2087 if( !pSetLayout )
2089 win_skip("Don't have SetLayout\n");
2090 skip_compare(1);
2092 else
2094 pSetLayout(hdc, LAYOUT_RTL);
2095 PaintRgn(hdc, hrgn);
2096 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
2097 Rectangle(hdc, 100, 250, 110, 260);
2098 compare_hash(hdc, bmi, bits, "rtl");
2100 pSetLayout(hdc, LAYOUT_LTR);
2102 DeleteObject( hrgn );
2104 for(i = 0, y = 10; i < 256; i++)
2106 if(!rop_uses_src(rop3[i]))
2108 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
2110 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
2111 SelectObject(hdc, hatch_brush);
2112 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
2113 ok(ret, "got FALSE for %x\n", rop3[i]);
2114 SelectObject(hdc, orig_brush);
2115 DeleteObject(hatch_brush);
2117 y += 25;
2121 compare_hash_broken_todo(hdc, bmi, bits, "hatch brushes", 1, FALSE); /* nt4 is different */
2123 /* overlapping blits */
2125 orig_brush = SelectObject(hdc, solid_brush);
2127 Rectangle(hdc, 10, 10, 100, 100);
2128 Rectangle(hdc, 20, 15, 30, 40);
2129 Rectangle(hdc, 15, 15, 20, 20);
2130 Rectangle(hdc, 15, 20, 50, 45);
2131 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
2132 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y");
2134 Rectangle(hdc, 10, 10, 100, 100);
2135 Rectangle(hdc, 20, 15, 30, 40);
2136 Rectangle(hdc, 15, 15, 20, 20);
2137 Rectangle(hdc, 15, 20, 50, 45);
2138 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
2139 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2140 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
2141 else
2142 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2144 Rectangle(hdc, 10, 10, 100, 100);
2145 Rectangle(hdc, 20, 15, 30, 40);
2146 Rectangle(hdc, 15, 15, 20, 20);
2147 Rectangle(hdc, 15, 20, 50, 45);
2148 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
2149 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y");
2151 Rectangle(hdc, 10, 10, 100, 100);
2152 Rectangle(hdc, 20, 15, 30, 40);
2153 Rectangle(hdc, 15, 15, 20, 20);
2154 Rectangle(hdc, 15, 20, 50, 45);
2155 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
2156 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
2157 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
2158 else
2159 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2161 Rectangle(hdc, 10, 10, 100, 100);
2162 Rectangle(hdc, 20, 15, 30, 40);
2163 Rectangle(hdc, 15, 15, 20, 20);
2164 Rectangle(hdc, 15, 20, 50, 45);
2165 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
2166 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y");
2168 Rectangle(hdc, 10, 10, 100, 100);
2169 Rectangle(hdc, 20, 15, 30, 40);
2170 Rectangle(hdc, 15, 15, 20, 20);
2171 Rectangle(hdc, 15, 20, 50, 45);
2172 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
2173 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y");
2175 Rectangle(hdc, 10, 10, 100, 100);
2176 Rectangle(hdc, 20, 15, 30, 40);
2177 Rectangle(hdc, 15, 15, 20, 20);
2178 Rectangle(hdc, 15, 20, 50, 45);
2179 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
2180 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
2181 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
2182 else
2183 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2185 Rectangle(hdc, 10, 10, 100, 100);
2186 Rectangle(hdc, 20, 15, 30, 40);
2187 Rectangle(hdc, 15, 15, 20, 20);
2188 Rectangle(hdc, 15, 20, 50, 45);
2189 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
2190 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" );
2192 /* blitting with 32-bpp BI_RGB source */
2194 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
2195 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2196 src_bi->bmiHeader.biHeight = 256;
2197 src_bi->bmiHeader.biWidth = 256;
2198 src_bi->bmiHeader.biBitCount = 32;
2199 src_bi->bmiHeader.biPlanes = 1;
2200 src_bi->bmiHeader.biCompression = BI_RGB;
2201 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2202 SelectObject( src_dc, bmp );
2203 for (y = 0; y < 256; y++)
2204 for (x = 0; x < 256; x++)
2206 BYTE a = (x + y) * 2;
2207 BYTE r = (BYTE)(y + 2 * x) * a / 255;
2208 BYTE g = (BYTE)(x + y / 3) * a / 255;
2209 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
2210 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
2213 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2215 /* Interesting cases for 1-bpp dst */
2216 BitBlt( hdc, 1, 4, 2, 2, src_dc, 0, 0, SRCCOPY );
2217 BitBlt( hdc, 1, 8, 16, 2, src_dc, 0, 0, SRCCOPY );
2218 BitBlt( hdc, 1, 12, 15, 2, src_dc, 0, 0, SRCCOPY );
2219 BitBlt( hdc, 0, 16, 8, 2, src_dc, 0, 0, SRCCOPY );
2220 BitBlt( hdc, 0, 20, 9, 2, src_dc, 0, 0, SRCCOPY );
2221 BitBlt( hdc, 7, 24, 1, 2, src_dc, 0, 0, SRCCOPY );
2222 BitBlt( hdc, 7, 28, 2, 2, src_dc, 0, 0, SRCCOPY );
2223 BitBlt( hdc, 7, 32, 9, 2, src_dc, 0, 0, SRCCOPY );
2224 BitBlt( hdc, 7, 36, 10, 2, src_dc, 0, 0, SRCCOPY );
2226 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2227 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
2228 else
2229 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" );
2231 blend.SourceConstantAlpha = 0xd0;
2232 blend.AlphaFormat = 0;
2233 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2234 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2236 if (!pGdiAlphaBlend) skip_compare(2);
2237 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
2239 else
2241 if (!pGdiAlphaBlend) skip_compare(1);
2242 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
2245 blend.SourceConstantAlpha = 0xb0;
2246 blend.AlphaFormat = AC_SRC_ALPHA;
2247 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
2248 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2250 if (!pGdiAlphaBlend) skip_compare(2);
2251 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 1, FALSE );
2253 else
2255 if (!pGdiAlphaBlend) skip_compare(1);
2256 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
2259 /* blitting with 32-bpp r10g10b10 source */
2261 src_bi->bmiHeader.biBitCount = 32;
2262 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2263 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
2264 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
2265 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
2266 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2267 SelectObject( src_dc, bmp );
2268 for (y = 0; y < 256; y++)
2269 for (x = 0; x < 256; x++)
2271 WORD r = (7 * x + 3 * y) % 1024;
2272 WORD g = (11 * x + y / 3) % 1024;
2273 WORD b = (x / 3 + 9 * y) % 1024;
2274 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
2277 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2278 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2279 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
2280 else
2281 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2283 /* blitting with 32-bpp b6g6r6 source */
2285 src_bi->bmiHeader.biBitCount = 32;
2286 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2287 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
2288 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
2289 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
2290 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2291 SelectObject( src_dc, bmp );
2292 for (y = 0; y < 256; y++)
2293 for (x = 0; x < 256; x++)
2295 BYTE r = (y + 2 * x) % 64;
2296 BYTE g = (x + y / 3) % 64;
2297 BYTE b = (x / 3 + 2 * y) % 64;
2298 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
2301 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2302 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2303 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
2304 else
2305 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2307 /* blitting with 24-bpp source */
2309 src_bi->bmiHeader.biBitCount = 24;
2310 src_bi->bmiHeader.biCompression = BI_RGB;
2311 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2312 DeleteObject( SelectObject( src_dc, bmp ) );
2313 for (y = 0; y < 256; y++)
2314 for (x = 0; x < 256; x++)
2316 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
2317 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
2318 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
2321 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2322 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
2323 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
2324 else
2325 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2327 blend.SourceConstantAlpha = 0xe0;
2328 blend.AlphaFormat = 0;
2329 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2330 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2332 if (!pGdiAlphaBlend) skip_compare(2);
2333 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 1, FALSE );
2335 else
2337 if (!pGdiAlphaBlend) skip_compare(1);
2338 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
2341 /* blitting with 16-bpp BI_RGB source */
2343 src_bi->bmiHeader.biBitCount = 16;
2344 src_bi->bmiHeader.biCompression = BI_RGB;
2345 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2346 DeleteObject( SelectObject( src_dc, bmp ) );
2347 for (y = 0; y < 256; y++)
2348 for (x = 0; x < 256; x++)
2349 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2351 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2352 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2353 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
2354 else
2355 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2357 /* blitting with 16-bpp b4g4r4 source */
2359 src_bi->bmiHeader.biBitCount = 16;
2360 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
2361 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
2362 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
2363 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
2364 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2365 DeleteObject( SelectObject( src_dc, bmp ) );
2366 for (y = 0; y < 256; y++)
2367 for (x = 0; x < 256; x++)
2368 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
2370 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2371 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
2372 compare_hash_broken_todo(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
2373 else
2374 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2376 /* blitting with 8-bpp source */
2378 src_bi->bmiHeader.biBitCount = 8;
2379 src_bi->bmiHeader.biCompression = BI_RGB;
2380 src_bi->bmiHeader.biClrUsed = 160;
2381 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
2382 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2383 DeleteObject( SelectObject( src_dc, bmp ) );
2384 for (y = 0; y < 256; y++)
2385 for (x = 0; x < 256; x++)
2386 src_bits[y * 256 + x] = 3 * x + 5 * y;
2388 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2389 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2391 blend.SourceConstantAlpha = 0xd0;
2392 blend.AlphaFormat = 0;
2393 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2394 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2396 if (!pGdiAlphaBlend) skip_compare(2);
2397 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 1, FALSE );
2399 else
2401 if (!pGdiAlphaBlend) skip_compare(1);
2402 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
2405 /* blitting with 4-bpp source */
2407 src_bi->bmiHeader.biBitCount = 4;
2408 src_bi->bmiHeader.biClrUsed = 12;
2409 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
2410 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2411 DeleteObject( SelectObject( src_dc, bmp ) );
2412 for (y = 0; y < 256; y++)
2413 for (x = 0; x < 256; x += 2)
2414 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
2416 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2417 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2419 /* blitting with 1-bpp source */
2421 src_bi->bmiHeader.biBitCount = 1;
2422 src_bi->bmiHeader.biClrUsed = 0;
2423 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
2424 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
2425 DeleteObject( SelectObject( src_dc, bmp ) );
2426 for (y = 0; y < 256; y++)
2427 for (x = 0; x < 256; x += 8)
2428 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
2430 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2431 /* Some interesting src co-ords */
2432 BitBlt( hdc, 10, 10, 3, 10, src_dc, 0, 0, SRCCOPY );
2433 BitBlt( hdc, 20, 10, 3, 10, src_dc, 2, 0, SRCCOPY );
2434 BitBlt( hdc, 30, 10, 3, 10, src_dc, 5, 0, SRCCOPY );
2435 BitBlt( hdc, 40, 10, 3, 10, src_dc, 6, 0, SRCCOPY );
2436 BitBlt( hdc, 50, 10, 20, 10, src_dc, 6, 0, SRCCOPY );
2437 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" );
2439 blend.SourceConstantAlpha = 0x90;
2440 blend.AlphaFormat = 0;
2441 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
2442 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2444 if (!pGdiAlphaBlend) skip_compare(2);
2445 else compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 1-bpp", 1, FALSE );
2447 else
2449 if (!pGdiAlphaBlend) skip_compare(1);
2450 else compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" );
2453 /* blitting with 1-bpp ddb source */
2455 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2456 DeleteObject( SelectObject( src_dc, bmp ) );
2458 old_text = GetTextColor( hdc );
2459 old_bkgnd = GetBkColor( hdc );
2460 for (i = 0; i < 256; i += 13)
2462 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) );
2463 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) );
2464 BitBlt( hdc, i, 0, 13, 13, src_dc, 0, 0, SRCCOPY );
2466 for (i = 0; i < 256; i += 13)
2468 SetTextColor(hdc, PALETTEINDEX( i ));
2469 SetBkColor(hdc, PALETTEINDEX( i + 3 ));
2470 BitBlt( hdc, i, 13, 13, 13, src_dc, 0, 0, SRCCOPY );
2472 for (i = 0; i < 256; i += 13)
2474 SetTextColor(hdc, DIBINDEX( i ));
2475 SetBkColor(hdc, DIBINDEX( i + 3 ));
2476 BitBlt( hdc, i, 26, 13, 13, src_dc, 0, 0, SRCCOPY );
2478 SetTextColor( hdc, old_text );
2479 SetBkColor( hdc, old_bkgnd );
2480 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp ddb SRCCOPY" );
2482 DeleteObject( bmp );
2484 /* blitting to 1-bpp ddb dest */
2486 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2487 DeleteObject( SelectObject( src_dc, bmp ) );
2489 for (y = 0; y < 16; y++)
2490 for (x = 0; x < 16; x++)
2491 SetPixel( hdc, x, y, RGB( 16 * x, 16 * y, 8 * (x + y)) );
2492 PatBlt( hdc, 15, 15, 1, 1, WHITENESS );
2493 /* source colors are ignored */
2494 SetTextColor( src_dc, 0xbeef );
2495 SetBkColor( src_dc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2496 /* destination text color is also ignored */
2497 SetTextColor( hdc, 0xbedead );
2499 i = 16;
2500 SetBkColor( hdc, 0xffffff );
2501 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2502 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2503 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2504 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2505 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2506 SetBkColor( hdc, 0 );
2507 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2508 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2509 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2510 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2511 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2512 SetBkColor( hdc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2513 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2514 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2515 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2516 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2517 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2518 SetBkColor( hdc, RGB( 16 * 13, 16 * 14, 8 * (13 + 14) ));
2519 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2520 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2521 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2522 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2523 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2524 SetBkColor( hdc, PALETTEINDEX( 1 ));
2525 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2526 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2527 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2528 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2529 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2530 SetBkColor( hdc, DIBINDEX( 2 ));
2531 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY );
2532 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2533 StretchDIBits( src_dc, 0, 0, 16, 16, 0,
2534 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY );
2535 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ );
2536 SetTextColor( hdc, old_text );
2537 SetBkColor( hdc, old_bkgnd );
2538 compare_hash(hdc, bmi, bits, "BitBlt dst 1-bpp ddb");
2540 DeleteDC( src_dc );
2541 DeleteObject( bmp );
2543 /* RLE StretchDIBits */
2544 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2545 src_bi->bmiHeader.biWidth = 8;
2546 src_bi->bmiHeader.biHeight = 8;
2547 src_bi->bmiHeader.biPlanes = 1;
2548 src_bi->bmiHeader.biBitCount = 8;
2549 src_bi->bmiHeader.biCompression = BI_RLE8;
2550 src_bi->bmiHeader.biClrUsed = 0;
2551 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2553 for (i = 0; i < 256; i++)
2555 src_bi->bmiColors[i].rgbRed = i;
2556 src_bi->bmiColors[i].rgbGreen = i;
2557 src_bi->bmiColors[i].rgbBlue = i;
2558 src_bi->bmiColors[i].rgbReserved = 0;
2561 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2562 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2563 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2564 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2565 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2566 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp );
2568 /* 32 bpp StretchDIBits */
2570 src_bi->bmiHeader.biWidth = 4;
2571 src_bi->bmiHeader.biHeight = 4;
2572 src_bi->bmiHeader.biPlanes = 1;
2573 src_bi->bmiHeader.biBitCount = 32;
2574 src_bi->bmiHeader.biCompression = BI_RGB;
2575 src_bi->bmiHeader.biClrUsed = 0;
2576 src_bi->bmiHeader.biSizeImage = 0;
2578 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2579 ok(ret == 4, "got %d\n", ret);
2580 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2581 ok(ret == 4, "got %d\n", ret);
2582 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2583 ok(ret == 4, "got %d\n", ret);
2584 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2585 ok(ret == 4, "got %d\n", ret);
2586 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2587 ok(ret == 4, "got %d\n", ret);
2588 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2589 ok(ret == 4, "got %d\n", ret);
2591 src_bi->bmiHeader.biHeight = -4;
2593 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2594 ok(ret == 4, "got %d\n", ret);
2595 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2596 ok(ret == -4, "got %d\n", ret);
2597 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2598 ok(ret == 4, "got %d\n", ret);
2599 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2600 ok(ret == -4, "got %d\n", ret);
2601 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2602 ok(ret == 4, "got %d\n", ret);
2603 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2604 ok(ret == -4, "got %d\n", ret);
2606 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2608 /* Solid colors */
2609 for (i = 0; i < 256; i++)
2611 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2612 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2613 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2614 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2615 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i );
2618 /* A few extra colors that are interesting in the 1bpp case */
2620 /* bk color */
2621 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2622 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2624 /* color 0 */
2625 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2626 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2628 /* color 1 */
2629 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2630 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2632 compare_hash(hdc, bmi, bits, "Colors");
2634 for (i = 0; i < 256; i++)
2636 COLORREF s, g;
2637 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2638 g = GetPixel( hdc, i * 2, 10 );
2639 ok( s == g, "got %08x and %08x\n", s, g );
2641 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2642 g = GetPixel( hdc, i * 2, 20 );
2643 ok( s == g, "got %08x and %08x\n", s, g );
2645 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2646 g = GetPixel( hdc, i * 2, 30 );
2647 ok( s == g, "got %08x and %08x\n", s, g );
2649 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2650 g = GetPixel( hdc, i * 2, 40 );
2651 ok( s == g, "got %08x and %08x\n", s, g );
2653 for (j = 0; j < 256; j++)
2655 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ));
2656 g = GetPixel( hdc, i * 2, 50+j );
2657 ok( s == g, "got %08x and %08x\n", s, g );
2659 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i );
2660 g = GetPixel( hdc, i * 2 + 1, 50+j );
2661 ok( s == g, "got %08x and %08x\n", s, g );
2665 compare_hash(hdc, bmi, bits, "SetPixel");
2667 /* gradients */
2669 if (pGdiGradientFill)
2671 TRIVERTEX vrect[] =
2673 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2674 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2675 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2676 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2678 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2680 TRIVERTEX vtri[] =
2682 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2683 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2684 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2686 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2687 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2688 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2690 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2691 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2692 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2694 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2695 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2696 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2698 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2699 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2700 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2702 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2703 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2704 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2706 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2707 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2708 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2710 GRADIENT_TRIANGLE tri[] =
2712 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2713 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2716 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2717 for (i = 0; i < 4; i++) vrect[i].y += 250;
2718 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2720 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2721 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2722 else
2723 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2725 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2726 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2727 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2728 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2729 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, 1 );
2730 else
2731 compare_hash(hdc, bmi, bits, "GdiGradientFill" );
2733 else
2735 win_skip( "GdiGradientFill not supported\n" );
2736 skip_compare(1);
2737 skip_compare(1);
2740 /* wide pen */
2742 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2743 SelectObject( hdc, wide_pen );
2745 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2747 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2748 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2751 compare_hash(hdc, bmi, bits, "wide pen" );
2753 SelectObject( hdc, orig_pen );
2754 DeleteObject( wide_pen );
2756 log_brush.lbStyle = BS_SOLID;
2757 log_brush.lbColor = RGB(0xff, 0, 0);
2758 log_brush.lbHatch = 0;
2760 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2761 9, &log_brush, 0, NULL );
2762 SelectObject( hdc, wide_pen );
2764 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2765 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2767 SelectObject( hdc, orig_pen );
2768 DeleteObject( wide_pen );
2770 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID,
2771 16, &log_brush, 0, NULL );
2772 SelectObject( hdc, wide_pen );
2774 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2775 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2777 SelectObject( hdc, orig_pen );
2778 DeleteObject( wide_pen );
2780 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID,
2781 9, &log_brush, 0, NULL );
2782 SelectObject( hdc, wide_pen );
2784 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) );
2785 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2787 SelectObject( hdc, orig_pen );
2788 DeleteObject( wide_pen );
2790 /* brushed wide pen */
2792 old_text = GetTextColor( hdc );
2793 old_bkgnd = GetBkColor( hdc );
2794 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2795 log_brush.lbStyle = BS_PATTERN;
2796 log_brush.lbColor = 0;
2797 log_brush.lbHatch = (ULONG_PTR)bmp;
2798 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2799 12, &log_brush, 0, NULL );
2800 ok( wide_pen != 0, "failed to create pen\n" );
2801 SelectObject( hdc, wide_pen );
2802 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2804 for (i = 1; i < 20; i++)
2806 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID,
2807 i, &log_brush, 0, NULL );
2808 ok( wide_pen != 0, "failed to create pen\n" );
2809 DeleteObject( SelectObject( hdc, wide_pen ));
2810 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2811 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) );
2812 MoveToEx( hdc, 10 * i, 10, NULL );
2813 LineTo( hdc, 10 * i, 200 + i );
2814 LineTo( hdc, 20 * i, 200 + i );
2816 /* NT4 broken for all cases, W2K for 1 bpp only */
2817 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2819 for (i = 1; i < 20; i++)
2821 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5),
2822 i, &log_brush, 0, NULL );
2823 DeleteObject( SelectObject( hdc, wide_pen ));
2824 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) );
2825 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) );
2826 MoveToEx( hdc, 10 * i, 10, NULL );
2827 LineTo( hdc, 10 * i, 200 + i );
2828 LineTo( hdc, 20 * i, 200 + i );
2830 /* NT4 broken for all cases, W2K for 1 bpp only */
2831 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 1 + dib_is_1bpp, dib_is_1bpp );
2833 DeleteObject(bmp);
2834 SetTextColor(hdc, old_text);
2835 SetBkColor(hdc, old_bkgnd);
2836 SelectObject( hdc, orig_pen );
2838 /* PALETTEINDEX */
2840 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2841 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2842 SetTextColor( hdc, PALETTEINDEX(38) );
2843 SetBkColor( hdc, PALETTEINDEX(9) );
2844 SelectObject( hdc, solid_brush );
2845 SelectObject( hdc, solid_pen );
2847 pal->palVersion = 0x300;
2848 pal->palNumEntries = 40;
2849 for (i = 0; i < 80; i++)
2851 entries[i].peRed = i * 3;
2852 entries[i].peGreen = i * 7;
2853 entries[i].peBlue = 128 - i;
2854 entries[i].peFlags = 0;
2856 hpal = CreatePalette( pal );
2857 old_hpal = SelectPalette( hdc, hpal, FALSE );
2859 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) );
2860 Rectangle( hdc, 0, 0, 10, 10 );
2861 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2862 Rectangle( hdc, 10, 0, 10, 10 );
2863 SelectObject( hdc, orig_brush );
2864 DeleteObject( solid_brush );
2866 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) );
2867 DeleteObject( SelectObject( hdc, solid_brush ));
2868 PatBlt( hdc, 20, 0, 10, 10, PATCOPY );
2869 SetPaletteEntries( hpal, 0, 40, entries );
2870 PatBlt( hdc, 30, 0, 10, 10, PATCOPY );
2871 SelectObject( hdc, orig_brush );
2872 DeleteObject( solid_brush );
2874 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2875 dib_brush = CreatePatternBrush( bmp );
2876 SelectObject( hdc, dib_brush );
2877 PatBlt( hdc, 40, 0, 10, 10, PATCOPY );
2878 SetPaletteEntries( hpal, 0, 40, entries + 40 );
2879 PatBlt( hdc, 50, 0, 10, 10, PATCOPY );
2880 DeleteObject( bmp );
2881 SelectObject( hdc, orig_brush );
2882 DeleteObject( dib_brush );
2884 SelectPalette( hdc, old_hpal, FALSE );
2885 DeleteObject( hpal );
2887 /* NT4 broken for all cases, W2K for 1 bpp only */
2888 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 1 + dib_is_1bpp, dib_is_1bpp );
2890 /* ExtFloodFill */
2892 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2893 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2894 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2895 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2896 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2898 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2899 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2900 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF );
2901 DeleteObject( hrgn );
2903 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2904 SelectObject( hdc, solid_brush );
2906 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2907 ok (ret, "got ret %d\n", ret);
2908 compare_hash(hdc, bmi, bits, "flood fill" );
2910 ExtSelectClipRgn( hdc, NULL, RGN_COPY );
2912 ret = ExtFloodFill( hdc, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2913 ok (!ret, "got ret %d\n", ret);
2915 SelectObject(hdc, orig_brush);
2916 SelectObject(hdc, orig_pen);
2917 DeleteObject(solid_brush);
2918 DeleteObject(wide_pen);
2919 DeleteObject(dashed_pen);
2920 DeleteObject(solid_pen);
2923 static const BYTE ramp[17] =
2925 0, 0x4d, 0x68, 0x7c,
2926 0x8c, 0x9a, 0xa7, 0xb2,
2927 0xbd, 0xc7, 0xd0, 0xd9,
2928 0xe1, 0xe9, 0xf0, 0xf8,
2929 0xff
2932 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2934 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2935 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2938 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2940 BYTE min_comp, max_comp;
2942 if (alpha == 16) return text;
2943 if (alpha <= 1) return dst;
2944 if (text == dst) return dst;
2946 get_range( alpha, text, &min_comp, &max_comp );
2948 if (dst > text)
2950 DWORD diff = dst - text;
2951 DWORD range = max_comp - text;
2952 dst = text + (diff * range ) / (0xff - text);
2953 return dst;
2955 else
2957 DWORD diff = text - dst;
2958 DWORD range = text - min_comp ;
2959 dst = text - (diff * range) / text;
2960 return dst;
2964 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2966 COLORREF ret;
2968 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2969 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2970 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2971 return ret;
2974 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2976 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2978 DWORD dib_size = get_dib_size(bmi), ret;
2979 LOGFONTA lf;
2980 HFONT font;
2981 GLYPHMETRICS gm;
2982 BYTE g_buf[10000];
2983 int i, stride, x, y;
2984 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2985 char *eto_hash = NULL, *diy_hash = NULL;
2986 static const char str[] = "Hello Wine";
2987 POINT origin, g_org;
2988 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2989 TEXTMETRICA tm;
2990 COLORREF text_color;
2992 for(i = 0; i < dib_size; i++)
2993 bits[i] = vals[i % 4];
2995 memset( &lf, 0, sizeof(lf) );
2996 strcpy( lf.lfFaceName, "Tahoma" );
2997 lf.lfHeight = 24;
2998 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
3000 font = CreateFontIndirectA( &lf );
3001 font = SelectObject( hdc, font );
3003 GetTextMetricsA( hdc, &tm );
3004 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
3006 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
3007 DeleteObject( SelectObject( hdc, font ) );
3008 return;
3011 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
3012 SetTextAlign( hdc, TA_BASELINE );
3013 SetBkMode( hdc, TRANSPARENT );
3014 origin.x = 10;
3015 origin.y = 100;
3017 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
3018 eto_hash = hash_dib( bmi, bits );
3020 for(i = 0; i < dib_size; i++)
3021 bits[i] = vals[i % 4];
3023 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
3025 text_color = GetTextColor( hdc );
3026 for (i = 0; i < strlen(str); i++)
3028 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
3030 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
3032 if (ret == GDI_ERROR) continue;
3034 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
3036 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
3037 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
3039 origin.x += gm.gmCellIncX;
3040 origin.y += gm.gmCellIncY;
3042 if (!ret) continue;
3044 if (aa)
3046 stride = (gm.gmBlackBoxX + 3) & ~3;
3048 for (y = 0; y < gm.gmBlackBoxY; y++)
3050 BYTE *g_ptr = g_buf + y * stride;
3051 COLORREF val;
3053 for (x = 0; x < gm.gmBlackBoxX; x++)
3055 if (g_ptr[x] <= 1) continue;
3056 if (g_ptr[x] >= 16) val = text_color;
3057 else
3059 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
3060 val = aa_colorref( val, text_color, g_ptr[x] );
3062 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
3066 else
3068 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
3070 for (y = 0; y < gm.gmBlackBoxY; y++)
3072 BYTE *g_ptr = g_buf + y * stride;
3073 for (x = 0; x < gm.gmBlackBoxX; x++)
3075 if (g_ptr[x / 8] & masks[x % 8])
3076 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
3082 diy_hash = hash_dib( bmi, bits );
3083 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
3085 HeapFree( GetProcessHeap(), 0, diy_hash );
3086 HeapFree( GetProcessHeap(), 0, eto_hash );
3088 font = SelectObject( hdc, font );
3089 DeleteObject( font );
3092 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
3094 draw_text_2( hdc, bmi, bits, FALSE );
3096 /* Rounding errors make these cases hard to test */
3097 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
3098 (bmi->bmiHeader.biBitCount == 16))
3099 return;
3101 draw_text_2( hdc, bmi, bits, TRUE );
3104 static void test_simple_graphics(void)
3106 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
3107 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
3108 RGBQUAD *colors = bmi->bmiColors;
3109 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
3110 HDC mem_dc;
3111 BYTE *bits;
3112 HBITMAP dib, orig_bm;
3113 DIBSECTION ds;
3114 HPALETTE default_palette, old_hpal;
3115 int i;
3117 mem_dc = CreateCompatibleDC(NULL);
3119 /* a8r8g8b8 */
3120 trace("8888\n");
3121 memset(bmi, 0, sizeof(bmibuf));
3122 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
3123 bmi->bmiHeader.biHeight = 512;
3124 bmi->bmiHeader.biWidth = 512;
3125 bmi->bmiHeader.biBitCount = 32;
3126 bmi->bmiHeader.biPlanes = 1;
3127 bmi->bmiHeader.biCompression = BI_RGB;
3129 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3130 ok(dib != NULL, "ret NULL\n");
3131 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3132 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
3133 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
3134 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
3135 ok(ds.dsBmih.biCompression == BI_RGB ||
3136 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
3137 "got %x\n", ds.dsBmih.biCompression);
3139 orig_bm = SelectObject(mem_dc, dib);
3141 default_palette = create_default_palette( 8 );
3142 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
3144 dst_format = "8888";
3145 current_sha1 = sha1_graphics_a8r8g8b8;
3146 draw_graphics(mem_dc, bmi, bits);
3147 draw_text(mem_dc, bmi, bits);
3149 SelectObject(mem_dc, orig_bm);
3150 DeleteObject(dib);
3152 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
3153 trace("8888 - bitfields\n");
3154 bmi->bmiHeader.biBitCount = 32;
3155 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3156 bit_fields[0] = 0xff0000;
3157 bit_fields[1] = 0x00ff00;
3158 bit_fields[2] = 0x0000ff;
3160 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3161 ok(dib != NULL, "ret NULL\n");
3162 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3163 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
3164 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3165 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
3166 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3168 orig_bm = SelectObject(mem_dc, dib);
3169 SelectPalette( mem_dc, default_palette, FALSE );
3171 dst_format = "8888 - bitfields";
3172 current_sha1 = sha1_graphics_a8r8g8b8_bitfields;
3173 draw_graphics(mem_dc, bmi, bits);
3174 draw_text(mem_dc, bmi, bits);
3176 SelectObject(mem_dc, orig_bm);
3177 DeleteObject(dib);
3179 /* a8b8g8r8. */
3180 trace("a8b8g8r8\n");
3181 bmi->bmiHeader.biBitCount = 32;
3182 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3183 bit_fields[0] = 0x0000ff;
3184 bit_fields[1] = 0x00ff00;
3185 bit_fields[2] = 0xff0000;
3187 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3188 ok(dib != NULL, "ret NULL\n");
3189 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3190 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
3191 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
3192 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
3193 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3195 orig_bm = SelectObject(mem_dc, dib);
3197 dst_format = "a8b8g8r8";
3198 current_sha1 = sha1_graphics_a8b8g8r8;
3199 draw_graphics(mem_dc, bmi, bits);
3200 draw_text(mem_dc, bmi, bits);
3202 SelectObject(mem_dc, orig_bm);
3203 DeleteObject(dib);
3205 /* r10g10b10. */
3206 trace("r10g10b10\n");
3207 bmi->bmiHeader.biBitCount = 32;
3208 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3209 bit_fields[0] = 0x3ff00000;
3210 bit_fields[1] = 0x000ffc00;
3211 bit_fields[2] = 0x000003ff;
3213 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3214 ok(dib != NULL, "ret NULL\n");
3215 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3216 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3217 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3218 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3219 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3221 orig_bm = SelectObject(mem_dc, dib);
3223 dst_format = "r10g10b10";
3224 current_sha1 = sha1_graphics_r10g10b10;
3225 draw_graphics(mem_dc, bmi, bits);
3226 draw_text(mem_dc, bmi, bits);
3228 SelectObject(mem_dc, orig_bm);
3229 DeleteObject(dib);
3231 /* r6g6b6. */
3232 trace("r6g6b6\n");
3233 bmi->bmiHeader.biBitCount = 32;
3234 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3235 bit_fields[0] = 0x0003f000;
3236 bit_fields[1] = 0x00000fc0;
3237 bit_fields[2] = 0x0000003f;
3239 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3240 ok(dib != NULL, "ret NULL\n");
3241 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3242 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3243 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3244 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3245 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3247 orig_bm = SelectObject(mem_dc, dib);
3249 dst_format = "r6g6b6";
3250 current_sha1 = sha1_graphics_r6g6b6;
3251 draw_graphics(mem_dc, bmi, bits);
3252 draw_text(mem_dc, bmi, bits);
3254 SelectObject(mem_dc, orig_bm);
3255 DeleteObject(dib);
3257 /* 24 */
3258 trace("24\n");
3259 bmi->bmiHeader.biBitCount = 24;
3260 bmi->bmiHeader.biCompression = BI_RGB;
3262 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3263 ok(dib != NULL, "ret NULL\n");
3264 orig_bm = SelectObject(mem_dc, dib);
3266 dst_format = "24";
3267 current_sha1 = sha1_graphics_24;
3268 draw_graphics(mem_dc, bmi, bits);
3269 draw_text(mem_dc, bmi, bits);
3271 SelectObject(mem_dc, orig_bm);
3272 DeleteObject(dib);
3274 /* r5g5b5 */
3275 trace("555\n");
3276 bmi->bmiHeader.biBitCount = 16;
3277 bmi->bmiHeader.biCompression = BI_RGB;
3279 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3280 ok(dib != NULL, "ret NULL\n");
3281 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3282 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3283 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3284 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3285 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3287 orig_bm = SelectObject(mem_dc, dib);
3289 dst_format = "r5g5b5";
3290 current_sha1 = sha1_graphics_r5g5b5;
3291 draw_graphics(mem_dc, bmi, bits);
3292 draw_text(mem_dc, bmi, bits);
3294 SelectObject(mem_dc, orig_bm);
3295 DeleteObject(dib);
3297 /* r4g4b4 */
3298 trace("444\n");
3299 bmi->bmiHeader.biBitCount = 16;
3300 bmi->bmiHeader.biCompression = BI_BITFIELDS;
3301 bit_fields[0] = 0x0f00;
3302 bit_fields[1] = 0x00f0;
3303 bit_fields[2] = 0x000f;
3304 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3305 ok(dib != NULL, "ret NULL\n");
3306 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3307 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3308 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3309 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3310 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3312 orig_bm = SelectObject(mem_dc, dib);
3314 dst_format = "r4g4b4";
3315 current_sha1 = sha1_graphics_r4g4b4;
3316 draw_graphics(mem_dc, bmi, bits);
3317 draw_text(mem_dc, bmi, bits);
3319 SelectObject(mem_dc, orig_bm);
3320 DeleteObject(dib);
3322 /* 8 color */
3323 trace("8 color\n");
3324 bmi->bmiHeader.biBitCount = 8;
3325 bmi->bmiHeader.biCompression = BI_RGB;
3326 bmi->bmiHeader.biClrUsed = 236;
3327 for (i = 0; i < 236; i++)
3329 colors[i].rgbRed = (i & 0x07) << 5;
3330 colors[i].rgbGreen = (i & 0x38) << 2;
3331 colors[i].rgbBlue = i & 0xc0;
3333 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3334 ok(dib != NULL, "ret NULL\n");
3336 orig_bm = SelectObject(mem_dc, dib);
3338 dst_format = "8 color";
3339 current_sha1 = sha1_graphics_8_color;
3340 draw_graphics(mem_dc, bmi, bits);
3341 draw_text(mem_dc, bmi, bits);
3343 SelectObject(mem_dc, orig_bm);
3344 DeleteObject(dib);
3346 /* 8 grayscale */
3347 trace("8 grayscale\n");
3348 bmi->bmiHeader.biBitCount = 8;
3349 bmi->bmiHeader.biCompression = BI_RGB;
3350 bmi->bmiHeader.biClrUsed = 256;
3351 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3353 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3354 ok(dib != NULL, "ret NULL\n");
3356 orig_bm = SelectObject(mem_dc, dib);
3358 dst_format = "8 grayscale";
3359 current_sha1 = sha1_graphics_8_grayscale;
3360 draw_graphics(mem_dc, bmi, bits);
3361 draw_text(mem_dc, bmi, bits);
3363 SelectObject(mem_dc, orig_bm);
3364 DeleteObject(dib);
3366 /* 8 */
3367 trace("8\n");
3368 bmi->bmiHeader.biBitCount = 8;
3369 bmi->bmiHeader.biCompression = BI_RGB;
3370 bmi->bmiHeader.biClrUsed = 5;
3371 colors[0].rgbRed = 0xff;
3372 colors[0].rgbGreen = 0xff;
3373 colors[0].rgbBlue = 0xff;
3374 colors[1].rgbRed = 0;
3375 colors[1].rgbGreen = 0;
3376 colors[1].rgbBlue = 0;
3377 colors[2].rgbRed = 0xff;
3378 colors[2].rgbGreen = 0;
3379 colors[2].rgbBlue = 0;
3380 colors[3].rgbRed = 0;
3381 colors[3].rgbGreen = 0xff;
3382 colors[3].rgbBlue = 0;
3383 colors[4].rgbRed = 0;
3384 colors[4].rgbGreen = 0;
3385 colors[4].rgbBlue = 0xff;
3387 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3388 ok(dib != NULL, "ret NULL\n");
3390 orig_bm = SelectObject(mem_dc, dib);
3392 dst_format = "8";
3393 current_sha1 = sha1_graphics_8;
3394 draw_graphics(mem_dc, bmi, bits);
3395 draw_text(mem_dc, bmi, bits);
3397 SelectObject(mem_dc, orig_bm);
3398 DeleteObject(dib);
3400 /* 4 */
3401 trace("4\n");
3402 bmi->bmiHeader.biBitCount = 4;
3404 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3405 ok(dib != NULL, "ret NULL\n");
3407 orig_bm = SelectObject(mem_dc, dib);
3408 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE ));
3410 dst_format = "4";
3411 current_sha1 = sha1_graphics_4;
3412 draw_graphics(mem_dc, bmi, bits);
3413 draw_text(mem_dc, bmi, bits);
3415 SelectObject(mem_dc, orig_bm);
3416 DeleteObject(dib);
3418 /* 4 grayscale */
3419 trace("4 grayscale\n");
3420 bmi->bmiHeader.biClrUsed = 16;
3421 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3423 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3424 ok(dib != NULL, "ret NULL\n");
3426 orig_bm = SelectObject(mem_dc, dib);
3428 dst_format = "4 grayscale";
3429 current_sha1 = sha1_graphics_4_grayscale;
3430 draw_graphics(mem_dc, bmi, bits);
3431 draw_text(mem_dc, bmi, bits);
3433 SelectObject(mem_dc, orig_bm);
3434 DeleteObject(dib);
3436 /* 1 */
3437 trace("1\n");
3438 bmi->bmiHeader.biBitCount = 1;
3439 bmi->bmiHeader.biClrUsed = 2;
3441 colors[0].rgbRed = 0x00;
3442 colors[0].rgbGreen = 0x01;
3443 colors[0].rgbBlue = 0xff;
3444 colors[1].rgbRed = 0xff;
3445 colors[1].rgbGreen = 0x00;
3446 colors[1].rgbBlue = 0x00;
3448 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3449 ok(dib != NULL, "ret NULL\n");
3451 orig_bm = SelectObject(mem_dc, dib);
3452 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE ));
3454 dst_format = "1";
3455 current_sha1 = sha1_graphics_1;
3456 draw_graphics(mem_dc, bmi, bits);
3457 draw_text(mem_dc, bmi, bits);
3459 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3460 SelectObject(mem_dc, orig_bm);
3461 DeleteObject(dib);
3463 DeleteDC(mem_dc);
3466 START_TEST(dib)
3468 HMODULE mod = GetModuleHandleA("gdi32.dll");
3469 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
3470 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
3471 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
3473 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
3475 test_simple_graphics();
3477 CryptReleaseContext(crypt_prov, 0);