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