gdi32/tests: Add more gradient tests.
[wine/multimedia.git] / dlls / gdi32 / tests / dib.c
blob79a62db5945a808961b02476f33d123fa287d3cf
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 NULL
141 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
143 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
144 "2426172d9e8fec27d9228088f382ef3c93717da9",
145 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
146 "664fac17803859a4015c6ae29e5538e314d5c827",
147 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
148 "fe6cc678fb13a3ead67839481bf22348adc69f52",
149 "d51bd330cec510cdccf5394328bd8e5411901e9e",
150 "df4aebf98d91f11be560dd232123b3ae327303d7",
151 "f2af53dd073a09b1031d0032d28da35c82adc566",
152 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
153 "c387917268455017aa0b28bed73aa6554044bbb3",
154 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
155 "6c530622a025d872a642e8f950867884d7b136cb",
156 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
157 "b2261353decda2712b83538ab434a49ce21f3172",
158 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
159 "9b9874c1c1d92afa554137e191d34ea33acc322f",
160 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
161 "d7398de15b2837a58a62a701ca1b3384625afec4",
162 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
163 "5246ef357e7317b9d141a3294d300c195da76cb7",
164 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
165 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
166 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
167 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
168 "e358efb1c11172e40855de620bdb8a8e545cd790",
169 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
170 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
171 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
172 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
173 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
174 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
175 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
176 "94645300d6eb51020a7ef8261dee2941cd51b5df",
177 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
178 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
179 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
180 "68c18db6abfda626cab12d198298d4c39264bfbc",
181 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
182 "39c31de73aafcfcadf0bf414da4495be9de54417",
183 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
184 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
185 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
186 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
187 "3d2ccbe51408232a04769546b1bdd74f84558a41",
188 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
189 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
190 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
191 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
192 "d7dd4700f49808541bba99244b7eb5840e0a2439",
193 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
194 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
195 "257d114354a93e681225072bcde756f155b70496",
196 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
197 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
198 "b2c8e1ebb9435031fe068442f479d1304096e79f",
199 NULL
202 static const char *sha1_graphics_a8b8g8r8[] =
204 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
205 "e0bc877697093ed440e125154e247ca9d65e933c",
206 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
207 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
208 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
209 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
210 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
211 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
212 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
213 "b753ebb39d90210cc717f57b53dd439f7de6b077",
214 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
215 "94368cea5033b435454daa56d55546310675131e",
216 "bf57a6a37fb107d29ed3d45695919887abcb7902",
217 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
218 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
219 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
220 "b0178632775d29bec2b16de7b9b8287115c40d0f",
221 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
222 "3369889a67d6c79a24ee15f7d14374f9995215e4",
223 "473a1fd07df800c87a5d3286b642ace10c61c6af",
224 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
225 "b8951d2b20518fd129e5113a5f429626893913bf",
226 "4851c5b7d5bc18590e787c0c218a592ef504e738",
227 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
228 "abdf003699364fe45fab7dc61e67c606d0063b40",
229 "89abaadff4e68c738cf9251c51e3609564843381",
230 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
231 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
232 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
233 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
234 "71b9756fdfeedce1e6db201176d21a981b881662",
235 "5319528d9af750c172ae62ee85ddb2eaef73b193",
236 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
237 "19b32a0daa91201725b5e13820c343d0a84ff698",
238 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
239 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
240 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
241 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
242 "8566c1110ab5cb8f754787b47923c8bff38f790c",
243 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
244 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
245 "d01071c44259adc94b89978b7d51a058b6dad665",
246 "e6d33b106bcda374e662d338c57a457dbcaa108a",
247 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
248 "339908a568f384e1f384a3e1b0dd415779203b02",
249 "88fd743d00bd37d2ed722092146795b044d08a6e",
250 "c0537ec24147e74939219213d864ee113cad9967",
251 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
252 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
253 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
254 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
255 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
256 "2c4f116451b571106beba8b85da8e4b923937246",
257 "9c8f3063504a81bbbfa8558e111c63d8bc36dbbf",
258 "87f57a31253a38dbf3dc3070473328fa04b68a48",
259 "db64cc4d830fc35ed170b53943e722b2342954d4",
260 NULL
263 static const char *sha1_graphics_r10g10b10[] =
265 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
266 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
267 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
268 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
269 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
270 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
271 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
272 "0ad27de0c916c073d0d18484fff899bbdb258db7",
273 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
274 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
275 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
276 "2986b431a0022153e5f875da77cc792e3825ebd5",
277 "ca4b25a5459885ce1e0a36844612087893d425b1",
278 "181bd4616796d89174cedc0332fb320b65aeb0e2",
279 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
280 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
281 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
282 "536eaaa901d652805a8977ecb2dc73f651094c5b",
283 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
284 "92cddcabf5365eef1e037f488af52b31669d987f",
285 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
286 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
287 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
288 "d578210815e27fe210eb678a71e6d22ba4b4c196",
289 "c7a027c7079dfcc831ca8bc134a509958273073c",
290 "19cf978596195b848df8709aaf637f83f92b8336",
291 "798a835fe50156eeb478c0a6085b088f53409d52",
292 "86ddf268d854f37e5b478c48792b551b57635db6",
293 "8259d388e02542207b6a08d65d553871ce1c4a09",
294 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
295 "66f8d78d4971934794478afee28b3a50e97f1b82",
296 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
297 "63798fb175afef78fa8fe8133d9de97a0cc80651",
298 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
299 "1ceb85697f649a62b1753438daa14944af7f450c",
300 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
301 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
302 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
303 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
304 "ada202d2f526f6995f83412479891c1764b66e5a",
305 "68348e8f54883f4fe295354b024e291c85f1038f",
306 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
307 "e9167564031ead3459eee6a3ebb2f58f100d931f",
308 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
309 "46196f50297260df2863e2fa76d2dfcf72006c23",
310 "0790585dfaef94f912b1ee81477d4ac448708708",
311 "589fb8a85d924ad19ed78409ae89475ba479c30a",
312 "43d67bc61ef54014b022891e5c024fc24b1fe797",
313 "e8783644428b637adbe80bcd084a33428cb69983",
314 "fc0c32afb719295f28bcfef22803bef94f798e20",
315 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
316 "d3f08946300e1700865042aed121870e292d1095",
317 "abb56db94becb64d663b51f0ea6b4bd535a88ba0",
318 "3a81fe558c69ca0aea7e7191771ed86cf4321a5a",
319 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
320 "317521e576801acaea62c76fe16813cdfe20f4ad",
321 NULL
324 static const char *sha1_graphics_r6g6b6[] =
326 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
327 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
328 "5b9dab3d8411afb25fbbeba0313db526815ac189",
329 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
330 "2028d1b0d1acef35dc07027135023f35fb9746b9",
331 "378713720dcb5aadb730435ad0989a68ab189114",
332 "084152773feb01a85df6006f2f4f288a1442d37a",
333 "97b824953f60fc9a91028045baacbe7b7dc82b14",
334 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
335 "287d755448e72e29e4812193e2b6f8098a214d82",
336 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
337 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
338 "e51bcf80211cd06e7d10225534b7a79b5454be27",
339 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
340 "0b94e0a5b739ab0020130646522e53da35a149ad",
341 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
342 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
343 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
344 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
345 "2128157e601ef0d6b3636b7387d3b28e876de728",
346 "8bdcdcd463f0052279d070ac763757f4db975483",
347 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
348 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
349 "66b130f83381957cfc4763558c5f5cddf2e3b564",
350 "d548135ce2320499277ce12b80bc35004f8a9787",
351 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
352 "1906ddfd829e735af49245171f8eb7673295d399",
353 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
354 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
355 "defd95a10d44cad6e736542920b74efd53e9e7eb",
356 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
357 "3f11a735e52030aa3d0f024d83803698293d10e5",
358 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
359 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
360 "3231c4d87faefb7ec5bd377613969c05b70343fc",
361 "00394e438e9edde978e88602c9ad2a572e965bf6",
362 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
363 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
364 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
365 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
366 "3d6cf3753390a05504b1f50302f767df443f0f40",
367 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
368 "da9e896a3a98b330980152b2e4a43cb6e686c730",
369 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
370 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
371 "47499ad13b719de18c59c2bc9b38ed578db50b95",
372 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
373 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
374 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
375 "49341c297a887186bd47d7465d827ab3147f05e3",
376 "325279e76367200d3fd7194d81c09fd139988ece",
377 "c3def160a1e847605ff0fc7edd30397fa90635a0",
378 "50acb1597c4d53ad63225376d2aa36f64e8a229d",
379 "796fd861474aa7861bd0384127df755458757ec3",
380 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
381 "77ea86e51a94b11a8081b29696cb4115687843e3",
382 NULL
385 static const char *sha1_graphics_24[] =
387 "e993b15c9bd14fb45a15310450b7083c44e42665",
388 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
389 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
390 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
391 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
392 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
393 "fd4be592483623dbc800fe28210a1f0daa71999b",
394 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
395 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
396 "883bc8f305c602edca785e21cd00f488583fb13f",
397 "3bac4e80993f49dc3926e30524115fca9d7a8026",
398 "91369e35be29059a0665782541db4c8b324c6bb2",
399 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
400 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
401 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
402 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
403 "5068bff794553cf5a3145ae407c9a2984357844c",
404 "413a7989969c229dee4ab1798362f32f96cf0a10",
405 "0bb222e540b82720d4971e4a2fc626899af03e03",
406 "adc20832d8c43f1cf372d8392535492013cd2306",
407 "45649794dcbcabda487f66f7a80fc1bec79047a1",
408 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
409 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
410 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
411 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
412 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
413 "92a1ab214dd8027c407814420449119466c92840",
414 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
415 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
416 "955390669afed2369b15b32fa519f2f921cdf1a0",
417 "201906f7d763b930a98c97f8eeab417f2b65e723",
418 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
419 "701c5af1d0c28294ce7d804b5697643c430d22a0",
420 "b0a959745b2db1d9f449e68e4479a4f36301879c",
421 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
422 "e171f6ec77bca91d6b8559911bce296c0bac469e",
423 "9725669042ef68acb408404d196496d10340bb5a",
424 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
425 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
426 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
427 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
428 "0f79500eda467cd3cbc220abdd37b5dba695d654",
429 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
430 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
431 "7d479beeb6758c164566638b5c873c188d6a91e7",
432 "80086808fca03e757d812e31d1ae576bf90dac9d",
433 "9560096f1b85ae6d939d736165c44df00a47c424",
434 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
435 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
436 "b25ba91487ec945410deb2b51bc1156890c032a8",
437 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
438 "ee315634ed92da3a32c2675ecd1b369471c60936",
439 "3491e2bd81e70dd203c8551cc2d39b19401caafe",
440 "826de85271b67a11e7bd1a6596b58a045a96b69e",
441 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
442 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
443 NULL
446 static const char *sha1_graphics_r5g5b5[] =
448 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
449 "847005cf7371f511bcc837251cde07b1796f6113",
450 "a8f75743a930843ec14d516cd048b6e0468e5d89",
451 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
452 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
453 "a9034a905daa91757b4f63345c0e40638cd53ca8",
454 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
455 "99474fecf11df7b7035c35be6b8b697be9889418",
456 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
457 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
458 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
459 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
460 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
461 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
462 "449092689226a1172b6086ba1181d6b6d6499f26",
463 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
464 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
465 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
466 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
467 "6daaf945a955928c5c124c880522ca4634fb2343",
468 "12a288390d16e1efa99d4185301de48a4d433b14",
469 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
470 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
471 "d7d97e28ed316f6596c737eb83baa5948d86b673",
472 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
473 "656bf3b7121bcd620a0a3ad488f0d66604824577",
474 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
475 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
476 "a49530722328ae88fd765792ac0c657efbcce75d",
477 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
478 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
479 "a6fd83542c3826132e88d3f5e304d604c0056fad",
480 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
481 "e428d213ad02651287894f093413949dcb369208",
482 "7df915bedcc5951a1b6f828490f7dbb93212e835",
483 "645dc251d205139282b17eb7bece1055fff3bcd0",
484 "76215275593631f5900aad3616d725733dc39493",
485 "81655a550703849a616d4a16504bb9c6f999285f",
486 "573d65665d20f00d36d9782ae2b89772140524ab",
487 "619414c1b33ac60cb0c0de61df86245d472259b0",
488 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
489 "2a66dae03890ff791eabb982949435adb19af02b",
490 "24ac219478ba406f30794550690486b14cbac5e8",
491 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
492 "db8c34882ddd46716d14bbf569d530f80db65ed4",
493 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
494 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
495 "a92942269911a88793b3460b6f2a2cd56e48eec1",
496 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
497 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
498 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
499 "585061e403d9cac1603a38af420efe87338f381a",
500 "8f447a3820c83662086dfa836da2205b0130fd5f",
501 "3772003c7fb420003512d0c437b3659d96d89ce4",
502 "dab47c9dc149e570045d699598b14a613bf319b3",
503 "2daca4d26a086ed34894693be0b0374402232809",
504 "bf0e0b74ce5686b73c527843e0d0df0cd10efefe",
505 "517e32a8c0312b5676d498583ea092b0f198f2bc",
506 "295ec16530126046790fb734e99f86f5b3b74ed8",
507 "d98b0561010606b55a1b9b85fbc93640f681d256",
508 NULL
511 static const char *sha1_graphics_r4g4b4[] =
513 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
514 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
515 "8bd18697d1ef27492805667a0bc956343ac08667",
516 "e8501c830321584474654f90e40eaf27dc21e6a8",
517 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
518 "821177710961d2cb5f7e7dfc0e06e767b6042753",
519 "667124365ffadeea1d8791bedda77a0c7b898de8",
520 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
521 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
522 "fb52b0c373a5f2a60b981604b120962942d2447a",
523 "5ab8dd07436681d762fa04ad7c6d71291c488924",
524 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
525 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
526 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
527 "25fcb75aa687aac35b8f72640889fe92413e00c5",
528 "3bddf9d53e89560b083302b146cd33791b13d941",
529 "a81504498c7a7bb46340ce74476a42f70f2730b1",
530 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
531 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
532 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
533 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
534 "57ebf8becac1524543da120e88e9cc57ecfdec49",
535 "d591232bbc2592462c819a9486750f64180518fd",
536 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
537 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
538 "8933450132bf949ba4bc28626968425b5ed2867d",
539 "9928a8f28a66c00069a124f7171b248817005763",
540 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
541 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
542 "233e588cf660e2c9b552cf02065cf63fa6655864",
543 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
544 "a3345acaf272f2e288626906e3056cd0ced70499",
545 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
546 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
547 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
548 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
549 "9dd123938b0a02601d8d458ecbd6535ddefea724",
550 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
551 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
552 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
553 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
554 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
555 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
556 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
557 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
558 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
559 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
560 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
561 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
562 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
563 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
564 "734d4a7836891d729f4a9ec6916ead78eecb2596",
565 "d8ba2e556fd64c9c2f1746496e6e7dd7a487cd6d",
566 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
567 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
568 NULL
571 static const char *sha1_graphics_8_color[] =
573 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
574 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
575 "49024d6cbdf1614327dfda9eda17675e76805f7e",
576 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
577 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
578 "84d85009d35ae10abbc435f3913422544105cea2",
579 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
580 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
581 "f3aa8d89430748178952de56643069d80b40aad6",
582 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
583 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
584 "52b1363e821bf604d9df260bfa97e26d428c33fd",
585 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
586 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
587 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
588 "89711289be6d5c55734878410e4923d5cca9aca9",
589 "8355caf57d51ad4e14275943088392e37dc75d33",
590 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
591 "6f0570da9dea7f043f678088f8362ee458cd79fa",
592 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
593 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
594 "5092b22af85a08f10a2899888bb9d552f25f828e",
595 "e91973be2651eeef568700463652838d8cbba976",
596 "1df851515ecf46df5c2d3279535c1763f72353dd",
597 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
598 "359bd76088a965bb0cee7c44800bc46b2638807e",
599 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
600 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
601 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
602 "91f988f575338505ba8a40727865a8d3f2298624",
603 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
604 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
605 "3b7488731da48635d86be551ab7c8c0f91c78219",
606 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
607 "e15a355fc09bfd22267917898e2266168ff410e3",
608 "b9688566bddf18586787c00e68724e51e97dfb72",
609 "5e38e03310f1c66f2052af2a745d8c60515707c5",
610 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
611 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
612 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
613 "6376234f542467e5887adfece62f753e998dc19d",
614 "add949d009217ef2b847e34772ba363e4be7b1b8",
615 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
616 "0b58666deb3615e912896a764e5c6475989e95e4",
617 "bf460cc44c0edee851d72587c8425c3f06a62c55",
618 "ea74c00c45569007383b632d7f1d2adc82645717",
619 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
620 "284abed096637c80bb50844e393da9dd4b3f19ac",
621 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
622 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
623 "46f772c2832b3aad584674db666bd63e48b4f338",
624 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
625 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
626 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
627 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
628 "678979a45126a76eb629992cd64734862f53a555",
629 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
630 "0204f06422a01787f7379d0edb51104bb023758a",
631 "1f9a21eba2f2ce87768a5618d9cfefa7e48fb386",
632 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
633 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
634 NULL
637 static const char *sha1_graphics_8_grayscale[] =
639 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
640 "df35491dd5038187c05bac06921402ba6d7773a8",
641 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
642 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
643 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
644 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
645 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
646 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
647 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
648 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
649 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
650 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
651 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
652 "114bb377b4e78a1978e1ac09388c48861b5223a3",
653 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
654 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
655 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
656 "216388ddf6b563dd2058a9df65b40b6f72df1715",
657 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
658 "47f72be971bd2d3399dabd018201f4f5075e96fe",
659 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
660 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
661 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
662 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
663 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
664 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
665 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
666 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
667 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
668 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
669 "0000000000000000000000000000000000000000",
670 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
671 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
672 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
673 "6d41e6168662e75baacf74d911d7419d54c8d73c",
674 "2404952157ba1519094a2da6bfbf2b0f1356432d",
675 "24caede65b40815a60b83c4edfa06bdc542388cd",
676 "650a51bedd1af92469d2950eb95220db35f95c6e",
677 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
678 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
679 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
680 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
681 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
682 "85425940daf119125deb52421b2057acebe6d1cf",
683 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
684 "9869b6f088822fb423996f9968e5a931301fc2c3",
685 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
686 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
687 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
688 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
689 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
690 "f543efc84e638afbaa456e629100f0274de1a35b",
691 "1bd2587399006eed0d46beff397d32081f6bc58e",
692 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
693 "640a49455acabca6954a7fbb6af4e872af342d11",
694 "589e7911e09332ee090371deae17b0120ff990b5",
695 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
696 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
697 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
698 "3685c9ae95118a83db3569832c29753276fa1264",
699 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
700 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
701 "a05e05b2e6e515baa59ea032d063ca11e70a72b5",
702 "d908c86b7301666a8d7999b831841115a4938181",
703 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
704 "17ae603c199a5d6695d198a7f36e6d7263990951",
705 NULL
708 static const char *sha1_graphics_8[] =
710 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
711 "512246d4886ab889a090b167ba194577cb95272e",
712 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
713 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
714 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
715 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
716 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
717 "390b2bf70daba36310683f46af9cd50b9a061396",
718 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
719 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
720 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
721 "da1cc34a9d9b779fc7849e03e214096026506464",
722 "5ba8f99ca034666effa556748c49a0f5a015125f",
723 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
724 "73e2859ce849f756f954718ce3c90f02e31712b6",
725 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
726 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
727 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
728 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
729 "7262364067e03c7fa498af1d59d228d6c63b460e",
730 "5241241a355a667ef0834049adf4218e8b3f16b8",
731 "db22d666690948eb966f75b796c72c7150a5c4b9",
732 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
733 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
734 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
735 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
736 "bdc0a354635b879871077c5b712570e469863c99",
737 "d599bf210423fe3adbb4f1de87d9360de97827d0",
738 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
739 "cc01f17928f7780cefd423ea653b072eea723a1b",
740 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
741 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
742 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
743 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
744 "f4a334e69535de74ee5ed54be93a75120a66e54a",
745 "559fd1d15447745527c61fe43a94c6708bff3e39",
746 "995f77f2f53398399f09d1365cb4dfd105764e5c",
747 "61907a6685bba93077da40cfb28cf2ab74552fd2",
748 "122015e5e17c1c317c6e51c0e207826b606a4077",
749 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
750 "8c609921d4a3ed89a994a75482b27496bf103cf5",
751 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
752 "66493ee117719e172f327a426af601996025f28c",
753 "acead2745fec0b6c817fa601353bdf2d197b64f7",
754 "a6b858b2d125c159529d3f3ec45b31925a79acff",
755 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
756 "d83adc669c0dea0dc4812b93f998514b6f02d805",
757 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
758 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
759 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
760 "7d1bfff706b0713e53209407889f83a0da26a81d",
761 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
762 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
763 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
764 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
765 "963d1fa8608c8b743e972eb9a4e9f3fc53c6c7e8",
766 "ba49de83c4668fb08956221f465b93e7dd6a3383",
767 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
768 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
769 NULL
772 static const char *sha1_graphics_4[] =
774 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
775 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
776 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
777 "9401799e6116c35e5f0e5bdca07ea25316757a72",
778 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
779 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
780 "2505598845fa026ea7187582461efbf06cb6904f",
781 "3981a19363beca8f28d32a5928ac296fd22a5296",
782 "01404024ebb2c266d17d734059524d874491650f",
783 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
784 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
785 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
786 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
787 "1f26a01730f67d40ea711a50d9d801bac15a642e",
788 "3b53d24178cfacba53103a44dfd5d072b15a6781",
789 "c52cfd57f26037723d37192722fc3a217f280c9e",
790 "e34da6500cf2e424d980714d92737cf6c31a7bda",
791 "d17f4358ae529f920960ed89e535902ee13b0033",
792 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
793 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
794 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
795 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
796 "39c16648cf6c261be71a33cec41867f28e119b94",
797 "26ad5116562e7b58c76a26eaf521e2e40899e944",
798 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
799 "4f827ca6927f15191588456f985bf29d2a3b3c24",
800 "e7de769c3d12ea9dd223bef4881c578823bec67e",
801 "6fb102d020e5554116feefc8482104f3ae2036d2",
802 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
803 "20c9eb3276c08fdce35755e349bec94b04929812",
804 "628d837163a25c6520f19c0602383176dbad528e",
805 "b5a12cff7100290ad43f5ed17a321b42de048893",
806 "b672afbeeafb44194a821f0def81a8892872937e",
807 "db0124045882b598feea192186cf7eb7a0387866",
808 "602d91471378fe24a2d0248bd8a92b624f099fea",
809 "e772873b87a0f55ea51a3da323f64bf8814c6703",
810 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
811 "1a579cd280422131c35e907a023ee0e80749b5a4",
812 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
813 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
814 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
815 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
816 "3e411b004a5be84451860c6da6a4a1a482b77862",
817 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
818 "7811c536a6527112b438a6413f3927f2c79086a7",
819 "525ef3615040225752a2fe646ab99ee64e360630",
820 "46760975993f9881b7bbe94123173e6a683d3f25",
821 "df5feb905a31c288008cf5e82d73ac818a160d82",
822 "df5feb905a31c288008cf5e82d73ac818a160d82",
823 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
824 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
825 "da401c745421f6bdfaefd590ab99dee948dce412",
826 "38a3b6edcba2a1fba6064f0b4d771aedae7f4673",
827 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
828 "029552113292cc110fd6b7888e766628950aaeef",
829 NULL
832 static const char *sha1_graphics_4_grayscale[] =
834 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
835 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
836 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
837 "1c201d149c0bd886ff8a427ad513f15a70991174",
838 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
839 "315189097a02024d2eae61d524c4de07a396aee7",
840 "73ac786015dea36ac466a6524dba757d5d238ece",
841 "6e328cc4d53627f034b23706d8bf26afe18512ae",
842 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
843 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
844 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
845 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
846 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
847 "ec3879342b5a44f6de6efe946243ae5ade00980d",
848 "6e328cc4d53627f034b23706d8bf26afe18512ae",
849 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
850 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
851 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
852 "b2bda683edef912957845a33edc055902a801fed",
853 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
854 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
855 "43ee3e187dda14b86aef12371041ae70313b5a65",
856 "d4930552a7845111ffd9db57260be1ab97967c06",
857 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
858 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
859 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
860 "0000000000000000000000000000000000000000",
861 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
862 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
863 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
864 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
865 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
866 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
867 "f8224430462f6a93f85ef33b8aa7299525990708",
868 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
869 "d58b8760ef01c12e691651c932d683c66fde3654",
870 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
871 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
872 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
873 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
874 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
875 "027b05bc82ce4f897c4bf812610a641547368939",
876 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
877 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
878 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
879 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
880 "5eeb56afea8040a8fb18c11f29931b836474126d",
881 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
882 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
883 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
884 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
885 "25ec9fd2eeb1514ba4e0458a444149a5456cf63a",
886 "2e4dc1e859350289575ffc2a47cd0033efca6c32",
887 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
888 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
889 NULL
892 static const char *sha1_graphics_1[] =
894 "23366004515f3bc46796ea505d748f8d0f97fbe1",
895 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
896 "a7cc69f957d7b533a0a330859a143d701daac73c",
897 "a955bf088c5edb129289ce65caace48ec95632e4",
898 "5316d3c558c254479883133cf58cd07ab521d3f0",
899 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
900 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
901 "121423a38b4ac4743bd516e0a7e88a3863796313",
902 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
903 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
904 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
905 "39ff81f77ef4ee772367ed1a63785987c060126e",
906 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
907 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
908 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
909 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
910 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
911 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
912 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
913 "0ff4b49797e30e3555aab45219adf449a9a560ff",
914 "280327328ca940c212ce24fe72e0b00014072767",
915 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
916 "b85463875f755b85f1464b1b6275912bcbad6c9f",
917 "816f200969feecc788b61dfeecf05b1790984401",
918 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
919 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
920 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
921 "0a76e0121facb103857130bc6e12185ad77fc3fa",
922 "02aede714773d654d0fc2f640afaa133ec718ad5",
923 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
924 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
925 "b26699f62661e16a1dc452d24c88ce363a1f2998",
926 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
927 "c14832e69ec3585c15987b3d69d5007236fa9814",
928 "e44ea620b0c47125a34193537ab9d219a52ad028",
929 "d1e6091caa4482d3142df3b958606c41ebf4698e",
930 "07c1116d8286fb665a1005de220eadc3d5999aaf",
931 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
932 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
933 "ffc78c075d4be66806f6c59180772d5eed963dc0",
934 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
935 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
936 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
937 "b71ca46be287598f716bb04fac0a52ad139c70db",
938 "6589e48498e30ab036fbfe94d73427b2b1238a69",
939 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
940 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
941 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
942 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
943 "18f4497e43903e8df5b27da4ceebf62b15550a87",
944 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
945 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
946 "655cfadeb157233c804d42b58195569c8846e3c1",
947 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
948 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
949 "0d180c37bc26d83a1a11f66168757f3de2493243",
950 "b362ba4790def178c236c0ae7b0093dbba47cf24",
951 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
952 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
953 "ee22f43ea867228c6ff937d39e1826e285a107e8",
954 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
955 "a2a928de9007d765da496abec8c21b23601f8c45",
956 "28ded40e72d4327b9413571476b167fb28a1f420",
957 "23366004515f3bc46796ea505d748f8d0f97fbe1",
958 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
959 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
960 "6b2cb2346b5820bdd0251cd6a4aeb5c22ee82e85",
961 "6c4640b17e072efc682044c499e5a4f3481b7c87",
962 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
963 "df510792a7790cc699532b1420d43c6d4da2ae2f",
964 NULL
967 static const char *dst_format;
969 static inline DWORD get_stride(BITMAPINFO *bmi)
971 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
974 static inline DWORD get_dib_size(BITMAPINFO *bmi)
976 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
979 static char *hash_dib(BITMAPINFO *bmi, void *bits)
981 DWORD dib_size = get_dib_size(bmi);
982 HCRYPTHASH hash;
983 char *buf;
984 BYTE hash_buf[20];
985 DWORD hash_size = sizeof(hash_buf);
986 int i;
987 static const char *hex = "0123456789abcdef";
989 if(!crypt_prov) return NULL;
991 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
993 CryptHashData(hash, bits, dib_size, 0);
995 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
996 if(hash_size != sizeof(hash_buf)) return NULL;
998 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
999 CryptDestroyHash(hash);
1001 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1003 for(i = 0; i < hash_size; i++)
1005 buf[i * 2] = hex[hash_buf[i] >> 4];
1006 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1008 buf[i * 2] = '\0';
1010 return buf;
1013 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
1015 char *hash = hash_dib(bmi, bits);
1016 BOOL ok_cond;
1017 int i;
1019 if(!hash)
1021 skip("SHA1 hashing unavailable on this platform\n");
1022 return;
1025 for(i = 0; i <= num_broken; i++)
1027 if((*sha1)[i] == NULL)
1029 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
1030 return;
1034 ok_cond = !strcmp(hash, **sha1);
1036 for(i = 1; i <= num_broken; i++)
1037 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
1039 if(todo)
1040 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1041 dst_format, info, **sha1, hash );
1042 else
1043 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1044 dst_format, info, **sha1, hash );
1046 *sha1 += num_broken + 1;
1048 HeapFree(GetProcessHeap(), 0, hash);
1051 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
1053 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
1056 static const RECT bias_check[] =
1058 {100, 100, 200, 150},
1059 {100, 100, 150, 200},
1060 {100, 100, 50, 200},
1061 {100, 100, 0, 150},
1062 {100, 100, 0, 50},
1063 {100, 100, 50, 0},
1064 {100, 100, 150, 0},
1065 {100, 100, 200, 50}
1068 static const RECT hline_clips[] =
1070 {120, 120, 140, 120}, /* unclipped */
1071 {100, 122, 140, 122}, /* l edgecase */
1072 { 99, 124, 140, 124}, /* l edgecase clipped */
1073 {120, 126, 200, 126}, /* r edgecase */
1074 {120, 128, 201, 128}, /* r edgecase clipped */
1075 { 99, 130, 201, 130}, /* l and r clipped */
1076 {120, 100, 140, 100}, /* t edgecase */
1077 {120, 99, 140, 99}, /* t edgecase clipped */
1078 {120, 199, 140, 199}, /* b edgecase */
1079 {120, 200, 140, 200}, /* b edgecase clipped */
1080 {120, 132, 310, 132}, /* inside two clip rects */
1081 { 10, 134, 101, 134}, /* r end on l edgecase */
1082 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1083 {199, 138, 220, 138}, /* l end on r edgecase */
1084 {200, 140, 220, 140} /* l end on r edgecase clipped */
1087 static const RECT vline_clips[] =
1089 {120, 120, 120, 140}, /* unclipped */
1090 {100, 120, 100, 140}, /* l edgecase */
1091 { 99, 120, 99, 140}, /* l edgecase clipped */
1092 {199, 120, 199, 140}, /* r edgecase */
1093 {200, 120, 200, 140}, /* r edgecase clipped */
1094 {122, 99, 122, 201}, /* t and b clipped */
1095 {124, 100, 124, 140}, /* t edgecase */
1096 {126, 99, 126, 140}, /* t edgecase clipped */
1097 {128, 120, 128, 200}, /* b edgecase */
1098 {130, 120, 130, 201}, /* b edgecase clipped */
1099 {132, 12, 132, 140}, /* inside two clip rects */
1100 {134, 90, 134, 101}, /* b end on t edgecase */
1101 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1102 {138, 199, 138, 220}, /* t end on b edgecase */
1103 {140, 200, 140, 220} /* t end on b edgecase clipped */
1106 static const RECT line_clips[] =
1108 { 90, 110, 310, 120},
1109 { 90, 120, 295, 130},
1110 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1111 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1112 { 90, 132, 101, 137}, /* end pt just inside l edge */
1113 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1114 {199, 142, 210, 143} /* start pt just inside r edge */
1117 static const RECT patblt_clips[] =
1119 {120, 120, 140, 126}, /* unclipped */
1120 {100, 130, 140, 136}, /* l edgecase */
1121 { 99, 140, 140, 146}, /* l edgecase clipped */
1122 {180, 130, 200, 136}, /* r edgecase */
1123 {180, 140, 201, 146}, /* r edgecase clipped */
1124 {120, 100, 130, 110}, /* t edgecase */
1125 {140, 99, 150, 110}, /* t edgecase clipped */
1126 {120, 180, 130, 200}, /* b edgecase */
1127 {140, 180, 150, 201}, /* b edgecase */
1128 {199, 150, 210, 156}, /* l edge on r edgecase */
1129 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1130 { 90, 150, 101, 156}, /* r edge on l edgecase */
1131 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1132 {160, 90, 166, 101}, /* b edge on t edgecase */
1133 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1134 {160, 199, 166, 210}, /* t edge on b edgecase */
1135 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1138 static const RECT rectangles[] =
1140 {10, 11, 100, 101},
1141 {250, 100, 350, 10},
1142 {120, 10, 120, 20}, /* zero width */
1143 {120, 10, 130, 10}, /* zero height */
1144 {120, 40, 121, 41}, /* 1 x 1 */
1145 {130, 50, 132, 52}, /* 2 x 2 */
1146 {140, 60, 143, 63}, /* 3 x 3 */
1147 {150, 70, 154, 74}, /* 4 x 4 */
1148 {120, 20, 121, 30}, /* width == 1 */
1149 {130, 20, 132, 30}, /* width == 2 */
1150 {140, 20, 143, 30}, /* width == 3 */
1151 {200, 20, 210, 21}, /* height == 1 */
1152 {200, 30, 210, 32}, /* height == 2 */
1153 {200, 40, 210, 43} /* height == 3 */
1156 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1157 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1158 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1159 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1160 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1161 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1163 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1164 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1165 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1166 0x00, 0x01 }; /* <eod> */
1168 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1169 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1170 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1171 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1173 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1175 HBRUSH brush = CreateSolidBrush( color );
1176 brush = SelectObject( hdc, brush );
1177 PatBlt( hdc, x, y, width, height, PATCOPY );
1178 DeleteObject( SelectObject( hdc, brush ) );
1181 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1183 DWORD dib_size = get_dib_size(bmi);
1184 HPEN solid_pen, dashed_pen, orig_pen;
1185 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1186 HBITMAP bmp;
1187 INT i, x, y, hatch_style;
1188 HDC src_dc;
1189 HRGN hrgn, hrgn2;
1190 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1191 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1192 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1193 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1194 RGBQUAD *brush_colors = brush_bi->bmiColors;
1195 BYTE *brush_bits, *src_bits;
1196 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1197 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1198 BLENDFUNCTION blend;
1200 blend.BlendOp = AC_SRC_OVER;
1201 blend.BlendFlags = 0;
1203 memset(bits, 0xcc, dib_size);
1204 compare_hash(bmi, bits, sha1, "empty");
1206 src_dc = CreateCompatibleDC( 0 );
1207 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1208 orig_pen = SelectObject(hdc, solid_pen);
1209 SetBrushOrgEx(hdc, 0, 0, NULL);
1211 /* horizontal and vertical lines */
1212 for(i = 1; i <= 16; i++)
1214 SetROP2(hdc, i);
1215 MoveToEx(hdc, 10, i * 3, NULL);
1216 LineTo(hdc, 100, i * 3); /* l -> r */
1217 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1218 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1219 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1220 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1221 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1222 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1224 compare_hash(bmi, bits, sha1, "h and v solid lines");
1225 memset(bits, 0xcc, dib_size);
1227 /* diagonal lines */
1228 SetROP2(hdc, R2_COPYPEN);
1229 for(i = 0; i < 16; i++)
1231 double s = sin(M_PI * i / 8.0);
1232 double c = cos(M_PI * i / 8.0);
1234 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1235 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1237 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1238 memset(bits, 0xcc, dib_size);
1240 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1242 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1243 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1245 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1246 memset(bits, 0xcc, dib_size);
1248 /* solid brush PatBlt */
1249 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1250 orig_brush = SelectObject(hdc, solid_brush);
1252 for(i = 0, y = 10; i < 256; i++)
1254 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1256 if(rop_uses_src(rop3[i]))
1257 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1258 else
1260 ok(ret, "got FALSE for %x\n", rop3[i]);
1261 y += 20;
1265 compare_hash(bmi, bits, sha1, "solid patblt");
1266 memset(bits, 0xcc, dib_size);
1268 /* clipped lines */
1269 hrgn = CreateRectRgn(10, 10, 200, 20);
1270 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1271 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1272 SetRectRgn(hrgn2, 290, 100, 300, 200);
1273 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1274 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1275 DeleteObject(hrgn2);
1277 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1279 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1280 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1282 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1283 memset(bits, 0xcc, dib_size);
1285 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1287 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1288 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1290 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1291 memset(bits, 0xcc, dib_size);
1293 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1295 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1296 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1298 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1299 memset(bits, 0xcc, dib_size);
1301 /* clipped PatBlt */
1302 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1304 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1305 patblt_clips[i].right - patblt_clips[i].left,
1306 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1308 compare_hash(bmi, bits, sha1, "clipped patblt");
1309 memset(bits, 0xcc, dib_size);
1311 /* clipped dashed lines */
1312 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1313 SelectObject(hdc, dashed_pen);
1314 SetBkMode(hdc, TRANSPARENT);
1315 SetBkColor(hdc, RGB(0, 0xff, 0));
1317 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1319 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1320 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1322 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1323 memset(bits, 0xcc, dib_size);
1325 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1327 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1328 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1330 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1331 memset(bits, 0xcc, dib_size);
1333 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1335 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1336 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1338 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1339 memset(bits, 0xcc, dib_size);
1341 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1343 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1344 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1346 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1347 memset(bits, 0xcc, dib_size);
1349 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1351 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1352 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1354 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1355 memset(bits, 0xcc, dib_size);
1357 SetBkMode(hdc, OPAQUE);
1359 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1361 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1362 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1364 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1365 memset(bits, 0xcc, dib_size);
1367 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1369 /* 8888 DIB pattern brush */
1371 brush_bi->bmiHeader = dib_brush_header_8888;
1372 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1373 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1374 brush_bits[2] = 0xff;
1375 brush_bits[6] = 0xff;
1376 brush_bits[14] = 0xff;
1377 brush_bits[65] = 0xff;
1378 brush_bits[69] = 0xff;
1379 brush_bits[72] = 0xff;
1381 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1383 SelectObject(hdc, dib_brush);
1384 SetBrushOrgEx(hdc, 1, 1, NULL);
1386 for(i = 0, y = 10; i < 256; i++)
1388 if(!rop_uses_src(rop3[i]))
1390 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1391 ok(ret, "got FALSE for %x\n", rop3[i]);
1392 y += 25;
1395 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1396 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1397 else
1398 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1399 memset(bits, 0xcc, dib_size);
1401 SelectObject(hdc, orig_brush);
1402 DeleteObject(dib_brush);
1404 /* 8888 bottom-up DIB pattern brush */
1406 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1408 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1410 SelectObject(hdc, dib_brush);
1412 /* This used to set the x origin to 100 as well, but
1413 there's a Windows bug for 24 bpp where the brush's x offset
1414 is incorrectly calculated for rops that involve both D and P */
1415 SetBrushOrgEx(hdc, 4, 100, NULL);
1417 for(i = 0, y = 10; i < 256; i++)
1419 if(!rop_uses_src(rop3[i]))
1421 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1422 ok(ret, "got FALSE for %x\n", rop3[i]);
1423 y += 25;
1426 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1427 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1428 else
1429 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1430 memset(bits, 0xcc, dib_size);
1432 SelectObject(hdc, orig_brush);
1433 DeleteObject(dib_brush);
1435 /* 24 bpp dib pattern brush */
1437 brush_bi->bmiHeader = dib_brush_header_24;
1438 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1439 memset(brush_bits, 0, 16 * 16 * 3);
1440 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1441 brush_bits[49] = brush_bits[52] = 0xff;
1443 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1445 SelectObject(hdc, dib_brush);
1446 SetBrushOrgEx(hdc, 1, 1, NULL);
1448 for(i = 0, y = 10; i < 256; i++)
1450 if(!rop_uses_src(rop3[i]))
1452 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1453 ok(ret, "got FALSE for %x\n", rop3[i]);
1454 y += 25;
1457 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1458 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1459 else
1460 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1461 memset(bits, 0xcc, dib_size);
1463 SelectObject(hdc, orig_brush);
1464 DeleteObject(dib_brush);
1466 /* 555 dib pattern brush */
1468 brush_bi->bmiHeader = dib_brush_header_555;
1469 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1470 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1471 brush_bits[0] = brush_bits[1] = 0xff;
1472 brush_bits[32] = brush_bits[34] = 0x7c;
1474 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1476 SelectObject(hdc, dib_brush);
1477 SetBrushOrgEx(hdc, 1, 1, NULL);
1479 for(i = 0, y = 10; i < 256; i++)
1481 if(!rop_uses_src(rop3[i]))
1483 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1484 ok(ret, "got FALSE for %x\n", rop3[i]);
1485 y += 25;
1488 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1489 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1490 else
1491 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1492 memset(bits, 0xcc, dib_size);
1494 SelectObject(hdc, orig_brush);
1495 DeleteObject(dib_brush);
1497 SetBrushOrgEx(hdc, 0, 0, NULL);
1499 /* 8 bpp dib pattern brush */
1501 brush_bi->bmiHeader = dib_brush_header_8;
1502 brush_bi->bmiHeader.biClrUsed = 3;
1503 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1504 brush_colors[0].rgbRed = 0xff;
1505 brush_colors[1].rgbRed = 0xff;
1506 brush_colors[1].rgbGreen = 0xff;
1507 brush_colors[1].rgbBlue = 0xff;
1509 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1510 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1511 brush_bits[0] = brush_bits[1] = 1;
1512 brush_bits[16] = brush_bits[17] = 2;
1513 brush_bits[32] = brush_bits[33] = 6;
1515 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1517 SelectObject(hdc, dib_brush);
1518 SetBrushOrgEx(hdc, 1, 1, NULL);
1520 for(i = 0, y = 10; i < 256; i++)
1522 if(!rop_uses_src(rop3[i]))
1524 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1525 ok(ret, "got FALSE for %x\n", rop3[i]);
1526 y += 25;
1529 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1530 memset(bits, 0xcc, dib_size);
1532 SelectObject(hdc, orig_brush);
1533 DeleteObject(dib_brush);
1535 /* 4 bpp dib pattern brush */
1537 brush_bi->bmiHeader = dib_brush_header_4;
1538 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1540 SelectObject(hdc, dib_brush);
1541 SetBrushOrgEx(hdc, 1, 1, NULL);
1543 for(i = 0, y = 10; i < 256; i++)
1545 if(!rop_uses_src(rop3[i]))
1547 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1548 ok(ret, "got FALSE for %x\n", rop3[i]);
1549 y += 25;
1552 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1553 memset(bits, 0xcc, dib_size);
1555 SelectObject(hdc, orig_brush);
1556 DeleteObject(dib_brush);
1558 /* 1 bpp dib pattern brush */
1560 brush_bi->bmiHeader = dib_brush_header_1;
1561 brush_bi->bmiHeader.biClrUsed = 2;
1562 memset(brush_bits, 0, 16 * 4);
1563 brush_bits[0] = 0xf0;
1564 brush_bits[4] = 0xf0;
1565 brush_bits[8] = 0xf0;
1567 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1568 SelectObject(hdc, dib_brush);
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;
1579 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1580 memset(bits, 0xcc, dib_size);
1582 SelectObject(hdc, orig_brush);
1583 SetBrushOrgEx(hdc, 0, 0, NULL);
1585 /* Rectangle */
1587 SelectObject(hdc, solid_pen);
1588 SelectObject(hdc, solid_brush);
1590 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1592 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1595 SelectObject(hdc, dashed_pen);
1596 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1598 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1601 compare_hash(bmi, bits, sha1, "rectangles");
1602 memset(bits, 0xcc, dib_size);
1603 SelectObject(hdc, solid_pen);
1605 /* PaintRgn */
1607 PaintRgn(hdc, hrgn);
1608 compare_hash(bmi, bits, sha1, "PaintRgn");
1609 memset(bits, 0xcc, dib_size);
1611 /* RTL rectangles */
1613 if( !pSetLayout )
1615 win_skip("Don't have SetLayout\n");
1616 (*sha1)++;
1618 else
1620 pSetLayout(hdc, LAYOUT_RTL);
1621 PaintRgn(hdc, hrgn);
1622 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1623 Rectangle(hdc, 100, 250, 110, 260);
1624 compare_hash(bmi, bits, sha1, "rtl");
1625 memset(bits, 0xcc, dib_size);
1627 pSetLayout(hdc, LAYOUT_LTR);
1630 for(i = 0, y = 10; i < 256; i++)
1632 if(!rop_uses_src(rop3[i]))
1634 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1636 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1637 SelectObject(hdc, hatch_brush);
1638 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1639 ok(ret, "got FALSE for %x\n", rop3[i]);
1640 SelectObject(hdc, orig_brush);
1641 DeleteObject(hatch_brush);
1643 y += 25;
1647 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1648 memset(bits, 0xcc, dib_size);
1650 /* overlapping blits */
1652 orig_brush = SelectObject(hdc, solid_brush);
1654 Rectangle(hdc, 10, 10, 100, 100);
1655 Rectangle(hdc, 20, 15, 30, 40);
1656 Rectangle(hdc, 15, 15, 20, 20);
1657 Rectangle(hdc, 15, 20, 50, 45);
1658 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1659 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1660 memset(bits, 0xcc, dib_size);
1662 Rectangle(hdc, 10, 10, 100, 100);
1663 Rectangle(hdc, 20, 15, 30, 40);
1664 Rectangle(hdc, 15, 15, 20, 20);
1665 Rectangle(hdc, 15, 20, 50, 45);
1666 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1667 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1668 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1669 else
1670 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1671 memset(bits, 0xcc, dib_size);
1673 Rectangle(hdc, 10, 10, 100, 100);
1674 Rectangle(hdc, 20, 15, 30, 40);
1675 Rectangle(hdc, 15, 15, 20, 20);
1676 Rectangle(hdc, 15, 20, 50, 45);
1677 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1678 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1679 memset(bits, 0xcc, dib_size);
1681 Rectangle(hdc, 10, 10, 100, 100);
1682 Rectangle(hdc, 20, 15, 30, 40);
1683 Rectangle(hdc, 15, 15, 20, 20);
1684 Rectangle(hdc, 15, 20, 50, 45);
1685 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1686 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1687 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1688 else
1689 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1690 memset(bits, 0xcc, dib_size);
1692 Rectangle(hdc, 10, 10, 100, 100);
1693 Rectangle(hdc, 20, 15, 30, 40);
1694 Rectangle(hdc, 15, 15, 20, 20);
1695 Rectangle(hdc, 15, 20, 50, 45);
1696 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1697 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1698 memset(bits, 0xcc, dib_size);
1700 Rectangle(hdc, 10, 10, 100, 100);
1701 Rectangle(hdc, 20, 15, 30, 40);
1702 Rectangle(hdc, 15, 15, 20, 20);
1703 Rectangle(hdc, 15, 20, 50, 45);
1704 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1705 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1706 memset(bits, 0xcc, dib_size);
1708 Rectangle(hdc, 10, 10, 100, 100);
1709 Rectangle(hdc, 20, 15, 30, 40);
1710 Rectangle(hdc, 15, 15, 20, 20);
1711 Rectangle(hdc, 15, 20, 50, 45);
1712 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1713 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1714 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1715 else
1716 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1717 memset(bits, 0xcc, dib_size);
1719 Rectangle(hdc, 10, 10, 100, 100);
1720 Rectangle(hdc, 20, 15, 30, 40);
1721 Rectangle(hdc, 15, 15, 20, 20);
1722 Rectangle(hdc, 15, 20, 50, 45);
1723 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1724 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1725 memset(bits, 0xcc, dib_size);
1727 /* blitting with 32-bpp BI_RGB source */
1729 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1730 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1731 src_bi->bmiHeader.biHeight = 256;
1732 src_bi->bmiHeader.biWidth = 256;
1733 src_bi->bmiHeader.biBitCount = 32;
1734 src_bi->bmiHeader.biPlanes = 1;
1735 src_bi->bmiHeader.biCompression = BI_RGB;
1736 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1737 SelectObject( src_dc, bmp );
1738 for (y = 0; y < 256; y++)
1739 for (x = 0; x < 256; x++)
1741 BYTE a = (x + y) * 2;
1742 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1743 BYTE g = (BYTE)(x + y / 3) * a / 255;
1744 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1745 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1748 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1749 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1750 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1751 else
1752 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1753 memset(bits, 0xcc, dib_size);
1755 blend.SourceConstantAlpha = 0xd0;
1756 blend.AlphaFormat = 0;
1757 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1758 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1760 if (!pGdiAlphaBlend) (*sha1) += 2;
1761 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1763 else
1765 if (!pGdiAlphaBlend) (*sha1)++;
1766 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1768 memset(bits, 0xcc, dib_size);
1770 blend.SourceConstantAlpha = 0xb0;
1771 blend.AlphaFormat = AC_SRC_ALPHA;
1772 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1773 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1775 if (!pGdiAlphaBlend) (*sha1) += 2;
1776 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1778 else
1780 if (!pGdiAlphaBlend) (*sha1)++;
1781 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1783 memset(bits, 0xcc, dib_size);
1785 /* blitting with 32-bpp r10g10b10 source */
1787 src_bi->bmiHeader.biBitCount = 32;
1788 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1789 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1790 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1791 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1792 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1793 SelectObject( src_dc, bmp );
1794 for (y = 0; y < 256; y++)
1795 for (x = 0; x < 256; x++)
1797 WORD r = (7 * x + 3 * y) % 1024;
1798 WORD g = (11 * x + y / 3) % 1024;
1799 WORD b = (x / 3 + 9 * y) % 1024;
1800 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1803 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1804 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1805 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1806 else
1807 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1808 memset(bits, 0xcc, dib_size);
1810 /* blitting with 32-bpp b6g6r6 source */
1812 src_bi->bmiHeader.biBitCount = 32;
1813 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1814 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1815 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1816 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1817 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1818 SelectObject( src_dc, bmp );
1819 for (y = 0; y < 256; y++)
1820 for (x = 0; x < 256; x++)
1822 BYTE r = (y + 2 * x) % 64;
1823 BYTE g = (x + y / 3) % 64;
1824 BYTE b = (x / 3 + 2 * y) % 64;
1825 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1828 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1829 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1830 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1831 else
1832 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1833 memset(bits, 0xcc, dib_size);
1835 /* blitting with 24-bpp source */
1837 src_bi->bmiHeader.biBitCount = 24;
1838 src_bi->bmiHeader.biCompression = BI_RGB;
1839 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1840 DeleteObject( SelectObject( src_dc, bmp ) );
1841 for (y = 0; y < 256; y++)
1842 for (x = 0; x < 256; x++)
1844 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1845 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1846 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1849 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1850 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1851 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1852 else
1853 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1854 memset(bits, 0xcc, dib_size);
1856 blend.SourceConstantAlpha = 0xe0;
1857 blend.AlphaFormat = 0;
1858 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1859 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1861 if (!pGdiAlphaBlend) (*sha1) += 2;
1862 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1864 else
1866 if (!pGdiAlphaBlend) (*sha1)++;
1867 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1869 memset(bits, 0xcc, dib_size);
1871 /* blitting with 16-bpp BI_RGB source */
1873 src_bi->bmiHeader.biBitCount = 16;
1874 src_bi->bmiHeader.biCompression = BI_RGB;
1875 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1876 DeleteObject( SelectObject( src_dc, bmp ) );
1877 for (y = 0; y < 256; y++)
1878 for (x = 0; x < 256; x++)
1879 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1881 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1882 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1883 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1884 else
1885 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1886 memset(bits, 0xcc, dib_size);
1888 /* blitting with 16-bpp b4g4r4 source */
1890 src_bi->bmiHeader.biBitCount = 16;
1891 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1892 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1893 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1894 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1895 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1896 DeleteObject( SelectObject( src_dc, bmp ) );
1897 for (y = 0; y < 256; y++)
1898 for (x = 0; x < 256; x++)
1899 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1901 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1902 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1903 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1904 else
1905 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1906 memset(bits, 0xcc, dib_size);
1908 /* blitting with 8-bpp source */
1910 src_bi->bmiHeader.biBitCount = 8;
1911 src_bi->bmiHeader.biCompression = BI_RGB;
1912 src_bi->bmiHeader.biClrUsed = 160;
1913 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1914 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1915 DeleteObject( SelectObject( src_dc, bmp ) );
1916 for (y = 0; y < 256; y++)
1917 for (x = 0; x < 256; x++)
1918 src_bits[y * 256 + x] = 3 * x + 5 * y;
1920 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1921 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1922 memset(bits, 0xcc, dib_size);
1924 blend.SourceConstantAlpha = 0xd0;
1925 blend.AlphaFormat = 0;
1926 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1927 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1929 if (!pGdiAlphaBlend) (*sha1) += 2;
1930 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1932 else
1934 if (!pGdiAlphaBlend) (*sha1)++;
1935 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1937 memset(bits, 0xcc, dib_size);
1939 /* blitting with 4-bpp source */
1941 src_bi->bmiHeader.biBitCount = 4;
1942 src_bi->bmiHeader.biClrUsed = 12;
1943 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
1944 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1945 DeleteObject( SelectObject( src_dc, bmp ) );
1946 for (y = 0; y < 256; y++)
1947 for (x = 0; x < 256; x += 2)
1948 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
1950 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1951 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
1952 memset(bits, 0xcc, dib_size);
1954 /* blitting with 1-bpp source */
1956 src_bi->bmiHeader.biBitCount = 1;
1957 src_bi->bmiHeader.biClrUsed = 0;
1958 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
1959 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1960 DeleteObject( SelectObject( src_dc, bmp ) );
1961 for (y = 0; y < 256; y++)
1962 for (x = 0; x < 256; x += 8)
1963 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
1965 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1966 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
1967 memset(bits, 0xcc, dib_size);
1969 blend.SourceConstantAlpha = 0x90;
1970 blend.AlphaFormat = 0;
1971 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1972 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1974 if (!pGdiAlphaBlend) (*sha1) += 2;
1975 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
1977 else
1979 if (!pGdiAlphaBlend) (*sha1)++;
1980 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
1982 memset(bits, 0xcc, dib_size);
1984 DeleteDC( src_dc );
1985 DeleteObject( bmp );
1987 /* RLE StretchDIBits */
1988 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
1989 src_bi->bmiHeader.biWidth = 8;
1990 src_bi->bmiHeader.biHeight = 8;
1991 src_bi->bmiHeader.biPlanes = 1;
1992 src_bi->bmiHeader.biBitCount = 8;
1993 src_bi->bmiHeader.biCompression = BI_RLE8;
1994 src_bi->bmiHeader.biClrUsed = 0;
1995 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
1997 for (i = 0; i < 256; i++)
1999 src_bi->bmiColors[i].rgbRed = i;
2000 src_bi->bmiColors[i].rgbGreen = i;
2001 src_bi->bmiColors[i].rgbBlue = i;
2002 src_bi->bmiColors[i].rgbReserved = 0;
2005 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2006 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
2007 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2008 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2009 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2010 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
2011 memset(bits, 0xcc, dib_size);
2013 /* 32 bpp StretchDIBits */
2015 src_bi->bmiHeader.biWidth = 4;
2016 src_bi->bmiHeader.biHeight = 4;
2017 src_bi->bmiHeader.biPlanes = 1;
2018 src_bi->bmiHeader.biBitCount = 32;
2019 src_bi->bmiHeader.biCompression = BI_RGB;
2020 src_bi->bmiHeader.biClrUsed = 0;
2021 src_bi->bmiHeader.biSizeImage = 0;
2023 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2024 ok(ret == 4, "got %d\n", ret);
2025 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2026 ok(ret == 4, "got %d\n", ret);
2027 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2028 ok(ret == 4, "got %d\n", ret);
2029 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2030 ok(ret == 4, "got %d\n", ret);
2031 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2032 ok(ret == 4, "got %d\n", ret);
2033 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2034 ok(ret == 4, "got %d\n", ret);
2036 src_bi->bmiHeader.biHeight = -4;
2038 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2039 ok(ret == 4, "got %d\n", ret);
2040 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2041 ok(ret == -4, "got %d\n", ret);
2042 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2043 ok(ret == 4, "got %d\n", ret);
2044 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2045 ok(ret == -4, "got %d\n", ret);
2046 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
2047 ok(ret == 4, "got %d\n", ret);
2048 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
2049 ok(ret == -4, "got %d\n", ret);
2051 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2052 memset(bits, 0xcc, dib_size);
2054 /* Solid colors */
2055 for (i = 0; i < 256; i++)
2057 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
2058 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
2059 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2060 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2063 /* A few extra colors that are interesting in the 1bpp case */
2065 /* bk color */
2066 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2067 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2069 /* color 0 */
2070 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2071 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2073 /* color 1 */
2074 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2075 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2077 compare_hash(bmi, bits, sha1, "Colors");
2078 memset(bits, 0xcc, dib_size);
2080 for (i = 0; i < 256; i++)
2082 COLORREF s, g;
2083 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
2084 g = GetPixel( hdc, i * 2, 10 );
2085 ok( s == g, "got %08x and %08x\n", s, g );
2087 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2088 g = GetPixel( hdc, i * 2, 20 );
2089 ok( s == g, "got %08x and %08x\n", s, g );
2091 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2092 g = GetPixel( hdc, i * 2, 30 );
2093 ok( s == g, "got %08x and %08x\n", s, g );
2095 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2096 g = GetPixel( hdc, i * 2, 40 );
2097 ok( s == g, "got %08x and %08x\n", s, g );
2100 compare_hash(bmi, bits, sha1, "SetPixel");
2101 memset(bits, 0xcc, dib_size);
2103 /* gradients */
2105 if (pGdiGradientFill)
2107 TRIVERTEX vrect[] =
2109 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2110 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2111 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2112 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2114 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2116 TRIVERTEX vtri[] =
2118 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2119 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2120 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2122 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2123 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2124 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2126 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2127 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2128 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2130 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2131 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2132 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2134 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2135 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2136 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2138 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2139 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2140 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2142 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2143 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2144 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2146 GRADIENT_TRIANGLE tri[] =
2148 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2149 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2152 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H );
2153 for (i = 0; i < 4; i++) vrect[i].y += 250;
2154 pGdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V );
2156 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2157 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2158 else
2159 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2160 memset(bits, 0xcc, dib_size);
2162 pGdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE );
2163 for (i = 0; i < 7*3; i++) vtri[i].y += 100;
2164 pGdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE );
2165 if (bmi->bmiHeader.biBitCount <= 8) /* Wine's 8-bit dithering isn't identical to Windows */
2166 compare_hash_broken_todo( bmi, bits, sha1, "GdiGradientFill", 0, 1 );
2167 else
2168 compare_hash(bmi, bits, sha1, "GdiGradientFill" );
2169 memset(bits, 0xcc, dib_size);
2171 else win_skip( "GdiGradientFill not supported\n" );
2173 SelectObject(hdc, orig_brush);
2174 SelectObject(hdc, orig_pen);
2175 DeleteObject(hrgn);
2176 DeleteObject(dib_brush);
2177 DeleteObject(dashed_pen);
2178 DeleteObject(solid_brush);
2179 DeleteObject(solid_pen);
2182 static const BYTE ramp[17] =
2184 0, 0x4d, 0x68, 0x7c,
2185 0x8c, 0x9a, 0xa7, 0xb2,
2186 0xbd, 0xc7, 0xd0, 0xd9,
2187 0xe1, 0xe9, 0xf0, 0xf8,
2188 0xff
2191 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2193 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2194 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2197 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2199 BYTE min_comp, max_comp;
2201 if (alpha == 16) return text;
2202 if (alpha <= 1) return dst;
2203 if (text == dst) return dst;
2205 get_range( alpha, text, &min_comp, &max_comp );
2207 if (dst > text)
2209 DWORD diff = dst - text;
2210 DWORD range = max_comp - text;
2211 dst = text + (diff * range ) / (0xff - text);
2212 return dst;
2214 else
2216 DWORD diff = text - dst;
2217 DWORD range = text - min_comp ;
2218 dst = text - (diff * range) / text;
2219 return dst;
2223 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2225 COLORREF ret;
2227 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2228 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2229 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2230 return ret;
2233 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2235 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2237 DWORD dib_size = get_dib_size(bmi), ret;
2238 LOGFONT lf;
2239 HFONT font;
2240 GLYPHMETRICS gm;
2241 BYTE g_buf[10000];
2242 int i, stride, x, y;
2243 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2244 char *eto_hash = NULL, *diy_hash = NULL;
2245 static const char *str = "Hello Wine";
2246 POINT origin, g_org;
2247 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2248 TEXTMETRIC tm;
2249 COLORREF text_color;
2251 for(i = 0; i < dib_size; i++)
2252 bits[i] = vals[i % 4];
2254 memset( &lf, 0, sizeof(lf) );
2255 strcpy( lf.lfFaceName, "Tahoma" );
2256 lf.lfHeight = 24;
2257 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2259 font = CreateFontIndirect( &lf );
2260 font = SelectObject( hdc, font );
2262 GetTextMetrics( hdc, &tm );
2263 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2265 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2266 DeleteObject( SelectObject( hdc, font ) );
2267 return;
2270 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2271 SetTextAlign( hdc, TA_BASELINE );
2272 SetBkMode( hdc, TRANSPARENT );
2273 origin.x = 10;
2274 origin.y = 100;
2276 ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2277 eto_hash = hash_dib( bmi, bits );
2279 for(i = 0; i < dib_size; i++)
2280 bits[i] = vals[i % 4];
2282 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2284 text_color = GetTextColor( hdc );
2285 for (i = 0; i < strlen(str); i++)
2287 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2289 ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2291 if (ret == GDI_ERROR) continue;
2293 if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2295 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2296 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2298 origin.x += gm.gmCellIncX;
2299 origin.y += gm.gmCellIncY;
2301 if (!ret) continue;
2303 if (aa)
2305 stride = (gm.gmBlackBoxX + 3) & ~3;
2307 for (y = 0; y < gm.gmBlackBoxY; y++)
2309 BYTE *g_ptr = g_buf + y * stride;
2310 COLORREF val;
2312 for (x = 0; x < gm.gmBlackBoxX; x++)
2314 if (g_ptr[x] <= 1) continue;
2315 if (g_ptr[x] >= 16) val = text_color;
2316 else
2318 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2319 val = aa_colorref( val, text_color, g_ptr[x] );
2321 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2325 else
2327 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2329 for (y = 0; y < gm.gmBlackBoxY; y++)
2331 BYTE *g_ptr = g_buf + y * stride;
2332 for (x = 0; x < gm.gmBlackBoxX; x++)
2334 if (g_ptr[x / 8] & masks[x % 8])
2335 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2341 diy_hash = hash_dib( bmi, bits );
2342 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2344 HeapFree( GetProcessHeap(), 0, diy_hash );
2345 HeapFree( GetProcessHeap(), 0, eto_hash );
2347 font = SelectObject( hdc, font );
2348 DeleteObject( font );
2351 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2353 draw_text_2( hdc, bmi, bits, FALSE );
2355 /* Rounding errors make these cases hard to test */
2356 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2357 (bmi->bmiHeader.biBitCount == 16))
2358 return;
2360 draw_text_2( hdc, bmi, bits, TRUE );
2363 static void test_simple_graphics(void)
2365 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2366 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2367 RGBQUAD *colors = bmi->bmiColors;
2368 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2369 HDC mem_dc;
2370 BYTE *bits;
2371 HBITMAP dib, orig_bm;
2372 const char **sha1;
2373 DIBSECTION ds;
2374 int i;
2376 mem_dc = CreateCompatibleDC(NULL);
2378 /* a8r8g8b8 */
2379 trace("8888\n");
2380 memset(bmi, 0, sizeof(bmibuf));
2381 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2382 bmi->bmiHeader.biHeight = 512;
2383 bmi->bmiHeader.biWidth = 512;
2384 bmi->bmiHeader.biBitCount = 32;
2385 bmi->bmiHeader.biPlanes = 1;
2386 bmi->bmiHeader.biCompression = BI_RGB;
2388 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2389 ok(dib != NULL, "ret NULL\n");
2390 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2391 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2392 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2393 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2394 ok(ds.dsBmih.biCompression == BI_RGB ||
2395 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2396 "got %x\n", ds.dsBmih.biCompression);
2398 orig_bm = SelectObject(mem_dc, dib);
2400 dst_format = "8888";
2401 sha1 = sha1_graphics_a8r8g8b8;
2402 draw_graphics(mem_dc, bmi, bits, &sha1);
2403 draw_text(mem_dc, bmi, bits);
2405 SelectObject(mem_dc, orig_bm);
2406 DeleteObject(dib);
2408 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2409 trace("8888 - bitfields\n");
2410 bmi->bmiHeader.biBitCount = 32;
2411 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2412 bit_fields[0] = 0xff0000;
2413 bit_fields[1] = 0x00ff00;
2414 bit_fields[2] = 0x0000ff;
2416 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2417 ok(dib != NULL, "ret NULL\n");
2418 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2419 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2420 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2421 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2422 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2424 orig_bm = SelectObject(mem_dc, dib);
2426 dst_format = "8888 - bitfields";
2427 sha1 = sha1_graphics_a8r8g8b8_bitfields;
2428 draw_graphics(mem_dc, bmi, bits, &sha1);
2429 draw_text(mem_dc, bmi, bits);
2431 SelectObject(mem_dc, orig_bm);
2432 DeleteObject(dib);
2434 /* a8b8g8r8. */
2435 trace("a8b8g8r8\n");
2436 bmi->bmiHeader.biBitCount = 32;
2437 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2438 bit_fields[0] = 0x0000ff;
2439 bit_fields[1] = 0x00ff00;
2440 bit_fields[2] = 0xff0000;
2442 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2443 ok(dib != NULL, "ret NULL\n");
2444 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2445 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2446 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2447 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2448 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2450 orig_bm = SelectObject(mem_dc, dib);
2452 dst_format = "a8b8g8r8";
2453 sha1 = sha1_graphics_a8b8g8r8;
2454 draw_graphics(mem_dc, bmi, bits, &sha1);
2455 draw_text(mem_dc, bmi, bits);
2457 SelectObject(mem_dc, orig_bm);
2458 DeleteObject(dib);
2460 /* r10g10b10. */
2461 trace("r10g10b10\n");
2462 bmi->bmiHeader.biBitCount = 32;
2463 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2464 bit_fields[0] = 0x3ff00000;
2465 bit_fields[1] = 0x000ffc00;
2466 bit_fields[2] = 0x000003ff;
2468 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2469 ok(dib != NULL, "ret NULL\n");
2470 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2471 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2472 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2473 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2474 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2476 orig_bm = SelectObject(mem_dc, dib);
2478 dst_format = "r10g10b10";
2479 sha1 = sha1_graphics_r10g10b10;
2480 draw_graphics(mem_dc, bmi, bits, &sha1);
2481 draw_text(mem_dc, bmi, bits);
2483 SelectObject(mem_dc, orig_bm);
2484 DeleteObject(dib);
2486 /* r6g6b6. */
2487 trace("r6g6b6\n");
2488 bmi->bmiHeader.biBitCount = 32;
2489 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2490 bit_fields[0] = 0x0003f000;
2491 bit_fields[1] = 0x00000fc0;
2492 bit_fields[2] = 0x0000003f;
2494 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2495 ok(dib != NULL, "ret NULL\n");
2496 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2497 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2498 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2499 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2500 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2502 orig_bm = SelectObject(mem_dc, dib);
2504 dst_format = "r6g6b6";
2505 sha1 = sha1_graphics_r6g6b6;
2506 draw_graphics(mem_dc, bmi, bits, &sha1);
2507 draw_text(mem_dc, bmi, bits);
2509 SelectObject(mem_dc, orig_bm);
2510 DeleteObject(dib);
2512 /* 24 */
2513 trace("24\n");
2514 bmi->bmiHeader.biBitCount = 24;
2515 bmi->bmiHeader.biCompression = BI_RGB;
2517 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2518 ok(dib != NULL, "ret NULL\n");
2519 orig_bm = SelectObject(mem_dc, dib);
2521 dst_format = "24";
2522 sha1 = sha1_graphics_24;
2523 draw_graphics(mem_dc, bmi, bits, &sha1);
2524 draw_text(mem_dc, bmi, bits);
2526 SelectObject(mem_dc, orig_bm);
2527 DeleteObject(dib);
2529 /* r5g5b5 */
2530 trace("555\n");
2531 bmi->bmiHeader.biBitCount = 16;
2532 bmi->bmiHeader.biCompression = BI_RGB;
2534 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2535 ok(dib != NULL, "ret NULL\n");
2536 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2537 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2538 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2539 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2540 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2542 orig_bm = SelectObject(mem_dc, dib);
2544 dst_format = "r5g5b5";
2545 sha1 = sha1_graphics_r5g5b5;
2546 draw_graphics(mem_dc, bmi, bits, &sha1);
2547 draw_text(mem_dc, bmi, bits);
2549 SelectObject(mem_dc, orig_bm);
2550 DeleteObject(dib);
2552 /* r4g4b4 */
2553 trace("444\n");
2554 bmi->bmiHeader.biBitCount = 16;
2555 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2556 bit_fields[0] = 0x0f00;
2557 bit_fields[1] = 0x00f0;
2558 bit_fields[2] = 0x000f;
2559 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2560 ok(dib != NULL, "ret NULL\n");
2561 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2562 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2563 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2564 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2565 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2567 orig_bm = SelectObject(mem_dc, dib);
2569 dst_format = "r4g4b4";
2570 sha1 = sha1_graphics_r4g4b4;
2571 draw_graphics(mem_dc, bmi, bits, &sha1);
2572 draw_text(mem_dc, bmi, bits);
2574 SelectObject(mem_dc, orig_bm);
2575 DeleteObject(dib);
2577 /* 8 color */
2578 trace("8 color\n");
2579 bmi->bmiHeader.biBitCount = 8;
2580 bmi->bmiHeader.biCompression = BI_RGB;
2581 bmi->bmiHeader.biClrUsed = 236;
2582 for (i = 0; i < 236; i++)
2584 colors[i].rgbRed = (i & 0x07) << 5;
2585 colors[i].rgbGreen = (i & 0x38) << 2;
2586 colors[i].rgbBlue = i & 0xc0;
2588 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2589 ok(dib != NULL, "ret NULL\n");
2591 orig_bm = SelectObject(mem_dc, dib);
2593 dst_format = "8 color";
2594 sha1 = sha1_graphics_8_color;
2595 draw_graphics(mem_dc, bmi, bits, &sha1);
2596 draw_text(mem_dc, bmi, bits);
2598 SelectObject(mem_dc, orig_bm);
2599 DeleteObject(dib);
2601 /* 8 grayscale */
2602 trace("8 grayscale\n");
2603 bmi->bmiHeader.biBitCount = 8;
2604 bmi->bmiHeader.biCompression = BI_RGB;
2605 bmi->bmiHeader.biClrUsed = 256;
2606 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2608 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2609 ok(dib != NULL, "ret NULL\n");
2611 orig_bm = SelectObject(mem_dc, dib);
2613 dst_format = "8 grayscale";
2614 sha1 = sha1_graphics_8_grayscale;
2615 draw_graphics(mem_dc, bmi, bits, &sha1);
2616 draw_text(mem_dc, bmi, bits);
2618 SelectObject(mem_dc, orig_bm);
2619 DeleteObject(dib);
2621 /* 8 */
2622 trace("8\n");
2623 bmi->bmiHeader.biBitCount = 8;
2624 bmi->bmiHeader.biCompression = BI_RGB;
2625 bmi->bmiHeader.biClrUsed = 5;
2626 colors[0].rgbRed = 0xff;
2627 colors[0].rgbGreen = 0xff;
2628 colors[0].rgbBlue = 0xff;
2629 colors[1].rgbRed = 0;
2630 colors[1].rgbGreen = 0;
2631 colors[1].rgbBlue = 0;
2632 colors[2].rgbRed = 0xff;
2633 colors[2].rgbGreen = 0;
2634 colors[2].rgbBlue = 0;
2635 colors[3].rgbRed = 0;
2636 colors[3].rgbGreen = 0xff;
2637 colors[3].rgbBlue = 0;
2638 colors[4].rgbRed = 0;
2639 colors[4].rgbGreen = 0;
2640 colors[4].rgbBlue = 0xff;
2642 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2643 ok(dib != NULL, "ret NULL\n");
2645 orig_bm = SelectObject(mem_dc, dib);
2647 dst_format = "8";
2648 sha1 = sha1_graphics_8;
2649 draw_graphics(mem_dc, bmi, bits, &sha1);
2650 draw_text(mem_dc, bmi, bits);
2652 SelectObject(mem_dc, orig_bm);
2653 DeleteObject(dib);
2655 /* 4 */
2656 trace("4\n");
2657 bmi->bmiHeader.biBitCount = 4;
2659 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2660 ok(dib != NULL, "ret NULL\n");
2662 orig_bm = SelectObject(mem_dc, dib);
2664 dst_format = "4";
2665 sha1 = sha1_graphics_4;
2666 draw_graphics(mem_dc, bmi, bits, &sha1);
2667 draw_text(mem_dc, bmi, bits);
2669 SelectObject(mem_dc, orig_bm);
2670 DeleteObject(dib);
2672 /* 4 grayscale */
2673 trace("4 grayscale\n");
2674 bmi->bmiHeader.biClrUsed = 16;
2675 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2677 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2678 ok(dib != NULL, "ret NULL\n");
2680 orig_bm = SelectObject(mem_dc, dib);
2682 dst_format = "4 grayscale";
2683 sha1 = sha1_graphics_4_grayscale;
2684 draw_graphics(mem_dc, bmi, bits, &sha1);
2685 draw_text(mem_dc, bmi, bits);
2687 SelectObject(mem_dc, orig_bm);
2688 DeleteObject(dib);
2690 /* 1 */
2691 trace("1\n");
2692 bmi->bmiHeader.biBitCount = 1;
2693 bmi->bmiHeader.biClrUsed = 2;
2695 colors[0].rgbRed = 0x00;
2696 colors[0].rgbGreen = 0x01;
2697 colors[0].rgbBlue = 0xff;
2698 colors[1].rgbRed = 0xff;
2699 colors[1].rgbGreen = 0x00;
2700 colors[1].rgbBlue = 0x00;
2702 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2703 ok(dib != NULL, "ret NULL\n");
2705 orig_bm = SelectObject(mem_dc, dib);
2707 dst_format = "1";
2708 sha1 = sha1_graphics_1;
2709 draw_graphics(mem_dc, bmi, bits, &sha1);
2710 draw_text(mem_dc, bmi, bits);
2712 SelectObject(mem_dc, orig_bm);
2713 DeleteObject(dib);
2715 DeleteDC(mem_dc);
2718 START_TEST(dib)
2720 HMODULE mod = GetModuleHandleA("gdi32.dll");
2721 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2722 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2723 pGdiGradientFill = (void *)GetProcAddress( mod, "GdiGradientFill" );
2725 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2727 test_simple_graphics();
2729 CryptReleaseContext(crypt_prov, 0);