dinput: Stub IDirectInputJoyConfig8 interface.
[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 const BYTE ramp[17] =
2025 {
2026     0,    0x4d, 0x68, 0x7c,
2027     0x8c, 0x9a, 0xa7, 0xb2,
2028     0xbd, 0xc7, 0xd0, 0xd9,
2029     0xe1, 0xe9, 0xf0, 0xf8,
2030     0xff
2031 };
2032
2033 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2034 {
2035     *min_comp = (ramp[alpha] * text_comp) / 0xff;
2036     *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2037 }
2038
2039 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
2040 {
2041     BYTE min_comp, max_comp;
2042
2043     if (alpha == 16)  return text;
2044     if (alpha <= 1)   return dst;
2045     if (text == dst)  return dst;
2046
2047     get_range( alpha, text, &min_comp, &max_comp );
2048
2049     if (dst > text)
2050     {
2051         DWORD diff = dst - text;
2052         DWORD range = max_comp - text;
2053         dst = text + (diff * range ) / (0xff - text);
2054         return dst;
2055     }
2056     else
2057     {
2058         DWORD diff = text - dst;
2059         DWORD range = text - min_comp ;
2060         dst = text - (diff * range) / text;
2061         return dst;
2062     }
2063 }
2064
2065 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph )
2066 {
2067     COLORREF ret;
2068
2069     ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2070                aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2071                aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2072     return ret;
2073 }
2074
2075 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2076
2077 static void draw_text_2( HDC hdc, BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2078 {
2079     DWORD dib_size = get_dib_size(bmi), ret;
2080     LOGFONT lf;
2081     HFONT font;
2082     GLYPHMETRICS gm;
2083     BYTE g_buf[10000];
2084     int i, stride, x, y;
2085     static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2086     char *eto_hash = NULL, *diy_hash = NULL;
2087     static const char *str = "Hello Wine";
2088     POINT origin, g_org;
2089     static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2090     TEXTMETRIC tm;
2091     COLORREF text_color;
2092
2093     for(i = 0; i < dib_size; i++)
2094         bits[i] = vals[i % 4];
2095
2096     memset( &lf, 0, sizeof(lf) );
2097     strcpy( lf.lfFaceName, "Tahoma" );
2098     lf.lfHeight = 24;
2099     lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY;
2100
2101     font = CreateFontIndirect( &lf );
2102     font = SelectObject( hdc, font );
2103
2104     GetTextMetrics( hdc, &tm );
2105     if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2106     {
2107         skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2108         DeleteObject( SelectObject( hdc, font ) );
2109         return;
2110     }
2111
2112     SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2113     SetTextAlign( hdc, TA_BASELINE );
2114     SetBkMode( hdc, TRANSPARENT );
2115     origin.x = 10;
2116     origin.y = 100;
2117
2118     ExtTextOut( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2119     eto_hash = hash_dib( bmi, bits );
2120
2121     for(i = 0; i < dib_size; i++)
2122         bits[i] = vals[i % 4];
2123
2124     if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2125
2126     text_color = GetTextColor( hdc );
2127     for (i = 0; i < strlen(str); i++)
2128     {
2129         DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2130
2131         ret = GetGlyphOutline( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2132
2133         if (ret == GDI_ERROR) continue;
2134
2135         if (ret) GetGlyphOutline( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2136
2137         g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2138         g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2139
2140         origin.x += gm.gmCellIncX;
2141         origin.y += gm.gmCellIncY;
2142
2143         if (!ret) continue;
2144
2145         if (aa)
2146         {
2147             stride = (gm.gmBlackBoxX + 3) & ~3;
2148
2149             for (y = 0; y < gm.gmBlackBoxY; y++)
2150             {
2151                 BYTE *g_ptr = g_buf + y * stride;
2152                 COLORREF val;
2153
2154                 for (x = 0; x < gm.gmBlackBoxX; x++)
2155                 {
2156                     if (g_ptr[x] <= 1) continue;
2157                     if (g_ptr[x] >= 16) val = text_color;
2158                     else
2159                     {
2160                         val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2161                         val = aa_colorref( val, text_color, g_ptr[x] );
2162                     }
2163                     SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2164                 }
2165             }
2166         }
2167         else
2168         {
2169             stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2170
2171             for (y = 0; y < gm.gmBlackBoxY; y++)
2172             {
2173                 BYTE *g_ptr = g_buf + y * stride;
2174                 for (x = 0; x < gm.gmBlackBoxX; x++)
2175                 {
2176                     if (g_ptr[x / 8] & masks[x % 8])
2177                         SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2178                 }
2179             }
2180         }
2181     }
2182
2183     diy_hash = hash_dib( bmi, bits );
2184     ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2185
2186     HeapFree( GetProcessHeap(), 0, diy_hash );
2187     HeapFree( GetProcessHeap(), 0, eto_hash );
2188
2189     font = SelectObject( hdc, font );
2190     DeleteObject( font );
2191 }
2192
2193 static void draw_text( HDC hdc, BITMAPINFO *bmi, BYTE *bits )
2194 {
2195     draw_text_2( hdc, bmi, bits, FALSE );
2196
2197     /* Rounding errors make these cases hard to test */
2198     if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2199         (bmi->bmiHeader.biBitCount == 16))
2200         return;
2201
2202     draw_text_2( hdc, bmi, bits, TRUE );
2203 }
2204
2205 static void test_simple_graphics(void)
2206 {
2207     char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2208     BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2209     RGBQUAD *colors = bmi->bmiColors;
2210     DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2211     HDC mem_dc;
2212     BYTE *bits;
2213     HBITMAP dib, orig_bm;
2214     const char **sha1;
2215     DIBSECTION ds;
2216     int i;
2217
2218     mem_dc = CreateCompatibleDC(NULL);
2219
2220     /* a8r8g8b8 */
2221     trace("8888\n");
2222     memset(bmi, 0, sizeof(bmibuf));
2223     bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2224     bmi->bmiHeader.biHeight = 512;
2225     bmi->bmiHeader.biWidth = 512;
2226     bmi->bmiHeader.biBitCount = 32;
2227     bmi->bmiHeader.biPlanes = 1;
2228     bmi->bmiHeader.biCompression = BI_RGB;
2229
2230     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2231     ok(dib != NULL, "ret NULL\n");
2232     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2233     ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2234     ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2235     ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2236     ok(ds.dsBmih.biCompression == BI_RGB ||
2237        broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2238        "got %x\n", ds.dsBmih.biCompression);
2239
2240     orig_bm = SelectObject(mem_dc, dib);
2241
2242     dst_format = "8888";
2243     sha1 = sha1_graphics_a8r8g8b8;
2244     draw_graphics(mem_dc, bmi, bits, &sha1);
2245     draw_text(mem_dc, bmi, bits);
2246
2247     SelectObject(mem_dc, orig_bm);
2248     DeleteObject(dib);
2249
2250     /* a8r8g8b8 - bitfields.  Should be the same as the regular 32 bit case.*/
2251     trace("8888 - bitfields\n");
2252     bmi->bmiHeader.biBitCount = 32;
2253     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2254     bit_fields[0] = 0xff0000;
2255     bit_fields[1] = 0x00ff00;
2256     bit_fields[2] = 0x0000ff;
2257
2258     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2259     ok(dib != NULL, "ret NULL\n");
2260     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2261     ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2262     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2263     ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2264     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2265
2266     orig_bm = SelectObject(mem_dc, dib);
2267
2268     dst_format = "8888 - bitfields";
2269     sha1 = sha1_graphics_a8r8g8b8;
2270     draw_graphics(mem_dc, bmi, bits, &sha1);
2271     draw_text(mem_dc, bmi, bits);
2272
2273     SelectObject(mem_dc, orig_bm);
2274     DeleteObject(dib);
2275
2276     /* a8b8g8r8. */
2277     trace("a8b8g8r8\n");
2278     bmi->bmiHeader.biBitCount = 32;
2279     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2280     bit_fields[0] = 0x0000ff;
2281     bit_fields[1] = 0x00ff00;
2282     bit_fields[2] = 0xff0000;
2283
2284     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2285     ok(dib != NULL, "ret NULL\n");
2286     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2287     ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2288     ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2289     ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2290     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2291
2292     orig_bm = SelectObject(mem_dc, dib);
2293
2294     dst_format = "a8b8g8r8";
2295     sha1 = sha1_graphics_a8b8g8r8;
2296     draw_graphics(mem_dc, bmi, bits, &sha1);
2297     draw_text(mem_dc, bmi, bits);
2298
2299     SelectObject(mem_dc, orig_bm);
2300     DeleteObject(dib);
2301
2302     /* r10g10b10. */
2303     trace("r10g10b10\n");
2304     bmi->bmiHeader.biBitCount = 32;
2305     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2306     bit_fields[0] = 0x3ff00000;
2307     bit_fields[1] = 0x000ffc00;
2308     bit_fields[2] = 0x000003ff;
2309
2310     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2311     ok(dib != NULL, "ret NULL\n");
2312     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2313     ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2314     ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2315     ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2316     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2317
2318     orig_bm = SelectObject(mem_dc, dib);
2319
2320     dst_format = "r10g10b10";
2321     sha1 = sha1_graphics_r10g10b10;
2322     draw_graphics(mem_dc, bmi, bits, &sha1);
2323     draw_text(mem_dc, bmi, bits);
2324
2325     SelectObject(mem_dc, orig_bm);
2326     DeleteObject(dib);
2327
2328     /* r6g6b6. */
2329     trace("r6g6b6\n");
2330     bmi->bmiHeader.biBitCount = 32;
2331     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2332     bit_fields[0] = 0x0003f000;
2333     bit_fields[1] = 0x00000fc0;
2334     bit_fields[2] = 0x0000003f;
2335
2336     dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2337     ok(dib != NULL, "ret NULL\n");
2338     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2339     ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2340     ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2341     ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2342     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2343
2344     orig_bm = SelectObject(mem_dc, dib);
2345
2346     dst_format = "r6g6b6";
2347     sha1 = sha1_graphics_r6g6b6;
2348     draw_graphics(mem_dc, bmi, bits, &sha1);
2349     draw_text(mem_dc, bmi, bits);
2350
2351     SelectObject(mem_dc, orig_bm);
2352     DeleteObject(dib);
2353
2354     /* 24 */
2355     trace("24\n");
2356     bmi->bmiHeader.biBitCount = 24;
2357     bmi->bmiHeader.biCompression = BI_RGB;
2358
2359     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2360     ok(dib != NULL, "ret NULL\n");
2361     orig_bm = SelectObject(mem_dc, dib);
2362
2363     dst_format = "24";
2364     sha1 = sha1_graphics_24;
2365     draw_graphics(mem_dc, bmi, bits, &sha1);
2366     draw_text(mem_dc, bmi, bits);
2367
2368     SelectObject(mem_dc, orig_bm);
2369     DeleteObject(dib);
2370
2371     /* r5g5b5 */
2372     trace("555\n");
2373     bmi->bmiHeader.biBitCount = 16;
2374     bmi->bmiHeader.biCompression = BI_RGB;
2375
2376     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2377     ok(dib != NULL, "ret NULL\n");
2378     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2379     ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2380     ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2381     ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2382     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2383
2384     orig_bm = SelectObject(mem_dc, dib);
2385
2386     dst_format = "r5g5b5";
2387     sha1 = sha1_graphics_r5g5b5;
2388     draw_graphics(mem_dc, bmi, bits, &sha1);
2389     draw_text(mem_dc, bmi, bits);
2390
2391     SelectObject(mem_dc, orig_bm);
2392     DeleteObject(dib);
2393
2394     /* r4g4b4 */
2395     trace("444\n");
2396     bmi->bmiHeader.biBitCount = 16;
2397     bmi->bmiHeader.biCompression = BI_BITFIELDS;
2398     bit_fields[0] = 0x0f00;
2399     bit_fields[1] = 0x00f0;
2400     bit_fields[2] = 0x000f;
2401     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2402     ok(dib != NULL, "ret NULL\n");
2403     ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2404     ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2405     ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2406     ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2407     ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2408
2409     orig_bm = SelectObject(mem_dc, dib);
2410
2411     dst_format = "r4g4b4";
2412     sha1 = sha1_graphics_r4g4b4;
2413     draw_graphics(mem_dc, bmi, bits, &sha1);
2414     draw_text(mem_dc, bmi, bits);
2415
2416     SelectObject(mem_dc, orig_bm);
2417     DeleteObject(dib);
2418
2419     /* 8 color */
2420     trace("8 color\n");
2421     bmi->bmiHeader.biBitCount = 8;
2422     bmi->bmiHeader.biCompression = BI_RGB;
2423     bmi->bmiHeader.biClrUsed = 236;
2424     for (i = 0; i < 236; i++)
2425     {
2426         colors[i].rgbRed   = (i & 0x07) << 5;
2427         colors[i].rgbGreen = (i & 0x38) << 2;
2428         colors[i].rgbBlue  =  i & 0xc0;
2429     }
2430     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2431     ok(dib != NULL, "ret NULL\n");
2432
2433     orig_bm = SelectObject(mem_dc, dib);
2434
2435     dst_format = "8 color";
2436     sha1 = sha1_graphics_8_color;
2437     draw_graphics(mem_dc, bmi, bits, &sha1);
2438     draw_text(mem_dc, bmi, bits);
2439
2440     SelectObject(mem_dc, orig_bm);
2441     DeleteObject(dib);
2442
2443     /* 8 grayscale */
2444     trace("8 grayscale\n");
2445     bmi->bmiHeader.biBitCount = 8;
2446     bmi->bmiHeader.biCompression = BI_RGB;
2447     bmi->bmiHeader.biClrUsed = 256;
2448     for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2449
2450     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2451     ok(dib != NULL, "ret NULL\n");
2452
2453     orig_bm = SelectObject(mem_dc, dib);
2454
2455     dst_format = "8 grayscale";
2456     sha1 = sha1_graphics_8_grayscale;
2457     draw_graphics(mem_dc, bmi, bits, &sha1);
2458     draw_text(mem_dc, bmi, bits);
2459
2460     SelectObject(mem_dc, orig_bm);
2461     DeleteObject(dib);
2462
2463     /* 8 */
2464     trace("8\n");
2465     bmi->bmiHeader.biBitCount = 8;
2466     bmi->bmiHeader.biCompression = BI_RGB;
2467     bmi->bmiHeader.biClrUsed = 5;
2468     colors[0].rgbRed = 0xff;
2469     colors[0].rgbGreen = 0xff;
2470     colors[0].rgbBlue = 0xff;
2471     colors[1].rgbRed = 0;
2472     colors[1].rgbGreen = 0;
2473     colors[1].rgbBlue = 0;
2474     colors[2].rgbRed = 0xff;
2475     colors[2].rgbGreen = 0;
2476     colors[2].rgbBlue = 0;
2477     colors[3].rgbRed = 0;
2478     colors[3].rgbGreen = 0xff;
2479     colors[3].rgbBlue = 0;
2480     colors[4].rgbRed = 0;
2481     colors[4].rgbGreen = 0;
2482     colors[4].rgbBlue = 0xff;
2483
2484     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2485     ok(dib != NULL, "ret NULL\n");
2486
2487     orig_bm = SelectObject(mem_dc, dib);
2488
2489     dst_format = "8";
2490     sha1 = sha1_graphics_8;
2491     draw_graphics(mem_dc, bmi, bits, &sha1);
2492     draw_text(mem_dc, bmi, bits);
2493
2494     SelectObject(mem_dc, orig_bm);
2495     DeleteObject(dib);
2496
2497     /* 4 */
2498     trace("4\n");
2499     bmi->bmiHeader.biBitCount = 4;
2500
2501     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2502     ok(dib != NULL, "ret NULL\n");
2503
2504     orig_bm = SelectObject(mem_dc, dib);
2505
2506     dst_format = "4";
2507     sha1 = sha1_graphics_4;
2508     draw_graphics(mem_dc, bmi, bits, &sha1);
2509     draw_text(mem_dc, bmi, bits);
2510
2511     SelectObject(mem_dc, orig_bm);
2512     DeleteObject(dib);
2513
2514     /* 4 grayscale */
2515     trace("4 grayscale\n");
2516     bmi->bmiHeader.biClrUsed = 16;
2517     for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2518
2519     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2520     ok(dib != NULL, "ret NULL\n");
2521
2522     orig_bm = SelectObject(mem_dc, dib);
2523
2524     dst_format = "4 grayscale";
2525     sha1 = sha1_graphics_4_grayscale;
2526     draw_graphics(mem_dc, bmi, bits, &sha1);
2527     draw_text(mem_dc, bmi, bits);
2528
2529     SelectObject(mem_dc, orig_bm);
2530     DeleteObject(dib);
2531
2532     /* 1 */
2533     trace("1\n");
2534     bmi->bmiHeader.biBitCount = 1;
2535     bmi->bmiHeader.biClrUsed = 2;
2536
2537     colors[0].rgbRed = 0x00;
2538     colors[0].rgbGreen = 0x01;
2539     colors[0].rgbBlue = 0xff;
2540     colors[1].rgbRed = 0xff;
2541     colors[1].rgbGreen = 0x00;
2542     colors[1].rgbBlue = 0x00;
2543
2544     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2545     ok(dib != NULL, "ret NULL\n");
2546
2547     orig_bm = SelectObject(mem_dc, dib);
2548
2549     dst_format = "1";
2550     sha1 = sha1_graphics_1;
2551     draw_graphics(mem_dc, bmi, bits, &sha1);
2552     draw_text(mem_dc, bmi, bits);
2553
2554     SelectObject(mem_dc, orig_bm);
2555     DeleteObject(dib);
2556
2557     DeleteDC(mem_dc);
2558 }
2559
2560 START_TEST(dib)
2561 {
2562     HMODULE mod = GetModuleHandleA("gdi32.dll");
2563     pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2564     pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2565
2566     CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2567
2568     test_simple_graphics();
2569
2570     CryptReleaseContext(crypt_prov, 0);
2571 }