gdi32: Simplify computation of the DIB header size for internal BITMAPINFO structures.
[wine/multimedia.git] / dlls / gdi32 / tests / dib.c
blob909457d5f9caa2ad07dbe1c8bcf3c7e943ab4e93
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 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
105 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
106 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
107 "e358efb1c11172e40855de620bdb8a8e545cd790",
108 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
109 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
110 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
111 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
112 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
113 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
114 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
115 "94645300d6eb51020a7ef8261dee2941cd51b5df",
116 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
117 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
118 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
119 "68c18db6abfda626cab12d198298d4c39264bfbc",
120 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
121 "39c31de73aafcfcadf0bf414da4495be9de54417",
122 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
123 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
124 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
125 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
126 "3d2ccbe51408232a04769546b1bdd74f84558a41",
127 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
128 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
129 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
130 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
131 "d7dd4700f49808541bba99244b7eb5840e0a2439",
132 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
133 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
134 "257d114354a93e681225072bcde756f155b70496",
135 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
136 "e462052a03dbe4ec3814db7700e166d00d4d686f",
137 "a27917d4db49ce77989fae246015aeb2a28520ee",
138 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
139 NULL
142 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
144 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
145 "2426172d9e8fec27d9228088f382ef3c93717da9",
146 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
147 "664fac17803859a4015c6ae29e5538e314d5c827",
148 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
149 "fe6cc678fb13a3ead67839481bf22348adc69f52",
150 "d51bd330cec510cdccf5394328bd8e5411901e9e",
151 "df4aebf98d91f11be560dd232123b3ae327303d7",
152 "f2af53dd073a09b1031d0032d28da35c82adc566",
153 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
154 "c387917268455017aa0b28bed73aa6554044bbb3",
155 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
156 "6c530622a025d872a642e8f950867884d7b136cb",
157 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
158 "b2261353decda2712b83538ab434a49ce21f3172",
159 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
160 "9b9874c1c1d92afa554137e191d34ea33acc322f",
161 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
162 "d7398de15b2837a58a62a701ca1b3384625afec4",
163 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
164 "5246ef357e7317b9d141a3294d300c195da76cb7",
165 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
166 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
167 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
168 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
169 "e358efb1c11172e40855de620bdb8a8e545cd790",
170 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
171 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
172 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
173 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
174 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
175 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
176 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
177 "94645300d6eb51020a7ef8261dee2941cd51b5df",
178 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
179 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
180 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
181 "68c18db6abfda626cab12d198298d4c39264bfbc",
182 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
183 "39c31de73aafcfcadf0bf414da4495be9de54417",
184 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
185 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
186 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
187 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
188 "3d2ccbe51408232a04769546b1bdd74f84558a41",
189 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
190 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
191 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
192 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
193 "d7dd4700f49808541bba99244b7eb5840e0a2439",
194 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
195 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
196 "257d114354a93e681225072bcde756f155b70496",
197 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
198 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
199 "b2c8e1ebb9435031fe068442f479d1304096e79f",
200 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
201 NULL
204 static const char *sha1_graphics_a8b8g8r8[] =
206 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
207 "e0bc877697093ed440e125154e247ca9d65e933c",
208 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
209 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
210 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
211 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
212 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
213 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
214 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
215 "b753ebb39d90210cc717f57b53dd439f7de6b077",
216 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
217 "94368cea5033b435454daa56d55546310675131e",
218 "bf57a6a37fb107d29ed3d45695919887abcb7902",
219 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
220 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
221 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
222 "b0178632775d29bec2b16de7b9b8287115c40d0f",
223 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
224 "3369889a67d6c79a24ee15f7d14374f9995215e4",
225 "473a1fd07df800c87a5d3286b642ace10c61c6af",
226 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
227 "b8951d2b20518fd129e5113a5f429626893913bf",
228 "4851c5b7d5bc18590e787c0c218a592ef504e738",
229 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
230 "abdf003699364fe45fab7dc61e67c606d0063b40",
231 "89abaadff4e68c738cf9251c51e3609564843381",
232 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
233 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
234 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
235 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
236 "71b9756fdfeedce1e6db201176d21a981b881662",
237 "5319528d9af750c172ae62ee85ddb2eaef73b193",
238 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
239 "19b32a0daa91201725b5e13820c343d0a84ff698",
240 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
241 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
242 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
243 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
244 "8566c1110ab5cb8f754787b47923c8bff38f790c",
245 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
246 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
247 "d01071c44259adc94b89978b7d51a058b6dad665",
248 "e6d33b106bcda374e662d338c57a457dbcaa108a",
249 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
250 "339908a568f384e1f384a3e1b0dd415779203b02",
251 "88fd743d00bd37d2ed722092146795b044d08a6e",
252 "c0537ec24147e74939219213d864ee113cad9967",
253 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
254 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
255 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
256 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
257 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
258 "2c4f116451b571106beba8b85da8e4b923937246",
259 "9c8f3063504a81bbbfa8558e111c63d8bc36dbbf",
260 "87f57a31253a38dbf3dc3070473328fa04b68a48",
261 "db64cc4d830fc35ed170b53943e722b2342954d4",
262 "9988ceca44dafbee247aece1f027c06c27c01652",
263 NULL
266 static const char *sha1_graphics_r10g10b10[] =
268 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
269 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
270 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
271 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
272 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
273 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
274 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
275 "0ad27de0c916c073d0d18484fff899bbdb258db7",
276 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
277 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
278 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
279 "2986b431a0022153e5f875da77cc792e3825ebd5",
280 "ca4b25a5459885ce1e0a36844612087893d425b1",
281 "181bd4616796d89174cedc0332fb320b65aeb0e2",
282 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
283 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
284 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
285 "536eaaa901d652805a8977ecb2dc73f651094c5b",
286 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
287 "92cddcabf5365eef1e037f488af52b31669d987f",
288 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
289 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
290 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
291 "d578210815e27fe210eb678a71e6d22ba4b4c196",
292 "c7a027c7079dfcc831ca8bc134a509958273073c",
293 "19cf978596195b848df8709aaf637f83f92b8336",
294 "798a835fe50156eeb478c0a6085b088f53409d52",
295 "86ddf268d854f37e5b478c48792b551b57635db6",
296 "8259d388e02542207b6a08d65d553871ce1c4a09",
297 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
298 "66f8d78d4971934794478afee28b3a50e97f1b82",
299 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
300 "63798fb175afef78fa8fe8133d9de97a0cc80651",
301 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
302 "1ceb85697f649a62b1753438daa14944af7f450c",
303 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
304 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
305 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
306 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
307 "ada202d2f526f6995f83412479891c1764b66e5a",
308 "68348e8f54883f4fe295354b024e291c85f1038f",
309 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
310 "e9167564031ead3459eee6a3ebb2f58f100d931f",
311 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
312 "46196f50297260df2863e2fa76d2dfcf72006c23",
313 "0790585dfaef94f912b1ee81477d4ac448708708",
314 "589fb8a85d924ad19ed78409ae89475ba479c30a",
315 "43d67bc61ef54014b022891e5c024fc24b1fe797",
316 "e8783644428b637adbe80bcd084a33428cb69983",
317 "fc0c32afb719295f28bcfef22803bef94f798e20",
318 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
319 "d3f08946300e1700865042aed121870e292d1095",
320 "abb56db94becb64d663b51f0ea6b4bd535a88ba0",
321 "3a81fe558c69ca0aea7e7191771ed86cf4321a5a",
322 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
323 "317521e576801acaea62c76fe16813cdfe20f4ad",
324 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
325 NULL
328 static const char *sha1_graphics_r6g6b6[] =
330 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
331 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
332 "5b9dab3d8411afb25fbbeba0313db526815ac189",
333 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
334 "2028d1b0d1acef35dc07027135023f35fb9746b9",
335 "378713720dcb5aadb730435ad0989a68ab189114",
336 "084152773feb01a85df6006f2f4f288a1442d37a",
337 "97b824953f60fc9a91028045baacbe7b7dc82b14",
338 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
339 "287d755448e72e29e4812193e2b6f8098a214d82",
340 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
341 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
342 "e51bcf80211cd06e7d10225534b7a79b5454be27",
343 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
344 "0b94e0a5b739ab0020130646522e53da35a149ad",
345 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
346 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
347 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
348 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
349 "2128157e601ef0d6b3636b7387d3b28e876de728",
350 "8bdcdcd463f0052279d070ac763757f4db975483",
351 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
352 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
353 "66b130f83381957cfc4763558c5f5cddf2e3b564",
354 "d548135ce2320499277ce12b80bc35004f8a9787",
355 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
356 "1906ddfd829e735af49245171f8eb7673295d399",
357 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
358 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
359 "defd95a10d44cad6e736542920b74efd53e9e7eb",
360 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
361 "3f11a735e52030aa3d0f024d83803698293d10e5",
362 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
363 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
364 "3231c4d87faefb7ec5bd377613969c05b70343fc",
365 "00394e438e9edde978e88602c9ad2a572e965bf6",
366 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
367 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
368 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
369 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
370 "3d6cf3753390a05504b1f50302f767df443f0f40",
371 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
372 "da9e896a3a98b330980152b2e4a43cb6e686c730",
373 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
374 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
375 "47499ad13b719de18c59c2bc9b38ed578db50b95",
376 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
377 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
378 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
379 "49341c297a887186bd47d7465d827ab3147f05e3",
380 "325279e76367200d3fd7194d81c09fd139988ece",
381 "c3def160a1e847605ff0fc7edd30397fa90635a0",
382 "50acb1597c4d53ad63225376d2aa36f64e8a229d",
383 "796fd861474aa7861bd0384127df755458757ec3",
384 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
385 "77ea86e51a94b11a8081b29696cb4115687843e3",
386 "d67b897cad72d31e75359094007b1346fd8806ea",
387 NULL
390 static const char *sha1_graphics_24[] =
392 "e993b15c9bd14fb45a15310450b7083c44e42665",
393 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
394 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
395 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
396 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
397 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
398 "fd4be592483623dbc800fe28210a1f0daa71999b",
399 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
400 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
401 "883bc8f305c602edca785e21cd00f488583fb13f",
402 "3bac4e80993f49dc3926e30524115fca9d7a8026",
403 "91369e35be29059a0665782541db4c8b324c6bb2",
404 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
405 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
406 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
407 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
408 "5068bff794553cf5a3145ae407c9a2984357844c",
409 "413a7989969c229dee4ab1798362f32f96cf0a10",
410 "0bb222e540b82720d4971e4a2fc626899af03e03",
411 "adc20832d8c43f1cf372d8392535492013cd2306",
412 "45649794dcbcabda487f66f7a80fc1bec79047a1",
413 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
414 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
415 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
416 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
417 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
418 "92a1ab214dd8027c407814420449119466c92840",
419 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
420 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
421 "955390669afed2369b15b32fa519f2f921cdf1a0",
422 "201906f7d763b930a98c97f8eeab417f2b65e723",
423 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
424 "701c5af1d0c28294ce7d804b5697643c430d22a0",
425 "b0a959745b2db1d9f449e68e4479a4f36301879c",
426 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
427 "e171f6ec77bca91d6b8559911bce296c0bac469e",
428 "9725669042ef68acb408404d196496d10340bb5a",
429 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
430 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
431 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
432 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
433 "0f79500eda467cd3cbc220abdd37b5dba695d654",
434 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
435 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
436 "7d479beeb6758c164566638b5c873c188d6a91e7",
437 "80086808fca03e757d812e31d1ae576bf90dac9d",
438 "9560096f1b85ae6d939d736165c44df00a47c424",
439 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
440 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
441 "b25ba91487ec945410deb2b51bc1156890c032a8",
442 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
443 "ee315634ed92da3a32c2675ecd1b369471c60936",
444 "3491e2bd81e70dd203c8551cc2d39b19401caafe",
445 "826de85271b67a11e7bd1a6596b58a045a96b69e",
446 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
447 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
448 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
449 NULL
452 static const char *sha1_graphics_r5g5b5[] =
454 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
455 "847005cf7371f511bcc837251cde07b1796f6113",
456 "a8f75743a930843ec14d516cd048b6e0468e5d89",
457 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
458 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
459 "a9034a905daa91757b4f63345c0e40638cd53ca8",
460 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
461 "99474fecf11df7b7035c35be6b8b697be9889418",
462 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
463 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
464 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
465 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
466 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
467 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
468 "449092689226a1172b6086ba1181d6b6d6499f26",
469 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
470 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
471 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
472 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
473 "6daaf945a955928c5c124c880522ca4634fb2343",
474 "12a288390d16e1efa99d4185301de48a4d433b14",
475 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
476 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
477 "d7d97e28ed316f6596c737eb83baa5948d86b673",
478 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
479 "656bf3b7121bcd620a0a3ad488f0d66604824577",
480 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
481 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
482 "a49530722328ae88fd765792ac0c657efbcce75d",
483 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
484 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
485 "a6fd83542c3826132e88d3f5e304d604c0056fad",
486 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
487 "e428d213ad02651287894f093413949dcb369208",
488 "7df915bedcc5951a1b6f828490f7dbb93212e835",
489 "645dc251d205139282b17eb7bece1055fff3bcd0",
490 "76215275593631f5900aad3616d725733dc39493",
491 "81655a550703849a616d4a16504bb9c6f999285f",
492 "573d65665d20f00d36d9782ae2b89772140524ab",
493 "619414c1b33ac60cb0c0de61df86245d472259b0",
494 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
495 "2a66dae03890ff791eabb982949435adb19af02b",
496 "24ac219478ba406f30794550690486b14cbac5e8",
497 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
498 "db8c34882ddd46716d14bbf569d530f80db65ed4",
499 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
500 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
501 "a92942269911a88793b3460b6f2a2cd56e48eec1",
502 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
503 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
504 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
505 "585061e403d9cac1603a38af420efe87338f381a",
506 "8f447a3820c83662086dfa836da2205b0130fd5f",
507 "3772003c7fb420003512d0c437b3659d96d89ce4",
508 "dab47c9dc149e570045d699598b14a613bf319b3",
509 "2daca4d26a086ed34894693be0b0374402232809",
510 "bf0e0b74ce5686b73c527843e0d0df0cd10efefe",
511 "517e32a8c0312b5676d498583ea092b0f198f2bc",
512 "295ec16530126046790fb734e99f86f5b3b74ed8",
513 "d98b0561010606b55a1b9b85fbc93640f681d256",
514 "1c1499051860b7caa25173b328ca9c862f01dd1a",
515 NULL
518 static const char *sha1_graphics_r4g4b4[] =
520 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
521 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
522 "8bd18697d1ef27492805667a0bc956343ac08667",
523 "e8501c830321584474654f90e40eaf27dc21e6a8",
524 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
525 "821177710961d2cb5f7e7dfc0e06e767b6042753",
526 "667124365ffadeea1d8791bedda77a0c7b898de8",
527 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
528 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
529 "fb52b0c373a5f2a60b981604b120962942d2447a",
530 "5ab8dd07436681d762fa04ad7c6d71291c488924",
531 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
532 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
533 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
534 "25fcb75aa687aac35b8f72640889fe92413e00c5",
535 "3bddf9d53e89560b083302b146cd33791b13d941",
536 "a81504498c7a7bb46340ce74476a42f70f2730b1",
537 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
538 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
539 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
540 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
541 "57ebf8becac1524543da120e88e9cc57ecfdec49",
542 "d591232bbc2592462c819a9486750f64180518fd",
543 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
544 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
545 "8933450132bf949ba4bc28626968425b5ed2867d",
546 "9928a8f28a66c00069a124f7171b248817005763",
547 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
548 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
549 "233e588cf660e2c9b552cf02065cf63fa6655864",
550 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
551 "a3345acaf272f2e288626906e3056cd0ced70499",
552 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
553 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
554 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
555 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
556 "9dd123938b0a02601d8d458ecbd6535ddefea724",
557 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
558 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
559 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
560 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
561 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
562 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
563 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
564 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
565 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
566 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
567 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
568 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
569 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
570 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
571 "734d4a7836891d729f4a9ec6916ead78eecb2596",
572 "d8ba2e556fd64c9c2f1746496e6e7dd7a487cd6d",
573 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
574 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
575 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
576 NULL
579 static const char *sha1_graphics_8_color[] =
581 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
582 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
583 "49024d6cbdf1614327dfda9eda17675e76805f7e",
584 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
585 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
586 "84d85009d35ae10abbc435f3913422544105cea2",
587 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
588 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
589 "f3aa8d89430748178952de56643069d80b40aad6",
590 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
591 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
592 "52b1363e821bf604d9df260bfa97e26d428c33fd",
593 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
594 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
595 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
596 "89711289be6d5c55734878410e4923d5cca9aca9",
597 "8355caf57d51ad4e14275943088392e37dc75d33",
598 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
599 "6f0570da9dea7f043f678088f8362ee458cd79fa",
600 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
601 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
602 "5092b22af85a08f10a2899888bb9d552f25f828e",
603 "e91973be2651eeef568700463652838d8cbba976",
604 "1df851515ecf46df5c2d3279535c1763f72353dd",
605 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
606 "359bd76088a965bb0cee7c44800bc46b2638807e",
607 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
608 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
609 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
610 "91f988f575338505ba8a40727865a8d3f2298624",
611 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
612 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
613 "3b7488731da48635d86be551ab7c8c0f91c78219",
614 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
615 "e15a355fc09bfd22267917898e2266168ff410e3",
616 "b9688566bddf18586787c00e68724e51e97dfb72",
617 "5e38e03310f1c66f2052af2a745d8c60515707c5",
618 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
619 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
620 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
621 "6376234f542467e5887adfece62f753e998dc19d",
622 "add949d009217ef2b847e34772ba363e4be7b1b8",
623 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
624 "0b58666deb3615e912896a764e5c6475989e95e4",
625 "bf460cc44c0edee851d72587c8425c3f06a62c55",
626 "ea74c00c45569007383b632d7f1d2adc82645717",
627 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
628 "284abed096637c80bb50844e393da9dd4b3f19ac",
629 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
630 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
631 "46f772c2832b3aad584674db666bd63e48b4f338",
632 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
633 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
634 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
635 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
636 "678979a45126a76eb629992cd64734862f53a555",
637 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
638 "0204f06422a01787f7379d0edb51104bb023758a",
639 "1f9a21eba2f2ce87768a5618d9cfefa7e48fb386",
640 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
641 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
642 "2c07272462c68cf5944b03e2aa049475b99143c5",
643 NULL
646 static const char *sha1_graphics_8_grayscale[] =
648 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
649 "df35491dd5038187c05bac06921402ba6d7773a8",
650 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
651 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
652 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
653 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
654 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
655 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
656 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
657 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
658 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
659 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
660 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
661 "114bb377b4e78a1978e1ac09388c48861b5223a3",
662 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
663 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
664 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
665 "216388ddf6b563dd2058a9df65b40b6f72df1715",
666 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
667 "47f72be971bd2d3399dabd018201f4f5075e96fe",
668 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
669 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
670 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
671 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
672 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
673 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
674 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
675 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
676 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
677 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
678 "0000000000000000000000000000000000000000",
679 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
680 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
681 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
682 "6d41e6168662e75baacf74d911d7419d54c8d73c",
683 "2404952157ba1519094a2da6bfbf2b0f1356432d",
684 "24caede65b40815a60b83c4edfa06bdc542388cd",
685 "650a51bedd1af92469d2950eb95220db35f95c6e",
686 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
687 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
688 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
689 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
690 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
691 "85425940daf119125deb52421b2057acebe6d1cf",
692 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
693 "9869b6f088822fb423996f9968e5a931301fc2c3",
694 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
695 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
696 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
697 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
698 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
699 "f543efc84e638afbaa456e629100f0274de1a35b",
700 "1bd2587399006eed0d46beff397d32081f6bc58e",
701 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
702 "640a49455acabca6954a7fbb6af4e872af342d11",
703 "589e7911e09332ee090371deae17b0120ff990b5",
704 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
705 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
706 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
707 "3685c9ae95118a83db3569832c29753276fa1264",
708 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
709 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
710 "a05e05b2e6e515baa59ea032d063ca11e70a72b5",
711 "d908c86b7301666a8d7999b831841115a4938181",
712 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
713 "17ae603c199a5d6695d198a7f36e6d7263990951",
714 "1918a33f59d3500204ffc573318a39e9ff754221",
715 NULL
718 static const char *sha1_graphics_8[] =
720 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
721 "512246d4886ab889a090b167ba194577cb95272e",
722 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
723 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
724 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
725 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
726 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
727 "390b2bf70daba36310683f46af9cd50b9a061396",
728 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
729 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
730 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
731 "da1cc34a9d9b779fc7849e03e214096026506464",
732 "5ba8f99ca034666effa556748c49a0f5a015125f",
733 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
734 "73e2859ce849f756f954718ce3c90f02e31712b6",
735 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
736 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
737 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
738 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
739 "7262364067e03c7fa498af1d59d228d6c63b460e",
740 "5241241a355a667ef0834049adf4218e8b3f16b8",
741 "db22d666690948eb966f75b796c72c7150a5c4b9",
742 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
743 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
744 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
745 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
746 "bdc0a354635b879871077c5b712570e469863c99",
747 "d599bf210423fe3adbb4f1de87d9360de97827d0",
748 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
749 "cc01f17928f7780cefd423ea653b072eea723a1b",
750 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
751 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
752 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
753 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
754 "f4a334e69535de74ee5ed54be93a75120a66e54a",
755 "559fd1d15447745527c61fe43a94c6708bff3e39",
756 "995f77f2f53398399f09d1365cb4dfd105764e5c",
757 "61907a6685bba93077da40cfb28cf2ab74552fd2",
758 "122015e5e17c1c317c6e51c0e207826b606a4077",
759 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
760 "8c609921d4a3ed89a994a75482b27496bf103cf5",
761 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
762 "66493ee117719e172f327a426af601996025f28c",
763 "acead2745fec0b6c817fa601353bdf2d197b64f7",
764 "a6b858b2d125c159529d3f3ec45b31925a79acff",
765 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
766 "d83adc669c0dea0dc4812b93f998514b6f02d805",
767 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
768 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
769 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
770 "7d1bfff706b0713e53209407889f83a0da26a81d",
771 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
772 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
773 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
774 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
775 "963d1fa8608c8b743e972eb9a4e9f3fc53c6c7e8",
776 "ba49de83c4668fb08956221f465b93e7dd6a3383",
777 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
778 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
779 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
780 NULL
783 static const char *sha1_graphics_4[] =
785 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
786 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
787 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
788 "9401799e6116c35e5f0e5bdca07ea25316757a72",
789 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
790 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
791 "2505598845fa026ea7187582461efbf06cb6904f",
792 "3981a19363beca8f28d32a5928ac296fd22a5296",
793 "01404024ebb2c266d17d734059524d874491650f",
794 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
795 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
796 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
797 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
798 "1f26a01730f67d40ea711a50d9d801bac15a642e",
799 "3b53d24178cfacba53103a44dfd5d072b15a6781",
800 "c52cfd57f26037723d37192722fc3a217f280c9e",
801 "e34da6500cf2e424d980714d92737cf6c31a7bda",
802 "d17f4358ae529f920960ed89e535902ee13b0033",
803 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
804 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
805 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
806 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
807 "39c16648cf6c261be71a33cec41867f28e119b94",
808 "26ad5116562e7b58c76a26eaf521e2e40899e944",
809 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
810 "4f827ca6927f15191588456f985bf29d2a3b3c24",
811 "e7de769c3d12ea9dd223bef4881c578823bec67e",
812 "6fb102d020e5554116feefc8482104f3ae2036d2",
813 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
814 "20c9eb3276c08fdce35755e349bec94b04929812",
815 "628d837163a25c6520f19c0602383176dbad528e",
816 "b5a12cff7100290ad43f5ed17a321b42de048893",
817 "b672afbeeafb44194a821f0def81a8892872937e",
818 "db0124045882b598feea192186cf7eb7a0387866",
819 "602d91471378fe24a2d0248bd8a92b624f099fea",
820 "e772873b87a0f55ea51a3da323f64bf8814c6703",
821 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
822 "1a579cd280422131c35e907a023ee0e80749b5a4",
823 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
824 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
825 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
826 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
827 "3e411b004a5be84451860c6da6a4a1a482b77862",
828 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
829 "7811c536a6527112b438a6413f3927f2c79086a7",
830 "525ef3615040225752a2fe646ab99ee64e360630",
831 "46760975993f9881b7bbe94123173e6a683d3f25",
832 "df5feb905a31c288008cf5e82d73ac818a160d82",
833 "df5feb905a31c288008cf5e82d73ac818a160d82",
834 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
835 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
836 "da401c745421f6bdfaefd590ab99dee948dce412",
837 "38a3b6edcba2a1fba6064f0b4d771aedae7f4673",
838 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
839 "029552113292cc110fd6b7888e766628950aaeef",
840 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
841 NULL
844 static const char *sha1_graphics_4_grayscale[] =
846 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
847 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
848 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
849 "1c201d149c0bd886ff8a427ad513f15a70991174",
850 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
851 "315189097a02024d2eae61d524c4de07a396aee7",
852 "73ac786015dea36ac466a6524dba757d5d238ece",
853 "6e328cc4d53627f034b23706d8bf26afe18512ae",
854 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
855 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
856 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
857 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
858 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
859 "ec3879342b5a44f6de6efe946243ae5ade00980d",
860 "6e328cc4d53627f034b23706d8bf26afe18512ae",
861 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
862 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
863 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
864 "b2bda683edef912957845a33edc055902a801fed",
865 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
866 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
867 "43ee3e187dda14b86aef12371041ae70313b5a65",
868 "d4930552a7845111ffd9db57260be1ab97967c06",
869 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
870 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
871 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
872 "0000000000000000000000000000000000000000",
873 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
874 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
875 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
876 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
877 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
878 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
879 "f8224430462f6a93f85ef33b8aa7299525990708",
880 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
881 "d58b8760ef01c12e691651c932d683c66fde3654",
882 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
883 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
884 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
885 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
886 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
887 "027b05bc82ce4f897c4bf812610a641547368939",
888 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
889 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
890 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
891 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
892 "5eeb56afea8040a8fb18c11f29931b836474126d",
893 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
894 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
895 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
896 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
897 "25ec9fd2eeb1514ba4e0458a444149a5456cf63a",
898 "2e4dc1e859350289575ffc2a47cd0033efca6c32",
899 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
900 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
901 "58f400c9bb78e49a879276fb049edfc9c981740a",
902 NULL
905 static const char *sha1_graphics_1[] =
907 "23366004515f3bc46796ea505d748f8d0f97fbe1",
908 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
909 "a7cc69f957d7b533a0a330859a143d701daac73c",
910 "a955bf088c5edb129289ce65caace48ec95632e4",
911 "5316d3c558c254479883133cf58cd07ab521d3f0",
912 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
913 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
914 "121423a38b4ac4743bd516e0a7e88a3863796313",
915 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
916 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
917 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
918 "39ff81f77ef4ee772367ed1a63785987c060126e",
919 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
920 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
921 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
922 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
923 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
924 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
925 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
926 "0ff4b49797e30e3555aab45219adf449a9a560ff",
927 "280327328ca940c212ce24fe72e0b00014072767",
928 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
929 "b85463875f755b85f1464b1b6275912bcbad6c9f",
930 "816f200969feecc788b61dfeecf05b1790984401",
931 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
932 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
933 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
934 "0a76e0121facb103857130bc6e12185ad77fc3fa",
935 "02aede714773d654d0fc2f640afaa133ec718ad5",
936 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
937 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
938 "b26699f62661e16a1dc452d24c88ce363a1f2998",
939 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
940 "c14832e69ec3585c15987b3d69d5007236fa9814",
941 "e44ea620b0c47125a34193537ab9d219a52ad028",
942 "d1e6091caa4482d3142df3b958606c41ebf4698e",
943 "07c1116d8286fb665a1005de220eadc3d5999aaf",
944 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
945 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
946 "ffc78c075d4be66806f6c59180772d5eed963dc0",
947 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
948 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
949 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
950 "b71ca46be287598f716bb04fac0a52ad139c70db",
951 "6589e48498e30ab036fbfe94d73427b2b1238a69",
952 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
953 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
954 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
955 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
956 "18f4497e43903e8df5b27da4ceebf62b15550a87",
957 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
958 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
959 "655cfadeb157233c804d42b58195569c8846e3c1",
960 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
961 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
962 "0d180c37bc26d83a1a11f66168757f3de2493243",
963 "b362ba4790def178c236c0ae7b0093dbba47cf24",
964 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
965 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
966 "ee22f43ea867228c6ff937d39e1826e285a107e8",
967 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
968 "a2a928de9007d765da496abec8c21b23601f8c45",
969 "28ded40e72d4327b9413571476b167fb28a1f420",
970 "23366004515f3bc46796ea505d748f8d0f97fbe1",
971 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
972 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
973 "6b2cb2346b5820bdd0251cd6a4aeb5c22ee82e85",
974 "6c4640b17e072efc682044c499e5a4f3481b7c87",
975 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
976 "df510792a7790cc699532b1420d43c6d4da2ae2f",
977 "55c26d22f11d80b73383fa57d0fac552d705b092",
978 NULL
981 static const char *dst_format;
983 static inline DWORD get_stride(BITMAPINFO *bmi)
985 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
988 static inline DWORD get_dib_size(BITMAPINFO *bmi)
990 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
993 static char *hash_dib(BITMAPINFO *bmi, void *bits)
995 DWORD dib_size = get_dib_size(bmi);
996 HCRYPTHASH hash;
997 char *buf;
998 BYTE hash_buf[20];
999 DWORD hash_size = sizeof(hash_buf);
1000 int i;
1001 static const char *hex = "0123456789abcdef";
1003 if(!crypt_prov) return NULL;
1005 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1007 CryptHashData(hash, bits, dib_size, 0);
1009 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1010 if(hash_size != sizeof(hash_buf)) return NULL;
1012 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1013 CryptDestroyHash(hash);
1015 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1017 for(i = 0; i < hash_size; i++)
1019 buf[i * 2] = hex[hash_buf[i] >> 4];
1020 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1022 buf[i * 2] = '\0';
1024 return buf;
1027 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
1029 char *hash = hash_dib(bmi, bits);
1030 BOOL ok_cond;
1031 int i;
1033 if(!hash)
1035 skip("SHA1 hashing unavailable on this platform\n");
1036 return;
1039 for(i = 0; i <= num_broken; i++)
1041 if((*sha1)[i] == NULL)
1043 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
1044 return;
1048 ok_cond = !strcmp(hash, **sha1);
1050 for(i = 1; i <= num_broken; i++)
1051 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
1053 if(todo)
1054 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1055 dst_format, info, **sha1, hash );
1056 else
1057 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1058 dst_format, info, **sha1, hash );
1060 *sha1 += num_broken + 1;
1062 HeapFree(GetProcessHeap(), 0, hash);
1065 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
1067 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
1070 static const RECT bias_check[] =
1072 {100, 100, 200, 150},
1073 {100, 100, 150, 200},
1074 {100, 100, 50, 200},
1075 {100, 100, 0, 150},
1076 {100, 100, 0, 50},
1077 {100, 100, 50, 0},
1078 {100, 100, 150, 0},
1079 {100, 100, 200, 50}
1082 static const RECT hline_clips[] =
1084 {120, 120, 140, 120}, /* unclipped */
1085 {100, 122, 140, 122}, /* l edgecase */
1086 { 99, 124, 140, 124}, /* l edgecase clipped */
1087 {120, 126, 200, 126}, /* r edgecase */
1088 {120, 128, 201, 128}, /* r edgecase clipped */
1089 { 99, 130, 201, 130}, /* l and r clipped */
1090 {120, 100, 140, 100}, /* t edgecase */
1091 {120, 99, 140, 99}, /* t edgecase clipped */
1092 {120, 199, 140, 199}, /* b edgecase */
1093 {120, 200, 140, 200}, /* b edgecase clipped */
1094 {120, 132, 310, 132}, /* inside two clip rects */
1095 { 10, 134, 101, 134}, /* r end on l edgecase */
1096 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1097 {199, 138, 220, 138}, /* l end on r edgecase */
1098 {200, 140, 220, 140} /* l end on r edgecase clipped */
1101 static const RECT vline_clips[] =
1103 {120, 120, 120, 140}, /* unclipped */
1104 {100, 120, 100, 140}, /* l edgecase */
1105 { 99, 120, 99, 140}, /* l edgecase clipped */
1106 {199, 120, 199, 140}, /* r edgecase */
1107 {200, 120, 200, 140}, /* r edgecase clipped */
1108 {122, 99, 122, 201}, /* t and b clipped */
1109 {124, 100, 124, 140}, /* t edgecase */
1110 {126, 99, 126, 140}, /* t edgecase clipped */
1111 {128, 120, 128, 200}, /* b edgecase */
1112 {130, 120, 130, 201}, /* b edgecase clipped */
1113 {132, 12, 132, 140}, /* inside two clip rects */
1114 {134, 90, 134, 101}, /* b end on t edgecase */
1115 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1116 {138, 199, 138, 220}, /* t end on b edgecase */
1117 {140, 200, 140, 220} /* t end on b edgecase clipped */
1120 static const RECT line_clips[] =
1122 { 90, 110, 310, 120},
1123 { 90, 120, 295, 130},
1124 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1125 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1126 { 90, 132, 101, 137}, /* end pt just inside l edge */
1127 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1128 {199, 142, 210, 143} /* start pt just inside r edge */
1131 static const RECT wide_lines[] =
1133 {100, 10, 200, 10},
1134 {100, 21, 200, 21},
1135 {200, 40, 100, 40},
1136 {200, 61, 100, 61},
1137 { 10, 100, 10, 200},
1138 { 21, 100, 21, 200},
1139 { 40, 200, 40, 100},
1140 { 61, 200, 61, 100},
1143 static const RECT patblt_clips[] =
1145 {120, 120, 140, 126}, /* unclipped */
1146 {100, 130, 140, 136}, /* l edgecase */
1147 { 99, 140, 140, 146}, /* l edgecase clipped */
1148 {180, 130, 200, 136}, /* r edgecase */
1149 {180, 140, 201, 146}, /* r edgecase clipped */
1150 {120, 100, 130, 110}, /* t edgecase */
1151 {140, 99, 150, 110}, /* t edgecase clipped */
1152 {120, 180, 130, 200}, /* b edgecase */
1153 {140, 180, 150, 201}, /* b edgecase */
1154 {199, 150, 210, 156}, /* l edge on r edgecase */
1155 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1156 { 90, 150, 101, 156}, /* r edge on l edgecase */
1157 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1158 {160, 90, 166, 101}, /* b edge on t edgecase */
1159 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1160 {160, 199, 166, 210}, /* t edge on b edgecase */
1161 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1164 static const RECT rectangles[] =
1166 {10, 11, 100, 101},
1167 {250, 100, 350, 10},
1168 {120, 10, 120, 20}, /* zero width */
1169 {120, 10, 130, 10}, /* zero height */
1170 {120, 40, 121, 41}, /* 1 x 1 */
1171 {130, 50, 132, 52}, /* 2 x 2 */
1172 {140, 60, 143, 63}, /* 3 x 3 */
1173 {150, 70, 154, 74}, /* 4 x 4 */
1174 {120, 20, 121, 30}, /* width == 1 */
1175 {130, 20, 132, 30}, /* width == 2 */
1176 {140, 20, 143, 30}, /* width == 3 */
1177 {200, 20, 210, 21}, /* height == 1 */
1178 {200, 30, 210, 32}, /* height == 2 */
1179 {200, 40, 210, 43} /* height == 3 */
1182 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1183 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1184 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1185 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1186 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1187 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1189 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1190 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1191 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1192 0x00, 0x01 }; /* <eod> */
1194 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1195 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1196 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1197 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1199 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1201 HBRUSH brush = CreateSolidBrush( color );
1202 brush = SelectObject( hdc, brush );
1203 PatBlt( hdc, x, y, width, height, PATCOPY );
1204 DeleteObject( SelectObject( hdc, brush ) );
1207 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1209 DWORD dib_size = get_dib_size(bmi);
1210 HPEN solid_pen, dashed_pen, wide_pen, orig_pen;
1211 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1212 HBITMAP bmp;
1213 INT i, x, y, hatch_style;
1214 HDC src_dc;
1215 HRGN hrgn, hrgn2;
1216 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1217 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1218 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1219 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1220 RGBQUAD *brush_colors = brush_bi->bmiColors;
1221 BYTE *brush_bits, *src_bits;
1222 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1223 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1224 BLENDFUNCTION blend;
1226 blend.BlendOp = AC_SRC_OVER;
1227 blend.BlendFlags = 0;
1229 memset(bits, 0xcc, dib_size);
1230 compare_hash(bmi, bits, sha1, "empty");
1232 src_dc = CreateCompatibleDC( 0 );
1233 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1234 orig_pen = SelectObject(hdc, solid_pen);
1235 SetBrushOrgEx(hdc, 0, 0, NULL);
1237 /* horizontal and vertical lines */
1238 for(i = 1; i <= 16; i++)
1240 SetROP2(hdc, i);
1241 MoveToEx(hdc, 10, i * 3, NULL);
1242 LineTo(hdc, 100, i * 3); /* l -> r */
1243 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1244 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1245 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1246 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1247 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1248 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1250 compare_hash(bmi, bits, sha1, "h and v solid lines");
1251 memset(bits, 0xcc, dib_size);
1253 /* diagonal lines */
1254 SetROP2(hdc, R2_COPYPEN);
1255 for(i = 0; i < 16; i++)
1257 double s = sin(M_PI * i / 8.0);
1258 double c = cos(M_PI * i / 8.0);
1260 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1261 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1263 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1264 memset(bits, 0xcc, dib_size);
1266 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1268 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1269 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1271 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1272 memset(bits, 0xcc, dib_size);
1274 /* solid brush PatBlt */
1275 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1276 orig_brush = SelectObject(hdc, solid_brush);
1278 for(i = 0, y = 10; i < 256; i++)
1280 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1282 if(rop_uses_src(rop3[i]))
1283 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1284 else
1286 ok(ret, "got FALSE for %x\n", rop3[i]);
1287 y += 20;
1291 compare_hash(bmi, bits, sha1, "solid patblt");
1292 memset(bits, 0xcc, dib_size);
1294 /* clipped lines */
1295 hrgn = CreateRectRgn(10, 10, 200, 20);
1296 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1297 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1298 SetRectRgn(hrgn2, 290, 100, 300, 200);
1299 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1300 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1301 DeleteObject(hrgn2);
1303 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1305 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1306 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1308 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1309 memset(bits, 0xcc, dib_size);
1311 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1313 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1314 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1316 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1317 memset(bits, 0xcc, dib_size);
1319 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1321 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1322 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1324 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1325 memset(bits, 0xcc, dib_size);
1327 /* clipped PatBlt */
1328 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1330 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1331 patblt_clips[i].right - patblt_clips[i].left,
1332 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1334 compare_hash(bmi, bits, sha1, "clipped patblt");
1335 memset(bits, 0xcc, dib_size);
1337 /* clipped dashed lines */
1338 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1339 SelectObject(hdc, dashed_pen);
1340 SetBkMode(hdc, TRANSPARENT);
1341 SetBkColor(hdc, RGB(0, 0xff, 0));
1343 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1345 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1346 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1348 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1349 memset(bits, 0xcc, dib_size);
1351 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1353 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1354 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1356 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1357 memset(bits, 0xcc, dib_size);
1359 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1361 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1362 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1364 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1365 memset(bits, 0xcc, dib_size);
1367 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1369 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1370 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1372 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1373 memset(bits, 0xcc, dib_size);
1375 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1377 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1378 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1380 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1381 memset(bits, 0xcc, dib_size);
1383 SetBkMode(hdc, OPAQUE);
1385 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1387 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1388 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1390 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1391 memset(bits, 0xcc, dib_size);
1393 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1395 /* 8888 DIB pattern brush */
1397 brush_bi->bmiHeader = dib_brush_header_8888;
1398 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1399 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1400 brush_bits[2] = 0xff;
1401 brush_bits[6] = 0xff;
1402 brush_bits[14] = 0xff;
1403 brush_bits[65] = 0xff;
1404 brush_bits[69] = 0xff;
1405 brush_bits[72] = 0xff;
1407 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1409 SelectObject(hdc, dib_brush);
1410 SetBrushOrgEx(hdc, 1, 1, NULL);
1412 for(i = 0, y = 10; i < 256; i++)
1414 if(!rop_uses_src(rop3[i]))
1416 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1417 ok(ret, "got FALSE for %x\n", rop3[i]);
1418 y += 25;
1421 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1422 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1423 else
1424 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1425 memset(bits, 0xcc, dib_size);
1427 SelectObject(hdc, orig_brush);
1428 DeleteObject(dib_brush);
1430 /* 8888 bottom-up DIB pattern brush */
1432 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1434 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1436 SelectObject(hdc, dib_brush);
1438 /* This used to set the x origin to 100 as well, but
1439 there's a Windows bug for 24 bpp where the brush's x offset
1440 is incorrectly calculated for rops that involve both D and P */
1441 SetBrushOrgEx(hdc, 4, 100, NULL);
1443 for(i = 0, y = 10; i < 256; i++)
1445 if(!rop_uses_src(rop3[i]))
1447 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1448 ok(ret, "got FALSE for %x\n", rop3[i]);
1449 y += 25;
1452 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1453 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1454 else
1455 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1456 memset(bits, 0xcc, dib_size);
1458 SelectObject(hdc, orig_brush);
1459 DeleteObject(dib_brush);
1461 /* 24 bpp dib pattern brush */
1463 brush_bi->bmiHeader = dib_brush_header_24;
1464 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1465 memset(brush_bits, 0, 16 * 16 * 3);
1466 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1467 brush_bits[49] = brush_bits[52] = 0xff;
1469 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1471 SelectObject(hdc, dib_brush);
1472 SetBrushOrgEx(hdc, 1, 1, NULL);
1474 for(i = 0, y = 10; i < 256; i++)
1476 if(!rop_uses_src(rop3[i]))
1478 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1479 ok(ret, "got FALSE for %x\n", rop3[i]);
1480 y += 25;
1483 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1484 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1485 else
1486 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1487 memset(bits, 0xcc, dib_size);
1489 SelectObject(hdc, orig_brush);
1490 DeleteObject(dib_brush);
1492 /* 555 dib pattern brush */
1494 brush_bi->bmiHeader = dib_brush_header_555;
1495 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1496 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1497 brush_bits[0] = brush_bits[1] = 0xff;
1498 brush_bits[32] = brush_bits[34] = 0x7c;
1500 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1502 SelectObject(hdc, dib_brush);
1503 SetBrushOrgEx(hdc, 1, 1, NULL);
1505 for(i = 0, y = 10; i < 256; i++)
1507 if(!rop_uses_src(rop3[i]))
1509 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1510 ok(ret, "got FALSE for %x\n", rop3[i]);
1511 y += 25;
1514 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1515 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1516 else
1517 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1518 memset(bits, 0xcc, dib_size);
1520 SelectObject(hdc, orig_brush);
1521 DeleteObject(dib_brush);
1523 SetBrushOrgEx(hdc, 0, 0, NULL);
1525 /* 8 bpp dib pattern brush */
1527 brush_bi->bmiHeader = dib_brush_header_8;
1528 brush_bi->bmiHeader.biClrUsed = 3;
1529 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1530 brush_colors[0].rgbRed = 0xff;
1531 brush_colors[1].rgbRed = 0xff;
1532 brush_colors[1].rgbGreen = 0xff;
1533 brush_colors[1].rgbBlue = 0xff;
1535 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1536 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1537 brush_bits[0] = brush_bits[1] = 1;
1538 brush_bits[16] = brush_bits[17] = 2;
1539 brush_bits[32] = brush_bits[33] = 6;
1541 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1543 SelectObject(hdc, dib_brush);
1544 SetBrushOrgEx(hdc, 1, 1, NULL);
1546 for(i = 0, y = 10; i < 256; i++)
1548 if(!rop_uses_src(rop3[i]))
1550 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1551 ok(ret, "got FALSE for %x\n", rop3[i]);
1552 y += 25;
1555 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1556 memset(bits, 0xcc, dib_size);
1558 SelectObject(hdc, orig_brush);
1559 DeleteObject(dib_brush);
1561 /* 4 bpp dib pattern brush */
1563 brush_bi->bmiHeader = dib_brush_header_4;
1564 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1566 SelectObject(hdc, dib_brush);
1567 SetBrushOrgEx(hdc, 1, 1, NULL);
1569 for(i = 0, y = 10; i < 256; i++)
1571 if(!rop_uses_src(rop3[i]))
1573 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1574 ok(ret, "got FALSE for %x\n", rop3[i]);
1575 y += 25;
1578 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1579 memset(bits, 0xcc, dib_size);
1581 SelectObject(hdc, orig_brush);
1582 DeleteObject(dib_brush);
1584 /* 1 bpp dib pattern brush */
1586 brush_bi->bmiHeader = dib_brush_header_1;
1587 brush_bi->bmiHeader.biClrUsed = 2;
1588 memset(brush_bits, 0, 16 * 4);
1589 brush_bits[0] = 0xf0;
1590 brush_bits[4] = 0xf0;
1591 brush_bits[8] = 0xf0;
1593 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1594 SelectObject(hdc, dib_brush);
1595 for(i = 0, y = 10; i < 256; i++)
1597 if(!rop_uses_src(rop3[i]))
1599 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1600 ok(ret, "got FALSE for %x\n", rop3[i]);
1601 y += 25;
1605 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1606 memset(bits, 0xcc, dib_size);
1608 SelectObject(hdc, orig_brush);
1609 SetBrushOrgEx(hdc, 0, 0, NULL);
1611 /* Rectangle */
1613 SelectObject(hdc, solid_pen);
1614 SelectObject(hdc, solid_brush);
1616 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1618 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1621 SelectObject(hdc, dashed_pen);
1622 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1624 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1627 compare_hash(bmi, bits, sha1, "rectangles");
1628 memset(bits, 0xcc, dib_size);
1629 SelectObject(hdc, solid_pen);
1631 /* PaintRgn */
1633 PaintRgn(hdc, hrgn);
1634 compare_hash(bmi, bits, sha1, "PaintRgn");
1635 memset(bits, 0xcc, dib_size);
1637 /* RTL rectangles */
1639 if( !pSetLayout )
1641 win_skip("Don't have SetLayout\n");
1642 (*sha1)++;
1644 else
1646 pSetLayout(hdc, LAYOUT_RTL);
1647 PaintRgn(hdc, hrgn);
1648 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1649 Rectangle(hdc, 100, 250, 110, 260);
1650 compare_hash(bmi, bits, sha1, "rtl");
1651 memset(bits, 0xcc, dib_size);
1653 pSetLayout(hdc, LAYOUT_LTR);
1656 for(i = 0, y = 10; i < 256; i++)
1658 if(!rop_uses_src(rop3[i]))
1660 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1662 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1663 SelectObject(hdc, hatch_brush);
1664 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1665 ok(ret, "got FALSE for %x\n", rop3[i]);
1666 SelectObject(hdc, orig_brush);
1667 DeleteObject(hatch_brush);
1669 y += 25;
1673 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1674 memset(bits, 0xcc, dib_size);
1676 /* overlapping blits */
1678 orig_brush = SelectObject(hdc, solid_brush);
1680 Rectangle(hdc, 10, 10, 100, 100);
1681 Rectangle(hdc, 20, 15, 30, 40);
1682 Rectangle(hdc, 15, 15, 20, 20);
1683 Rectangle(hdc, 15, 20, 50, 45);
1684 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1685 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1686 memset(bits, 0xcc, dib_size);
1688 Rectangle(hdc, 10, 10, 100, 100);
1689 Rectangle(hdc, 20, 15, 30, 40);
1690 Rectangle(hdc, 15, 15, 20, 20);
1691 Rectangle(hdc, 15, 20, 50, 45);
1692 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1693 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1694 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1695 else
1696 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1697 memset(bits, 0xcc, dib_size);
1699 Rectangle(hdc, 10, 10, 100, 100);
1700 Rectangle(hdc, 20, 15, 30, 40);
1701 Rectangle(hdc, 15, 15, 20, 20);
1702 Rectangle(hdc, 15, 20, 50, 45);
1703 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1704 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1705 memset(bits, 0xcc, dib_size);
1707 Rectangle(hdc, 10, 10, 100, 100);
1708 Rectangle(hdc, 20, 15, 30, 40);
1709 Rectangle(hdc, 15, 15, 20, 20);
1710 Rectangle(hdc, 15, 20, 50, 45);
1711 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1712 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1713 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1714 else
1715 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1716 memset(bits, 0xcc, dib_size);
1718 Rectangle(hdc, 10, 10, 100, 100);
1719 Rectangle(hdc, 20, 15, 30, 40);
1720 Rectangle(hdc, 15, 15, 20, 20);
1721 Rectangle(hdc, 15, 20, 50, 45);
1722 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1723 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1724 memset(bits, 0xcc, dib_size);
1726 Rectangle(hdc, 10, 10, 100, 100);
1727 Rectangle(hdc, 20, 15, 30, 40);
1728 Rectangle(hdc, 15, 15, 20, 20);
1729 Rectangle(hdc, 15, 20, 50, 45);
1730 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1731 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1732 memset(bits, 0xcc, dib_size);
1734 Rectangle(hdc, 10, 10, 100, 100);
1735 Rectangle(hdc, 20, 15, 30, 40);
1736 Rectangle(hdc, 15, 15, 20, 20);
1737 Rectangle(hdc, 15, 20, 50, 45);
1738 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1739 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1740 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1741 else
1742 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1743 memset(bits, 0xcc, dib_size);
1745 Rectangle(hdc, 10, 10, 100, 100);
1746 Rectangle(hdc, 20, 15, 30, 40);
1747 Rectangle(hdc, 15, 15, 20, 20);
1748 Rectangle(hdc, 15, 20, 50, 45);
1749 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1750 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1751 memset(bits, 0xcc, dib_size);
1753 /* blitting with 32-bpp BI_RGB source */
1755 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1756 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1757 src_bi->bmiHeader.biHeight = 256;
1758 src_bi->bmiHeader.biWidth = 256;
1759 src_bi->bmiHeader.biBitCount = 32;
1760 src_bi->bmiHeader.biPlanes = 1;
1761 src_bi->bmiHeader.biCompression = BI_RGB;
1762 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1763 SelectObject( src_dc, bmp );
1764 for (y = 0; y < 256; y++)
1765 for (x = 0; x < 256; x++)
1767 BYTE a = (x + y) * 2;
1768 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1769 BYTE g = (BYTE)(x + y / 3) * a / 255;
1770 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1771 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1774 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1775 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1776 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1777 else
1778 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1779 memset(bits, 0xcc, dib_size);
1781 blend.SourceConstantAlpha = 0xd0;
1782 blend.AlphaFormat = 0;
1783 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1784 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1786 if (!pGdiAlphaBlend) (*sha1) += 2;
1787 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1789 else
1791 if (!pGdiAlphaBlend) (*sha1)++;
1792 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1794 memset(bits, 0xcc, dib_size);
1796 blend.SourceConstantAlpha = 0xb0;
1797 blend.AlphaFormat = AC_SRC_ALPHA;
1798 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1799 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1801 if (!pGdiAlphaBlend) (*sha1) += 2;
1802 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1804 else
1806 if (!pGdiAlphaBlend) (*sha1)++;
1807 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1809 memset(bits, 0xcc, dib_size);
1811 /* blitting with 32-bpp r10g10b10 source */
1813 src_bi->bmiHeader.biBitCount = 32;
1814 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1815 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1816 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1817 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1818 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1819 SelectObject( src_dc, bmp );
1820 for (y = 0; y < 256; y++)
1821 for (x = 0; x < 256; x++)
1823 WORD r = (7 * x + 3 * y) % 1024;
1824 WORD g = (11 * x + y / 3) % 1024;
1825 WORD b = (x / 3 + 9 * y) % 1024;
1826 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1829 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1830 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1831 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1832 else
1833 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1834 memset(bits, 0xcc, dib_size);
1836 /* blitting with 32-bpp b6g6r6 source */
1838 src_bi->bmiHeader.biBitCount = 32;
1839 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1840 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1841 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1842 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1843 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1844 SelectObject( src_dc, bmp );
1845 for (y = 0; y < 256; y++)
1846 for (x = 0; x < 256; x++)
1848 BYTE r = (y + 2 * x) % 64;
1849 BYTE g = (x + y / 3) % 64;
1850 BYTE b = (x / 3 + 2 * y) % 64;
1851 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1854 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1855 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1856 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1857 else
1858 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1859 memset(bits, 0xcc, dib_size);
1861 /* blitting with 24-bpp source */
1863 src_bi->bmiHeader.biBitCount = 24;
1864 src_bi->bmiHeader.biCompression = BI_RGB;
1865 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1866 DeleteObject( SelectObject( src_dc, bmp ) );
1867 for (y = 0; y < 256; y++)
1868 for (x = 0; x < 256; x++)
1870 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1871 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1872 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1875 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1876 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1877 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1878 else
1879 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1880 memset(bits, 0xcc, dib_size);
1882 blend.SourceConstantAlpha = 0xe0;
1883 blend.AlphaFormat = 0;
1884 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1885 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1887 if (!pGdiAlphaBlend) (*sha1) += 2;
1888 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1890 else
1892 if (!pGdiAlphaBlend) (*sha1)++;
1893 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1895 memset(bits, 0xcc, dib_size);
1897 /* blitting with 16-bpp BI_RGB source */
1899 src_bi->bmiHeader.biBitCount = 16;
1900 src_bi->bmiHeader.biCompression = BI_RGB;
1901 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1902 DeleteObject( SelectObject( src_dc, bmp ) );
1903 for (y = 0; y < 256; y++)
1904 for (x = 0; x < 256; x++)
1905 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1907 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1908 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1909 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1910 else
1911 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1912 memset(bits, 0xcc, dib_size);
1914 /* blitting with 16-bpp b4g4r4 source */
1916 src_bi->bmiHeader.biBitCount = 16;
1917 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1918 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1919 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1920 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1921 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1922 DeleteObject( SelectObject( src_dc, bmp ) );
1923 for (y = 0; y < 256; y++)
1924 for (x = 0; x < 256; x++)
1925 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1927 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1928 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1929 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1930 else
1931 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1932 memset(bits, 0xcc, dib_size);
1934 /* blitting with 8-bpp source */
1936 src_bi->bmiHeader.biBitCount = 8;
1937 src_bi->bmiHeader.biCompression = BI_RGB;
1938 src_bi->bmiHeader.biClrUsed = 160;
1939 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1940 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1941 DeleteObject( SelectObject( src_dc, bmp ) );
1942 for (y = 0; y < 256; y++)
1943 for (x = 0; x < 256; x++)
1944 src_bits[y * 256 + x] = 3 * x + 5 * y;
1946 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1947 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1948 memset(bits, 0xcc, dib_size);
1950 blend.SourceConstantAlpha = 0xd0;
1951 blend.AlphaFormat = 0;
1952 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1953 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1955 if (!pGdiAlphaBlend) (*sha1) += 2;
1956 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1958 else
1960 if (!pGdiAlphaBlend) (*sha1)++;
1961 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1963 memset(bits, 0xcc, dib_size);
1965 /* blitting with 4-bpp source */
1967 src_bi->bmiHeader.biBitCount = 4;
1968 src_bi->bmiHeader.biClrUsed = 12;
1969 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
1970 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1971 DeleteObject( SelectObject( src_dc, bmp ) );
1972 for (y = 0; y < 256; y++)
1973 for (x = 0; x < 256; x += 2)
1974 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
1976 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1977 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
1978 memset(bits, 0xcc, dib_size);
1980 /* blitting with 1-bpp source */
1982 src_bi->bmiHeader.biBitCount = 1;
1983 src_bi->bmiHeader.biClrUsed = 0;
1984 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
1985 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1986 DeleteObject( SelectObject( src_dc, bmp ) );
1987 for (y = 0; y < 256; y++)
1988 for (x = 0; x < 256; x += 8)
1989 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
1991 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1992 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
1993 memset(bits, 0xcc, dib_size);
1995 blend.SourceConstantAlpha = 0x90;
1996 blend.AlphaFormat = 0;
1997 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1998 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
2000 if (!pGdiAlphaBlend) (*sha1) += 2;
2001 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
2003 else
2005 if (!pGdiAlphaBlend) (*sha1)++;
2006 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
2008 memset(bits, 0xcc, dib_size);
2010 DeleteDC( src_dc );
2011 DeleteObject( bmp );
2013 /* RLE StretchDIBits */
2014 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
2015 src_bi->bmiHeader.biWidth = 8;
2016 src_bi->bmiHeader.biHeight = 8;
2017 src_bi->bmiHeader.biPlanes = 1;
2018 src_bi->bmiHeader.biBitCount = 8;
2019 src_bi->bmiHeader.biCompression = BI_RLE8;
2020 src_bi->bmiHeader.biClrUsed = 0;
2021 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
2023 for (i = 0; i < 256; i++)
2025 src_bi->bmiColors[i].rgbRed = i;
2026 src_bi->bmiColors[i].rgbGreen = i;
2027 src_bi->bmiColors[i].rgbBlue = i;
2028 src_bi->bmiColors[i].rgbReserved = 0;
2031 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2032 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2033 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2034 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2035 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2036 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
2037 memset(bits, 0xcc, dib_size);
2039 /* 32 bpp StretchDIBits */
2041 src_bi->bmiHeader.biWidth = 4;
2042 src_bi->bmiHeader.biHeight = 4;
2043 src_bi->bmiHeader.biPlanes = 1;
2044 src_bi->bmiHeader.biBitCount = 32;
2045 src_bi->bmiHeader.biCompression = BI_RGB;
2046 src_bi->bmiHeader.biClrUsed = 0;
2047 src_bi->bmiHeader.biSizeImage = 0;
2049 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2050 ok(ret == 4, "got %d\n", ret);
2051 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2052 ok(ret == 4, "got %d\n", ret);
2053 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2054 ok(ret == 4, "got %d\n", ret);
2055 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2056 ok(ret == 4, "got %d\n", ret);
2057 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2058 ok(ret == 4, "got %d\n", ret);
2059 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2060 ok(ret == 4, "got %d\n", ret);
2062 src_bi->bmiHeader.biHeight = -4;
2064 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2065 ok(ret == 4, "got %d\n", ret);
2066 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2067 ok(ret == -4, "got %d\n", ret);
2068 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2069 ok(ret == 4, "got %d\n", ret);
2070 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2071 ok(ret == -4, "got %d\n", ret);
2072 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2073 ok(ret == 4, "got %d\n", ret);
2074 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2075 ok(ret == -4, "got %d\n", ret);
2077 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2078 memset(bits, 0xcc, dib_size);
2080 /* Solid colors */
2081 for (i = 0; i < 256; i++)
2083 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2084 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2085 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2086 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2089 /* A few extra colors that are interesting in the 1bpp case */
2091 /* bk color */
2092 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2093 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2095 /* color 0 */
2096 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2097 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2099 /* color 1 */
2100 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2101 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2103 compare_hash(bmi, bits, sha1, "Colors");
2104 memset(bits, 0xcc, dib_size);
2106 for (i = 0; i < 256; i++)
2108 COLORREF s, g;
2109 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2110 g = GetPixel( hdc, i * 2, 10 );
2111 ok( s == g, "got %08x and %08x\n", s, g );
2113 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2114 g = GetPixel( hdc, i * 2, 20 );
2115 ok( s == g, "got %08x and %08x\n", s, g );
2117 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2118 g = GetPixel( hdc, i * 2, 30 );
2119 ok( s == g, "got %08x and %08x\n", s, g );
2121 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2122 g = GetPixel( hdc, i * 2, 40 );
2123 ok( s == g, "got %08x and %08x\n", s, g );
2126 compare_hash(bmi, bits, sha1, "SetPixel");
2127 memset(bits, 0xcc, dib_size);
2129 /* gradients */
2131 if (pGdiGradientFill)
2133 TRIVERTEX vrect[] =
2135 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2136 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2137 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2138 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2140 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2142 TRIVERTEX vtri[] =
2144 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2145 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2146 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2148 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2149 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2150 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2152 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2153 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2154 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2156 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2157 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2158 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2160 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2161 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2162 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2164 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2165 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2166 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2168 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2169 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2170 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2172 GRADIENT_TRIANGLE tri[] =
2174 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2175 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2178 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2179 for (i = 0; i < 4; i++) vrect[i].y += 250;
2180 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2182 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2183 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2184 else
2185 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2186 memset(bits, 0xcc, dib_size);
2188 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2189 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2190 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2191 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2192 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2193 else
2194 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2195 memset(bits, 0xcc, dib_size);
2197 else
2199 win_skip( "GdiGradientFill not supported\n" );
2200 *sha1 += 2;
2203 /* wide pen */
2205 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2206 SelectObject( hdc, wide_pen );
2208 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2210 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL );
2211 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom );
2214 compare_hash(bmi, bits, sha1, "wide pen" );
2215 memset(bits, 0xcc, dib_size);
2217 SelectObject(hdc, orig_brush);
2218 SelectObject(hdc, orig_pen);
2219 DeleteObject(hrgn);
2220 DeleteObject(dib_brush);
2221 DeleteObject(solid_brush);
2222 DeleteObject(wide_pen);
2223 DeleteObject(dashed_pen);
2224 DeleteObject(solid_pen);
2227 static const BYTE ramp[17] =
2229 0, 0x4d, 0x68, 0x7c,
2230 0x8c, 0x9a, 0xa7, 0xb2,
2231 0xbd, 0xc7, 0xd0, 0xd9,
2232 0xe1, 0xe9, 0xf0, 0xf8,
2233 0xff
2236 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2238 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2239 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2242 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2244 BYTE min_comp, max_comp;
2246 if (alpha == 16) return text;
2247 if (alpha <= 1) return dst;
2248 if (text == dst) return dst;
2250 get_range( alpha, text, &min_comp, &max_comp );
2252 if (dst > text)
2254 DWORD diff = dst - text;
2255 DWORD range = max_comp - text;
2256 dst = text + (diff * range ) / (0xff - text);
2257 return dst;
2259 else
2261 DWORD diff = text - dst;
2262 DWORD range = text - min_comp ;
2263 dst = text - (diff * range) / text;
2264 return dst;
2268 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2270 COLORREF ret;
2272 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2273 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2274 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2275 return ret;
2278 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2280 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2282 DWORD dib_size = get_dib_size(bmi), ret;
2283 LOGFONT lf;
2284 HFONT font;
2285 GLYPHMETRICS gm;
2286 BYTE g_buf[10000];
2287 int i, stride, x, y;
2288 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2289 char *eto_hash = NULL, *diy_hash = NULL;
2290 static const char *str = "Hello Wine";
2291 POINT origin, g_org;
2292 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2293 TEXTMETRIC tm;
2294 COLORREF text_color;
2296 for(i = 0; i < dib_size; i++)
2297 bits[i] = vals[i % 4];
2299 memset( &lf, 0, sizeof(lf) );
2300 strcpy( lf.lfFaceName, "Tahoma" );
2301 lf.lfHeight = 24;
2302 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2304 font = CreateFontIndirect( &lf );
2305 font = SelectObject( hdc, font );
2307 GetTextMetrics( hdc, &tm );
2308 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2310 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2311 DeleteObject( SelectObject( hdc, font ) );
2312 return;
2315 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2316 SetTextAlign( hdc, TA_BASELINE );
2317 SetBkMode( hdc, TRANSPARENT );
2318 origin.x = 10;
2319 origin.y = 100;
2321 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2322 eto_hash = hash_dib( bmi, bits );
2324 for(i = 0; i < dib_size; i++)
2325 bits[i] = vals[i % 4];
2327 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2329 text_color = GetTextColor( hdc );
2330 for (i = 0; i < strlen(str); i++)
2332 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2334 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2336 if (ret == GDI_ERROR) continue;
2338 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2340 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2341 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2343 origin.x += gm.gmCellIncX;
2344 origin.y += gm.gmCellIncY;
2346 if (!ret) continue;
2348 if (aa)
2350 stride = (gm.gmBlackBoxX + 3) & ~3;
2352 for (y = 0; y < gm.gmBlackBoxY; y++)
2354 BYTE *g_ptr = g_buf + y * stride;
2355 COLORREF val;
2357 for (x = 0; x < gm.gmBlackBoxX; x++)
2359 if (g_ptr[x] <= 1) continue;
2360 if (g_ptr[x] >= 16) val = text_color;
2361 else
2363 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2364 val = aa_colorref( val, text_color, g_ptr[x] );
2366 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2370 else
2372 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2374 for (y = 0; y < gm.gmBlackBoxY; y++)
2376 BYTE *g_ptr = g_buf + y * stride;
2377 for (x = 0; x < gm.gmBlackBoxX; x++)
2379 if (g_ptr[x / 8] & masks[x % 8])
2380 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2386 diy_hash = hash_dib( bmi, bits );
2387 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2389 HeapFree( GetProcessHeap(), 0, diy_hash );
2390 HeapFree( GetProcessHeap(), 0, eto_hash );
2392 font = SelectObject( hdc, font );
2393 DeleteObject( font );
2396 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2398 draw_text_2( hdc, bmi, bits, FALSE );
2400 /* Rounding errors make these cases hard to test */
2401 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2402 (bmi->bmiHeader.biBitCount == 16))
2403 return;
2405 draw_text_2( hdc, bmi, bits, TRUE );
2408 static void test_simple_graphics(void)
2410 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2411 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2412 RGBQUAD *colors = bmi->bmiColors;
2413 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2414 HDC mem_dc;
2415 BYTE *bits;
2416 HBITMAP dib, orig_bm;
2417 const char **sha1;
2418 DIBSECTION ds;
2419 int i;
2421 mem_dc = CreateCompatibleDC(NULL);
2423 /* a8r8g8b8 */
2424 trace("8888\n");
2425 memset(bmi, 0, sizeof(bmibuf));
2426 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2427 bmi->bmiHeader.biHeight = 512;
2428 bmi->bmiHeader.biWidth = 512;
2429 bmi->bmiHeader.biBitCount = 32;
2430 bmi->bmiHeader.biPlanes = 1;
2431 bmi->bmiHeader.biCompression = BI_RGB;
2433 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2434 ok(dib != NULL, "ret NULL\n");
2435 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2436 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2437 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2438 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2439 ok(ds.dsBmih.biCompression == BI_RGB ||
2440 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2441 "got %x\n", ds.dsBmih.biCompression);
2443 orig_bm = SelectObject(mem_dc, dib);
2445 dst_format = "8888";
2446 sha1 = sha1_graphics_a8r8g8b8;
2447 draw_graphics(mem_dc, bmi, bits, &sha1);
2448 draw_text(mem_dc, bmi, bits);
2450 SelectObject(mem_dc, orig_bm);
2451 DeleteObject(dib);
2453 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2454 trace("8888 - bitfields\n");
2455 bmi->bmiHeader.biBitCount = 32;
2456 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2457 bit_fields[0] = 0xff0000;
2458 bit_fields[1] = 0x00ff00;
2459 bit_fields[2] = 0x0000ff;
2461 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2462 ok(dib != NULL, "ret NULL\n");
2463 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2464 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2465 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2466 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2467 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2469 orig_bm = SelectObject(mem_dc, dib);
2471 dst_format = "8888 - bitfields";
2472 sha1 = sha1_graphics_a8r8g8b8_bitfields;
2473 draw_graphics(mem_dc, bmi, bits, &sha1);
2474 draw_text(mem_dc, bmi, bits);
2476 SelectObject(mem_dc, orig_bm);
2477 DeleteObject(dib);
2479 /* a8b8g8r8. */
2480 trace("a8b8g8r8\n");
2481 bmi->bmiHeader.biBitCount = 32;
2482 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2483 bit_fields[0] = 0x0000ff;
2484 bit_fields[1] = 0x00ff00;
2485 bit_fields[2] = 0xff0000;
2487 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2488 ok(dib != NULL, "ret NULL\n");
2489 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2490 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2491 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2492 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2493 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2495 orig_bm = SelectObject(mem_dc, dib);
2497 dst_format = "a8b8g8r8";
2498 sha1 = sha1_graphics_a8b8g8r8;
2499 draw_graphics(mem_dc, bmi, bits, &sha1);
2500 draw_text(mem_dc, bmi, bits);
2502 SelectObject(mem_dc, orig_bm);
2503 DeleteObject(dib);
2505 /* r10g10b10. */
2506 trace("r10g10b10\n");
2507 bmi->bmiHeader.biBitCount = 32;
2508 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2509 bit_fields[0] = 0x3ff00000;
2510 bit_fields[1] = 0x000ffc00;
2511 bit_fields[2] = 0x000003ff;
2513 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2514 ok(dib != NULL, "ret NULL\n");
2515 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2516 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2517 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2518 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2519 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2521 orig_bm = SelectObject(mem_dc, dib);
2523 dst_format = "r10g10b10";
2524 sha1 = sha1_graphics_r10g10b10;
2525 draw_graphics(mem_dc, bmi, bits, &sha1);
2526 draw_text(mem_dc, bmi, bits);
2528 SelectObject(mem_dc, orig_bm);
2529 DeleteObject(dib);
2531 /* r6g6b6. */
2532 trace("r6g6b6\n");
2533 bmi->bmiHeader.biBitCount = 32;
2534 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2535 bit_fields[0] = 0x0003f000;
2536 bit_fields[1] = 0x00000fc0;
2537 bit_fields[2] = 0x0000003f;
2539 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2540 ok(dib != NULL, "ret NULL\n");
2541 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2542 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2543 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2544 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2545 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2547 orig_bm = SelectObject(mem_dc, dib);
2549 dst_format = "r6g6b6";
2550 sha1 = sha1_graphics_r6g6b6;
2551 draw_graphics(mem_dc, bmi, bits, &sha1);
2552 draw_text(mem_dc, bmi, bits);
2554 SelectObject(mem_dc, orig_bm);
2555 DeleteObject(dib);
2557 /* 24 */
2558 trace("24\n");
2559 bmi->bmiHeader.biBitCount = 24;
2560 bmi->bmiHeader.biCompression = BI_RGB;
2562 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2563 ok(dib != NULL, "ret NULL\n");
2564 orig_bm = SelectObject(mem_dc, dib);
2566 dst_format = "24";
2567 sha1 = sha1_graphics_24;
2568 draw_graphics(mem_dc, bmi, bits, &sha1);
2569 draw_text(mem_dc, bmi, bits);
2571 SelectObject(mem_dc, orig_bm);
2572 DeleteObject(dib);
2574 /* r5g5b5 */
2575 trace("555\n");
2576 bmi->bmiHeader.biBitCount = 16;
2577 bmi->bmiHeader.biCompression = BI_RGB;
2579 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2580 ok(dib != NULL, "ret NULL\n");
2581 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2582 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2583 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2584 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2585 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2587 orig_bm = SelectObject(mem_dc, dib);
2589 dst_format = "r5g5b5";
2590 sha1 = sha1_graphics_r5g5b5;
2591 draw_graphics(mem_dc, bmi, bits, &sha1);
2592 draw_text(mem_dc, bmi, bits);
2594 SelectObject(mem_dc, orig_bm);
2595 DeleteObject(dib);
2597 /* r4g4b4 */
2598 trace("444\n");
2599 bmi->bmiHeader.biBitCount = 16;
2600 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2601 bit_fields[0] = 0x0f00;
2602 bit_fields[1] = 0x00f0;
2603 bit_fields[2] = 0x000f;
2604 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2605 ok(dib != NULL, "ret NULL\n");
2606 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2607 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2608 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2609 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2610 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2612 orig_bm = SelectObject(mem_dc, dib);
2614 dst_format = "r4g4b4";
2615 sha1 = sha1_graphics_r4g4b4;
2616 draw_graphics(mem_dc, bmi, bits, &sha1);
2617 draw_text(mem_dc, bmi, bits);
2619 SelectObject(mem_dc, orig_bm);
2620 DeleteObject(dib);
2622 /* 8 color */
2623 trace("8 color\n");
2624 bmi->bmiHeader.biBitCount = 8;
2625 bmi->bmiHeader.biCompression = BI_RGB;
2626 bmi->bmiHeader.biClrUsed = 236;
2627 for (i = 0; i < 236; i++)
2629 colors[i].rgbRed = (i & 0x07) << 5;
2630 colors[i].rgbGreen = (i & 0x38) << 2;
2631 colors[i].rgbBlue = i & 0xc0;
2633 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2634 ok(dib != NULL, "ret NULL\n");
2636 orig_bm = SelectObject(mem_dc, dib);
2638 dst_format = "8 color";
2639 sha1 = sha1_graphics_8_color;
2640 draw_graphics(mem_dc, bmi, bits, &sha1);
2641 draw_text(mem_dc, bmi, bits);
2643 SelectObject(mem_dc, orig_bm);
2644 DeleteObject(dib);
2646 /* 8 grayscale */
2647 trace("8 grayscale\n");
2648 bmi->bmiHeader.biBitCount = 8;
2649 bmi->bmiHeader.biCompression = BI_RGB;
2650 bmi->bmiHeader.biClrUsed = 256;
2651 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2653 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2654 ok(dib != NULL, "ret NULL\n");
2656 orig_bm = SelectObject(mem_dc, dib);
2658 dst_format = "8 grayscale";
2659 sha1 = sha1_graphics_8_grayscale;
2660 draw_graphics(mem_dc, bmi, bits, &sha1);
2661 draw_text(mem_dc, bmi, bits);
2663 SelectObject(mem_dc, orig_bm);
2664 DeleteObject(dib);
2666 /* 8 */
2667 trace("8\n");
2668 bmi->bmiHeader.biBitCount = 8;
2669 bmi->bmiHeader.biCompression = BI_RGB;
2670 bmi->bmiHeader.biClrUsed = 5;
2671 colors[0].rgbRed = 0xff;
2672 colors[0].rgbGreen = 0xff;
2673 colors[0].rgbBlue = 0xff;
2674 colors[1].rgbRed = 0;
2675 colors[1].rgbGreen = 0;
2676 colors[1].rgbBlue = 0;
2677 colors[2].rgbRed = 0xff;
2678 colors[2].rgbGreen = 0;
2679 colors[2].rgbBlue = 0;
2680 colors[3].rgbRed = 0;
2681 colors[3].rgbGreen = 0xff;
2682 colors[3].rgbBlue = 0;
2683 colors[4].rgbRed = 0;
2684 colors[4].rgbGreen = 0;
2685 colors[4].rgbBlue = 0xff;
2687 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2688 ok(dib != NULL, "ret NULL\n");
2690 orig_bm = SelectObject(mem_dc, dib);
2692 dst_format = "8";
2693 sha1 = sha1_graphics_8;
2694 draw_graphics(mem_dc, bmi, bits, &sha1);
2695 draw_text(mem_dc, bmi, bits);
2697 SelectObject(mem_dc, orig_bm);
2698 DeleteObject(dib);
2700 /* 4 */
2701 trace("4\n");
2702 bmi->bmiHeader.biBitCount = 4;
2704 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2705 ok(dib != NULL, "ret NULL\n");
2707 orig_bm = SelectObject(mem_dc, dib);
2709 dst_format = "4";
2710 sha1 = sha1_graphics_4;
2711 draw_graphics(mem_dc, bmi, bits, &sha1);
2712 draw_text(mem_dc, bmi, bits);
2714 SelectObject(mem_dc, orig_bm);
2715 DeleteObject(dib);
2717 /* 4 grayscale */
2718 trace("4 grayscale\n");
2719 bmi->bmiHeader.biClrUsed = 16;
2720 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2722 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2723 ok(dib != NULL, "ret NULL\n");
2725 orig_bm = SelectObject(mem_dc, dib);
2727 dst_format = "4 grayscale";
2728 sha1 = sha1_graphics_4_grayscale;
2729 draw_graphics(mem_dc, bmi, bits, &sha1);
2730 draw_text(mem_dc, bmi, bits);
2732 SelectObject(mem_dc, orig_bm);
2733 DeleteObject(dib);
2735 /* 1 */
2736 trace("1\n");
2737 bmi->bmiHeader.biBitCount = 1;
2738 bmi->bmiHeader.biClrUsed = 2;
2740 colors[0].rgbRed = 0x00;
2741 colors[0].rgbGreen = 0x01;
2742 colors[0].rgbBlue = 0xff;
2743 colors[1].rgbRed = 0xff;
2744 colors[1].rgbGreen = 0x00;
2745 colors[1].rgbBlue = 0x00;
2747 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2748 ok(dib != NULL, "ret NULL\n");
2750 orig_bm = SelectObject(mem_dc, dib);
2752 dst_format = "1";
2753 sha1 = sha1_graphics_1;
2754 draw_graphics(mem_dc, bmi, bits, &sha1);
2755 draw_text(mem_dc, bmi, bits);
2757 SelectObject(mem_dc, orig_bm);
2758 DeleteObject(dib);
2760 DeleteDC(mem_dc);
2763 START_TEST(dib)
2765 HMODULE mod = GetModuleHandleA("gdi32.dll");
2766 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2767 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2768 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
2770 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2772 test_simple_graphics();
2774 CryptReleaseContext(crypt_prov, 0);