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
31 #include "wine/test.h"
33 static HCRYPTPROV crypt_prov
;
34 static DWORD (WINAPI
*pSetLayout
)(HDC hdc
, DWORD layout
);
36 static const DWORD rop3
[256] =
38 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
39 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
40 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
41 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
42 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
43 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
44 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
45 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
46 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
47 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
48 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
49 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
50 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
51 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
52 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
53 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
54 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
55 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
56 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
57 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
58 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
59 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
60 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
61 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
62 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
63 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
64 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
65 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
66 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
67 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
68 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
69 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
72 static inline BOOL
rop_uses_src(DWORD rop
)
74 return (((rop
& 0xcc0000) >> 2) != (rop
& 0x330000));
77 static const char *sha1_graphics_a8r8g8b8
[] =
79 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
80 "2426172d9e8fec27d9228088f382ef3c93717da9",
81 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
82 "664fac17803859a4015c6ae29e5538e314d5c827",
83 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
84 "fe6cc678fb13a3ead67839481bf22348adc69f52",
85 "d51bd330cec510cdccf5394328bd8e5411901e9e",
86 "df4aebf98d91f11be560dd232123b3ae327303d7",
87 "f2af53dd073a09b1031d0032d28da35c82adc566",
88 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
89 "c387917268455017aa0b28bed73aa6554044bbb3",
90 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
91 "6c530622a025d872a642e8f950867884d7b136cb",
92 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
93 "b2261353decda2712b83538ab434a49ce21f3172",
94 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
95 "9b9874c1c1d92afa554137e191d34ea33acc322f",
96 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
97 "d7398de15b2837a58a62a701ca1b3384625afec4",
98 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
99 "5246ef357e7317b9d141a3294d300c195da76cb7",
100 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
101 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
102 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
103 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
104 "e358efb1c11172e40855de620bdb8a8e545cd790",
105 "9e0c2596c6ecb4f1bc97b18ec3ca493d37626608",
106 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
107 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
108 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
109 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
110 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
111 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
112 "94645300d6eb51020a7ef8261dee2941cd51b5df",
113 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
114 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
118 static const char *sha1_graphics_a8b8g8r8
[] =
120 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
121 "e0bc877697093ed440e125154e247ca9d65e933c",
122 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
123 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
124 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
125 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
126 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
127 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
128 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
129 "b753ebb39d90210cc717f57b53dd439f7de6b077",
130 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
131 "94368cea5033b435454daa56d55546310675131e",
132 "bf57a6a37fb107d29ed3d45695919887abcb7902",
133 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
134 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
135 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
136 "b0178632775d29bec2b16de7b9b8287115c40d0f",
137 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
138 "3369889a67d6c79a24ee15f7d14374f9995215e4",
139 "473a1fd07df800c87a5d3286b642ace10c61c6af",
140 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
141 "b8951d2b20518fd129e5113a5f429626893913bf",
142 "4851c5b7d5bc18590e787c0c218a592ef504e738",
143 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
144 "abdf003699364fe45fab7dc61e67c606d0063b40",
145 "89abaadff4e68c738cf9251c51e3609564843381",
146 "f6aa3f907f620b9f3493f03cb3b4b292df3a9545",
147 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
148 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
149 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
150 "71b9756fdfeedce1e6db201176d21a981b881662",
151 "5319528d9af750c172ae62ee85ddb2eaef73b193",
152 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
153 "19b32a0daa91201725b5e13820c343d0a84ff698",
154 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
155 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
159 static const char *sha1_graphics_24
[] =
161 "e993b15c9bd14fb45a15310450b7083c44e42665",
162 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
163 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
164 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
165 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
166 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
167 "fd4be592483623dbc800fe28210a1f0daa71999b",
168 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
169 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
170 "883bc8f305c602edca785e21cd00f488583fb13f",
171 "3bac4e80993f49dc3926e30524115fca9d7a8026",
172 "91369e35be29059a0665782541db4c8b324c6bb2",
173 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
174 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
175 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
176 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
177 "5068bff794553cf5a3145ae407c9a2984357844c",
178 "413a7989969c229dee4ab1798362f32f96cf0a10",
179 "0bb222e540b82720d4971e4a2fc626899af03e03",
180 "adc20832d8c43f1cf372d8392535492013cd2306",
181 "45649794dcbcabda487f66f7a80fc1bec79047a1",
182 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
183 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
184 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
185 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
186 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
187 "92a1ab214dd8027c407814420449119466c92840",
188 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
189 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
190 "955390669afed2369b15b32fa519f2f921cdf1a0",
191 "201906f7d763b930a98c97f8eeab417f2b65e723",
192 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
193 "701c5af1d0c28294ce7d804b5697643c430d22a0",
194 "b0a959745b2db1d9f449e68e4479a4f36301879c",
195 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
196 "e171f6ec77bca91d6b8559911bce296c0bac469e",
200 static const char *sha1_graphics_r5g5b5
[] =
202 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
203 "847005cf7371f511bcc837251cde07b1796f6113",
204 "a8f75743a930843ec14d516cd048b6e0468e5d89",
205 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
206 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
207 "a9034a905daa91757b4f63345c0e40638cd53ca8",
208 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
209 "99474fecf11df7b7035c35be6b8b697be9889418",
210 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
211 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
212 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
213 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
214 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
215 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
216 "449092689226a1172b6086ba1181d6b6d6499f26",
217 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
218 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
219 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
220 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
221 "6daaf945a955928c5c124c880522ca4634fb2343",
222 "12a288390d16e1efa99d4185301de48a4d433b14",
223 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
224 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
225 "d7d97e28ed316f6596c737eb83baa5948d86b673",
226 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
227 "656bf3b7121bcd620a0a3ad488f0d66604824577",
228 "d7d8493b5fa7a3a8323d6ac84245093a79f052c1",
229 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
230 "a49530722328ae88fd765792ac0c657efbcce75d",
231 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
232 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
233 "a6fd83542c3826132e88d3f5e304d604c0056fad",
234 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
235 "e428d213ad02651287894f093413949dcb369208",
236 "7df915bedcc5951a1b6f828490f7dbb93212e835",
240 static const char *sha1_graphics_r4g4b4
[] =
242 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
243 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
244 "8bd18697d1ef27492805667a0bc956343ac08667",
245 "e8501c830321584474654f90e40eaf27dc21e6a8",
246 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
247 "821177710961d2cb5f7e7dfc0e06e767b6042753",
248 "667124365ffadeea1d8791bedda77a0c7b898de8",
249 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
250 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
251 "fb52b0c373a5f2a60b981604b120962942d2447a",
252 "5ab8dd07436681d762fa04ad7c6d71291c488924",
253 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
254 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
255 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
256 "25fcb75aa687aac35b8f72640889fe92413e00c5",
257 "3bddf9d53e89560b083302b146cd33791b13d941",
258 "a81504498c7a7bb46340ce74476a42f70f2730b1",
259 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
260 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
261 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
262 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
263 "57ebf8becac1524543da120e88e9cc57ecfdec49",
264 "d591232bbc2592462c819a9486750f64180518fd",
265 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
266 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
267 "8933450132bf949ba4bc28626968425b5ed2867d",
268 "9928a8f28a66c00069a124f7171b248817005763",
269 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
270 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
271 "233e588cf660e2c9b552cf02065cf63fa6655864",
272 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
273 "a3345acaf272f2e288626906e3056cd0ced70499",
274 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
275 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
276 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
280 static const char *sha1_graphics_8
[] =
282 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
283 "512246d4886ab889a090b167ba194577cb95272e",
284 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
285 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
286 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
287 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
288 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
289 "390b2bf70daba36310683f46af9cd50b9a061396",
290 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
291 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
292 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
293 "da1cc34a9d9b779fc7849e03e214096026506464",
294 "5ba8f99ca034666effa556748c49a0f5a015125f",
295 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
296 "73e2859ce849f756f954718ce3c90f02e31712b6",
297 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
298 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
299 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
300 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
301 "7262364067e03c7fa498af1d59d228d6c63b460e",
302 "5241241a355a667ef0834049adf4218e8b3f16b8",
303 "db22d666690948eb966f75b796c72c7150a5c4b9",
304 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
305 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
306 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
307 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
308 "bdc0a354635b879871077c5b712570e469863c99",
309 "d599bf210423fe3adbb4f1de87d9360de97827d0",
310 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
311 "cc01f17928f7780cefd423ea653b072eea723a1b",
312 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
313 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
314 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
315 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
316 "f4a334e69535de74ee5ed54be93a75120a66e54a",
320 static const char *sha1_graphics_4
[] =
322 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
323 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
324 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
325 "9401799e6116c35e5f0e5bdca07ea25316757a72",
326 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
327 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
328 "2505598845fa026ea7187582461efbf06cb6904f",
329 "3981a19363beca8f28d32a5928ac296fd22a5296",
330 "01404024ebb2c266d17d734059524d874491650f",
331 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
332 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
333 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
334 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
335 "1f26a01730f67d40ea711a50d9d801bac15a642e",
336 "3b53d24178cfacba53103a44dfd5d072b15a6781",
337 "c52cfd57f26037723d37192722fc3a217f280c9e",
338 "e34da6500cf2e424d980714d92737cf6c31a7bda",
339 "d17f4358ae529f920960ed89e535902ee13b0033",
340 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
341 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
342 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
343 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
344 "39c16648cf6c261be71a33cec41867f28e119b94",
345 "26ad5116562e7b58c76a26eaf521e2e40899e944",
346 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
347 "4f827ca6927f15191588456f985bf29d2a3b3c24",
348 "e7de769c3d12ea9dd223bef4881c578823bec67e",
349 "6fb102d020e5554116feefc8482104f3ae2036d2",
350 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
351 "20c9eb3276c08fdce35755e349bec94b04929812",
352 "628d837163a25c6520f19c0602383176dbad528e",
353 "b5a12cff7100290ad43f5ed17a321b42de048893",
354 "b672afbeeafb44194a821f0def81a8892872937e",
355 "db0124045882b598feea192186cf7eb7a0387866",
356 "602d91471378fe24a2d0248bd8a92b624f099fea",
360 static const char *sha1_graphics_1
[] =
362 "23366004515f3bc46796ea505d748f8d0f97fbe1",
363 "ad674a4104c6a1eacaee8f20effdfe31775b4409",
364 "a7cc69f957d7b533a0a330859a143d701daac73c",
365 "a955bf088c5edb129289ce65caace48ec95632e4",
366 "5316d3c558c254479883133cf58cd07ab521d3f0",
367 "fcbfdb5d60716ea05f2d1896fae7a6e7a8249d35",
368 "2c140b39cc8d21358fded8959cd655f03d7f0f89",
369 "121423a38b4ac4743bd516e0a7e88a3863796313",
370 "7c17635c6c7f62dbf8fd4773d0c503358553d2c7",
371 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
372 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
373 "39ff81f77ef4ee772367ed1a63785987c060126e",
374 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
375 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
376 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
377 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
378 "c5ffc59048bf786b5646ad6226cd8633965de9ef",
379 "40fadc2d24c713b04ff96f7dc26e70e85f26c55e",
380 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
381 "0ff4b49797e30e3555aab45219adf449a9a560ff",
382 "280327328ca940c212ce24fe72e0b00014072767",
383 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
384 "b85463875f755b85f1464b1b6275912bcbad6c9f",
385 "816f200969feecc788b61dfeecf05b1790984401",
386 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
387 "a5d204cc7342d40b765ca042f8668e22601c4ff9",
388 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
389 "0a76e0121facb103857130bc6e12185ad77fc3fa",
390 "02aede714773d654d0fc2f640afaa133ec718ad5",
391 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
392 "3bb745ccb08402ce6fac6ee26fb8d7aad2dba27e",
393 "b26699f62661e16a1dc452d24c88ce363a1f2998",
394 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
395 "c14832e69ec3585c15987b3d69d5007236fa9814",
396 "e44ea620b0c47125a34193537ab9d219a52ad028",
397 "d1e6091caa4482d3142df3b958606c41ebf4698e",
398 "07c1116d8286fb665a1005de220eadc3d5999aaf",
399 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
400 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
401 "ffc78c075d4be66806f6c59180772d5eed963dc0",
402 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
403 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
404 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
405 "b71ca46be287598f716bb04fac0a52ad139c70db",
406 "6589e48498e30ab036fbfe94d73427b2b1238a69",
407 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
408 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
409 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
410 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
411 "18f4497e43903e8df5b27da4ceebf62b15550a87",
415 static inline DWORD
get_stride(BITMAPINFO
*bmi
)
417 return ((bmi
->bmiHeader
.biBitCount
* bmi
->bmiHeader
.biWidth
+ 31) >> 3) & ~3;
420 static inline DWORD
get_dib_size(BITMAPINFO
*bmi
)
422 return get_stride(bmi
) * abs(bmi
->bmiHeader
.biHeight
);
425 static char *hash_dib(BITMAPINFO
*bmi
, void *bits
)
427 DWORD dib_size
= get_dib_size(bmi
);
431 DWORD hash_size
= sizeof(hash_buf
);
433 static const char *hex
= "0123456789abcdef";
435 if(!crypt_prov
) return NULL
;
437 if(!CryptCreateHash(crypt_prov
, CALG_SHA1
, 0, 0, &hash
)) return NULL
;
439 CryptHashData(hash
, bits
, dib_size
, 0);
441 CryptGetHashParam(hash
, HP_HASHVAL
, NULL
, &hash_size
, 0);
442 if(hash_size
!= sizeof(hash_buf
)) return NULL
;
444 CryptGetHashParam(hash
, HP_HASHVAL
, hash_buf
, &hash_size
, 0);
445 CryptDestroyHash(hash
);
447 buf
= HeapAlloc(GetProcessHeap(), 0, hash_size
* 2 + 1);
449 for(i
= 0; i
< hash_size
; i
++)
451 buf
[i
* 2] = hex
[hash_buf
[i
] >> 4];
452 buf
[i
* 2 + 1] = hex
[hash_buf
[i
] & 0xf];
459 static void compare_hash_broken_todo(BITMAPINFO
*bmi
, BYTE
*bits
, const char ***sha1
, const char *info
, int num_broken
, BOOL todo
)
461 char *hash
= hash_dib(bmi
, bits
);
467 skip("SHA1 hashing unavailable on this platform\n");
471 for(i
= 0; i
<= num_broken
; i
++)
473 if((*sha1
)[i
] == NULL
)
475 ok((*sha1
)[i
] != NULL
, "missing hash, got \"%s\",\n", hash
);
480 ok_cond
= !strcmp(hash
, **sha1
);
482 for(i
= 1; i
<= num_broken
; i
++)
483 ok_cond
= ok_cond
|| broken( !strcmp(hash
, (*sha1
)[i
]) );
486 todo_wine
ok( ok_cond
, "%d: %s: expected hash %s got %s\n",
487 bmi
->bmiHeader
.biBitCount
, info
, **sha1
, hash
);
489 ok( ok_cond
, "%d: %s: expected hash %s got %s\n",
490 bmi
->bmiHeader
.biBitCount
, info
, **sha1
, hash
);
492 *sha1
+= num_broken
+ 1;
494 HeapFree(GetProcessHeap(), 0, hash
);
497 static void compare_hash(BITMAPINFO
*bmi
, BYTE
*bits
, const char ***sha1
, const char *info
)
499 compare_hash_broken_todo(bmi
, bits
, sha1
, info
, 0, FALSE
);
502 static const RECT bias_check
[] =
504 {100, 100, 200, 150},
505 {100, 100, 150, 200},
514 static const RECT hline_clips
[] =
516 {120, 120, 140, 120}, /* unclipped */
517 {100, 122, 140, 122}, /* l edgecase */
518 { 99, 124, 140, 124}, /* l edgecase clipped */
519 {120, 126, 200, 126}, /* r edgecase */
520 {120, 128, 201, 128}, /* r edgecase clipped */
521 { 99, 130, 201, 130}, /* l and r clipped */
522 {120, 100, 140, 100}, /* t edgecase */
523 {120, 99, 140, 99}, /* t edgecase clipped */
524 {120, 199, 140, 199}, /* b edgecase */
525 {120, 200, 140, 200}, /* b edgecase clipped */
526 {120, 132, 310, 132}, /* inside two clip rects */
527 { 10, 134, 101, 134}, /* r end on l edgecase */
528 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
529 {199, 138, 220, 138}, /* l end on r edgecase */
530 {200, 140, 220, 140} /* l end on r edgecase clipped */
533 static const RECT vline_clips
[] =
535 {120, 120, 120, 140}, /* unclipped */
536 {100, 120, 100, 140}, /* l edgecase */
537 { 99, 120, 99, 140}, /* l edgecase clipped */
538 {199, 120, 199, 140}, /* r edgecase */
539 {200, 120, 200, 140}, /* r edgecase clipped */
540 {122, 99, 122, 201}, /* t and b clipped */
541 {124, 100, 124, 140}, /* t edgecase */
542 {126, 99, 126, 140}, /* t edgecase clipped */
543 {128, 120, 128, 200}, /* b edgecase */
544 {130, 120, 130, 201}, /* b edgecase clipped */
545 {132, 12, 132, 140}, /* inside two clip rects */
546 {134, 90, 134, 101}, /* b end on t edgecase */
547 {136, 90, 136, 100}, /* b end on t edgecase clipped */
548 {138, 199, 138, 220}, /* t end on b edgecase */
549 {140, 200, 140, 220} /* t end on b edgecase clipped */
552 static const RECT line_clips
[] =
554 { 90, 110, 310, 120},
555 { 90, 120, 295, 130},
556 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
557 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
558 { 90, 132, 101, 137}, /* end pt just inside l edge */
559 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
560 {199, 142, 210, 143} /* start pt just inside r edge */
563 static const RECT patblt_clips
[] =
565 {120, 120, 140, 126}, /* unclipped */
566 {100, 130, 140, 136}, /* l edgecase */
567 { 99, 140, 140, 146}, /* l edgecase clipped */
568 {180, 130, 200, 136}, /* r edgecase */
569 {180, 140, 201, 146}, /* r edgecase clipped */
570 {120, 100, 130, 110}, /* t edgecase */
571 {140, 99, 150, 110}, /* t edgecase clipped */
572 {120, 180, 130, 200}, /* b edgecase */
573 {140, 180, 150, 201}, /* b edgecase */
574 {199, 150, 210, 156}, /* l edge on r edgecase */
575 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
576 { 90, 150, 101, 156}, /* r edge on l edgecase */
577 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
578 {160, 90, 166, 101}, /* b edge on t edgecase */
579 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
580 {160, 199, 166, 210}, /* t edge on b edgecase */
581 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
584 static const RECT rectangles
[] =
588 {120, 10, 120, 20}, /* zero width */
589 {120, 10, 130, 10}, /* zero height */
590 {120, 40, 121, 41}, /* 1 x 1 */
591 {130, 50, 132, 52}, /* 2 x 2 */
592 {140, 60, 143, 63}, /* 3 x 3 */
593 {150, 70, 154, 74}, /* 4 x 4 */
594 {120, 20, 121, 30}, /* width == 1 */
595 {130, 20, 132, 30}, /* width == 2 */
596 {140, 20, 143, 30}, /* width == 3 */
597 {200, 20, 210, 21}, /* height == 1 */
598 {200, 30, 210, 32}, /* height == 2 */
599 {200, 40, 210, 43} /* height == 3 */
602 static const BITMAPINFOHEADER dib_brush_header_8888
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 32, BI_RGB
, 0, 0, 0, 0, 0};
603 static const BITMAPINFOHEADER dib_brush_header_24
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 24, BI_RGB
, 0, 0, 0, 0, 0};
604 static const BITMAPINFOHEADER dib_brush_header_555
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 16, BI_RGB
, 0, 0, 0, 0, 0};
605 static const BITMAPINFOHEADER dib_brush_header_8
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 8, BI_RGB
, 0, 0, 0, 0, 0};
606 static const BITMAPINFOHEADER dib_brush_header_4
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 4, BI_RGB
, 0, 0, 0, 0, 0};
607 static const BITMAPINFOHEADER dib_brush_header_1
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 1, BI_RGB
, 0, 0, 0, 0, 0};
609 static void draw_graphics(HDC hdc
, BITMAPINFO
*bmi
, BYTE
*bits
, const char ***sha1
)
611 DWORD dib_size
= get_dib_size(bmi
);
612 HPEN solid_pen
, dashed_pen
, orig_pen
;
613 HBRUSH solid_brush
, dib_brush
, hatch_brush
, orig_brush
;
614 INT i
, y
, hatch_style
;
616 BYTE dib_brush_buf
[sizeof(BITMAPINFO
) + 256 * sizeof(RGBQUAD
) + 16 * 16 * sizeof(DWORD
)]; /* Enough for 16 x 16 at 32 bpp */
617 BITMAPINFO
*brush_bi
= (BITMAPINFO
*)dib_brush_buf
;
619 BOOL dib_is_1bpp
= (bmi
->bmiHeader
.biBitCount
== 1);
621 memset(bits
, 0xcc, dib_size
);
622 compare_hash(bmi
, bits
, sha1
, "empty");
624 solid_pen
= CreatePen(PS_SOLID
, 1, RGB(0, 0, 0xff));
625 orig_pen
= SelectObject(hdc
, solid_pen
);
626 SetBrushOrgEx(hdc
, 0, 0, NULL
);
628 /* horizontal and vertical lines */
629 for(i
= 1; i
<= 16; i
++)
632 MoveToEx(hdc
, 10, i
* 3, NULL
);
633 LineTo(hdc
, 100, i
* 3); /* l -> r */
634 MoveToEx(hdc
, 100, 50 + i
* 3, NULL
);
635 LineTo(hdc
, 10, 50 + i
* 3); /* r -> l */
636 MoveToEx(hdc
, 120 + i
* 3, 10, NULL
);
637 LineTo(hdc
, 120 + i
* 3, 100); /* t -> b */
638 MoveToEx(hdc
, 170 + i
* 3, 100, NULL
);
639 LineTo(hdc
, 170 + i
* 3, 10); /* b -> t */
641 compare_hash(bmi
, bits
, sha1
, "h and v solid lines");
642 memset(bits
, 0xcc, dib_size
);
645 SetROP2(hdc
, R2_COPYPEN
);
646 for(i
= 0; i
< 16; i
++)
648 double s
= sin(M_PI
* i
/ 8.0);
649 double c
= cos(M_PI
* i
/ 8.0);
651 MoveToEx(hdc
, 200.5 + 10 * c
, 200.5 + 10 * s
, NULL
);
652 LineTo(hdc
, 200.5 + 100 * c
, 200.5 + 100 * s
);
654 compare_hash(bmi
, bits
, sha1
, "diagonal solid lines");
655 memset(bits
, 0xcc, dib_size
);
657 for(i
= 0; i
< sizeof(bias_check
) / sizeof(bias_check
[0]); i
++)
659 MoveToEx(hdc
, bias_check
[i
].left
, bias_check
[i
].top
, NULL
);
660 LineTo(hdc
, bias_check
[i
].right
, bias_check
[i
].bottom
);
662 compare_hash(bmi
, bits
, sha1
, "more diagonal solid lines");
663 memset(bits
, 0xcc, dib_size
);
665 /* solid brush PatBlt */
666 solid_brush
= CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
667 orig_brush
= SelectObject(hdc
, solid_brush
);
669 for(i
= 0, y
= 10; i
< 256; i
++)
673 ret
= PatBlt(hdc
, 10, y
, 100, 10, rop3
[i
]);
675 if(rop_uses_src(rop3
[i
]))
676 ok(ret
== FALSE
, "got TRUE for %x\n", rop3
[i
]);
679 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
684 compare_hash(bmi
, bits
, sha1
, "solid patblt");
685 memset(bits
, 0xcc, dib_size
);
688 hrgn
= CreateRectRgn(10, 10, 200, 20);
689 hrgn2
= CreateRectRgn(100, 100, 200, 200);
690 CombineRgn(hrgn
, hrgn
, hrgn2
, RGN_OR
);
691 SetRectRgn(hrgn2
, 290, 100, 300, 200);
692 CombineRgn(hrgn
, hrgn
, hrgn2
, RGN_OR
);
693 ExtSelectClipRgn(hdc
, hrgn
, RGN_COPY
);
696 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
698 MoveToEx(hdc
, hline_clips
[i
].left
, hline_clips
[i
].top
, NULL
);
699 LineTo(hdc
, hline_clips
[i
].right
, hline_clips
[i
].bottom
);
701 compare_hash(bmi
, bits
, sha1
, "clipped solid hlines");
702 memset(bits
, 0xcc, dib_size
);
704 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
706 MoveToEx(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
, NULL
);
707 LineTo(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
);
709 compare_hash(bmi
, bits
, sha1
, "clipped solid vlines");
710 memset(bits
, 0xcc, dib_size
);
712 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
714 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
715 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
717 compare_hash(bmi
, bits
, sha1
, "clipped solid diagonal lines");
718 memset(bits
, 0xcc, dib_size
);
721 for(i
= 0; i
< sizeof(patblt_clips
) / sizeof(patblt_clips
[0]); i
++)
723 PatBlt(hdc
, patblt_clips
[i
].left
, patblt_clips
[i
].top
,
724 patblt_clips
[i
].right
- patblt_clips
[i
].left
,
725 patblt_clips
[i
].bottom
- patblt_clips
[i
].top
, PATCOPY
);
727 compare_hash(bmi
, bits
, sha1
, "clipped patblt");
728 memset(bits
, 0xcc, dib_size
);
730 /* clipped dashed lines */
731 dashed_pen
= CreatePen(PS_DASH
, 1, RGB(0xff, 0, 0));
732 SelectObject(hdc
, dashed_pen
);
733 SetBkMode(hdc
, TRANSPARENT
);
734 SetBkColor(hdc
, RGB(0, 0xff, 0));
736 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
738 MoveToEx(hdc
, hline_clips
[i
].left
, hline_clips
[i
].top
, NULL
);
739 LineTo(hdc
, hline_clips
[i
].right
, hline_clips
[i
].bottom
);
741 compare_hash(bmi
, bits
, sha1
, "clipped dashed hlines");
742 memset(bits
, 0xcc, dib_size
);
744 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
746 MoveToEx(hdc
, hline_clips
[i
].right
- 1, hline_clips
[i
].bottom
, NULL
);
747 LineTo(hdc
, hline_clips
[i
].left
- 1, hline_clips
[i
].top
);
749 compare_hash(bmi
, bits
, sha1
, "clipped dashed hlines r -> l");
750 memset(bits
, 0xcc, dib_size
);
752 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
754 MoveToEx(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
, NULL
);
755 LineTo(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
);
757 compare_hash(bmi
, bits
, sha1
, "clipped dashed vlines");
758 memset(bits
, 0xcc, dib_size
);
760 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
762 MoveToEx(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
- 1, NULL
);
763 LineTo(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
- 1);
765 compare_hash(bmi
, bits
, sha1
, "clipped dashed vlines b -> t");
766 memset(bits
, 0xcc, dib_size
);
768 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
770 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
771 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
773 compare_hash(bmi
, bits
, sha1
, "clipped dashed diagonal lines");
774 memset(bits
, 0xcc, dib_size
);
776 SetBkMode(hdc
, OPAQUE
);
778 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
780 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
781 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
783 compare_hash(bmi
, bits
, sha1
, "clipped opaque dashed diagonal lines");
784 memset(bits
, 0xcc, dib_size
);
786 ExtSelectClipRgn(hdc
, NULL
, RGN_COPY
);
788 /* 8888 DIB pattern brush */
790 brush_bi
->bmiHeader
= dib_brush_header_8888
;
791 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
792 memset(brush_bits
, 0, 16 * 16 * sizeof(DWORD
));
793 brush_bits
[2] = 0xff;
794 brush_bits
[6] = 0xff;
795 brush_bits
[14] = 0xff;
796 brush_bits
[65] = 0xff;
797 brush_bits
[69] = 0xff;
798 brush_bits
[72] = 0xff;
800 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
802 SelectObject(hdc
, dib_brush
);
803 SetBrushOrgEx(hdc
, 1, 1, NULL
);
805 for(i
= 0, y
= 10; i
< 256; i
++)
809 if(!rop_uses_src(rop3
[i
]))
811 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
812 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
816 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 8888 dib brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
817 memset(bits
, 0xcc, dib_size
);
819 SelectObject(hdc
, orig_brush
);
820 DeleteObject(dib_brush
);
822 /* 8888 bottom-up DIB pattern brush */
824 brush_bi
->bmiHeader
.biHeight
= -brush_bi
->bmiHeader
.biHeight
;
826 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
828 SelectObject(hdc
, dib_brush
);
830 /* This used to set the x origin to 100 as well, but
831 there's a Windows bug for 24 bpp where the brush's x offset
832 is incorrectly calculated for rops that involve both D and P */
833 SetBrushOrgEx(hdc
, 4, 100, NULL
);
835 for(i
= 0, y
= 10; i
< 256; i
++)
839 if(!rop_uses_src(rop3
[i
]))
841 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
842 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
846 compare_hash_broken_todo(bmi
, bits
, sha1
, "bottom-up 8888 dib brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
847 memset(bits
, 0xcc, dib_size
);
849 SelectObject(hdc
, orig_brush
);
850 DeleteObject(dib_brush
);
852 /* 24 bpp dib pattern brush */
854 brush_bi
->bmiHeader
= dib_brush_header_24
;
855 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
856 memset(brush_bits
, 0, 16 * 16 * 3);
857 brush_bits
[0] = brush_bits
[3] = brush_bits
[6] = brush_bits
[8] = 0xff;
858 brush_bits
[49] = brush_bits
[52] = 0xff;
860 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
862 SelectObject(hdc
, dib_brush
);
863 SetBrushOrgEx(hdc
, 1, 1, NULL
);
865 for(i
= 0, y
= 10; i
< 256; i
++)
869 if(!rop_uses_src(rop3
[i
]))
871 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
872 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
876 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 24 bpp brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
877 memset(bits
, 0xcc, dib_size
);
879 SelectObject(hdc
, orig_brush
);
880 DeleteObject(dib_brush
);
882 /* 555 dib pattern brush */
884 brush_bi
->bmiHeader
= dib_brush_header_555
;
885 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
886 memset(brush_bits
, 0, 16 * 16 * sizeof(WORD
));
887 brush_bits
[0] = brush_bits
[1] = 0xff;
888 brush_bits
[32] = brush_bits
[34] = 0x7c;
890 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
892 SelectObject(hdc
, dib_brush
);
893 SetBrushOrgEx(hdc
, 1, 1, NULL
);
895 for(i
= 0, y
= 10; i
< 256; i
++)
899 if(!rop_uses_src(rop3
[i
]))
901 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
902 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
906 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 555 dib brush patblt", dib_is_1bpp
? 1 : 0, dib_is_1bpp
);
907 memset(bits
, 0xcc, dib_size
);
909 SelectObject(hdc
, orig_brush
);
910 DeleteObject(dib_brush
);
912 SetBrushOrgEx(hdc
, 0, 0, NULL
);
914 /* 8 bpp dib pattern brush */
916 brush_bi
->bmiHeader
= dib_brush_header_8
;
917 brush_bi
->bmiHeader
.biClrUsed
= 3;
918 memset(brush_bi
->bmiColors
, 0, brush_bi
->bmiHeader
.biClrUsed
* sizeof(RGBQUAD
));
919 brush_bi
->bmiColors
[0].rgbRed
= 0xff;
920 brush_bi
->bmiColors
[1].rgbRed
= 0xff;
921 brush_bi
->bmiColors
[1].rgbGreen
= 0xff;
922 brush_bi
->bmiColors
[1].rgbBlue
= 0xff;
924 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
) + brush_bi
->bmiHeader
.biClrUsed
* sizeof(RGBQUAD
);
925 memset(brush_bits
, 0, 16 * 16 * sizeof(BYTE
));
926 brush_bits
[0] = brush_bits
[1] = 1;
927 brush_bits
[16] = brush_bits
[17] = 2;
928 brush_bits
[32] = brush_bits
[33] = 6;
930 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
932 SelectObject(hdc
, dib_brush
);
933 SetBrushOrgEx(hdc
, 1, 1, NULL
);
935 for(i
= 0, y
= 10; i
< 256; i
++)
939 if(!rop_uses_src(rop3
[i
]))
941 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
942 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
946 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 8 bpp dib brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
947 memset(bits
, 0xcc, dib_size
);
949 SelectObject(hdc
, orig_brush
);
950 DeleteObject(dib_brush
);
952 /* 4 bpp dib pattern brush */
954 brush_bi
->bmiHeader
= dib_brush_header_4
;
955 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
957 SelectObject(hdc
, dib_brush
);
958 SetBrushOrgEx(hdc
, 1, 1, NULL
);
960 for(i
= 0, y
= 10; i
< 256; i
++)
964 if(!rop_uses_src(rop3
[i
]))
966 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
967 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
971 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 4 bpp dib brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
972 memset(bits
, 0xcc, dib_size
);
974 SelectObject(hdc
, orig_brush
);
975 DeleteObject(dib_brush
);
977 /* 1 bpp dib pattern brush */
979 brush_bi
->bmiHeader
= dib_brush_header_1
;
980 brush_bi
->bmiHeader
.biClrUsed
= 2;
981 memset(brush_bits
, 0, 16 * 4);
982 brush_bits
[0] = 0xf0;
983 brush_bits
[4] = 0xf0;
984 brush_bits
[8] = 0xf0;
986 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
987 SelectObject(hdc
, dib_brush
);
988 for(i
= 0, y
= 10; i
< 256; i
++)
992 if(!rop_uses_src(rop3
[i
]))
994 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
995 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1000 compare_hash_broken_todo(bmi
, bits
, sha1
, "top-down 1 bpp dib brush patblt", dib_is_1bpp
? 2 : 0, dib_is_1bpp
);
1001 memset(bits
, 0xcc, dib_size
);
1003 SelectObject(hdc
, orig_brush
);
1004 SetBrushOrgEx(hdc
, 0, 0, NULL
);
1008 SelectObject(hdc
, solid_pen
);
1009 SelectObject(hdc
, solid_brush
);
1011 for(i
= 0; i
< sizeof(rectangles
)/sizeof(rectangles
[0]); i
++)
1013 Rectangle(hdc
, rectangles
[i
].left
, rectangles
[i
].top
, rectangles
[i
].right
, rectangles
[i
].bottom
);
1016 SelectObject(hdc
, dashed_pen
);
1017 for(i
= 0; i
< sizeof(rectangles
)/sizeof(rectangles
[0]); i
++)
1019 Rectangle(hdc
, rectangles
[i
].left
, rectangles
[i
].top
+ 150, rectangles
[i
].right
, rectangles
[i
].bottom
+ 150);
1022 compare_hash(bmi
, bits
, sha1
, "rectangles");
1023 memset(bits
, 0xcc, dib_size
);
1024 SelectObject(hdc
, solid_pen
);
1028 PaintRgn(hdc
, hrgn
);
1029 compare_hash(bmi
, bits
, sha1
, "PaintRgn");
1030 memset(bits
, 0xcc, dib_size
);
1032 /* RTL rectangles */
1036 win_skip("Don't have SetLayout\n");
1041 pSetLayout(hdc
, LAYOUT_RTL
);
1042 PaintRgn(hdc
, hrgn
);
1043 PatBlt(hdc
, 10, 250, 10, 10, PATCOPY
);
1044 Rectangle(hdc
, 100, 250, 110, 260);
1045 compare_hash(bmi
, bits
, sha1
, "rtl");
1046 memset(bits
, 0xcc, dib_size
);
1048 pSetLayout(hdc
, LAYOUT_LTR
);
1051 for(i
= 0, y
= 10; i
< 256; i
++)
1055 if(!rop_uses_src(rop3
[i
]))
1057 for(hatch_style
= HS_HORIZONTAL
; hatch_style
<= HS_DIAGCROSS
; hatch_style
++)
1059 hatch_brush
= CreateHatchBrush(hatch_style
, RGB(0xff, 0, 0));
1060 SelectObject(hdc
, hatch_brush
);
1061 ret
= PatBlt(hdc
, 10 + i
+ 30 * hatch_style
, y
, 20, 20, rop3
[i
]);
1062 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1063 SelectObject(hdc
, orig_brush
);
1064 DeleteObject(hatch_brush
);
1070 compare_hash_broken_todo(bmi
, bits
, sha1
, "hatch brushes", 1, FALSE
); /* nt4 is different */
1071 memset(bits
, 0xcc, dib_size
);
1073 /* overlapping blits */
1075 orig_brush
= SelectObject(hdc
, solid_brush
);
1077 Rectangle(hdc
, 10, 10, 100, 100);
1078 Rectangle(hdc
, 20, 15, 30, 40);
1079 Rectangle(hdc
, 15, 15, 20, 20);
1080 Rectangle(hdc
, 15, 20, 50, 45);
1081 BitBlt( hdc
, 20, 20, 100, 100, hdc
, 10, 10, SRCCOPY
);
1082 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY +x, +y");
1083 memset(bits
, 0xcc, dib_size
);
1085 Rectangle(hdc
, 10, 10, 100, 100);
1086 Rectangle(hdc
, 20, 15, 30, 40);
1087 Rectangle(hdc
, 15, 15, 20, 20);
1088 Rectangle(hdc
, 15, 20, 50, 45);
1089 BitBlt( hdc
, 10, 10, 100, 100, hdc
, 20, 20, SRCCOPY
);
1090 if (bmi
->bmiHeader
.biBitCount
== 1) /* Windows gets this one wrong */
1091 compare_hash_broken_todo(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE
);
1093 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY -x, -y");
1094 memset(bits
, 0xcc, dib_size
);
1096 Rectangle(hdc
, 10, 10, 100, 100);
1097 Rectangle(hdc
, 20, 15, 30, 40);
1098 Rectangle(hdc
, 15, 15, 20, 20);
1099 Rectangle(hdc
, 15, 20, 50, 45);
1100 BitBlt( hdc
, 20, 10, 100, 100, hdc
, 10, 20, SRCCOPY
);
1101 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY +x, -y");
1102 memset(bits
, 0xcc, dib_size
);
1104 Rectangle(hdc
, 10, 10, 100, 100);
1105 Rectangle(hdc
, 20, 15, 30, 40);
1106 Rectangle(hdc
, 15, 15, 20, 20);
1107 Rectangle(hdc
, 15, 20, 50, 45);
1108 BitBlt( hdc
, 10, 20, 100, 100, hdc
, 20, 10, SRCCOPY
);
1109 if (bmi
->bmiHeader
.biBitCount
== 1) /* Windows gets this one wrong */
1110 compare_hash_broken_todo(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE
);
1112 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt SRCCOPY -x, +y" );
1113 memset(bits
, 0xcc, dib_size
);
1115 Rectangle(hdc
, 10, 10, 100, 100);
1116 Rectangle(hdc
, 20, 15, 30, 40);
1117 Rectangle(hdc
, 15, 15, 20, 20);
1118 Rectangle(hdc
, 15, 20, 50, 45);
1119 BitBlt( hdc
, 20, 20, 100, 100, hdc
, 10, 10, PATPAINT
);
1120 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt PATPAINT +x, +y");
1121 memset(bits
, 0xcc, dib_size
);
1123 Rectangle(hdc
, 10, 10, 100, 100);
1124 Rectangle(hdc
, 20, 15, 30, 40);
1125 Rectangle(hdc
, 15, 15, 20, 20);
1126 Rectangle(hdc
, 15, 20, 50, 45);
1127 BitBlt( hdc
, 10, 10, 100, 100, hdc
, 20, 20, PATPAINT
);
1128 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt PATPAINT -x, -y");
1129 memset(bits
, 0xcc, dib_size
);
1131 Rectangle(hdc
, 10, 10, 100, 100);
1132 Rectangle(hdc
, 20, 15, 30, 40);
1133 Rectangle(hdc
, 15, 15, 20, 20);
1134 Rectangle(hdc
, 15, 20, 50, 45);
1135 BitBlt( hdc
, 20, 10, 100, 100, hdc
, 10, 20, PATPAINT
);
1136 if (bmi
->bmiHeader
.biBitCount
>= 24) /* Windows gets this one wrong */
1137 compare_hash_broken_todo(bmi
, bits
, sha1
, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE
);
1139 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt PATPAINT +x, -y");
1140 memset(bits
, 0xcc, dib_size
);
1142 Rectangle(hdc
, 10, 10, 100, 100);
1143 Rectangle(hdc
, 20, 15, 30, 40);
1144 Rectangle(hdc
, 15, 15, 20, 20);
1145 Rectangle(hdc
, 15, 20, 50, 45);
1146 BitBlt( hdc
, 10, 20, 100, 100, hdc
, 20, 10, PATPAINT
);
1147 compare_hash(bmi
, bits
, sha1
, "overlapping BitBlt PATPAINT -x, +y" );
1148 memset(bits
, 0xcc, dib_size
);
1150 SelectObject(hdc
, orig_brush
);
1151 SelectObject(hdc
, orig_pen
);
1153 DeleteObject(dib_brush
);
1154 DeleteObject(dashed_pen
);
1155 DeleteObject(solid_brush
);
1156 DeleteObject(solid_pen
);
1159 static void test_simple_graphics(void)
1161 char bmibuf
[sizeof(BITMAPINFO
) + 256 * sizeof(RGBQUAD
)];
1162 BITMAPINFO
*bmi
= (BITMAPINFO
*)bmibuf
;
1163 DWORD
*bit_fields
= (DWORD
*)(bmibuf
+ sizeof(BITMAPINFOHEADER
));
1166 HBITMAP dib
, orig_bm
;
1170 mem_dc
= CreateCompatibleDC(NULL
);
1174 memset(bmi
, 0, sizeof(bmibuf
));
1175 bmi
->bmiHeader
.biSize
= sizeof(bmi
->bmiHeader
);
1176 bmi
->bmiHeader
.biHeight
= 512;
1177 bmi
->bmiHeader
.biWidth
= 512;
1178 bmi
->bmiHeader
.biBitCount
= 32;
1179 bmi
->bmiHeader
.biPlanes
= 1;
1180 bmi
->bmiHeader
.biCompression
= BI_RGB
;
1182 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1183 ok(dib
!= NULL
, "ret NULL\n");
1184 ok(GetObjectW( dib
, sizeof(ds
), &ds
), "GetObject failed\n");
1185 ok(ds
.dsBitfields
[0] == 0, "got %08x\n", ds
.dsBitfields
[0]);
1186 ok(ds
.dsBitfields
[1] == 0, "got %08x\n", ds
.dsBitfields
[1]);
1187 ok(ds
.dsBitfields
[2] == 0, "got %08x\n", ds
.dsBitfields
[2]);
1188 ok(ds
.dsBmih
.biCompression
== BI_RGB
||
1189 broken(ds
.dsBmih
.biCompression
== BI_BITFIELDS
), /* nt4 sp1 and 2 */
1190 "got %x\n", ds
.dsBmih
.biCompression
);
1192 orig_bm
= SelectObject(mem_dc
, dib
);
1194 sha1
= sha1_graphics_a8r8g8b8
;
1195 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1197 SelectObject(mem_dc
, orig_bm
);
1200 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
1201 trace("8888 - bitfields\n");
1202 bmi
->bmiHeader
.biBitCount
= 32;
1203 bmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
1204 bit_fields
[0] = 0xff0000;
1205 bit_fields
[1] = 0x00ff00;
1206 bit_fields
[2] = 0x0000ff;
1208 dib
= CreateDIBSection(mem_dc
, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1209 ok(dib
!= NULL
, "ret NULL\n");
1210 ok(GetObjectW( dib
, sizeof(ds
), &ds
), "GetObject failed\n");
1211 ok(ds
.dsBitfields
[0] == 0xff0000, "got %08x\n", ds
.dsBitfields
[0]);
1212 ok(ds
.dsBitfields
[1] == 0x00ff00, "got %08x\n", ds
.dsBitfields
[1]);
1213 ok(ds
.dsBitfields
[2] == 0x0000ff, "got %08x\n", ds
.dsBitfields
[2]);
1214 ok(ds
.dsBmih
.biCompression
== BI_BITFIELDS
, "got %x\n", ds
.dsBmih
.biCompression
);
1216 orig_bm
= SelectObject(mem_dc
, dib
);
1218 sha1
= sha1_graphics_a8r8g8b8
;
1219 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1221 SelectObject(mem_dc
, orig_bm
);
1224 /* a8b8g8r8 - bitfields. */
1225 trace("a8b8g8r8 - bitfields\n");
1226 bmi
->bmiHeader
.biBitCount
= 32;
1227 bmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
1228 bit_fields
[0] = 0x0000ff;
1229 bit_fields
[1] = 0x00ff00;
1230 bit_fields
[2] = 0xff0000;
1232 dib
= CreateDIBSection(mem_dc
, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1233 ok(dib
!= NULL
, "ret NULL\n");
1234 ok(GetObjectW( dib
, sizeof(ds
), &ds
), "GetObject failed\n");
1235 ok(ds
.dsBitfields
[0] == 0x0000ff, "got %08x\n", ds
.dsBitfields
[0]);
1236 ok(ds
.dsBitfields
[1] == 0x00ff00, "got %08x\n", ds
.dsBitfields
[1]);
1237 ok(ds
.dsBitfields
[2] == 0xff0000, "got %08x\n", ds
.dsBitfields
[2]);
1238 ok(ds
.dsBmih
.biCompression
== BI_BITFIELDS
, "got %x\n", ds
.dsBmih
.biCompression
);
1240 orig_bm
= SelectObject(mem_dc
, dib
);
1242 sha1
= sha1_graphics_a8b8g8r8
;
1243 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1245 SelectObject(mem_dc
, orig_bm
);
1250 bmi
->bmiHeader
.biBitCount
= 24;
1251 bmi
->bmiHeader
.biCompression
= BI_RGB
;
1253 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1254 ok(dib
!= NULL
, "ret NULL\n");
1255 orig_bm
= SelectObject(mem_dc
, dib
);
1257 sha1
= sha1_graphics_24
;
1258 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1260 SelectObject(mem_dc
, orig_bm
);
1265 bmi
->bmiHeader
.biBitCount
= 16;
1266 bmi
->bmiHeader
.biCompression
= BI_RGB
;
1268 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1269 ok(dib
!= NULL
, "ret NULL\n");
1270 ok(GetObjectW( dib
, sizeof(ds
), &ds
), "GetObject failed\n");
1271 ok(ds
.dsBitfields
[0] == 0x7c00, "got %08x\n", ds
.dsBitfields
[0]);
1272 ok(ds
.dsBitfields
[1] == 0x03e0, "got %08x\n", ds
.dsBitfields
[1]);
1273 ok(ds
.dsBitfields
[2] == 0x001f, "got %08x\n", ds
.dsBitfields
[2]);
1274 ok(ds
.dsBmih
.biCompression
== BI_BITFIELDS
, "got %x\n", ds
.dsBmih
.biCompression
);
1276 orig_bm
= SelectObject(mem_dc
, dib
);
1278 sha1
= sha1_graphics_r5g5b5
;
1279 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1281 SelectObject(mem_dc
, orig_bm
);
1286 bmi
->bmiHeader
.biBitCount
= 16;
1287 bmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
1288 bit_fields
[0] = 0x0f00;
1289 bit_fields
[1] = 0x00f0;
1290 bit_fields
[2] = 0x000f;
1291 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1292 ok(dib
!= NULL
, "ret NULL\n");
1293 ok(GetObjectW( dib
, sizeof(ds
), &ds
), "GetObject failed\n");
1294 ok(ds
.dsBitfields
[0] == 0x0f00, "got %08x\n", ds
.dsBitfields
[0]);
1295 ok(ds
.dsBitfields
[1] == 0x00f0, "got %08x\n", ds
.dsBitfields
[1]);
1296 ok(ds
.dsBitfields
[2] == 0x000f, "got %08x\n", ds
.dsBitfields
[2]);
1297 ok(ds
.dsBmih
.biCompression
== BI_BITFIELDS
, "got %x\n", ds
.dsBmih
.biCompression
);
1299 orig_bm
= SelectObject(mem_dc
, dib
);
1301 sha1
= sha1_graphics_r4g4b4
;
1302 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1304 SelectObject(mem_dc
, orig_bm
);
1309 bmi
->bmiHeader
.biBitCount
= 8;
1310 bmi
->bmiHeader
.biCompression
= BI_RGB
;
1311 bmi
->bmiHeader
.biClrUsed
= 5;
1312 bmi
->bmiColors
[0].rgbRed
= 0xff;
1313 bmi
->bmiColors
[0].rgbGreen
= 0xff;
1314 bmi
->bmiColors
[0].rgbBlue
= 0xff;
1315 bmi
->bmiColors
[1].rgbRed
= 0;
1316 bmi
->bmiColors
[1].rgbGreen
= 0;
1317 bmi
->bmiColors
[1].rgbBlue
= 0;
1318 bmi
->bmiColors
[2].rgbRed
= 0xff;
1319 bmi
->bmiColors
[2].rgbGreen
= 0;
1320 bmi
->bmiColors
[2].rgbBlue
= 0;
1321 bmi
->bmiColors
[3].rgbRed
= 0;
1322 bmi
->bmiColors
[3].rgbGreen
= 0xff;
1323 bmi
->bmiColors
[3].rgbBlue
= 0;
1324 bmi
->bmiColors
[4].rgbRed
= 0;
1325 bmi
->bmiColors
[4].rgbGreen
= 0;
1326 bmi
->bmiColors
[4].rgbBlue
= 0xff;
1328 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1329 ok(dib
!= NULL
, "ret NULL\n");
1331 orig_bm
= SelectObject(mem_dc
, dib
);
1333 sha1
= sha1_graphics_8
;
1334 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1336 SelectObject(mem_dc
, orig_bm
);
1341 bmi
->bmiHeader
.biBitCount
= 4;
1343 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1344 ok(dib
!= NULL
, "ret NULL\n");
1346 orig_bm
= SelectObject(mem_dc
, dib
);
1348 sha1
= sha1_graphics_4
;
1349 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1351 SelectObject(mem_dc
, orig_bm
);
1356 bmi
->bmiHeader
.biBitCount
= 1;
1357 bmi
->bmiHeader
.biClrUsed
= 2;
1359 bmi
->bmiColors
[0].rgbRed
= 0x00;
1360 bmi
->bmiColors
[0].rgbGreen
= 0x01;
1361 bmi
->bmiColors
[0].rgbBlue
= 0xff;
1362 bmi
->bmiColors
[1].rgbRed
= 0xff;
1363 bmi
->bmiColors
[1].rgbGreen
= 0x00;
1364 bmi
->bmiColors
[1].rgbBlue
= 0x00;
1366 dib
= CreateDIBSection(0, bmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
1367 ok(dib
!= NULL
, "ret NULL\n");
1369 orig_bm
= SelectObject(mem_dc
, dib
);
1371 sha1
= sha1_graphics_1
;
1372 draw_graphics(mem_dc
, bmi
, bits
, &sha1
);
1374 SelectObject(mem_dc
, orig_bm
);
1382 HMODULE mod
= GetModuleHandleA("gdi32.dll");
1383 pSetLayout
= (void *)GetProcAddress( mod
, "SetLayout" );
1385 CryptAcquireContextW(&crypt_prov
, NULL
, NULL
, PROV_RSA_FULL
, CRYPT_VERIFYCONTEXT
);
1387 test_simple_graphics();
1389 CryptReleaseContext(crypt_prov
, 0);