gdi32/tests: Add tests for GetPixel.
[wine.git] / dlls / gdi32 / tests / dib.c
blob844ccef87a0b3fa84891b3c8cd23d1789da33a2d
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 DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
38 static const DWORD rop3[256] =
40 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
41 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
42 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
43 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
44 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
45 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
46 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
47 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
48 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
49 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
50 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
51 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
52 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
53 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
54 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
55 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
56 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
57 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
58 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
59 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
60 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
61 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
62 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
63 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
64 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
65 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
66 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
67 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
68 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
69 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
70 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
71 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
74 static inline BOOL rop_uses_src(DWORD rop)
76 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
79 static const char *sha1_graphics_a8r8g8b8[] =
81 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
82 "2426172d9e8fec27d9228088f382ef3c93717da9",
83 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
84 "664fac17803859a4015c6ae29e5538e314d5c827",
85 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
86 "fe6cc678fb13a3ead67839481bf22348adc69f52",
87 "d51bd330cec510cdccf5394328bd8e5411901e9e",
88 "df4aebf98d91f11be560dd232123b3ae327303d7",
89 "f2af53dd073a09b1031d0032d28da35c82adc566",
90 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
91 "c387917268455017aa0b28bed73aa6554044bbb3",
92 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
93 "6c530622a025d872a642e8f950867884d7b136cb",
94 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
95 "b2261353decda2712b83538ab434a49ce21f3172",
96 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
97 "9b9874c1c1d92afa554137e191d34ea33acc322f",
98 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
99 "d7398de15b2837a58a62a701ca1b3384625afec4",
100 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
101 "5246ef357e7317b9d141a3294d300c195da76cb7",
102 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
103 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
104 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
105 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
106 "e358efb1c11172e40855de620bdb8a8e545cd790",
107 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
108 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
109 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
110 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
111 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
112 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
113 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
114 "94645300d6eb51020a7ef8261dee2941cd51b5df",
115 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
116 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
117 "1fd2f4dcb62f8522171872e43fd4a35041d68100",
118 "68c18db6abfda626cab12d198298d4c39264bfbc",
119 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
120 "39c31de73aafcfcadf0bf414da4495be9de54417",
121 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
122 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
123 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
124 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
125 "3d2ccbe51408232a04769546b1bdd74f84558a41",
126 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
127 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
128 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
129 "287b2f2f2fb5a1d7ee4a29b43342103d78a7a8ab",
130 "d7dd4700f49808541bba99244b7eb5840e0a2439",
131 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
132 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
133 "257d114354a93e681225072bcde756f155b70496",
134 "0cdf6fee6721d60d5d5ed26b1989eacddc16b14e",
135 NULL
138 static const char *sha1_graphics_a8b8g8r8[] =
140 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
141 "e0bc877697093ed440e125154e247ca9d65e933c",
142 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
143 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
144 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
145 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
146 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
147 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
148 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
149 "b753ebb39d90210cc717f57b53dd439f7de6b077",
150 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
151 "94368cea5033b435454daa56d55546310675131e",
152 "bf57a6a37fb107d29ed3d45695919887abcb7902",
153 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
154 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
155 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
156 "b0178632775d29bec2b16de7b9b8287115c40d0f",
157 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
158 "3369889a67d6c79a24ee15f7d14374f9995215e4",
159 "473a1fd07df800c87a5d3286b642ace10c61c6af",
160 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
161 "b8951d2b20518fd129e5113a5f429626893913bf",
162 "4851c5b7d5bc18590e787c0c218a592ef504e738",
163 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
164 "abdf003699364fe45fab7dc61e67c606d0063b40",
165 "89abaadff4e68c738cf9251c51e3609564843381",
166 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
167 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
168 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
169 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
170 "71b9756fdfeedce1e6db201176d21a981b881662",
171 "5319528d9af750c172ae62ee85ddb2eaef73b193",
172 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
173 "19b32a0daa91201725b5e13820c343d0a84ff698",
174 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
175 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
176 "7b4e1d47a03e2cec236d8fb6e2ae89d8ed078f79",
177 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
178 "8566c1110ab5cb8f754787b47923c8bff38f790c",
179 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
180 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
181 "d01071c44259adc94b89978b7d51a058b6dad665",
182 "e6d33b106bcda374e662d338c57a457dbcaa108a",
183 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
184 "339908a568f384e1f384a3e1b0dd415779203b02",
185 "88fd743d00bd37d2ed722092146795b044d08a6e",
186 "c0537ec24147e74939219213d864ee113cad9967",
187 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
188 "7cb51f6c5f1dae926601986c934533df5f8baa9f",
189 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
190 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
191 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
192 "2c4f116451b571106beba8b85da8e4b923937246",
193 "9c8f3063504a81bbbfa8558e111c63d8bc36dbbf",
194 NULL
197 static const char *sha1_graphics_r10g10b10[] =
199 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
200 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
201 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
202 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
203 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
204 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
205 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
206 "0ad27de0c916c073d0d18484fff899bbdb258db7",
207 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
208 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
209 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
210 "2986b431a0022153e5f875da77cc792e3825ebd5",
211 "ca4b25a5459885ce1e0a36844612087893d425b1",
212 "181bd4616796d89174cedc0332fb320b65aeb0e2",
213 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
214 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
215 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
216 "536eaaa901d652805a8977ecb2dc73f651094c5b",
217 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
218 "92cddcabf5365eef1e037f488af52b31669d987f",
219 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
220 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
221 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
222 "d578210815e27fe210eb678a71e6d22ba4b4c196",
223 "c7a027c7079dfcc831ca8bc134a509958273073c",
224 "19cf978596195b848df8709aaf637f83f92b8336",
225 "798a835fe50156eeb478c0a6085b088f53409d52",
226 "86ddf268d854f37e5b478c48792b551b57635db6",
227 "8259d388e02542207b6a08d65d553871ce1c4a09",
228 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
229 "66f8d78d4971934794478afee28b3a50e97f1b82",
230 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
231 "63798fb175afef78fa8fe8133d9de97a0cc80651",
232 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
233 "1ceb85697f649a62b1753438daa14944af7f450c",
234 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
235 "3addb9ccd8f56fc0825f61b1b5af67d3297f4ded",
236 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
237 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
238 "ada202d2f526f6995f83412479891c1764b66e5a",
239 "68348e8f54883f4fe295354b024e291c85f1038f",
240 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
241 "e9167564031ead3459eee6a3ebb2f58f100d931f",
242 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
243 "46196f50297260df2863e2fa76d2dfcf72006c23",
244 "0790585dfaef94f912b1ee81477d4ac448708708",
245 "589fb8a85d924ad19ed78409ae89475ba479c30a",
246 "43d67bc61ef54014b022891e5c024fc24b1fe797",
247 "e8783644428b637adbe80bcd084a33428cb69983",
248 "fc0c32afb719295f28bcfef22803bef94f798e20",
249 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
250 "d3f08946300e1700865042aed121870e292d1095",
251 "abb56db94becb64d663b51f0ea6b4bd535a88ba0",
252 "3a81fe558c69ca0aea7e7191771ed86cf4321a5a",
253 NULL
256 static const char *sha1_graphics_r6g6b6[] =
258 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
259 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
260 "5b9dab3d8411afb25fbbeba0313db526815ac189",
261 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
262 "2028d1b0d1acef35dc07027135023f35fb9746b9",
263 "378713720dcb5aadb730435ad0989a68ab189114",
264 "084152773feb01a85df6006f2f4f288a1442d37a",
265 "97b824953f60fc9a91028045baacbe7b7dc82b14",
266 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
267 "287d755448e72e29e4812193e2b6f8098a214d82",
268 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
269 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
270 "e51bcf80211cd06e7d10225534b7a79b5454be27",
271 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
272 "0b94e0a5b739ab0020130646522e53da35a149ad",
273 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
274 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
275 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
276 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
277 "2128157e601ef0d6b3636b7387d3b28e876de728",
278 "8bdcdcd463f0052279d070ac763757f4db975483",
279 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
280 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
281 "66b130f83381957cfc4763558c5f5cddf2e3b564",
282 "d548135ce2320499277ce12b80bc35004f8a9787",
283 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
284 "1906ddfd829e735af49245171f8eb7673295d399",
285 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
286 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
287 "defd95a10d44cad6e736542920b74efd53e9e7eb",
288 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
289 "3f11a735e52030aa3d0f024d83803698293d10e5",
290 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
291 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
292 "3231c4d87faefb7ec5bd377613969c05b70343fc",
293 "00394e438e9edde978e88602c9ad2a572e965bf6",
294 "e760be69cb37c7be35d5968d7a294e1fd49d4f66",
295 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
296 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
297 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
298 "3d6cf3753390a05504b1f50302f767df443f0f40",
299 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
300 "da9e896a3a98b330980152b2e4a43cb6e686c730",
301 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
302 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
303 "47499ad13b719de18c59c2bc9b38ed578db50b95",
304 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
305 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
306 "94b54f1da5212b3f3a1195eda5ea927e160bc89d",
307 "49341c297a887186bd47d7465d827ab3147f05e3",
308 "325279e76367200d3fd7194d81c09fd139988ece",
309 "c3def160a1e847605ff0fc7edd30397fa90635a0",
310 "50acb1597c4d53ad63225376d2aa36f64e8a229d",
311 "796fd861474aa7861bd0384127df755458757ec3",
312 NULL
315 static const char *sha1_graphics_24[] =
317 "e993b15c9bd14fb45a15310450b7083c44e42665",
318 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
319 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
320 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
321 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
322 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
323 "fd4be592483623dbc800fe28210a1f0daa71999b",
324 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
325 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
326 "883bc8f305c602edca785e21cd00f488583fb13f",
327 "3bac4e80993f49dc3926e30524115fca9d7a8026",
328 "91369e35be29059a0665782541db4c8b324c6bb2",
329 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
330 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
331 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
332 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
333 "5068bff794553cf5a3145ae407c9a2984357844c",
334 "413a7989969c229dee4ab1798362f32f96cf0a10",
335 "0bb222e540b82720d4971e4a2fc626899af03e03",
336 "adc20832d8c43f1cf372d8392535492013cd2306",
337 "45649794dcbcabda487f66f7a80fc1bec79047a1",
338 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
339 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
340 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
341 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
342 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
343 "92a1ab214dd8027c407814420449119466c92840",
344 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
345 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
346 "955390669afed2369b15b32fa519f2f921cdf1a0",
347 "201906f7d763b930a98c97f8eeab417f2b65e723",
348 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
349 "701c5af1d0c28294ce7d804b5697643c430d22a0",
350 "b0a959745b2db1d9f449e68e4479a4f36301879c",
351 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
352 "e171f6ec77bca91d6b8559911bce296c0bac469e",
353 "9725669042ef68acb408404d196496d10340bb5a",
354 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
355 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
356 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
357 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
358 "0f79500eda467cd3cbc220abdd37b5dba695d654",
359 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
360 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
361 "7d479beeb6758c164566638b5c873c188d6a91e7",
362 "80086808fca03e757d812e31d1ae576bf90dac9d",
363 "9560096f1b85ae6d939d736165c44df00a47c424",
364 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
365 "93e1aec608e037af3bfb7bd32dde446abe4eea11",
366 "b25ba91487ec945410deb2b51bc1156890c032a8",
367 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
368 "ee315634ed92da3a32c2675ecd1b369471c60936",
369 "3491e2bd81e70dd203c8551cc2d39b19401caafe",
370 "826de85271b67a11e7bd1a6596b58a045a96b69e",
371 NULL
374 static const char *sha1_graphics_r5g5b5[] =
376 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
377 "847005cf7371f511bcc837251cde07b1796f6113",
378 "a8f75743a930843ec14d516cd048b6e0468e5d89",
379 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
380 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
381 "a9034a905daa91757b4f63345c0e40638cd53ca8",
382 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
383 "99474fecf11df7b7035c35be6b8b697be9889418",
384 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
385 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
386 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
387 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
388 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
389 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
390 "449092689226a1172b6086ba1181d6b6d6499f26",
391 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
392 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
393 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
394 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
395 "6daaf945a955928c5c124c880522ca4634fb2343",
396 "12a288390d16e1efa99d4185301de48a4d433b14",
397 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
398 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
399 "d7d97e28ed316f6596c737eb83baa5948d86b673",
400 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
401 "656bf3b7121bcd620a0a3ad488f0d66604824577",
402 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
403 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
404 "a49530722328ae88fd765792ac0c657efbcce75d",
405 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
406 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
407 "a6fd83542c3826132e88d3f5e304d604c0056fad",
408 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
409 "e428d213ad02651287894f093413949dcb369208",
410 "7df915bedcc5951a1b6f828490f7dbb93212e835",
411 "645dc251d205139282b17eb7bece1055fff3bcd0",
412 "76215275593631f5900aad3616d725733dc39493",
413 "81655a550703849a616d4a16504bb9c6f999285f",
414 "573d65665d20f00d36d9782ae2b89772140524ab",
415 "619414c1b33ac60cb0c0de61df86245d472259b0",
416 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
417 "2a66dae03890ff791eabb982949435adb19af02b",
418 "24ac219478ba406f30794550690486b14cbac5e8",
419 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
420 "db8c34882ddd46716d14bbf569d530f80db65ed4",
421 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
422 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
423 "a92942269911a88793b3460b6f2a2cd56e48eec1",
424 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
425 "a52d6ceee5c2a04b4e059c0d49337a997cc17e40",
426 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
427 "585061e403d9cac1603a38af420efe87338f381a",
428 "8f447a3820c83662086dfa836da2205b0130fd5f",
429 "3772003c7fb420003512d0c437b3659d96d89ce4",
430 "dab47c9dc149e570045d699598b14a613bf319b3",
431 "2daca4d26a086ed34894693be0b0374402232809",
432 "bf0e0b74ce5686b73c527843e0d0df0cd10efefe",
433 "517e32a8c0312b5676d498583ea092b0f198f2bc",
434 NULL
437 static const char *sha1_graphics_r4g4b4[] =
439 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
440 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
441 "8bd18697d1ef27492805667a0bc956343ac08667",
442 "e8501c830321584474654f90e40eaf27dc21e6a8",
443 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
444 "821177710961d2cb5f7e7dfc0e06e767b6042753",
445 "667124365ffadeea1d8791bedda77a0c7b898de8",
446 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
447 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
448 "fb52b0c373a5f2a60b981604b120962942d2447a",
449 "5ab8dd07436681d762fa04ad7c6d71291c488924",
450 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
451 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
452 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
453 "25fcb75aa687aac35b8f72640889fe92413e00c5",
454 "3bddf9d53e89560b083302b146cd33791b13d941",
455 "a81504498c7a7bb46340ce74476a42f70f2730b1",
456 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
457 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
458 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
459 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
460 "57ebf8becac1524543da120e88e9cc57ecfdec49",
461 "d591232bbc2592462c819a9486750f64180518fd",
462 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
463 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
464 "8933450132bf949ba4bc28626968425b5ed2867d",
465 "9928a8f28a66c00069a124f7171b248817005763",
466 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
467 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
468 "233e588cf660e2c9b552cf02065cf63fa6655864",
469 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
470 "a3345acaf272f2e288626906e3056cd0ced70499",
471 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
472 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
473 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
474 "1b593d8e031d3b37fecf6f1df5a8f96c8e8bfef8",
475 "9dd123938b0a02601d8d458ecbd6535ddefea724",
476 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
477 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
478 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
479 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
480 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
481 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
482 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
483 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
484 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
485 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
486 "e4731b63d41f6b51e30752ea52d85c4a2938731b",
487 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
488 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
489 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
490 "734d4a7836891d729f4a9ec6916ead78eecb2596",
491 "d8ba2e556fd64c9c2f1746496e6e7dd7a487cd6d",
492 NULL
495 static const char *sha1_graphics_8_color[] =
497 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
498 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
499 "49024d6cbdf1614327dfda9eda17675e76805f7e",
500 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
501 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
502 "84d85009d35ae10abbc435f3913422544105cea2",
503 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
504 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
505 "f3aa8d89430748178952de56643069d80b40aad6",
506 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
507 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
508 "52b1363e821bf604d9df260bfa97e26d428c33fd",
509 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
510 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
511 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
512 "89711289be6d5c55734878410e4923d5cca9aca9",
513 "8355caf57d51ad4e14275943088392e37dc75d33",
514 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
515 "6f0570da9dea7f043f678088f8362ee458cd79fa",
516 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
517 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
518 "5092b22af85a08f10a2899888bb9d552f25f828e",
519 "e91973be2651eeef568700463652838d8cbba976",
520 "1df851515ecf46df5c2d3279535c1763f72353dd",
521 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
522 "359bd76088a965bb0cee7c44800bc46b2638807e",
523 "e14e5734b33057b890368f3e9d482d9e5a0358c5",
524 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
525 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
526 "91f988f575338505ba8a40727865a8d3f2298624",
527 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
528 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
529 "3b7488731da48635d86be551ab7c8c0f91c78219",
530 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
531 "e15a355fc09bfd22267917898e2266168ff410e3",
532 "b9688566bddf18586787c00e68724e51e97dfb72",
533 "5e38e03310f1c66f2052af2a745d8c60515707c5",
534 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
535 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
536 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
537 "6376234f542467e5887adfece62f753e998dc19d",
538 "add949d009217ef2b847e34772ba363e4be7b1b8",
539 "28fcf9f7d098c05de632ae38b2fe33b9635ad445",
540 "0b58666deb3615e912896a764e5c6475989e95e4",
541 "bf460cc44c0edee851d72587c8425c3f06a62c55",
542 "ea74c00c45569007383b632d7f1d2adc82645717",
543 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
544 "284abed096637c80bb50844e393da9dd4b3f19ac",
545 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
546 "a433c41c05b6db008a4cb2c52a321d027c6be1fe",
547 "46f772c2832b3aad584674db666bd63e48b4f338",
548 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
549 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
550 "eae47bf865d932f22a6e59b6fe8d041f220e1fbc",
551 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
552 "678979a45126a76eb629992cd64734862f53a555",
553 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
554 "0204f06422a01787f7379d0edb51104bb023758a",
555 "1f9a21eba2f2ce87768a5618d9cfefa7e48fb386",
556 NULL
559 static const char *sha1_graphics_8_grayscale[] =
561 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
562 "df35491dd5038187c05bac06921402ba6d7773a8",
563 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
564 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
565 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
566 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
567 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
568 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
569 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
570 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
571 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
572 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
573 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
574 "114bb377b4e78a1978e1ac09388c48861b5223a3",
575 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
576 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
577 "eb4c14ee66b012187f5fe6a2ec28b6be956567c8",
578 "216388ddf6b563dd2058a9df65b40b6f72df1715",
579 "ad11e4b6979cf055e3bf1868112a7bef207385a4",
580 "47f72be971bd2d3399dabd018201f4f5075e96fe",
581 "de09d41c9ae4338fbfcfe9f8ed71d343537a6f3d",
582 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
583 "6e7baf7d328bc2c55366e32967a0db4d2f43ab82",
584 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
585 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
586 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
587 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
588 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
589 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
590 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
591 "0000000000000000000000000000000000000000",
592 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
593 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
594 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
595 "6d41e6168662e75baacf74d911d7419d54c8d73c",
596 "2404952157ba1519094a2da6bfbf2b0f1356432d",
597 "24caede65b40815a60b83c4edfa06bdc542388cd",
598 "650a51bedd1af92469d2950eb95220db35f95c6e",
599 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
600 "04cea9753b575ecce8e55357eddfcec10ddfbbea",
601 "6b6f4b97f05e015eb37a5f6aff637235feacd030",
602 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
603 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
604 "85425940daf119125deb52421b2057acebe6d1cf",
605 "a3db92382cf0a4c7cafe52c27b1f41520aaa677d",
606 "9869b6f088822fb423996f9968e5a931301fc2c3",
607 "cdf63ab4ab32c2e8e27527a9588d0fb525f1c945",
608 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
609 "f2ea92f523f8918b1d514a2d9555dcb4750273b4",
610 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
611 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
612 "f543efc84e638afbaa456e629100f0274de1a35b",
613 "1bd2587399006eed0d46beff397d32081f6bc58e",
614 "f8a571de89ed82ffb9cbc041ce1eacb064be2853",
615 "640a49455acabca6954a7fbb6af4e872af342d11",
616 "589e7911e09332ee090371deae17b0120ff990b5",
617 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
618 "f30a8d9f73ca043c5bfc18d9595e299fc0a39eec",
619 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
620 "3685c9ae95118a83db3569832c29753276fa1264",
621 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
622 "cb9ea8137eca1450e049879772f5c11a0e11ff0a",
623 "a05e05b2e6e515baa59ea032d063ca11e70a72b5",
624 "d908c86b7301666a8d7999b831841115a4938181",
625 NULL
628 static const char *sha1_graphics_8[] =
630 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
631 "512246d4886ab889a090b167ba194577cb95272e",
632 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
633 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
634 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
635 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
636 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
637 "390b2bf70daba36310683f46af9cd50b9a061396",
638 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
639 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
640 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
641 "da1cc34a9d9b779fc7849e03e214096026506464",
642 "5ba8f99ca034666effa556748c49a0f5a015125f",
643 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
644 "73e2859ce849f756f954718ce3c90f02e31712b6",
645 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
646 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
647 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
648 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
649 "7262364067e03c7fa498af1d59d228d6c63b460e",
650 "5241241a355a667ef0834049adf4218e8b3f16b8",
651 "db22d666690948eb966f75b796c72c7150a5c4b9",
652 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
653 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
654 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
655 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
656 "bdc0a354635b879871077c5b712570e469863c99",
657 "d599bf210423fe3adbb4f1de87d9360de97827d0",
658 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
659 "cc01f17928f7780cefd423ea653b072eea723a1b",
660 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
661 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
662 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
663 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
664 "f4a334e69535de74ee5ed54be93a75120a66e54a",
665 "559fd1d15447745527c61fe43a94c6708bff3e39",
666 "995f77f2f53398399f09d1365cb4dfd105764e5c",
667 "61907a6685bba93077da40cfb28cf2ab74552fd2",
668 "122015e5e17c1c317c6e51c0e207826b606a4077",
669 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
670 "8c609921d4a3ed89a994a75482b27496bf103cf5",
671 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
672 "66493ee117719e172f327a426af601996025f28c",
673 "acead2745fec0b6c817fa601353bdf2d197b64f7",
674 "a6b858b2d125c159529d3f3ec45b31925a79acff",
675 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
676 "d83adc669c0dea0dc4812b93f998514b6f02d805",
677 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
678 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
679 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
680 "7d1bfff706b0713e53209407889f83a0da26a81d",
681 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
682 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
683 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
684 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
685 "963d1fa8608c8b743e972eb9a4e9f3fc53c6c7e8",
686 "ba49de83c4668fb08956221f465b93e7dd6a3383",
687 NULL
690 static const char *sha1_graphics_4[] =
692 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
693 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
694 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
695 "9401799e6116c35e5f0e5bdca07ea25316757a72",
696 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
697 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
698 "2505598845fa026ea7187582461efbf06cb6904f",
699 "3981a19363beca8f28d32a5928ac296fd22a5296",
700 "01404024ebb2c266d17d734059524d874491650f",
701 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
702 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
703 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
704 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
705 "1f26a01730f67d40ea711a50d9d801bac15a642e",
706 "3b53d24178cfacba53103a44dfd5d072b15a6781",
707 "c52cfd57f26037723d37192722fc3a217f280c9e",
708 "e34da6500cf2e424d980714d92737cf6c31a7bda",
709 "d17f4358ae529f920960ed89e535902ee13b0033",
710 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
711 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
712 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
713 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
714 "39c16648cf6c261be71a33cec41867f28e119b94",
715 "26ad5116562e7b58c76a26eaf521e2e40899e944",
716 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
717 "4f827ca6927f15191588456f985bf29d2a3b3c24",
718 "e7de769c3d12ea9dd223bef4881c578823bec67e",
719 "6fb102d020e5554116feefc8482104f3ae2036d2",
720 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
721 "20c9eb3276c08fdce35755e349bec94b04929812",
722 "628d837163a25c6520f19c0602383176dbad528e",
723 "b5a12cff7100290ad43f5ed17a321b42de048893",
724 "b672afbeeafb44194a821f0def81a8892872937e",
725 "db0124045882b598feea192186cf7eb7a0387866",
726 "602d91471378fe24a2d0248bd8a92b624f099fea",
727 "e772873b87a0f55ea51a3da323f64bf8814c6703",
728 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
729 "1a579cd280422131c35e907a023ee0e80749b5a4",
730 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
731 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
732 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
733 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
734 "3e411b004a5be84451860c6da6a4a1a482b77862",
735 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
736 "7811c536a6527112b438a6413f3927f2c79086a7",
737 "525ef3615040225752a2fe646ab99ee64e360630",
738 "46760975993f9881b7bbe94123173e6a683d3f25",
739 "df5feb905a31c288008cf5e82d73ac818a160d82",
740 "df5feb905a31c288008cf5e82d73ac818a160d82",
741 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
742 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
743 "da401c745421f6bdfaefd590ab99dee948dce412",
744 "38a3b6edcba2a1fba6064f0b4d771aedae7f4673",
745 NULL
748 static const char *sha1_graphics_4_grayscale[] =
750 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
751 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
752 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
753 "1c201d149c0bd886ff8a427ad513f15a70991174",
754 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
755 "315189097a02024d2eae61d524c4de07a396aee7",
756 "73ac786015dea36ac466a6524dba757d5d238ece",
757 "6e328cc4d53627f034b23706d8bf26afe18512ae",
758 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
759 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
760 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
761 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
762 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
763 "ec3879342b5a44f6de6efe946243ae5ade00980d",
764 "6e328cc4d53627f034b23706d8bf26afe18512ae",
765 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
766 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
767 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
768 "b2bda683edef912957845a33edc055902a801fed",
769 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
770 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
771 "43ee3e187dda14b86aef12371041ae70313b5a65",
772 "d4930552a7845111ffd9db57260be1ab97967c06",
773 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
774 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
775 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
776 "0000000000000000000000000000000000000000",
777 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
778 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
779 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
780 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
781 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
782 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
783 "f8224430462f6a93f85ef33b8aa7299525990708",
784 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
785 "d58b8760ef01c12e691651c932d683c66fde3654",
786 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
787 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
788 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
789 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
790 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
791 "027b05bc82ce4f897c4bf812610a641547368939",
792 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
793 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
794 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
795 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
796 "5eeb56afea8040a8fb18c11f29931b836474126d",
797 "a3405c085fc2f2184bcd0d1edcdcc66927e33659",
798 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
799 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
800 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
801 "25ec9fd2eeb1514ba4e0458a444149a5456cf63a",
802 "2e4dc1e859350289575ffc2a47cd0033efca6c32",
803 NULL
806 static const char *sha1_graphics_1[] =
808 "23366004515f3bc46796ea505d748f8d0f97fbe1",
809 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
810 "a7cc69f957d7b533a0a330859a143d701daac73c",
811 "a955bf088c5edb129289ce65caace48ec95632e4",
812 "5316d3c558c254479883133cf58cd07ab521d3f0",
813 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
814 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
815 "121423a38b4ac4743bd516e0a7e88a3863796313",
816 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
817 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
818 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
819 "39ff81f77ef4ee772367ed1a63785987c060126e",
820 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
821 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
822 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
823 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
824 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
825 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
826 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
827 "0ff4b49797e30e3555aab45219adf449a9a560ff",
828 "280327328ca940c212ce24fe72e0b00014072767",
829 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
830 "b85463875f755b85f1464b1b6275912bcbad6c9f",
831 "816f200969feecc788b61dfeecf05b1790984401",
832 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
833 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
834 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
835 "0a76e0121facb103857130bc6e12185ad77fc3fa",
836 "02aede714773d654d0fc2f640afaa133ec718ad5",
837 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
838 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
839 "b26699f62661e16a1dc452d24c88ce363a1f2998",
840 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
841 "c14832e69ec3585c15987b3d69d5007236fa9814",
842 "e44ea620b0c47125a34193537ab9d219a52ad028",
843 "d1e6091caa4482d3142df3b958606c41ebf4698e",
844 "07c1116d8286fb665a1005de220eadc3d5999aaf",
845 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
846 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
847 "ffc78c075d4be66806f6c59180772d5eed963dc0",
848 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
849 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
850 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
851 "b71ca46be287598f716bb04fac0a52ad139c70db",
852 "6589e48498e30ab036fbfe94d73427b2b1238a69",
853 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
854 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
855 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
856 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
857 "18f4497e43903e8df5b27da4ceebf62b15550a87",
858 "3fa3570a2ebd38042b90f24bd3496233bca5a23d",
859 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
860 "655cfadeb157233c804d42b58195569c8846e3c1",
861 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
862 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
863 "0d180c37bc26d83a1a11f66168757f3de2493243",
864 "b362ba4790def178c236c0ae7b0093dbba47cf24",
865 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
866 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
867 "ee22f43ea867228c6ff937d39e1826e285a107e8",
868 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
869 "a2a928de9007d765da496abec8c21b23601f8c45",
870 "28ded40e72d4327b9413571476b167fb28a1f420",
871 "23366004515f3bc46796ea505d748f8d0f97fbe1",
872 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
873 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
874 "6b2cb2346b5820bdd0251cd6a4aeb5c22ee82e85",
875 "6c4640b17e072efc682044c499e5a4f3481b7c87",
876 NULL
879 static const char *dst_format;
881 static inline DWORD get_stride(BITMAPINFO *bmi)
883 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
886 static inline DWORD get_dib_size(BITMAPINFO *bmi)
888 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
891 static char *hash_dib(BITMAPINFO *bmi, void *bits)
893 DWORD dib_size = get_dib_size(bmi);
894 HCRYPTHASH hash;
895 char *buf;
896 BYTE hash_buf[20];
897 DWORD hash_size = sizeof(hash_buf);
898 int i;
899 static const char *hex = "0123456789abcdef";
901 if(!crypt_prov) return NULL;
903 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
905 CryptHashData(hash, bits, dib_size, 0);
907 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
908 if(hash_size != sizeof(hash_buf)) return NULL;
910 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
911 CryptDestroyHash(hash);
913 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
915 for(i = 0; i < hash_size; i++)
917 buf[i * 2] = hex[hash_buf[i] >> 4];
918 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
920 buf[i * 2] = '\0';
922 return buf;
925 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
927 char *hash = hash_dib(bmi, bits);
928 BOOL ok_cond;
929 int i;
931 if(!hash)
933 skip("SHA1 hashing unavailable on this platform\n");
934 return;
937 for(i = 0; i <= num_broken; i++)
939 if((*sha1)[i] == NULL)
941 ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
942 return;
946 ok_cond = !strcmp(hash, **sha1);
948 for(i = 1; i <= num_broken; i++)
949 ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
951 if(todo)
952 todo_wine ok( ok_cond, "%s: %s: expected hash %s got %s\n",
953 dst_format, info, **sha1, hash );
954 else
955 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
956 dst_format, info, **sha1, hash );
958 *sha1 += num_broken + 1;
960 HeapFree(GetProcessHeap(), 0, hash);
963 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
965 compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
968 static const RECT bias_check[] =
970 {100, 100, 200, 150},
971 {100, 100, 150, 200},
972 {100, 100, 50, 200},
973 {100, 100, 0, 150},
974 {100, 100, 0, 50},
975 {100, 100, 50, 0},
976 {100, 100, 150, 0},
977 {100, 100, 200, 50}
980 static const RECT hline_clips[] =
982 {120, 120, 140, 120}, /* unclipped */
983 {100, 122, 140, 122}, /* l edgecase */
984 { 99, 124, 140, 124}, /* l edgecase clipped */
985 {120, 126, 200, 126}, /* r edgecase */
986 {120, 128, 201, 128}, /* r edgecase clipped */
987 { 99, 130, 201, 130}, /* l and r clipped */
988 {120, 100, 140, 100}, /* t edgecase */
989 {120, 99, 140, 99}, /* t edgecase clipped */
990 {120, 199, 140, 199}, /* b edgecase */
991 {120, 200, 140, 200}, /* b edgecase clipped */
992 {120, 132, 310, 132}, /* inside two clip rects */
993 { 10, 134, 101, 134}, /* r end on l edgecase */
994 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
995 {199, 138, 220, 138}, /* l end on r edgecase */
996 {200, 140, 220, 140} /* l end on r edgecase clipped */
999 static const RECT vline_clips[] =
1001 {120, 120, 120, 140}, /* unclipped */
1002 {100, 120, 100, 140}, /* l edgecase */
1003 { 99, 120, 99, 140}, /* l edgecase clipped */
1004 {199, 120, 199, 140}, /* r edgecase */
1005 {200, 120, 200, 140}, /* r edgecase clipped */
1006 {122, 99, 122, 201}, /* t and b clipped */
1007 {124, 100, 124, 140}, /* t edgecase */
1008 {126, 99, 126, 140}, /* t edgecase clipped */
1009 {128, 120, 128, 200}, /* b edgecase */
1010 {130, 120, 130, 201}, /* b edgecase clipped */
1011 {132, 12, 132, 140}, /* inside two clip rects */
1012 {134, 90, 134, 101}, /* b end on t edgecase */
1013 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1014 {138, 199, 138, 220}, /* t end on b edgecase */
1015 {140, 200, 140, 220} /* t end on b edgecase clipped */
1018 static const RECT line_clips[] =
1020 { 90, 110, 310, 120},
1021 { 90, 120, 295, 130},
1022 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1023 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1024 { 90, 132, 101, 137}, /* end pt just inside l edge */
1025 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1026 {199, 142, 210, 143} /* start pt just inside r edge */
1029 static const RECT patblt_clips[] =
1031 {120, 120, 140, 126}, /* unclipped */
1032 {100, 130, 140, 136}, /* l edgecase */
1033 { 99, 140, 140, 146}, /* l edgecase clipped */
1034 {180, 130, 200, 136}, /* r edgecase */
1035 {180, 140, 201, 146}, /* r edgecase clipped */
1036 {120, 100, 130, 110}, /* t edgecase */
1037 {140, 99, 150, 110}, /* t edgecase clipped */
1038 {120, 180, 130, 200}, /* b edgecase */
1039 {140, 180, 150, 201}, /* b edgecase */
1040 {199, 150, 210, 156}, /* l edge on r edgecase */
1041 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1042 { 90, 150, 101, 156}, /* r edge on l edgecase */
1043 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1044 {160, 90, 166, 101}, /* b edge on t edgecase */
1045 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1046 {160, 199, 166, 210}, /* t edge on b edgecase */
1047 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1050 static const RECT rectangles[] =
1052 {10, 11, 100, 101},
1053 {250, 100, 350, 10},
1054 {120, 10, 120, 20}, /* zero width */
1055 {120, 10, 130, 10}, /* zero height */
1056 {120, 40, 121, 41}, /* 1 x 1 */
1057 {130, 50, 132, 52}, /* 2 x 2 */
1058 {140, 60, 143, 63}, /* 3 x 3 */
1059 {150, 70, 154, 74}, /* 4 x 4 */
1060 {120, 20, 121, 30}, /* width == 1 */
1061 {130, 20, 132, 30}, /* width == 2 */
1062 {140, 20, 143, 30}, /* width == 3 */
1063 {200, 20, 210, 21}, /* height == 1 */
1064 {200, 30, 210, 32}, /* height == 2 */
1065 {200, 40, 210, 43} /* height == 3 */
1068 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1069 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1070 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1071 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1072 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1073 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1075 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1076 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1077 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1078 0x00, 0x01 }; /* <eod> */
1080 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1081 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1082 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1083 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1085 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1087 HBRUSH brush = CreateSolidBrush( color );
1088 brush = SelectObject( hdc, brush );
1089 PatBlt( hdc, x, y, width, height, PATCOPY );
1090 DeleteObject( SelectObject( hdc, brush ) );
1093 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1095 DWORD dib_size = get_dib_size(bmi);
1096 HPEN solid_pen, dashed_pen, orig_pen;
1097 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1098 HBITMAP bmp;
1099 INT i, x, y, hatch_style;
1100 HDC src_dc;
1101 HRGN hrgn, hrgn2;
1102 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
1103 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */
1104 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf;
1105 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf;
1106 BYTE *brush_bits, *src_bits;
1107 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1108 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1109 BLENDFUNCTION blend;
1111 blend.BlendOp = AC_SRC_OVER;
1112 blend.BlendFlags = 0;
1114 memset(bits, 0xcc, dib_size);
1115 compare_hash(bmi, bits, sha1, "empty");
1117 src_dc = CreateCompatibleDC( 0 );
1118 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1119 orig_pen = SelectObject(hdc, solid_pen);
1120 SetBrushOrgEx(hdc, 0, 0, NULL);
1122 /* horizontal and vertical lines */
1123 for(i = 1; i <= 16; i++)
1125 SetROP2(hdc, i);
1126 MoveToEx(hdc, 10, i * 3, NULL);
1127 LineTo(hdc, 100, i * 3); /* l -> r */
1128 MoveToEx(hdc, 100, 50 + i * 3, NULL);
1129 LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1130 MoveToEx(hdc, 120 + i * 3, 10, NULL);
1131 LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1132 MoveToEx(hdc, 170 + i * 3, 100, NULL);
1133 LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1135 compare_hash(bmi, bits, sha1, "h and v solid lines");
1136 memset(bits, 0xcc, dib_size);
1138 /* diagonal lines */
1139 SetROP2(hdc, R2_COPYPEN);
1140 for(i = 0; i < 16; i++)
1142 double s = sin(M_PI * i / 8.0);
1143 double c = cos(M_PI * i / 8.0);
1145 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1146 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1148 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1149 memset(bits, 0xcc, dib_size);
1151 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1153 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1154 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1156 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1157 memset(bits, 0xcc, dib_size);
1159 /* solid brush PatBlt */
1160 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1161 orig_brush = SelectObject(hdc, solid_brush);
1163 for(i = 0, y = 10; i < 256; i++)
1165 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1167 if(rop_uses_src(rop3[i]))
1168 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1169 else
1171 ok(ret, "got FALSE for %x\n", rop3[i]);
1172 y += 20;
1176 compare_hash(bmi, bits, sha1, "solid patblt");
1177 memset(bits, 0xcc, dib_size);
1179 /* clipped lines */
1180 hrgn = CreateRectRgn(10, 10, 200, 20);
1181 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1182 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1183 SetRectRgn(hrgn2, 290, 100, 300, 200);
1184 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1185 ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1186 DeleteObject(hrgn2);
1188 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1190 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1191 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1193 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1194 memset(bits, 0xcc, dib_size);
1196 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1198 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1199 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1201 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1202 memset(bits, 0xcc, dib_size);
1204 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1206 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1207 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1209 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1210 memset(bits, 0xcc, dib_size);
1212 /* clipped PatBlt */
1213 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1215 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1216 patblt_clips[i].right - patblt_clips[i].left,
1217 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1219 compare_hash(bmi, bits, sha1, "clipped patblt");
1220 memset(bits, 0xcc, dib_size);
1222 /* clipped dashed lines */
1223 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1224 SelectObject(hdc, dashed_pen);
1225 SetBkMode(hdc, TRANSPARENT);
1226 SetBkColor(hdc, RGB(0, 0xff, 0));
1228 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1230 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1231 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1233 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1234 memset(bits, 0xcc, dib_size);
1236 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1238 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1239 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1241 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1242 memset(bits, 0xcc, dib_size);
1244 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1246 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1247 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1249 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1250 memset(bits, 0xcc, dib_size);
1252 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1254 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1255 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1257 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1258 memset(bits, 0xcc, dib_size);
1260 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1262 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1263 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1265 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1266 memset(bits, 0xcc, dib_size);
1268 SetBkMode(hdc, OPAQUE);
1270 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1272 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1273 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1275 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1276 memset(bits, 0xcc, dib_size);
1278 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1280 /* 8888 DIB pattern brush */
1282 brush_bi->bmiHeader = dib_brush_header_8888;
1283 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1284 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1285 brush_bits[2] = 0xff;
1286 brush_bits[6] = 0xff;
1287 brush_bits[14] = 0xff;
1288 brush_bits[65] = 0xff;
1289 brush_bits[69] = 0xff;
1290 brush_bits[72] = 0xff;
1292 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1294 SelectObject(hdc, dib_brush);
1295 SetBrushOrgEx(hdc, 1, 1, NULL);
1297 for(i = 0, y = 10; i < 256; i++)
1299 if(!rop_uses_src(rop3[i]))
1301 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1302 ok(ret, "got FALSE for %x\n", rop3[i]);
1303 y += 25;
1306 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1307 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1308 else
1309 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1310 memset(bits, 0xcc, dib_size);
1312 SelectObject(hdc, orig_brush);
1313 DeleteObject(dib_brush);
1315 /* 8888 bottom-up DIB pattern brush */
1317 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1319 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1321 SelectObject(hdc, dib_brush);
1323 /* This used to set the x origin to 100 as well, but
1324 there's a Windows bug for 24 bpp where the brush's x offset
1325 is incorrectly calculated for rops that involve both D and P */
1326 SetBrushOrgEx(hdc, 4, 100, NULL);
1328 for(i = 0, y = 10; i < 256; i++)
1330 if(!rop_uses_src(rop3[i]))
1332 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1333 ok(ret, "got FALSE for %x\n", rop3[i]);
1334 y += 25;
1337 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1338 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1339 else
1340 compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1341 memset(bits, 0xcc, dib_size);
1343 SelectObject(hdc, orig_brush);
1344 DeleteObject(dib_brush);
1346 /* 24 bpp dib pattern brush */
1348 brush_bi->bmiHeader = dib_brush_header_24;
1349 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1350 memset(brush_bits, 0, 16 * 16 * 3);
1351 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1352 brush_bits[49] = brush_bits[52] = 0xff;
1354 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1356 SelectObject(hdc, dib_brush);
1357 SetBrushOrgEx(hdc, 1, 1, NULL);
1359 for(i = 0, y = 10; i < 256; i++)
1361 if(!rop_uses_src(rop3[i]))
1363 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1364 ok(ret, "got FALSE for %x\n", rop3[i]);
1365 y += 25;
1368 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1369 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1370 else
1371 compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1372 memset(bits, 0xcc, dib_size);
1374 SelectObject(hdc, orig_brush);
1375 DeleteObject(dib_brush);
1377 /* 555 dib pattern brush */
1379 brush_bi->bmiHeader = dib_brush_header_555;
1380 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1381 memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1382 brush_bits[0] = brush_bits[1] = 0xff;
1383 brush_bits[32] = brush_bits[34] = 0x7c;
1385 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1387 SelectObject(hdc, dib_brush);
1388 SetBrushOrgEx(hdc, 1, 1, NULL);
1390 for(i = 0, y = 10; i < 256; i++)
1392 if(!rop_uses_src(rop3[i]))
1394 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1395 ok(ret, "got FALSE for %x\n", rop3[i]);
1396 y += 25;
1399 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256) /* 8-bpp grayscale broken on NT4 */
1400 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1401 else
1402 compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1403 memset(bits, 0xcc, dib_size);
1405 SelectObject(hdc, orig_brush);
1406 DeleteObject(dib_brush);
1408 SetBrushOrgEx(hdc, 0, 0, NULL);
1410 /* 8 bpp dib pattern brush */
1412 brush_bi->bmiHeader = dib_brush_header_8;
1413 brush_bi->bmiHeader.biClrUsed = 3;
1414 memset(brush_bi->bmiColors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1415 brush_bi->bmiColors[0].rgbRed = 0xff;
1416 brush_bi->bmiColors[1].rgbRed = 0xff;
1417 brush_bi->bmiColors[1].rgbGreen = 0xff;
1418 brush_bi->bmiColors[1].rgbBlue = 0xff;
1420 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1421 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1422 brush_bits[0] = brush_bits[1] = 1;
1423 brush_bits[16] = brush_bits[17] = 2;
1424 brush_bits[32] = brush_bits[33] = 6;
1426 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1428 SelectObject(hdc, dib_brush);
1429 SetBrushOrgEx(hdc, 1, 1, NULL);
1431 for(i = 0, y = 10; i < 256; i++)
1433 if(!rop_uses_src(rop3[i]))
1435 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1436 ok(ret, "got FALSE for %x\n", rop3[i]);
1437 y += 25;
1440 compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1441 memset(bits, 0xcc, dib_size);
1443 SelectObject(hdc, orig_brush);
1444 DeleteObject(dib_brush);
1446 /* 4 bpp dib pattern brush */
1448 brush_bi->bmiHeader = dib_brush_header_4;
1449 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1451 SelectObject(hdc, dib_brush);
1452 SetBrushOrgEx(hdc, 1, 1, NULL);
1454 for(i = 0, y = 10; i < 256; i++)
1456 if(!rop_uses_src(rop3[i]))
1458 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1459 ok(ret, "got FALSE for %x\n", rop3[i]);
1460 y += 25;
1463 compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1464 memset(bits, 0xcc, dib_size);
1466 SelectObject(hdc, orig_brush);
1467 DeleteObject(dib_brush);
1469 /* 1 bpp dib pattern brush */
1471 brush_bi->bmiHeader = dib_brush_header_1;
1472 brush_bi->bmiHeader.biClrUsed = 2;
1473 memset(brush_bits, 0, 16 * 4);
1474 brush_bits[0] = 0xf0;
1475 brush_bits[4] = 0xf0;
1476 brush_bits[8] = 0xf0;
1478 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1479 SelectObject(hdc, dib_brush);
1480 for(i = 0, y = 10; i < 256; i++)
1482 if(!rop_uses_src(rop3[i]))
1484 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1485 ok(ret, "got FALSE for %x\n", rop3[i]);
1486 y += 25;
1490 compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1491 memset(bits, 0xcc, dib_size);
1493 SelectObject(hdc, orig_brush);
1494 SetBrushOrgEx(hdc, 0, 0, NULL);
1496 /* Rectangle */
1498 SelectObject(hdc, solid_pen);
1499 SelectObject(hdc, solid_brush);
1501 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1503 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1506 SelectObject(hdc, dashed_pen);
1507 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1509 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1512 compare_hash(bmi, bits, sha1, "rectangles");
1513 memset(bits, 0xcc, dib_size);
1514 SelectObject(hdc, solid_pen);
1516 /* PaintRgn */
1518 PaintRgn(hdc, hrgn);
1519 compare_hash(bmi, bits, sha1, "PaintRgn");
1520 memset(bits, 0xcc, dib_size);
1522 /* RTL rectangles */
1524 if( !pSetLayout )
1526 win_skip("Don't have SetLayout\n");
1527 (*sha1)++;
1529 else
1531 pSetLayout(hdc, LAYOUT_RTL);
1532 PaintRgn(hdc, hrgn);
1533 PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1534 Rectangle(hdc, 100, 250, 110, 260);
1535 compare_hash(bmi, bits, sha1, "rtl");
1536 memset(bits, 0xcc, dib_size);
1538 pSetLayout(hdc, LAYOUT_LTR);
1541 for(i = 0, y = 10; i < 256; i++)
1543 if(!rop_uses_src(rop3[i]))
1545 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1547 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1548 SelectObject(hdc, hatch_brush);
1549 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1550 ok(ret, "got FALSE for %x\n", rop3[i]);
1551 SelectObject(hdc, orig_brush);
1552 DeleteObject(hatch_brush);
1554 y += 25;
1558 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1559 memset(bits, 0xcc, dib_size);
1561 /* overlapping blits */
1563 orig_brush = SelectObject(hdc, solid_brush);
1565 Rectangle(hdc, 10, 10, 100, 100);
1566 Rectangle(hdc, 20, 15, 30, 40);
1567 Rectangle(hdc, 15, 15, 20, 20);
1568 Rectangle(hdc, 15, 20, 50, 45);
1569 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1570 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1571 memset(bits, 0xcc, dib_size);
1573 Rectangle(hdc, 10, 10, 100, 100);
1574 Rectangle(hdc, 20, 15, 30, 40);
1575 Rectangle(hdc, 15, 15, 20, 20);
1576 Rectangle(hdc, 15, 20, 50, 45);
1577 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1578 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1579 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1580 else
1581 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1582 memset(bits, 0xcc, dib_size);
1584 Rectangle(hdc, 10, 10, 100, 100);
1585 Rectangle(hdc, 20, 15, 30, 40);
1586 Rectangle(hdc, 15, 15, 20, 20);
1587 Rectangle(hdc, 15, 20, 50, 45);
1588 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1589 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1590 memset(bits, 0xcc, dib_size);
1592 Rectangle(hdc, 10, 10, 100, 100);
1593 Rectangle(hdc, 20, 15, 30, 40);
1594 Rectangle(hdc, 15, 15, 20, 20);
1595 Rectangle(hdc, 15, 20, 50, 45);
1596 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1597 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */
1598 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1599 else
1600 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1601 memset(bits, 0xcc, dib_size);
1603 Rectangle(hdc, 10, 10, 100, 100);
1604 Rectangle(hdc, 20, 15, 30, 40);
1605 Rectangle(hdc, 15, 15, 20, 20);
1606 Rectangle(hdc, 15, 20, 50, 45);
1607 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1608 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1609 memset(bits, 0xcc, dib_size);
1611 Rectangle(hdc, 10, 10, 100, 100);
1612 Rectangle(hdc, 20, 15, 30, 40);
1613 Rectangle(hdc, 15, 15, 20, 20);
1614 Rectangle(hdc, 15, 20, 50, 45);
1615 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1616 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1617 memset(bits, 0xcc, dib_size);
1619 Rectangle(hdc, 10, 10, 100, 100);
1620 Rectangle(hdc, 20, 15, 30, 40);
1621 Rectangle(hdc, 15, 15, 20, 20);
1622 Rectangle(hdc, 15, 20, 50, 45);
1623 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1624 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */
1625 compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1626 else
1627 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1628 memset(bits, 0xcc, dib_size);
1630 Rectangle(hdc, 10, 10, 100, 100);
1631 Rectangle(hdc, 20, 15, 30, 40);
1632 Rectangle(hdc, 15, 15, 20, 20);
1633 Rectangle(hdc, 15, 20, 50, 45);
1634 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1635 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1636 memset(bits, 0xcc, dib_size);
1638 /* blitting with 32-bpp BI_RGB source */
1640 memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1641 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1642 src_bi->bmiHeader.biHeight = 256;
1643 src_bi->bmiHeader.biWidth = 256;
1644 src_bi->bmiHeader.biBitCount = 32;
1645 src_bi->bmiHeader.biPlanes = 1;
1646 src_bi->bmiHeader.biCompression = BI_RGB;
1647 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1648 SelectObject( src_dc, bmp );
1649 for (y = 0; y < 256; y++)
1650 for (x = 0; x < 256; x++)
1652 BYTE a = (x + y) * 2;
1653 BYTE r = (BYTE)(y + 2 * x) * a / 255;
1654 BYTE g = (BYTE)(x + y / 3) * a / 255;
1655 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1656 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1659 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1660 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1661 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1662 else
1663 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1664 memset(bits, 0xcc, dib_size);
1666 blend.SourceConstantAlpha = 0xd0;
1667 blend.AlphaFormat = 0;
1668 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1669 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1671 if (!pGdiAlphaBlend) (*sha1) += 2;
1672 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1674 else
1676 if (!pGdiAlphaBlend) (*sha1)++;
1677 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1679 memset(bits, 0xcc, dib_size);
1681 blend.SourceConstantAlpha = 0xb0;
1682 blend.AlphaFormat = AC_SRC_ALPHA;
1683 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1684 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1686 if (!pGdiAlphaBlend) (*sha1) += 2;
1687 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1689 else
1691 if (!pGdiAlphaBlend) (*sha1)++;
1692 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1694 memset(bits, 0xcc, dib_size);
1696 /* blitting with 32-bpp r10g10b10 source */
1698 src_bi->bmiHeader.biBitCount = 32;
1699 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1700 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1701 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1702 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1703 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1704 SelectObject( src_dc, bmp );
1705 for (y = 0; y < 256; y++)
1706 for (x = 0; x < 256; x++)
1708 WORD r = (7 * x + 3 * y) % 1024;
1709 WORD g = (11 * x + y / 3) % 1024;
1710 WORD b = (x / 3 + 9 * y) % 1024;
1711 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1714 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1715 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1716 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1717 else
1718 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1719 memset(bits, 0xcc, dib_size);
1721 /* blitting with 32-bpp b6g6r6 source */
1723 src_bi->bmiHeader.biBitCount = 32;
1724 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1725 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1726 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1727 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1728 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1729 SelectObject( src_dc, bmp );
1730 for (y = 0; y < 256; y++)
1731 for (x = 0; x < 256; x++)
1733 BYTE r = (y + 2 * x) % 64;
1734 BYTE g = (x + y / 3) % 64;
1735 BYTE b = (x / 3 + 2 * y) % 64;
1736 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1739 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1740 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1741 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1742 else
1743 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1744 memset(bits, 0xcc, dib_size);
1746 /* blitting with 24-bpp source */
1748 src_bi->bmiHeader.biBitCount = 24;
1749 src_bi->bmiHeader.biCompression = BI_RGB;
1750 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1751 DeleteObject( SelectObject( src_dc, bmp ) );
1752 for (y = 0; y < 256; y++)
1753 for (x = 0; x < 256; x++)
1755 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1756 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1757 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1760 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1761 if (bmi->bmiHeader.biBitCount == 8) /* broken on NT4 */
1762 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1763 else
1764 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1765 memset(bits, 0xcc, dib_size);
1767 blend.SourceConstantAlpha = 0xe0;
1768 blend.AlphaFormat = 0;
1769 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1770 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1772 if (!pGdiAlphaBlend) (*sha1) += 2;
1773 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1775 else
1777 if (!pGdiAlphaBlend) (*sha1)++;
1778 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1780 memset(bits, 0xcc, dib_size);
1782 /* blitting with 16-bpp BI_RGB source */
1784 src_bi->bmiHeader.biBitCount = 16;
1785 src_bi->bmiHeader.biCompression = BI_RGB;
1786 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1787 DeleteObject( SelectObject( src_dc, bmp ) );
1788 for (y = 0; y < 256; y++)
1789 for (x = 0; x < 256; x++)
1790 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1792 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1793 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1794 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1795 else
1796 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1797 memset(bits, 0xcc, dib_size);
1799 /* blitting with 16-bpp b4g4r4 source */
1801 src_bi->bmiHeader.biBitCount = 16;
1802 src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1803 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1804 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1805 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1806 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1807 DeleteObject( SelectObject( src_dc, bmp ) );
1808 for (y = 0; y < 256; y++)
1809 for (x = 0; x < 256; x++)
1810 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1812 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1813 if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5) /* broken on NT4 */
1814 compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1815 else
1816 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1817 memset(bits, 0xcc, dib_size);
1819 /* blitting with 8-bpp source */
1821 src_bi->bmiHeader.biBitCount = 8;
1822 src_bi->bmiHeader.biCompression = BI_RGB;
1823 src_bi->bmiHeader.biClrUsed = 160;
1824 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1825 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1826 DeleteObject( SelectObject( src_dc, bmp ) );
1827 for (y = 0; y < 256; y++)
1828 for (x = 0; x < 256; x++)
1829 src_bits[y * 256 + x] = 3 * x + 5 * y;
1831 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1832 compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1833 memset(bits, 0xcc, dib_size);
1835 blend.SourceConstantAlpha = 0xd0;
1836 blend.AlphaFormat = 0;
1837 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1838 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1840 if (!pGdiAlphaBlend) (*sha1) += 2;
1841 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1843 else
1845 if (!pGdiAlphaBlend) (*sha1)++;
1846 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1848 memset(bits, 0xcc, dib_size);
1850 /* blitting with 4-bpp source */
1852 src_bi->bmiHeader.biBitCount = 4;
1853 src_bi->bmiHeader.biClrUsed = 12;
1854 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
1855 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1856 DeleteObject( SelectObject( src_dc, bmp ) );
1857 for (y = 0; y < 256; y++)
1858 for (x = 0; x < 256; x += 2)
1859 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
1861 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1862 compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
1863 memset(bits, 0xcc, dib_size);
1865 /* blitting with 1-bpp source */
1867 src_bi->bmiHeader.biBitCount = 1;
1868 src_bi->bmiHeader.biClrUsed = 0;
1869 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
1870 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1871 DeleteObject( SelectObject( src_dc, bmp ) );
1872 for (y = 0; y < 256; y++)
1873 for (x = 0; x < 256; x += 8)
1874 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
1876 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1877 compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
1878 memset(bits, 0xcc, dib_size);
1880 blend.SourceConstantAlpha = 0x90;
1881 blend.AlphaFormat = 0;
1882 if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1883 if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1885 if (!pGdiAlphaBlend) (*sha1) += 2;
1886 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
1888 else
1890 if (!pGdiAlphaBlend) (*sha1)++;
1891 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
1893 memset(bits, 0xcc, dib_size);
1895 DeleteDC( src_dc );
1896 DeleteObject( bmp );
1898 /* RLE StretchDIBits */
1899 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader);
1900 src_bi->bmiHeader.biWidth = 8;
1901 src_bi->bmiHeader.biHeight = 8;
1902 src_bi->bmiHeader.biPlanes = 1;
1903 src_bi->bmiHeader.biBitCount = 8;
1904 src_bi->bmiHeader.biCompression = BI_RLE8;
1905 src_bi->bmiHeader.biClrUsed = 0;
1906 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data);
1908 for (i = 0; i < 256; i++)
1910 src_bi->bmiColors[i].rgbRed = i;
1911 src_bi->bmiColors[i].rgbGreen = i;
1912 src_bi->bmiColors[i].rgbBlue = i;
1913 src_bi->bmiColors[i].rgbReserved = 0;
1916 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1917 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
1918 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1919 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1920 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1921 compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
1922 memset(bits, 0xcc, dib_size);
1924 /* 32 bpp StretchDIBits */
1926 src_bi->bmiHeader.biWidth = 4;
1927 src_bi->bmiHeader.biHeight = 4;
1928 src_bi->bmiHeader.biPlanes = 1;
1929 src_bi->bmiHeader.biBitCount = 32;
1930 src_bi->bmiHeader.biCompression = BI_RGB;
1931 src_bi->bmiHeader.biClrUsed = 0;
1932 src_bi->bmiHeader.biSizeImage = 0;
1934 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1935 ok(ret == 4, "got %d\n", ret);
1936 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1937 ok(ret == 4, "got %d\n", ret);
1938 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1939 ok(ret == 4, "got %d\n", ret);
1940 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1941 ok(ret == 4, "got %d\n", ret);
1942 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1943 ok(ret == 4, "got %d\n", ret);
1944 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1945 ok(ret == 4, "got %d\n", ret);
1947 src_bi->bmiHeader.biHeight = -4;
1949 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1950 ok(ret == 4, "got %d\n", ret);
1951 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1952 ok(ret == -4, "got %d\n", ret);
1953 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1954 ok(ret == 4, "got %d\n", ret);
1955 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1956 ok(ret == -4, "got %d\n", ret);
1957 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1958 ok(ret == 4, "got %d\n", ret);
1959 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1960 ok(ret == -4, "got %d\n", ret);
1962 compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
1963 memset(bits, 0xcc, dib_size);
1965 /* Solid colors */
1966 for (i = 0; i < 256; i++)
1968 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
1969 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
1970 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1971 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1974 /* A few extra colors that are interesting in the 1bpp case */
1976 /* bk color */
1977 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
1978 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
1980 /* color 0 */
1981 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
1982 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
1984 /* color 1 */
1985 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
1986 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
1988 compare_hash(bmi, bits, sha1, "Colors");
1989 memset(bits, 0xcc, dib_size);
1991 for (i = 0; i < 256; i++)
1993 COLORREF s, g;
1994 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
1995 g = GetPixel( hdc, i * 2, 10 );
1996 ok( s == g, "got %08x and %08x\n", s, g );
1998 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
1999 g = GetPixel( hdc, i * 2, 20 );
2000 ok( s == g, "got %08x and %08x\n", s, g );
2002 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2003 g = GetPixel( hdc, i * 2, 30 );
2004 ok( s == g, "got %08x and %08x\n", s, g );
2006 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2007 g = GetPixel( hdc, i * 2, 40 );
2008 ok( s == g, "got %08x and %08x\n", s, g );
2011 compare_hash(bmi, bits, sha1, "SetPixel");
2012 memset(bits, 0xcc, dib_size);
2014 SelectObject(hdc, orig_brush);
2015 SelectObject(hdc, orig_pen);
2016 DeleteObject(hrgn);
2017 DeleteObject(dib_brush);
2018 DeleteObject(dashed_pen);
2019 DeleteObject(solid_brush);
2020 DeleteObject(solid_pen);
2023 static void test_simple_graphics(void)
2025 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2026 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2027 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2028 HDC mem_dc;
2029 BYTE *bits;
2030 HBITMAP dib, orig_bm;
2031 const char **sha1;
2032 DIBSECTION ds;
2033 int i;
2035 mem_dc = CreateCompatibleDC(NULL);
2037 /* a8r8g8b8 */
2038 trace("8888\n");
2039 memset(bmi, 0, sizeof(bmibuf));
2040 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2041 bmi->bmiHeader.biHeight = 512;
2042 bmi->bmiHeader.biWidth = 512;
2043 bmi->bmiHeader.biBitCount = 32;
2044 bmi->bmiHeader.biPlanes = 1;
2045 bmi->bmiHeader.biCompression = BI_RGB;
2047 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2048 ok(dib != NULL, "ret NULL\n");
2049 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2050 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2051 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2052 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2053 ok(ds.dsBmih.biCompression == BI_RGB ||
2054 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2055 "got %x\n", ds.dsBmih.biCompression);
2057 orig_bm = SelectObject(mem_dc, dib);
2059 dst_format = "8888";
2060 sha1 = sha1_graphics_a8r8g8b8;
2061 draw_graphics(mem_dc, bmi, bits, &sha1);
2063 SelectObject(mem_dc, orig_bm);
2064 DeleteObject(dib);
2066 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2067 trace("8888 - bitfields\n");
2068 bmi->bmiHeader.biBitCount = 32;
2069 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2070 bit_fields[0] = 0xff0000;
2071 bit_fields[1] = 0x00ff00;
2072 bit_fields[2] = 0x0000ff;
2074 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2075 ok(dib != NULL, "ret NULL\n");
2076 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2077 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2078 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2079 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2080 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2082 orig_bm = SelectObject(mem_dc, dib);
2084 dst_format = "8888 - bitfields";
2085 sha1 = sha1_graphics_a8r8g8b8;
2086 draw_graphics(mem_dc, bmi, bits, &sha1);
2088 SelectObject(mem_dc, orig_bm);
2089 DeleteObject(dib);
2091 /* a8b8g8r8. */
2092 trace("a8b8g8r8\n");
2093 bmi->bmiHeader.biBitCount = 32;
2094 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2095 bit_fields[0] = 0x0000ff;
2096 bit_fields[1] = 0x00ff00;
2097 bit_fields[2] = 0xff0000;
2099 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2100 ok(dib != NULL, "ret NULL\n");
2101 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2102 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2103 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2104 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2105 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2107 orig_bm = SelectObject(mem_dc, dib);
2109 dst_format = "a8b8g8r8";
2110 sha1 = sha1_graphics_a8b8g8r8;
2111 draw_graphics(mem_dc, bmi, bits, &sha1);
2113 SelectObject(mem_dc, orig_bm);
2114 DeleteObject(dib);
2116 /* r10g10b10. */
2117 trace("r10g10b10\n");
2118 bmi->bmiHeader.biBitCount = 32;
2119 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2120 bit_fields[0] = 0x3ff00000;
2121 bit_fields[1] = 0x000ffc00;
2122 bit_fields[2] = 0x000003ff;
2124 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2125 ok(dib != NULL, "ret NULL\n");
2126 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2127 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2128 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2129 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2130 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2132 orig_bm = SelectObject(mem_dc, dib);
2134 dst_format = "r10g10b10";
2135 sha1 = sha1_graphics_r10g10b10;
2136 draw_graphics(mem_dc, bmi, bits, &sha1);
2138 SelectObject(mem_dc, orig_bm);
2139 DeleteObject(dib);
2141 /* r6g6b6. */
2142 trace("r6g6b6\n");
2143 bmi->bmiHeader.biBitCount = 32;
2144 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2145 bit_fields[0] = 0x0003f000;
2146 bit_fields[1] = 0x00000fc0;
2147 bit_fields[2] = 0x0000003f;
2149 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2150 ok(dib != NULL, "ret NULL\n");
2151 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2152 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2153 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2154 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2155 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2157 orig_bm = SelectObject(mem_dc, dib);
2159 dst_format = "r6g6b6";
2160 sha1 = sha1_graphics_r6g6b6;
2161 draw_graphics(mem_dc, bmi, bits, &sha1);
2163 SelectObject(mem_dc, orig_bm);
2164 DeleteObject(dib);
2166 /* 24 */
2167 trace("24\n");
2168 bmi->bmiHeader.biBitCount = 24;
2169 bmi->bmiHeader.biCompression = BI_RGB;
2171 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2172 ok(dib != NULL, "ret NULL\n");
2173 orig_bm = SelectObject(mem_dc, dib);
2175 dst_format = "24";
2176 sha1 = sha1_graphics_24;
2177 draw_graphics(mem_dc, bmi, bits, &sha1);
2179 SelectObject(mem_dc, orig_bm);
2180 DeleteObject(dib);
2182 /* r5g5b5 */
2183 trace("555\n");
2184 bmi->bmiHeader.biBitCount = 16;
2185 bmi->bmiHeader.biCompression = BI_RGB;
2187 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2188 ok(dib != NULL, "ret NULL\n");
2189 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2190 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2191 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2192 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2193 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2195 orig_bm = SelectObject(mem_dc, dib);
2197 dst_format = "r5g5b5";
2198 sha1 = sha1_graphics_r5g5b5;
2199 draw_graphics(mem_dc, bmi, bits, &sha1);
2201 SelectObject(mem_dc, orig_bm);
2202 DeleteObject(dib);
2204 /* r4g4b4 */
2205 trace("444\n");
2206 bmi->bmiHeader.biBitCount = 16;
2207 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2208 bit_fields[0] = 0x0f00;
2209 bit_fields[1] = 0x00f0;
2210 bit_fields[2] = 0x000f;
2211 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2212 ok(dib != NULL, "ret NULL\n");
2213 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2214 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2215 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2216 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2217 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2219 orig_bm = SelectObject(mem_dc, dib);
2221 dst_format = "r4g4b4";
2222 sha1 = sha1_graphics_r4g4b4;
2223 draw_graphics(mem_dc, bmi, bits, &sha1);
2225 SelectObject(mem_dc, orig_bm);
2226 DeleteObject(dib);
2228 /* 8 color */
2229 trace("8 color\n");
2230 bmi->bmiHeader.biBitCount = 8;
2231 bmi->bmiHeader.biCompression = BI_RGB;
2232 bmi->bmiHeader.biClrUsed = 236;
2233 for (i = 0; i < 236; i++)
2235 bmi->bmiColors[i].rgbRed = (i & 0x07) << 5;
2236 bmi->bmiColors[i].rgbGreen = (i & 0x38) << 2;
2237 bmi->bmiColors[i].rgbBlue = i & 0xc0;
2239 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2240 ok(dib != NULL, "ret NULL\n");
2242 orig_bm = SelectObject(mem_dc, dib);
2244 dst_format = "8 color";
2245 sha1 = sha1_graphics_8_color;
2246 draw_graphics(mem_dc, bmi, bits, &sha1);
2248 SelectObject(mem_dc, orig_bm);
2249 DeleteObject(dib);
2251 /* 8 grayscale */
2252 trace("8 grayscale\n");
2253 bmi->bmiHeader.biBitCount = 8;
2254 bmi->bmiHeader.biCompression = BI_RGB;
2255 bmi->bmiHeader.biClrUsed = 256;
2256 for (i = 0; i < 256; i++)
2257 bmi->bmiColors[i].rgbRed = bmi->bmiColors[i].rgbGreen = bmi->bmiColors[i].rgbBlue = i;
2259 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2260 ok(dib != NULL, "ret NULL\n");
2262 orig_bm = SelectObject(mem_dc, dib);
2264 dst_format = "8 grayscale";
2265 sha1 = sha1_graphics_8_grayscale;
2266 draw_graphics(mem_dc, bmi, bits, &sha1);
2268 SelectObject(mem_dc, orig_bm);
2269 DeleteObject(dib);
2271 /* 8 */
2272 trace("8\n");
2273 bmi->bmiHeader.biBitCount = 8;
2274 bmi->bmiHeader.biCompression = BI_RGB;
2275 bmi->bmiHeader.biClrUsed = 5;
2276 bmi->bmiColors[0].rgbRed = 0xff;
2277 bmi->bmiColors[0].rgbGreen = 0xff;
2278 bmi->bmiColors[0].rgbBlue = 0xff;
2279 bmi->bmiColors[1].rgbRed = 0;
2280 bmi->bmiColors[1].rgbGreen = 0;
2281 bmi->bmiColors[1].rgbBlue = 0;
2282 bmi->bmiColors[2].rgbRed = 0xff;
2283 bmi->bmiColors[2].rgbGreen = 0;
2284 bmi->bmiColors[2].rgbBlue = 0;
2285 bmi->bmiColors[3].rgbRed = 0;
2286 bmi->bmiColors[3].rgbGreen = 0xff;
2287 bmi->bmiColors[3].rgbBlue = 0;
2288 bmi->bmiColors[4].rgbRed = 0;
2289 bmi->bmiColors[4].rgbGreen = 0;
2290 bmi->bmiColors[4].rgbBlue = 0xff;
2292 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2293 ok(dib != NULL, "ret NULL\n");
2295 orig_bm = SelectObject(mem_dc, dib);
2297 dst_format = "8";
2298 sha1 = sha1_graphics_8;
2299 draw_graphics(mem_dc, bmi, bits, &sha1);
2301 SelectObject(mem_dc, orig_bm);
2302 DeleteObject(dib);
2304 /* 4 */
2305 trace("4\n");
2306 bmi->bmiHeader.biBitCount = 4;
2308 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2309 ok(dib != NULL, "ret NULL\n");
2311 orig_bm = SelectObject(mem_dc, dib);
2313 dst_format = "4";
2314 sha1 = sha1_graphics_4;
2315 draw_graphics(mem_dc, bmi, bits, &sha1);
2317 SelectObject(mem_dc, orig_bm);
2318 DeleteObject(dib);
2320 /* 4 grayscale */
2321 trace("4 grayscale\n");
2322 bmi->bmiHeader.biClrUsed = 16;
2323 for (i = 0; i < 16; i++)
2324 bmi->bmiColors[i].rgbRed = bmi->bmiColors[i].rgbGreen = bmi->bmiColors[i].rgbBlue = i * 17;
2326 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2327 ok(dib != NULL, "ret NULL\n");
2329 orig_bm = SelectObject(mem_dc, dib);
2331 dst_format = "4 grayscale";
2332 sha1 = sha1_graphics_4_grayscale;
2333 draw_graphics(mem_dc, bmi, bits, &sha1);
2335 SelectObject(mem_dc, orig_bm);
2336 DeleteObject(dib);
2338 /* 1 */
2339 trace("1\n");
2340 bmi->bmiHeader.biBitCount = 1;
2341 bmi->bmiHeader.biClrUsed = 2;
2343 bmi->bmiColors[0].rgbRed = 0x00;
2344 bmi->bmiColors[0].rgbGreen = 0x01;
2345 bmi->bmiColors[0].rgbBlue = 0xff;
2346 bmi->bmiColors[1].rgbRed = 0xff;
2347 bmi->bmiColors[1].rgbGreen = 0x00;
2348 bmi->bmiColors[1].rgbBlue = 0x00;
2350 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2351 ok(dib != NULL, "ret NULL\n");
2353 orig_bm = SelectObject(mem_dc, dib);
2355 dst_format = "1";
2356 sha1 = sha1_graphics_1;
2357 draw_graphics(mem_dc, bmi, bits, &sha1);
2359 SelectObject(mem_dc, orig_bm);
2360 DeleteObject(dib);
2362 DeleteDC(mem_dc);
2365 START_TEST(dib)
2367 HMODULE mod = GetModuleHandleA("gdi32.dll");
2368 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2369 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2371 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2373 test_simple_graphics();
2375 CryptReleaseContext(crypt_prov, 0);