mshtml: Wine Gecko 1.4 release.
[wine] / dlls / gdi32 / tests / dib.c
1 /*
2  * DIB driver tests.
3  *
4  * Copyright 2011 Huw Davies
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <math.h>
24
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 */
31
32 #include "wine/test.h"
33
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);
37
38 static const DWORD rop3[256] =
39 {
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
72 };
73
74 static inline BOOL rop_uses_src(DWORD rop)
75 {
76     return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
77 }
78
79 static const char *sha1_graphics_a8r8g8b8[] =
80 {
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
136 };
137
138 static const char *sha1_graphics_a8b8g8r8[] =
139 {
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
195 };
196
197 static const char *sha1_graphics_r10g10b10[] =
198 {
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
254 };
255
256 static const char *sha1_graphics_r6g6b6[] =
257 {
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
313 };
314
315 static const char *sha1_graphics_24[] =
316 {
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
372 };
373
374 static const char *sha1_graphics_r5g5b5[] =
375 {
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
435 };
436
437 static const char *sha1_graphics_r4g4b4[] =
438 {
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
493 };
494
495 static const char *sha1_graphics_8_color[] =
496 {
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
557 };
558
559 static const char *sha1_graphics_8_grayscale[] =
560 {
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
626 };
627
628 static const char *sha1_graphics_8[] =
629 {
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
688 };
689
690 static const char *sha1_graphics_4[] =
691 {
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
746 };
747
748 static const char *sha1_graphics_4_grayscale[] =
749 {
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
804 };
805
806 static const char *sha1_graphics_1[] =
807 {
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
877 };
878
879 static const char *dst_format;
880
881 static inline DWORD get_stride(BITMAPINFO *bmi)
882 {
883     return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
884 }
885
886 static inline DWORD get_dib_size(BITMAPINFO *bmi)
887 {
888     return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
889 }
890
891 static char *hash_dib(BITMAPINFO *bmi, void *bits)
892 {
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";
900
901     if(!crypt_prov) return NULL;
902
903     if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
904
905     CryptHashData(hash, bits, dib_size, 0);
906
907     CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
908     if(hash_size != sizeof(hash_buf)) return NULL;
909
910     CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
911     CryptDestroyHash(hash);
912
913     buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
914
915     for(i = 0; i < hash_size; i++)
916     {
917         buf[i * 2] = hex[hash_buf[i] >> 4];
918         buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
919     }
920     buf[i * 2] = '\0';
921
922     return buf;
923 }
924
925 static void compare_hash_broken_todo(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info, int num_broken, BOOL todo)
926 {
927     char *hash = hash_dib(bmi, bits);
928     BOOL ok_cond;
929     int i;
930
931     if(!hash)
932     {
933         skip("SHA1 hashing unavailable on this platform\n");
934         return;
935     }
936
937     for(i = 0; i <= num_broken; i++)
938     {
939         if((*sha1)[i] == NULL)
940         {
941             ok((*sha1)[i] != NULL, "missing hash, got \"%s\",\n", hash);
942             return;
943         }
944     }
945
946     ok_cond = !strcmp(hash, **sha1);
947
948     for(i = 1; i <= num_broken; i++)
949         ok_cond = ok_cond || broken( !strcmp(hash, (*sha1)[i]) );
950
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 );
957
958     *sha1 += num_broken + 1;
959
960     HeapFree(GetProcessHeap(), 0, hash);
961 }
962
963 static void compare_hash(BITMAPINFO *bmi, BYTE *bits, const char ***sha1, const char *info)
964 {
965     compare_hash_broken_todo(bmi, bits, sha1, info, 0, FALSE);
966 }
967
968 static const RECT bias_check[] =
969 {
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}
978 };
979
980 static const RECT hline_clips[] =
981 {
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 */
997 };
998
999 static const RECT vline_clips[] =
1000 {
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 */
1016 };
1017
1018 static const RECT line_clips[] =
1019 {
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 */
1027 };
1028
1029 static const RECT patblt_clips[] =
1030 {
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 */
1048 };
1049
1050 static const RECT rectangles[] =
1051 {
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 */
1066 };
1067
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};
1074
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> */
1079
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 };
1084
1085 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1086 {
1087     HBRUSH brush = CreateSolidBrush( color );
1088     brush = SelectObject( hdc, brush );
1089     PatBlt( hdc, x, y, width, height, PATCOPY );
1090     DeleteObject( SelectObject( hdc, brush ) );
1091 }
1092
1093 static void draw_graphics(HDC hdc, BITMAPINFO *bmi, BYTE *bits, const char ***sha1)
1094 {
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     RGBQUAD *brush_colors = brush_bi->bmiColors;
1107     BYTE *brush_bits, *src_bits;
1108     BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1);
1109     BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1);
1110     BLENDFUNCTION blend;
1111
1112     blend.BlendOp = AC_SRC_OVER;
1113     blend.BlendFlags = 0;
1114
1115     memset(bits, 0xcc, dib_size);
1116     compare_hash(bmi, bits, sha1, "empty");
1117
1118     src_dc = CreateCompatibleDC( 0 );
1119     solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff));
1120     orig_pen = SelectObject(hdc, solid_pen);
1121     SetBrushOrgEx(hdc, 0, 0, NULL);
1122
1123     /* horizontal and vertical lines */
1124     for(i = 1; i <= 16; i++)
1125     {
1126         SetROP2(hdc, i);
1127         MoveToEx(hdc, 10, i * 3, NULL);
1128         LineTo(hdc, 100, i * 3); /* l -> r */
1129         MoveToEx(hdc, 100, 50 + i * 3, NULL);
1130         LineTo(hdc, 10, 50 + i * 3); /* r -> l */
1131         MoveToEx(hdc, 120 + i * 3, 10, NULL);
1132         LineTo(hdc, 120 + i * 3, 100); /* t -> b */
1133         MoveToEx(hdc, 170 + i * 3, 100, NULL);
1134         LineTo(hdc, 170 + i * 3, 10); /* b -> t */
1135     }
1136     compare_hash(bmi, bits, sha1, "h and v solid lines");
1137     memset(bits, 0xcc, dib_size);
1138
1139     /* diagonal lines */
1140     SetROP2(hdc, R2_COPYPEN);
1141     for(i = 0; i < 16; i++)
1142     {
1143         double s = sin(M_PI * i / 8.0);
1144         double c = cos(M_PI * i / 8.0);
1145
1146         MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1147         LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1148     }
1149     compare_hash(bmi, bits, sha1, "diagonal solid lines");
1150     memset(bits, 0xcc, dib_size);
1151
1152     for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1153     {
1154         MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1155         LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1156     }
1157     compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1158     memset(bits, 0xcc, dib_size);
1159
1160     /* solid brush PatBlt */
1161     solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1162     orig_brush = SelectObject(hdc, solid_brush);
1163
1164     for(i = 0, y = 10; i < 256; i++)
1165     {
1166         ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1167
1168         if(rop_uses_src(rop3[i]))
1169             ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1170         else
1171         {
1172             ok(ret, "got FALSE for %x\n", rop3[i]);
1173             y += 20;
1174         }
1175
1176     }
1177     compare_hash(bmi, bits, sha1, "solid patblt");
1178     memset(bits, 0xcc, dib_size);
1179
1180     /* clipped lines */
1181     hrgn = CreateRectRgn(10, 10, 200, 20);
1182     hrgn2 = CreateRectRgn(100, 100, 200, 200);
1183     CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1184     SetRectRgn(hrgn2, 290, 100, 300, 200);
1185     CombineRgn(hrgn, hrgn, hrgn2, RGN_OR);
1186     ExtSelectClipRgn(hdc, hrgn, RGN_COPY);
1187     DeleteObject(hrgn2);
1188
1189     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1190     {
1191         MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1192         LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1193     }
1194     compare_hash(bmi, bits, sha1, "clipped solid hlines");
1195     memset(bits, 0xcc, dib_size);
1196
1197     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1198     {
1199         MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1200         LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1201     }
1202     compare_hash(bmi, bits, sha1, "clipped solid vlines");
1203     memset(bits, 0xcc, dib_size);
1204
1205     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1206     {
1207         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1208         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1209     }
1210     compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1211     memset(bits, 0xcc, dib_size);
1212
1213     /* clipped PatBlt */
1214     for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1215     {
1216         PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top,
1217                patblt_clips[i].right - patblt_clips[i].left,
1218                patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY);
1219     }
1220     compare_hash(bmi, bits, sha1, "clipped patblt");
1221     memset(bits, 0xcc, dib_size);
1222
1223     /* clipped dashed lines */
1224     dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1225     SelectObject(hdc, dashed_pen);
1226     SetBkMode(hdc, TRANSPARENT);
1227     SetBkColor(hdc, RGB(0, 0xff, 0));
1228
1229     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1230     {
1231         MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1232         LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1233     }
1234     compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1235     memset(bits, 0xcc, dib_size);
1236
1237     for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1238     {
1239         MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL);
1240         LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top);
1241     }
1242     compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1243     memset(bits, 0xcc, dib_size);
1244
1245     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1246     {
1247         MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1248         LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1249     }
1250     compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1251     memset(bits, 0xcc, dib_size);
1252
1253     for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1254     {
1255         MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL);
1256         LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1);
1257     }
1258     compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1259     memset(bits, 0xcc, dib_size);
1260
1261     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1262     {
1263         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1264         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1265     }
1266     compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1267     memset(bits, 0xcc, dib_size);
1268
1269     SetBkMode(hdc, OPAQUE);
1270
1271     for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1272     {
1273         MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1274         LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1275     }
1276     compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1277     memset(bits, 0xcc, dib_size);
1278
1279     ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1280
1281     /* 8888 DIB pattern brush */
1282
1283     brush_bi->bmiHeader = dib_brush_header_8888;
1284     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1285     memset(brush_bits, 0, 16 * 16 * sizeof(DWORD));
1286     brush_bits[2] = 0xff;
1287     brush_bits[6] = 0xff;
1288     brush_bits[14] = 0xff;
1289     brush_bits[65] = 0xff;
1290     brush_bits[69] = 0xff;
1291     brush_bits[72] = 0xff;
1292
1293     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1294
1295     SelectObject(hdc, dib_brush);
1296     SetBrushOrgEx(hdc, 1, 1, NULL);
1297
1298     for(i = 0, y = 10; i < 256; i++)
1299     {
1300         if(!rop_uses_src(rop3[i]))
1301         {
1302             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1303             ok(ret, "got FALSE for %x\n", rop3[i]);
1304             y += 25;
1305         }
1306     }
1307     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1308         compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", 1, FALSE);
1309     else
1310         compare_hash_broken_todo(bmi, bits, sha1, "top-down 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1311     memset(bits, 0xcc, dib_size);
1312
1313     SelectObject(hdc, orig_brush);
1314     DeleteObject(dib_brush);
1315
1316     /* 8888 bottom-up DIB pattern brush */
1317
1318     brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1319
1320     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1321
1322     SelectObject(hdc, dib_brush);
1323
1324     /* This used to set the x origin to 100 as well, but
1325        there's a Windows bug for 24 bpp where the brush's x offset
1326        is incorrectly calculated for rops that involve both D and P */
1327     SetBrushOrgEx(hdc, 4, 100, NULL);
1328
1329     for(i = 0, y = 10; i < 256; i++)
1330     {
1331         if(!rop_uses_src(rop3[i]))
1332         {
1333             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1334             ok(ret, "got FALSE for %x\n", rop3[i]);
1335             y += 25;
1336         }
1337     }
1338     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1339         compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", 1, FALSE);
1340     else
1341         compare_hash_broken_todo(bmi, bits, sha1, "bottom-up 8888 dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1342     memset(bits, 0xcc, dib_size);
1343
1344     SelectObject(hdc, orig_brush);
1345     DeleteObject(dib_brush);
1346
1347     /* 24 bpp dib pattern brush */
1348
1349     brush_bi->bmiHeader = dib_brush_header_24;
1350     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1351     memset(brush_bits, 0, 16 * 16 * 3);
1352     brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff;
1353     brush_bits[49] = brush_bits[52] = 0xff;
1354
1355     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1356
1357     SelectObject(hdc, dib_brush);
1358     SetBrushOrgEx(hdc, 1, 1, NULL);
1359
1360     for(i = 0, y = 10; i < 256; i++)
1361     {
1362         if(!rop_uses_src(rop3[i]))
1363         {
1364             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1365             ok(ret, "got FALSE for %x\n", rop3[i]);
1366             y += 25;
1367         }
1368     }
1369     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1370         compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", 1, FALSE);
1371     else
1372         compare_hash_broken_todo(bmi, bits, sha1, "top-down 24 bpp brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1373     memset(bits, 0xcc, dib_size);
1374
1375     SelectObject(hdc, orig_brush);
1376     DeleteObject(dib_brush);
1377
1378     /* 555 dib pattern brush */
1379
1380     brush_bi->bmiHeader = dib_brush_header_555;
1381     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER);
1382     memset(brush_bits, 0, 16 * 16 * sizeof(WORD));
1383     brush_bits[0] = brush_bits[1] = 0xff;
1384     brush_bits[32] = brush_bits[34] = 0x7c;
1385
1386     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1387
1388     SelectObject(hdc, dib_brush);
1389     SetBrushOrgEx(hdc, 1, 1, NULL);
1390
1391     for(i = 0, y = 10; i < 256; i++)
1392     {
1393         if(!rop_uses_src(rop3[i]))
1394         {
1395             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1396             ok(ret, "got FALSE for %x\n", rop3[i]);
1397             y += 25;
1398         }
1399     }
1400     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed == 256)  /* 8-bpp grayscale broken on NT4 */
1401         compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", 1, FALSE);
1402     else
1403         compare_hash_broken_todo(bmi, bits, sha1, "top-down 555 dib brush patblt", dib_is_1bpp ? 1 : 0, dib_is_1bpp);
1404     memset(bits, 0xcc, dib_size);
1405
1406     SelectObject(hdc, orig_brush);
1407     DeleteObject(dib_brush);
1408
1409     SetBrushOrgEx(hdc, 0, 0, NULL);
1410
1411     /* 8 bpp dib pattern brush */
1412
1413     brush_bi->bmiHeader = dib_brush_header_8;
1414     brush_bi->bmiHeader.biClrUsed = 3;
1415     memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD));
1416     brush_colors[0].rgbRed = 0xff;
1417     brush_colors[1].rgbRed = 0xff;
1418     brush_colors[1].rgbGreen = 0xff;
1419     brush_colors[1].rgbBlue = 0xff;
1420
1421     brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD);
1422     memset(brush_bits, 0, 16 * 16 * sizeof(BYTE));
1423     brush_bits[0] = brush_bits[1] = 1;
1424     brush_bits[16] = brush_bits[17] = 2;
1425     brush_bits[32] = brush_bits[33] = 6;
1426
1427     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1428
1429     SelectObject(hdc, dib_brush);
1430     SetBrushOrgEx(hdc, 1, 1, NULL);
1431
1432     for(i = 0, y = 10; i < 256; i++)
1433     {
1434         if(!rop_uses_src(rop3[i]))
1435         {
1436             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1437             ok(ret, "got FALSE for %x\n", rop3[i]);
1438             y += 25;
1439         }
1440     }
1441     compare_hash_broken_todo(bmi, bits, sha1, "top-down 8 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1442     memset(bits, 0xcc, dib_size);
1443
1444     SelectObject(hdc, orig_brush);
1445     DeleteObject(dib_brush);
1446
1447     /* 4 bpp dib pattern brush */
1448
1449     brush_bi->bmiHeader = dib_brush_header_4;
1450     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1451
1452     SelectObject(hdc, dib_brush);
1453     SetBrushOrgEx(hdc, 1, 1, NULL);
1454
1455     for(i = 0, y = 10; i < 256; i++)
1456     {
1457         if(!rop_uses_src(rop3[i]))
1458         {
1459             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1460             ok(ret, "got FALSE for %x\n", rop3[i]);
1461             y += 25;
1462         }
1463     }
1464     compare_hash_broken_todo(bmi, bits, sha1, "top-down 4 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1465     memset(bits, 0xcc, dib_size);
1466
1467     SelectObject(hdc, orig_brush);
1468     DeleteObject(dib_brush);
1469
1470     /* 1 bpp dib pattern brush */
1471
1472     brush_bi->bmiHeader = dib_brush_header_1;
1473     brush_bi->bmiHeader.biClrUsed = 2;
1474     memset(brush_bits, 0, 16 * 4);
1475     brush_bits[0] = 0xf0;
1476     brush_bits[4] = 0xf0;
1477     brush_bits[8] = 0xf0;
1478
1479     dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1480     SelectObject(hdc, dib_brush);
1481     for(i = 0, y = 10; i < 256; i++)
1482     {
1483         if(!rop_uses_src(rop3[i]))
1484         {
1485             ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1486             ok(ret, "got FALSE for %x\n", rop3[i]);
1487             y += 25;
1488         }
1489     }
1490
1491     compare_hash_broken_todo(bmi, bits, sha1, "top-down 1 bpp dib brush patblt", dib_is_1bpp ? 2 : 0, dib_is_1bpp);
1492     memset(bits, 0xcc, dib_size);
1493
1494     SelectObject(hdc, orig_brush);
1495     SetBrushOrgEx(hdc, 0, 0, NULL);
1496
1497     /* Rectangle */
1498
1499     SelectObject(hdc, solid_pen);
1500     SelectObject(hdc, solid_brush);
1501
1502     for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1503     {
1504         Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1505     }
1506
1507     SelectObject(hdc, dashed_pen);
1508     for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1509     {
1510         Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1511     }
1512
1513     compare_hash(bmi, bits, sha1, "rectangles");
1514     memset(bits, 0xcc, dib_size);
1515     SelectObject(hdc, solid_pen);
1516
1517     /* PaintRgn */
1518
1519     PaintRgn(hdc, hrgn);
1520     compare_hash(bmi, bits, sha1, "PaintRgn");
1521     memset(bits, 0xcc, dib_size);
1522
1523     /* RTL rectangles */
1524
1525     if( !pSetLayout )
1526     {
1527         win_skip("Don't have SetLayout\n");
1528         (*sha1)++;
1529     }
1530     else
1531     {
1532         pSetLayout(hdc, LAYOUT_RTL);
1533         PaintRgn(hdc, hrgn);
1534         PatBlt(hdc, 10, 250, 10, 10, PATCOPY);
1535         Rectangle(hdc, 100, 250, 110, 260);
1536         compare_hash(bmi, bits, sha1, "rtl");
1537         memset(bits, 0xcc, dib_size);
1538
1539         pSetLayout(hdc, LAYOUT_LTR);
1540     }
1541
1542     for(i = 0, y = 10; i < 256; i++)
1543     {
1544         if(!rop_uses_src(rop3[i]))
1545         {
1546             for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1547             {
1548                 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0));
1549                 SelectObject(hdc, hatch_brush);
1550                 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]);
1551                 ok(ret, "got FALSE for %x\n", rop3[i]);
1552                 SelectObject(hdc, orig_brush);
1553                 DeleteObject(hatch_brush);
1554             }
1555             y += 25;
1556         }
1557     }
1558
1559     compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1560     memset(bits, 0xcc, dib_size);
1561
1562     /* overlapping blits */
1563
1564     orig_brush = SelectObject(hdc, solid_brush);
1565
1566     Rectangle(hdc, 10, 10, 100, 100);
1567     Rectangle(hdc, 20, 15, 30, 40);
1568     Rectangle(hdc, 15, 15, 20, 20);
1569     Rectangle(hdc, 15, 20, 50, 45);
1570     BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY );
1571     compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, +y");
1572     memset(bits, 0xcc, dib_size);
1573
1574     Rectangle(hdc, 10, 10, 100, 100);
1575     Rectangle(hdc, 20, 15, 30, 40);
1576     Rectangle(hdc, 15, 15, 20, 20);
1577     Rectangle(hdc, 15, 20, 50, 45);
1578     BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY );
1579     if (bmi->bmiHeader.biBitCount == 1)  /* Windows gets this one wrong */
1580         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE);
1581     else
1582         compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1583     memset(bits, 0xcc, dib_size);
1584
1585     Rectangle(hdc, 10, 10, 100, 100);
1586     Rectangle(hdc, 20, 15, 30, 40);
1587     Rectangle(hdc, 15, 15, 20, 20);
1588     Rectangle(hdc, 15, 20, 50, 45);
1589     BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY );
1590     compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY +x, -y");
1591     memset(bits, 0xcc, dib_size);
1592
1593     Rectangle(hdc, 10, 10, 100, 100);
1594     Rectangle(hdc, 20, 15, 30, 40);
1595     Rectangle(hdc, 15, 15, 20, 20);
1596     Rectangle(hdc, 15, 20, 50, 45);
1597     BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY );
1598     if (bmi->bmiHeader.biBitCount == 1)  /* Windows gets this one wrong */
1599         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE );
1600     else
1601         compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1602     memset(bits, 0xcc, dib_size);
1603
1604     Rectangle(hdc, 10, 10, 100, 100);
1605     Rectangle(hdc, 20, 15, 30, 40);
1606     Rectangle(hdc, 15, 15, 20, 20);
1607     Rectangle(hdc, 15, 20, 50, 45);
1608     BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT );
1609     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, +y");
1610     memset(bits, 0xcc, dib_size);
1611
1612     Rectangle(hdc, 10, 10, 100, 100);
1613     Rectangle(hdc, 20, 15, 30, 40);
1614     Rectangle(hdc, 15, 15, 20, 20);
1615     Rectangle(hdc, 15, 20, 50, 45);
1616     BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT );
1617     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, -y");
1618     memset(bits, 0xcc, dib_size);
1619
1620     Rectangle(hdc, 10, 10, 100, 100);
1621     Rectangle(hdc, 20, 15, 30, 40);
1622     Rectangle(hdc, 15, 15, 20, 20);
1623     Rectangle(hdc, 15, 20, 50, 45);
1624     BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT );
1625     if (bmi->bmiHeader.biBitCount >= 24)  /* Windows gets this one wrong */
1626         compare_hash_broken_todo(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE);
1627     else
1628         compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1629     memset(bits, 0xcc, dib_size);
1630
1631     Rectangle(hdc, 10, 10, 100, 100);
1632     Rectangle(hdc, 20, 15, 30, 40);
1633     Rectangle(hdc, 15, 15, 20, 20);
1634     Rectangle(hdc, 15, 20, 50, 45);
1635     BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT );
1636     compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT -x, +y" );
1637     memset(bits, 0xcc, dib_size);
1638
1639     /* blitting with 32-bpp BI_RGB source */
1640
1641     memset( dib_src_buf, 0, sizeof(dib_src_buf) );
1642     src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
1643     src_bi->bmiHeader.biHeight = 256;
1644     src_bi->bmiHeader.biWidth = 256;
1645     src_bi->bmiHeader.biBitCount = 32;
1646     src_bi->bmiHeader.biPlanes = 1;
1647     src_bi->bmiHeader.biCompression = BI_RGB;
1648     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1649     SelectObject( src_dc, bmp );
1650     for (y = 0; y < 256; y++)
1651         for (x = 0; x < 256; x++)
1652         {
1653             BYTE a = (x + y) * 2;
1654             BYTE r = (BYTE)(y + 2 * x) * a / 255;
1655             BYTE g = (BYTE)(x + y / 3) * a / 255;
1656             BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255;
1657             ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b );
1658         }
1659
1660     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1661     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1662         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY", 1, FALSE );
1663     else
1664         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1665     memset(bits, 0xcc, dib_size);
1666
1667     blend.SourceConstantAlpha = 0xd0;
1668     blend.AlphaFormat = 0;
1669     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1670     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1671     {
1672         if (!pGdiAlphaBlend) (*sha1) += 2;
1673         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1674     }
1675     else
1676     {
1677         if (!pGdiAlphaBlend) (*sha1)++;
1678         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1679     }
1680     memset(bits, 0xcc, dib_size);
1681
1682     blend.SourceConstantAlpha = 0xb0;
1683     blend.AlphaFormat = AC_SRC_ALPHA;
1684     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend );
1685     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1686     {
1687         if (!pGdiAlphaBlend) (*sha1) += 2;
1688         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1689     }
1690     else
1691     {
1692         if (!pGdiAlphaBlend) (*sha1)++;
1693         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1694     }
1695     memset(bits, 0xcc, dib_size);
1696
1697     /* blitting with 32-bpp r10g10b10 source */
1698
1699     src_bi->bmiHeader.biBitCount = 32;
1700     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1701     ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000;
1702     ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00;
1703     ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff;
1704     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1705     SelectObject( src_dc, bmp );
1706     for (y = 0; y < 256; y++)
1707         for (x = 0; x < 256; x++)
1708         {
1709             WORD r = (7 * x + 3 * y) % 1024;
1710             WORD g = (11 * x + y / 3) % 1024;
1711             WORD b = (x / 3 + 9 * y) % 1024;
1712             ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b;
1713         }
1714
1715     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1716     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1717         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY", 1, FALSE );
1718     else
1719         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1720     memset(bits, 0xcc, dib_size);
1721
1722     /* blitting with 32-bpp b6g6r6 source */
1723
1724     src_bi->bmiHeader.biBitCount = 32;
1725     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1726     ((DWORD *)src_bi->bmiColors)[0] = 0x00003f;
1727     ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0;
1728     ((DWORD *)src_bi->bmiColors)[2] = 0x03f000;
1729     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1730     SelectObject( src_dc, bmp );
1731     for (y = 0; y < 256; y++)
1732         for (x = 0; x < 256; x++)
1733         {
1734             BYTE r = (y + 2 * x) % 64;
1735             BYTE g = (x + y / 3) % 64;
1736             BYTE b = (x / 3 + 2 * y) % 64;
1737             ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12;
1738         }
1739
1740     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1741     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1742         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY", 1, FALSE );
1743     else
1744         compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1745     memset(bits, 0xcc, dib_size);
1746
1747     /* blitting with 24-bpp source */
1748
1749     src_bi->bmiHeader.biBitCount = 24;
1750     src_bi->bmiHeader.biCompression = BI_RGB;
1751     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1752     DeleteObject( SelectObject( src_dc, bmp ) );
1753     for (y = 0; y < 256; y++)
1754         for (x = 0; x < 256; x++)
1755         {
1756             src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y;
1757             src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y;
1758             src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y;
1759         }
1760
1761     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1762     if (bmi->bmiHeader.biBitCount == 8)  /* broken on NT4 */
1763         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY", 1, FALSE );
1764     else
1765         compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1766     memset(bits, 0xcc, dib_size);
1767
1768     blend.SourceConstantAlpha = 0xe0;
1769     blend.AlphaFormat = 0;
1770     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1771     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1772     {
1773         if (!pGdiAlphaBlend) (*sha1) += 2;
1774         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1775     }
1776     else
1777     {
1778         if (!pGdiAlphaBlend) (*sha1)++;
1779         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1780     }
1781     memset(bits, 0xcc, dib_size);
1782
1783     /* blitting with 16-bpp BI_RGB source */
1784
1785     src_bi->bmiHeader.biBitCount = 16;
1786     src_bi->bmiHeader.biCompression = BI_RGB;
1787     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1788     DeleteObject( SelectObject( src_dc, bmp ) );
1789     for (y = 0; y < 256; y++)
1790         for (x = 0; x < 256; x++)
1791             ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1792
1793     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1794     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5)  /* broken on NT4 */
1795         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY", 1, FALSE );
1796     else
1797         compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1798     memset(bits, 0xcc, dib_size);
1799
1800     /* blitting with 16-bpp b4g4r4 source */
1801
1802     src_bi->bmiHeader.biBitCount = 16;
1803     src_bi->bmiHeader.biCompression = BI_BITFIELDS;
1804     ((DWORD *)src_bi->bmiColors)[0] = 0x00000f;
1805     ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0;
1806     ((DWORD *)src_bi->bmiColors)[2] = 0x000f00;
1807     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1808     DeleteObject( SelectObject( src_dc, bmp ) );
1809     for (y = 0; y < 256; y++)
1810         for (x = 0; x < 256; x++)
1811             ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7;
1812
1813     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1814     if (bmi->bmiHeader.biBitCount == 8 && bmi->bmiHeader.biClrUsed > 5)  /* broken on NT4 */
1815         compare_hash_broken_todo(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY", 1, FALSE );
1816     else
1817         compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1818     memset(bits, 0xcc, dib_size);
1819
1820     /* blitting with 8-bpp source */
1821
1822     src_bi->bmiHeader.biBitCount = 8;
1823     src_bi->bmiHeader.biCompression = BI_RGB;
1824     src_bi->bmiHeader.biClrUsed = 160;
1825     for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16;
1826     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1827     DeleteObject( SelectObject( src_dc, bmp ) );
1828     for (y = 0; y < 256; y++)
1829         for (x = 0; x < 256; x++)
1830             src_bits[y * 256 + x] = 3 * x + 5 * y;
1831
1832     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1833     compare_hash(bmi, bits, sha1, "BitBlt src 8-bpp SRCCOPY" );
1834     memset(bits, 0xcc, dib_size);
1835
1836     blend.SourceConstantAlpha = 0xd0;
1837     blend.AlphaFormat = 0;
1838     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1839     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1840     {
1841         if (!pGdiAlphaBlend) (*sha1) += 2;
1842         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1843     }
1844     else
1845     {
1846         if (!pGdiAlphaBlend) (*sha1)++;
1847         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1848     }
1849     memset(bits, 0xcc, dib_size);
1850
1851     /* blitting with 4-bpp source */
1852
1853     src_bi->bmiHeader.biBitCount = 4;
1854     src_bi->bmiHeader.biClrUsed = 12;
1855     for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16;
1856     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1857     DeleteObject( SelectObject( src_dc, bmp ) );
1858     for (y = 0; y < 256; y++)
1859         for (x = 0; x < 256; x += 2)
1860             src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y;
1861
1862     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1863     compare_hash(bmi, bits, sha1, "BitBlt src 4-bpp SRCCOPY" );
1864     memset(bits, 0xcc, dib_size);
1865
1866     /* blitting with 1-bpp source */
1867
1868     src_bi->bmiHeader.biBitCount = 1;
1869     src_bi->bmiHeader.biClrUsed = 0;
1870     for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16;
1871     bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0);
1872     DeleteObject( SelectObject( src_dc, bmp ) );
1873     for (y = 0; y < 256; y++)
1874         for (x = 0; x < 256; x += 8)
1875             src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y;
1876
1877     BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
1878     compare_hash(bmi, bits, sha1, "BitBlt src 1-bpp SRCCOPY" );
1879     memset(bits, 0xcc, dib_size);
1880
1881     blend.SourceConstantAlpha = 0x90;
1882     blend.AlphaFormat = 0;
1883     if (pGdiAlphaBlend) pGdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend );
1884     if (bmi->bmiHeader.biBitCount == 16 && bmi->bmiHeader.biCompression == BI_RGB) /* 555 broken on w2k */
1885     {
1886         if (!pGdiAlphaBlend) (*sha1) += 2;
1887         else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
1888     }
1889     else
1890     {
1891         if (!pGdiAlphaBlend) (*sha1)++;
1892         else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
1893     }
1894     memset(bits, 0xcc, dib_size);
1895
1896     DeleteDC( src_dc );
1897     DeleteObject( bmp );
1898
1899     /* RLE StretchDIBits */
1900     src_bi->bmiHeader.biSize        = sizeof(src_bi->bmiHeader);
1901     src_bi->bmiHeader.biWidth       = 8;
1902     src_bi->bmiHeader.biHeight      = 8;
1903     src_bi->bmiHeader.biPlanes      = 1;
1904     src_bi->bmiHeader.biBitCount    = 8;
1905     src_bi->bmiHeader.biCompression = BI_RLE8;
1906     src_bi->bmiHeader.biClrUsed     = 0;
1907     src_bi->bmiHeader.biSizeImage   = sizeof(rle8_data);
1908
1909     for (i = 0; i < 256; i++)
1910     {
1911         src_bi->bmiColors[i].rgbRed      = i;
1912         src_bi->bmiColors[i].rgbGreen    = i;
1913         src_bi->bmiColors[i].rgbBlue     = i;
1914         src_bi->bmiColors[i].rgbReserved = 0;
1915     }
1916
1917     StretchDIBits( hdc,  10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1918     StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND );
1919     StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1920     StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1921     StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1922     compare_hash_broken_todo( bmi, bits, sha1, "rle stretchdibits", 0, dib_is_1bpp );
1923     memset(bits, 0xcc, dib_size);
1924
1925     /* 32 bpp StretchDIBits */
1926
1927     src_bi->bmiHeader.biWidth       = 4;
1928     src_bi->bmiHeader.biHeight      = 4;
1929     src_bi->bmiHeader.biPlanes      = 1;
1930     src_bi->bmiHeader.biBitCount    = 32;
1931     src_bi->bmiHeader.biCompression = BI_RGB;
1932     src_bi->bmiHeader.biClrUsed     = 0;
1933     src_bi->bmiHeader.biSizeImage   = 0;
1934
1935     ret = StretchDIBits( hdc,  10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1936     ok(ret == 4, "got %d\n", ret);
1937     ret = StretchDIBits( hdc,  20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1938     ok(ret == 4, "got %d\n", ret);
1939     ret = StretchDIBits( hdc,  30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1940     ok(ret == 4, "got %d\n", ret);
1941     ret = StretchDIBits( hdc,  40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1942     ok(ret == 4, "got %d\n", ret);
1943     ret = StretchDIBits( hdc,  50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1944     ok(ret == 4, "got %d\n", ret);
1945     ret = StretchDIBits( hdc,  60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1946     ok(ret == 4, "got %d\n", ret);
1947
1948     src_bi->bmiHeader.biHeight = -4;
1949
1950     ret = StretchDIBits( hdc,  10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1951     ok(ret == 4, "got %d\n", ret);
1952     ret = StretchDIBits( hdc,  20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1953     ok(ret == -4, "got %d\n", ret);
1954     ret = StretchDIBits( hdc,  30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1955     ok(ret == 4, "got %d\n", ret);
1956     ret = StretchDIBits( hdc,  40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1957     ok(ret == -4, "got %d\n", ret);
1958     ret = StretchDIBits( hdc,  50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY );
1959     ok(ret == 4, "got %d\n", ret);
1960     ret = StretchDIBits( hdc,  60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND );
1961     ok(ret == -4, "got %d\n", ret);
1962
1963     compare_hash_broken_todo( bmi, bits, sha1, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
1964     memset(bits, 0xcc, dib_size);
1965
1966     /* Solid colors */
1967     for (i = 0; i < 256; i++)
1968     {
1969         solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) );
1970         solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) );
1971         solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1972         solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
1973     }
1974
1975     /* A few extra colors that are interesting in the 1bpp case */
1976
1977     /* bk color */
1978     solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
1979     solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
1980
1981     /* color 0 */
1982     solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
1983     solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
1984
1985     /* color 1 */
1986     solid_patblt( hdc,  8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
1987     solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
1988
1989     compare_hash(bmi, bits, sha1, "Colors");
1990     memset(bits, 0xcc, dib_size);
1991
1992     for (i = 0; i < 256; i++)
1993     {
1994         COLORREF s, g;
1995         s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) );
1996         g = GetPixel( hdc, i * 2, 10 );
1997         ok( s == g, "got %08x and %08x\n", s, g );
1998
1999         s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) );
2000         g = GetPixel( hdc, i * 2, 20 );
2001         ok( s == g, "got %08x and %08x\n", s, g );
2002
2003         s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2004         g = GetPixel( hdc, i * 2, 30 );
2005         ok( s == g, "got %08x and %08x\n", s, g );
2006
2007         s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) );
2008         g = GetPixel( hdc, i * 2, 40 );
2009         ok( s == g, "got %08x and %08x\n", s, g );
2010     }
2011
2012     compare_hash(bmi, bits, sha1, "SetPixel");
2013     memset(bits, 0xcc, dib_size);
2014
2015     SelectObject(hdc, orig_brush);
2016     SelectObject(hdc, orig_pen);
2017     DeleteObject(hrgn);
2018     DeleteObject(dib_brush);
2019     DeleteObject(dashed_pen);
2020     DeleteObject(solid_brush);
2021     DeleteObject(solid_pen);
2022 }
2023
2024 static void test_simple_graphics(void)
2025 {
2026     char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2027     BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2028     RGBQUAD *colors = bmi->bmiColors;
2029     DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2030     HDC mem_dc;
2031     BYTE *bits;
2032     HBITMAP dib, orig_bm;
2033     const char **sha1;
2034     DIBSECTION ds;
2035     int i;
2036
2037     mem_dc = CreateCompatibleDC(NULL);
2038
2039     /* a8r8g8b8 */
2040     trace("8888\n");
2041     memset(bmi, 0, sizeof(bmibuf));
2042     bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2043     bmi->bmiHeader.biHeight = 512;
2044     bmi->bmiHeader.biWidth = 512;
2045     bmi->bmiHeader.biBitCount = 32;
2046     bmi->bmiHeader.biPlanes = 1;
2047     bmi->bmiHeader.biCompression = BI_RGB;
2048
2049     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2050     ok(dib != NULL, "ret NULL\n");
2051     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2052     ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2053     ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2054     ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2055     ok(ds.dsBmih.biCompression == BI_RGB ||
2056        broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2057        "got %x\n", ds.dsBmih.biCompression);
2058
2059     orig_bm = SelectObject(mem_dc, dib);
2060
2061     dst_format = "8888";
2062     sha1 = sha1_graphics_a8r8g8b8;
2063     draw_graphics(mem_dc, bmi, bits, &sha1);
2064
2065     SelectObject(mem_dc, orig_bm);
2066     DeleteObject(dib);
2067
2068     /* a8r8g8b8 - bitfields.  Should be the same as the regular 32 bit case.*/
2069     trace("8888 - bitfields\n");
2070     bmi->bmiHeader.biBitCount = 32;
2071     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2072     bit_fields[0] = 0xff0000;
2073     bit_fields[1] = 0x00ff00;
2074     bit_fields[2] = 0x0000ff;
2075
2076     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2077     ok(dib != NULL, "ret NULL\n");
2078     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2079     ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2080     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2081     ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2082     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2083
2084     orig_bm = SelectObject(mem_dc, dib);
2085
2086     dst_format = "8888 - bitfields";
2087     sha1 = sha1_graphics_a8r8g8b8;
2088     draw_graphics(mem_dc, bmi, bits, &sha1);
2089
2090     SelectObject(mem_dc, orig_bm);
2091     DeleteObject(dib);
2092
2093     /* a8b8g8r8. */
2094     trace("a8b8g8r8\n");
2095     bmi->bmiHeader.biBitCount = 32;
2096     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2097     bit_fields[0] = 0x0000ff;
2098     bit_fields[1] = 0x00ff00;
2099     bit_fields[2] = 0xff0000;
2100
2101     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2102     ok(dib != NULL, "ret NULL\n");
2103     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2104     ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2105     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2106     ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2107     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2108
2109     orig_bm = SelectObject(mem_dc, dib);
2110
2111     dst_format = "a8b8g8r8";
2112     sha1 = sha1_graphics_a8b8g8r8;
2113     draw_graphics(mem_dc, bmi, bits, &sha1);
2114
2115     SelectObject(mem_dc, orig_bm);
2116     DeleteObject(dib);
2117
2118     /* r10g10b10. */
2119     trace("r10g10b10\n");
2120     bmi->bmiHeader.biBitCount = 32;
2121     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2122     bit_fields[0] = 0x3ff00000;
2123     bit_fields[1] = 0x000ffc00;
2124     bit_fields[2] = 0x000003ff;
2125
2126     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2127     ok(dib != NULL, "ret NULL\n");
2128     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2129     ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2130     ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2131     ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2132     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2133
2134     orig_bm = SelectObject(mem_dc, dib);
2135
2136     dst_format = "r10g10b10";
2137     sha1 = sha1_graphics_r10g10b10;
2138     draw_graphics(mem_dc, bmi, bits, &sha1);
2139
2140     SelectObject(mem_dc, orig_bm);
2141     DeleteObject(dib);
2142
2143     /* r6g6b6. */
2144     trace("r6g6b6\n");
2145     bmi->bmiHeader.biBitCount = 32;
2146     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2147     bit_fields[0] = 0x0003f000;
2148     bit_fields[1] = 0x00000fc0;
2149     bit_fields[2] = 0x0000003f;
2150
2151     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2152     ok(dib != NULL, "ret NULL\n");
2153     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2154     ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2155     ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2156     ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2157     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2158
2159     orig_bm = SelectObject(mem_dc, dib);
2160
2161     dst_format = "r6g6b6";
2162     sha1 = sha1_graphics_r6g6b6;
2163     draw_graphics(mem_dc, bmi, bits, &sha1);
2164
2165     SelectObject(mem_dc, orig_bm);
2166     DeleteObject(dib);
2167
2168     /* 24 */
2169     trace("24\n");
2170     bmi->bmiHeader.biBitCount = 24;
2171     bmi->bmiHeader.biCompression = BI_RGB;
2172
2173     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2174     ok(dib != NULL, "ret NULL\n");
2175     orig_bm = SelectObject(mem_dc, dib);
2176
2177     dst_format = "24";
2178     sha1 = sha1_graphics_24;
2179     draw_graphics(mem_dc, bmi, bits, &sha1);
2180
2181     SelectObject(mem_dc, orig_bm);
2182     DeleteObject(dib);
2183
2184     /* r5g5b5 */
2185     trace("555\n");
2186     bmi->bmiHeader.biBitCount = 16;
2187     bmi->bmiHeader.biCompression = BI_RGB;
2188
2189     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2190     ok(dib != NULL, "ret NULL\n");
2191     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2192     ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2193     ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2194     ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2195     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2196
2197     orig_bm = SelectObject(mem_dc, dib);
2198
2199     dst_format = "r5g5b5";
2200     sha1 = sha1_graphics_r5g5b5;
2201     draw_graphics(mem_dc, bmi, bits, &sha1);
2202
2203     SelectObject(mem_dc, orig_bm);
2204     DeleteObject(dib);
2205
2206     /* r4g4b4 */
2207     trace("444\n");
2208     bmi->bmiHeader.biBitCount = 16;
2209     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2210     bit_fields[0] = 0x0f00;
2211     bit_fields[1] = 0x00f0;
2212     bit_fields[2] = 0x000f;
2213     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2214     ok(dib != NULL, "ret NULL\n");
2215     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2216     ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2217     ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2218     ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2219     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2220
2221     orig_bm = SelectObject(mem_dc, dib);
2222
2223     dst_format = "r4g4b4";
2224     sha1 = sha1_graphics_r4g4b4;
2225     draw_graphics(mem_dc, bmi, bits, &sha1);
2226
2227     SelectObject(mem_dc, orig_bm);
2228     DeleteObject(dib);
2229
2230     /* 8 color */
2231     trace("8 color\n");
2232     bmi->bmiHeader.biBitCount = 8;
2233     bmi->bmiHeader.biCompression = BI_RGB;
2234     bmi->bmiHeader.biClrUsed = 236;
2235     for (i = 0; i < 236; i++)
2236     {
2237         colors[i].rgbRed   = (i & 0x07) << 5;
2238         colors[i].rgbGreen = (i & 0x38) << 2;
2239         colors[i].rgbBlue  =  i & 0xc0;
2240     }
2241     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2242     ok(dib != NULL, "ret NULL\n");
2243
2244     orig_bm = SelectObject(mem_dc, dib);
2245
2246     dst_format = "8 color";
2247     sha1 = sha1_graphics_8_color;
2248     draw_graphics(mem_dc, bmi, bits, &sha1);
2249
2250     SelectObject(mem_dc, orig_bm);
2251     DeleteObject(dib);
2252
2253     /* 8 grayscale */
2254     trace("8 grayscale\n");
2255     bmi->bmiHeader.biBitCount = 8;
2256     bmi->bmiHeader.biCompression = BI_RGB;
2257     bmi->bmiHeader.biClrUsed = 256;
2258     for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2259
2260     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2261     ok(dib != NULL, "ret NULL\n");
2262
2263     orig_bm = SelectObject(mem_dc, dib);
2264
2265     dst_format = "8 grayscale";
2266     sha1 = sha1_graphics_8_grayscale;
2267     draw_graphics(mem_dc, bmi, bits, &sha1);
2268
2269     SelectObject(mem_dc, orig_bm);
2270     DeleteObject(dib);
2271
2272     /* 8 */
2273     trace("8\n");
2274     bmi->bmiHeader.biBitCount = 8;
2275     bmi->bmiHeader.biCompression = BI_RGB;
2276     bmi->bmiHeader.biClrUsed = 5;
2277     colors[0].rgbRed = 0xff;
2278     colors[0].rgbGreen = 0xff;
2279     colors[0].rgbBlue = 0xff;
2280     colors[1].rgbRed = 0;
2281     colors[1].rgbGreen = 0;
2282     colors[1].rgbBlue = 0;
2283     colors[2].rgbRed = 0xff;
2284     colors[2].rgbGreen = 0;
2285     colors[2].rgbBlue = 0;
2286     colors[3].rgbRed = 0;
2287     colors[3].rgbGreen = 0xff;
2288     colors[3].rgbBlue = 0;
2289     colors[4].rgbRed = 0;
2290     colors[4].rgbGreen = 0;
2291     colors[4].rgbBlue = 0xff;
2292
2293     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2294     ok(dib != NULL, "ret NULL\n");
2295
2296     orig_bm = SelectObject(mem_dc, dib);
2297
2298     dst_format = "8";
2299     sha1 = sha1_graphics_8;
2300     draw_graphics(mem_dc, bmi, bits, &sha1);
2301
2302     SelectObject(mem_dc, orig_bm);
2303     DeleteObject(dib);
2304
2305     /* 4 */
2306     trace("4\n");
2307     bmi->bmiHeader.biBitCount = 4;
2308
2309     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2310     ok(dib != NULL, "ret NULL\n");
2311
2312     orig_bm = SelectObject(mem_dc, dib);
2313
2314     dst_format = "4";
2315     sha1 = sha1_graphics_4;
2316     draw_graphics(mem_dc, bmi, bits, &sha1);
2317
2318     SelectObject(mem_dc, orig_bm);
2319     DeleteObject(dib);
2320
2321     /* 4 grayscale */
2322     trace("4 grayscale\n");
2323     bmi->bmiHeader.biClrUsed = 16;
2324     for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2325
2326     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2327     ok(dib != NULL, "ret NULL\n");
2328
2329     orig_bm = SelectObject(mem_dc, dib);
2330
2331     dst_format = "4 grayscale";
2332     sha1 = sha1_graphics_4_grayscale;
2333     draw_graphics(mem_dc, bmi, bits, &sha1);
2334
2335     SelectObject(mem_dc, orig_bm);
2336     DeleteObject(dib);
2337
2338     /* 1 */
2339     trace("1\n");
2340     bmi->bmiHeader.biBitCount = 1;
2341     bmi->bmiHeader.biClrUsed = 2;
2342
2343     colors[0].rgbRed = 0x00;
2344     colors[0].rgbGreen = 0x01;
2345     colors[0].rgbBlue = 0xff;
2346     colors[1].rgbRed = 0xff;
2347     colors[1].rgbGreen = 0x00;
2348     colors[1].rgbBlue = 0x00;
2349
2350     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2351     ok(dib != NULL, "ret NULL\n");
2352
2353     orig_bm = SelectObject(mem_dc, dib);
2354
2355     dst_format = "1";
2356     sha1 = sha1_graphics_1;
2357     draw_graphics(mem_dc, bmi, bits, &sha1);
2358
2359     SelectObject(mem_dc, orig_bm);
2360     DeleteObject(dib);
2361
2362     DeleteDC(mem_dc);
2363 }
2364
2365 START_TEST(dib)
2366 {
2367     HMODULE mod = GetModuleHandleA("gdi32.dll");
2368     pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2369     pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2370
2371     CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2372
2373     test_simple_graphics();
2374
2375     CryptReleaseContext(crypt_prov, 0);
2376 }