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 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;
1112 blend.BlendOp = AC_SRC_OVER;
1113 blend.BlendFlags = 0;
1115 memset(bits, 0xcc, dib_size);
1116 compare_hash(bmi, bits, sha1, "empty");
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);
1123 /* horizontal and vertical lines */
1124 for(i = 1; i <= 16; 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 */
1136 compare_hash(bmi, bits, sha1, "h and v solid lines");
1137 memset(bits, 0xcc, dib_size);
1139 /* diagonal lines */
1140 SetROP2(hdc, R2_COPYPEN);
1141 for(i = 0; i < 16; i++)
1143 double s = sin(M_PI * i / 8.0);
1144 double c = cos(M_PI * i / 8.0);
1146 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1147 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1149 compare_hash(bmi, bits, sha1, "diagonal solid lines");
1150 memset(bits, 0xcc, dib_size);
1152 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1154 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL);
1155 LineTo(hdc, bias_check[i].right, bias_check[i].bottom);
1157 compare_hash(bmi, bits, sha1, "more diagonal solid lines");
1158 memset(bits, 0xcc, dib_size);
1160 /* solid brush PatBlt */
1161 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1162 orig_brush = SelectObject(hdc, solid_brush);
1164 for(i = 0, y = 10; i < 256; i++)
1166 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1168 if(rop_uses_src(rop3[i]))
1169 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1172 ok(ret, "got FALSE for %x\n", rop3[i]);
1177 compare_hash(bmi, bits, sha1, "solid patblt");
1178 memset(bits, 0xcc, dib_size);
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);
1189 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1191 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1192 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1194 compare_hash(bmi, bits, sha1, "clipped solid hlines");
1195 memset(bits, 0xcc, dib_size);
1197 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1199 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1200 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1202 compare_hash(bmi, bits, sha1, "clipped solid vlines");
1203 memset(bits, 0xcc, dib_size);
1205 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1207 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1208 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1210 compare_hash(bmi, bits, sha1, "clipped solid diagonal lines");
1211 memset(bits, 0xcc, dib_size);
1213 /* clipped PatBlt */
1214 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
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);
1220 compare_hash(bmi, bits, sha1, "clipped patblt");
1221 memset(bits, 0xcc, dib_size);
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));
1229 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1231 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL);
1232 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom);
1234 compare_hash(bmi, bits, sha1, "clipped dashed hlines");
1235 memset(bits, 0xcc, dib_size);
1237 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
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);
1242 compare_hash(bmi, bits, sha1, "clipped dashed hlines r -> l");
1243 memset(bits, 0xcc, dib_size);
1245 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1247 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL);
1248 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom);
1250 compare_hash(bmi, bits, sha1, "clipped dashed vlines");
1251 memset(bits, 0xcc, dib_size);
1253 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
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);
1258 compare_hash(bmi, bits, sha1, "clipped dashed vlines b -> t");
1259 memset(bits, 0xcc, dib_size);
1261 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1263 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1264 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1266 compare_hash(bmi, bits, sha1, "clipped dashed diagonal lines");
1267 memset(bits, 0xcc, dib_size);
1269 SetBkMode(hdc, OPAQUE);
1271 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1273 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL);
1274 LineTo(hdc, line_clips[i].right, line_clips[i].bottom);
1276 compare_hash(bmi, bits, sha1, "clipped opaque dashed diagonal lines");
1277 memset(bits, 0xcc, dib_size);
1279 ExtSelectClipRgn(hdc, NULL, RGN_COPY);
1281 /* 8888 DIB pattern brush */
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;
1293 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1295 SelectObject(hdc, dib_brush);
1296 SetBrushOrgEx(hdc, 1, 1, NULL);
1298 for(i = 0, y = 10; i < 256; i++)
1300 if(!rop_uses_src(rop3[i]))
1302 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1303 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
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);
1313 SelectObject(hdc, orig_brush);
1314 DeleteObject(dib_brush);
1316 /* 8888 bottom-up DIB pattern brush */
1318 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1320 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1322 SelectObject(hdc, dib_brush);
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);
1329 for(i = 0, y = 10; i < 256; i++)
1331 if(!rop_uses_src(rop3[i]))
1333 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1334 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
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);
1344 SelectObject(hdc, orig_brush);
1345 DeleteObject(dib_brush);
1347 /* 24 bpp dib pattern brush */
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;
1355 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1357 SelectObject(hdc, dib_brush);
1358 SetBrushOrgEx(hdc, 1, 1, NULL);
1360 for(i = 0, y = 10; i < 256; i++)
1362 if(!rop_uses_src(rop3[i]))
1364 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1365 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
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);
1375 SelectObject(hdc, orig_brush);
1376 DeleteObject(dib_brush);
1378 /* 555 dib pattern brush */
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;
1386 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1388 SelectObject(hdc, dib_brush);
1389 SetBrushOrgEx(hdc, 1, 1, NULL);
1391 for(i = 0, y = 10; i < 256; i++)
1393 if(!rop_uses_src(rop3[i]))
1395 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1396 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
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);
1406 SelectObject(hdc, orig_brush);
1407 DeleteObject(dib_brush);
1409 SetBrushOrgEx(hdc, 0, 0, NULL);
1411 /* 8 bpp dib pattern brush */
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;
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;
1427 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1429 SelectObject(hdc, dib_brush);
1430 SetBrushOrgEx(hdc, 1, 1, NULL);
1432 for(i = 0, y = 10; i < 256; i++)
1434 if(!rop_uses_src(rop3[i]))
1436 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1437 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
1444 SelectObject(hdc, orig_brush);
1445 DeleteObject(dib_brush);
1447 /* 4 bpp dib pattern brush */
1449 brush_bi->bmiHeader = dib_brush_header_4;
1450 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1452 SelectObject(hdc, dib_brush);
1453 SetBrushOrgEx(hdc, 1, 1, NULL);
1455 for(i = 0, y = 10; i < 256; i++)
1457 if(!rop_uses_src(rop3[i]))
1459 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1460 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
1467 SelectObject(hdc, orig_brush);
1468 DeleteObject(dib_brush);
1470 /* 1 bpp dib pattern brush */
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;
1479 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1480 SelectObject(hdc, dib_brush);
1481 for(i = 0, y = 10; i < 256; i++)
1483 if(!rop_uses_src(rop3[i]))
1485 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1486 ok(ret, "got FALSE for %x\n", rop3[i]);
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);
1494 SelectObject(hdc, orig_brush);
1495 SetBrushOrgEx(hdc, 0, 0, NULL);
1499 SelectObject(hdc, solid_pen);
1500 SelectObject(hdc, solid_brush);
1502 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1504 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom);
1507 SelectObject(hdc, dashed_pen);
1508 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1510 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150);
1513 compare_hash(bmi, bits, sha1, "rectangles");
1514 memset(bits, 0xcc, dib_size);
1515 SelectObject(hdc, solid_pen);
1519 PaintRgn(hdc, hrgn);
1520 compare_hash(bmi, bits, sha1, "PaintRgn");
1521 memset(bits, 0xcc, dib_size);
1523 /* RTL rectangles */
1527 win_skip("Don't have SetLayout\n");
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);
1539 pSetLayout(hdc, LAYOUT_LTR);
1542 for(i = 0, y = 10; i < 256; i++)
1544 if(!rop_uses_src(rop3[i]))
1546 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
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);
1559 compare_hash_broken_todo(bmi, bits, sha1, "hatch brushes", 1, FALSE); /* nt4 is different */
1560 memset(bits, 0xcc, dib_size);
1562 /* overlapping blits */
1564 orig_brush = SelectObject(hdc, solid_brush);
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);
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);
1582 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, -y");
1583 memset(bits, 0xcc, dib_size);
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);
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 );
1601 compare_hash(bmi, bits, sha1, "overlapping BitBlt SRCCOPY -x, +y" );
1602 memset(bits, 0xcc, dib_size);
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);
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);
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);
1628 compare_hash(bmi, bits, sha1, "overlapping BitBlt PATPAINT +x, -y");
1629 memset(bits, 0xcc, dib_size);
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);
1639 /* blitting with 32-bpp BI_RGB source */
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++)
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 );
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 );
1664 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp SRCCOPY" );
1665 memset(bits, 0xcc, dib_size);
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 */
1672 if (!pGdiAlphaBlend) (*sha1) += 2;
1673 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 1, FALSE );
1677 if (!pGdiAlphaBlend) (*sha1)++;
1678 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp );
1680 memset(bits, 0xcc, dib_size);
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 */
1687 if (!pGdiAlphaBlend) (*sha1) += 2;
1688 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 1, FALSE );
1692 if (!pGdiAlphaBlend) (*sha1)++;
1693 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp );
1695 memset(bits, 0xcc, dib_size);
1697 /* blitting with 32-bpp r10g10b10 source */
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++)
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;
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 );
1719 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
1720 memset(bits, 0xcc, dib_size);
1722 /* blitting with 32-bpp b6g6r6 source */
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++)
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;
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 );
1744 compare_hash(bmi, bits, sha1, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
1745 memset(bits, 0xcc, dib_size);
1747 /* blitting with 24-bpp source */
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++)
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;
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 );
1765 compare_hash(bmi, bits, sha1, "BitBlt src 24-bpp SRCCOPY" );
1766 memset(bits, 0xcc, dib_size);
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 */
1773 if (!pGdiAlphaBlend) (*sha1) += 2;
1774 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 1, FALSE );
1778 if (!pGdiAlphaBlend) (*sha1)++;
1779 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 24-bpp", 0, dib_is_1bpp );
1781 memset(bits, 0xcc, dib_size);
1783 /* blitting with 16-bpp BI_RGB source */
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;
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 );
1797 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp SRCCOPY" );
1798 memset(bits, 0xcc, dib_size);
1800 /* blitting with 16-bpp b4g4r4 source */
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;
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 );
1817 compare_hash(bmi, bits, sha1, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
1818 memset(bits, 0xcc, dib_size);
1820 /* blitting with 8-bpp source */
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;
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);
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 */
1841 if (!pGdiAlphaBlend) (*sha1) += 2;
1842 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 1, FALSE );
1846 if (!pGdiAlphaBlend) (*sha1)++;
1847 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 8-bpp", 0, dib_is_1bpp );
1849 memset(bits, 0xcc, dib_size);
1851 /* blitting with 4-bpp source */
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;
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);
1866 /* blitting with 1-bpp source */
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;
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);
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 */
1886 if (!pGdiAlphaBlend) (*sha1) += 2;
1887 else compare_hash_broken_todo(bmi, bits, sha1, "AlphaBlend src 1-bpp", 1, FALSE );
1891 if (!pGdiAlphaBlend) (*sha1)++;
1892 else compare_hash(bmi, bits, sha1, "AlphaBlend src 1-bpp" );
1894 memset(bits, 0xcc, dib_size);
1897 DeleteObject( bmp );
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);
1909 for (i = 0; i < 256; i++)
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;
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);
1925 /* 32 bpp StretchDIBits */
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;
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);
1948 src_bi->bmiHeader.biHeight = -4;
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);
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);
1967 for (i = 0; i < 256; i++)
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 ) );
1975 /* A few extra colors that are interesting in the 1bpp case */
1978 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
1979 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 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 ) );
1986 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
1987 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
1989 compare_hash(bmi, bits, sha1, "Colors");
1990 memset(bits, 0xcc, dib_size);
1992 for (i = 0; i < 256; i++)
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 );
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 );
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 );
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 );
2012 compare_hash(bmi, bits, sha1, "SetPixel");
2013 memset(bits, 0xcc, dib_size);
2015 SelectObject(hdc, orig_brush);
2016 SelectObject(hdc, orig_pen);
2018 DeleteObject(dib_brush);
2019 DeleteObject(dashed_pen);
2020 DeleteObject(solid_brush);
2021 DeleteObject(solid_pen);
2024 static void test_simple_graphics(void)
2026 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2027 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2028 RGBQUAD *colors = bmi->bmiColors;
2029 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2032 HBITMAP dib, orig_bm;
2037 mem_dc = CreateCompatibleDC(NULL);
2041 memset(bmi, 0, sizeof(bmibuf));
2042 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2043 bmi->bmiHeader.biHeight = 512;
2044 bmi->bmiHeader.biWidth = 512;
2045 bmi->bmiHeader.biBitCount = 32;
2046 bmi->bmiHeader.biPlanes = 1;
2047 bmi->bmiHeader.biCompression = BI_RGB;
2049 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2050 ok(dib != NULL, "ret NULL\n");
2051 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2052 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2053 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2054 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2055 ok(ds.dsBmih.biCompression == BI_RGB ||
2056 broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */
2057 "got %x\n", ds.dsBmih.biCompression);
2059 orig_bm = SelectObject(mem_dc, dib);
2061 dst_format = "8888";
2062 sha1 = sha1_graphics_a8r8g8b8;
2063 draw_graphics(mem_dc, bmi, bits, &sha1);
2065 SelectObject(mem_dc, orig_bm);
2068 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2069 trace("8888 - bitfields\n");
2070 bmi->bmiHeader.biBitCount = 32;
2071 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2072 bit_fields[0] = 0xff0000;
2073 bit_fields[1] = 0x00ff00;
2074 bit_fields[2] = 0x0000ff;
2076 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2077 ok(dib != NULL, "ret NULL\n");
2078 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2079 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2080 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2081 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2082 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2084 orig_bm = SelectObject(mem_dc, dib);
2086 dst_format = "8888 - bitfields";
2087 sha1 = sha1_graphics_a8r8g8b8;
2088 draw_graphics(mem_dc, bmi, bits, &sha1);
2090 SelectObject(mem_dc, orig_bm);
2094 trace("a8b8g8r8\n");
2095 bmi->bmiHeader.biBitCount = 32;
2096 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2097 bit_fields[0] = 0x0000ff;
2098 bit_fields[1] = 0x00ff00;
2099 bit_fields[2] = 0xff0000;
2101 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2102 ok(dib != NULL, "ret NULL\n");
2103 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2104 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2105 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2106 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2107 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2109 orig_bm = SelectObject(mem_dc, dib);
2111 dst_format = "a8b8g8r8";
2112 sha1 = sha1_graphics_a8b8g8r8;
2113 draw_graphics(mem_dc, bmi, bits, &sha1);
2115 SelectObject(mem_dc, orig_bm);
2119 trace("r10g10b10\n");
2120 bmi->bmiHeader.biBitCount = 32;
2121 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2122 bit_fields[0] = 0x3ff00000;
2123 bit_fields[1] = 0x000ffc00;
2124 bit_fields[2] = 0x000003ff;
2126 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2127 ok(dib != NULL, "ret NULL\n");
2128 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2129 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
2130 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
2131 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
2132 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2134 orig_bm = SelectObject(mem_dc, dib);
2136 dst_format = "r10g10b10";
2137 sha1 = sha1_graphics_r10g10b10;
2138 draw_graphics(mem_dc, bmi, bits, &sha1);
2140 SelectObject(mem_dc, orig_bm);
2145 bmi->bmiHeader.biBitCount = 32;
2146 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2147 bit_fields[0] = 0x0003f000;
2148 bit_fields[1] = 0x00000fc0;
2149 bit_fields[2] = 0x0000003f;
2151 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2152 ok(dib != NULL, "ret NULL\n");
2153 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2154 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
2155 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
2156 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
2157 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2159 orig_bm = SelectObject(mem_dc, dib);
2161 dst_format = "r6g6b6";
2162 sha1 = sha1_graphics_r6g6b6;
2163 draw_graphics(mem_dc, bmi, bits, &sha1);
2165 SelectObject(mem_dc, orig_bm);
2170 bmi->bmiHeader.biBitCount = 24;
2171 bmi->bmiHeader.biCompression = BI_RGB;
2173 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2174 ok(dib != NULL, "ret NULL\n");
2175 orig_bm = SelectObject(mem_dc, dib);
2178 sha1 = sha1_graphics_24;
2179 draw_graphics(mem_dc, bmi, bits, &sha1);
2181 SelectObject(mem_dc, orig_bm);
2186 bmi->bmiHeader.biBitCount = 16;
2187 bmi->bmiHeader.biCompression = BI_RGB;
2189 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2190 ok(dib != NULL, "ret NULL\n");
2191 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2192 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
2193 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
2194 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
2195 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2197 orig_bm = SelectObject(mem_dc, dib);
2199 dst_format = "r5g5b5";
2200 sha1 = sha1_graphics_r5g5b5;
2201 draw_graphics(mem_dc, bmi, bits, &sha1);
2203 SelectObject(mem_dc, orig_bm);
2208 bmi->bmiHeader.biBitCount = 16;
2209 bmi->bmiHeader.biCompression = BI_BITFIELDS;
2210 bit_fields[0] = 0x0f00;
2211 bit_fields[1] = 0x00f0;
2212 bit_fields[2] = 0x000f;
2213 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2214 ok(dib != NULL, "ret NULL\n");
2215 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2216 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
2217 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
2218 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
2219 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2221 orig_bm = SelectObject(mem_dc, dib);
2223 dst_format = "r4g4b4";
2224 sha1 = sha1_graphics_r4g4b4;
2225 draw_graphics(mem_dc, bmi, bits, &sha1);
2227 SelectObject(mem_dc, orig_bm);
2232 bmi->bmiHeader.biBitCount = 8;
2233 bmi->bmiHeader.biCompression = BI_RGB;
2234 bmi->bmiHeader.biClrUsed = 236;
2235 for (i = 0; i < 236; i++)
2237 colors[i].rgbRed = (i & 0x07) << 5;
2238 colors[i].rgbGreen = (i & 0x38) << 2;
2239 colors[i].rgbBlue = i & 0xc0;
2241 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2242 ok(dib != NULL, "ret NULL\n");
2244 orig_bm = SelectObject(mem_dc, dib);
2246 dst_format = "8 color";
2247 sha1 = sha1_graphics_8_color;
2248 draw_graphics(mem_dc, bmi, bits, &sha1);
2250 SelectObject(mem_dc, orig_bm);
2254 trace("8 grayscale\n");
2255 bmi->bmiHeader.biBitCount = 8;
2256 bmi->bmiHeader.biCompression = BI_RGB;
2257 bmi->bmiHeader.biClrUsed = 256;
2258 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
2260 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2261 ok(dib != NULL, "ret NULL\n");
2263 orig_bm = SelectObject(mem_dc, dib);
2265 dst_format = "8 grayscale";
2266 sha1 = sha1_graphics_8_grayscale;
2267 draw_graphics(mem_dc, bmi, bits, &sha1);
2269 SelectObject(mem_dc, orig_bm);
2274 bmi->bmiHeader.biBitCount = 8;
2275 bmi->bmiHeader.biCompression = BI_RGB;
2276 bmi->bmiHeader.biClrUsed = 5;
2277 colors[0].rgbRed = 0xff;
2278 colors[0].rgbGreen = 0xff;
2279 colors[0].rgbBlue = 0xff;
2280 colors[1].rgbRed = 0;
2281 colors[1].rgbGreen = 0;
2282 colors[1].rgbBlue = 0;
2283 colors[2].rgbRed = 0xff;
2284 colors[2].rgbGreen = 0;
2285 colors[2].rgbBlue = 0;
2286 colors[3].rgbRed = 0;
2287 colors[3].rgbGreen = 0xff;
2288 colors[3].rgbBlue = 0;
2289 colors[4].rgbRed = 0;
2290 colors[4].rgbGreen = 0;
2291 colors[4].rgbBlue = 0xff;
2293 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2294 ok(dib != NULL, "ret NULL\n");
2296 orig_bm = SelectObject(mem_dc, dib);
2299 sha1 = sha1_graphics_8;
2300 draw_graphics(mem_dc, bmi, bits, &sha1);
2302 SelectObject(mem_dc, orig_bm);
2307 bmi->bmiHeader.biBitCount = 4;
2309 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2310 ok(dib != NULL, "ret NULL\n");
2312 orig_bm = SelectObject(mem_dc, dib);
2315 sha1 = sha1_graphics_4;
2316 draw_graphics(mem_dc, bmi, bits, &sha1);
2318 SelectObject(mem_dc, orig_bm);
2322 trace("4 grayscale\n");
2323 bmi->bmiHeader.biClrUsed = 16;
2324 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
2326 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2327 ok(dib != NULL, "ret NULL\n");
2329 orig_bm = SelectObject(mem_dc, dib);
2331 dst_format = "4 grayscale";
2332 sha1 = sha1_graphics_4_grayscale;
2333 draw_graphics(mem_dc, bmi, bits, &sha1);
2335 SelectObject(mem_dc, orig_bm);
2340 bmi->bmiHeader.biBitCount = 1;
2341 bmi->bmiHeader.biClrUsed = 2;
2343 colors[0].rgbRed = 0x00;
2344 colors[0].rgbGreen = 0x01;
2345 colors[0].rgbBlue = 0xff;
2346 colors[1].rgbRed = 0xff;
2347 colors[1].rgbGreen = 0x00;
2348 colors[1].rgbBlue = 0x00;
2350 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2351 ok(dib != NULL, "ret NULL\n");
2353 orig_bm = SelectObject(mem_dc, dib);
2356 sha1 = sha1_graphics_1;
2357 draw_graphics(mem_dc, bmi, bits, &sha1);
2359 SelectObject(mem_dc, orig_bm);
2367 HMODULE mod = GetModuleHandleA("gdi32.dll");
2368 pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
2369 pGdiAlphaBlend = (void *)GetProcAddress( mod, "GdiAlphaBlend" );
2371 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
2373 test_simple_graphics();
2375 CryptReleaseContext(crypt_prov, 0);