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
26 #define M_PI 3.14159265358979323846
29 static HCRYPTPROV crypt_prov
;
31 static const DWORD rop3
[256] =
33 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5,
34 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001,
35 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54,
36 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385,
37 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868,
38 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A,
39 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388,
40 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA,
41 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A,
42 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25,
43 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389,
44 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9,
45 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8,
46 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65,
47 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6,
48 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9,
49 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5,
50 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5,
51 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A,
52 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345,
53 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5,
54 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229,
55 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348,
56 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9,
57 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA,
58 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224,
59 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349,
60 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8,
61 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79,
62 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08,
63 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5,
64 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062
67 static inline BOOL
rop_uses_src(DWORD rop
)
69 return (((rop
& 0xcc0000) >> 2) != (rop
& 0x330000));
72 static const char *sha1_graphics_a8r8g8b8
[] =
74 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
75 "2426172d9e8fec27d9228088f382ef3c93717da9",
76 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
77 "664fac17803859a4015c6ae29e5538e314d5c827",
78 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
79 "fe6cc678fb13a3ead67839481bf22348adc69f52",
80 "d51bd330cec510cdccf5394328bd8e5411901e9e",
81 "df4aebf98d91f11be560dd232123b3ae327303d7",
82 "f2af53dd073a09b1031d0032d28da35c82adc566",
83 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
84 "c387917268455017aa0b28bed73aa6554044bbb3",
85 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
86 "6c530622a025d872a642e8f950867884d7b136cb",
87 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
88 "b2261353decda2712b83538ab434a49ce21f3172",
89 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
90 "9b9874c1c1d92afa554137e191d34ea33acc322f",
91 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
92 "d7398de15b2837a58a62a701ca1b3384625afec4",
93 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
94 "5246ef357e7317b9d141a3294d300c195da76cb7",
95 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
96 "3d8244b665ecdb104087bad171b0b0f83545133c",
97 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
98 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
99 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
100 "e358efb1c11172e40855de620bdb8a8e545cd790",
101 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
102 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
103 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
104 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
105 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
106 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
107 "94645300d6eb51020a7ef8261dee2941cd51b5df",
108 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
109 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
110 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
111 "68c18db6abfda626cab12d198298d4c39264bfbc",
112 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
113 "39c31de73aafcfcadf0bf414da4495be9de54417",
114 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
115 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
116 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
117 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
118 "3d2ccbe51408232a04769546b1bdd74f84558a41",
119 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
120 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
121 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
122 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
123 "d7dd4700f49808541bba99244b7eb5840e0a2439",
124 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
125 "8eb1f99d21a84153e88e7958707049d517ab7641",
126 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
127 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
128 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
129 "50a09678c49c208f71d40452daca5411279aa674",
130 "e462052a03dbe4ec3814db7700e166d00d4d686f",
131 "a27917d4db49ce77989fae246015aeb2a28520ee",
132 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
133 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
134 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
135 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
136 "2b3198bd5c0a87db5dab13df8bbe14363d02acec",
137 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
138 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
139 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
143 static const char *sha1_graphics_a8r8g8b8_bitfields
[] =
145 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
146 "2426172d9e8fec27d9228088f382ef3c93717da9",
147 "9e8f27ca952cdba01dbf25d07c34e86a7820c012",
148 "664fac17803859a4015c6ae29e5538e314d5c827",
149 "17b2c177bdce5e94433574a928bda5c94a8cdfa5",
150 "fe6cc678fb13a3ead67839481bf22348adc69f52",
151 "d51bd330cec510cdccf5394328bd8e5411901e9e",
152 "df4aebf98d91f11be560dd232123b3ae327303d7",
153 "f2af53dd073a09b1031d0032d28da35c82adc566",
154 "eb5a963a6f7b25533ddfb8915e70865d037bd156",
155 "c387917268455017aa0b28bed73aa6554044bbb3",
156 "dcae44fee010dbf7a107797a503923fd8b1abe2e",
157 "6c530622a025d872a642e8f950867884d7b136cb",
158 "7c07d91b8f68fb31821701b3dcb96de018bf0c66",
159 "b2261353decda2712b83538ab434a49ce21f3172",
160 "35f731c0f6356b8f30651bb3cbe0d922c49deba5",
161 "9b9874c1c1d92afa554137e191d34ea33acc322f",
162 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e",
163 "d7398de15b2837a58a62a701ca1b3384625afec4",
164 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae",
165 "5246ef357e7317b9d141a3294d300c195da76cb7",
166 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3",
167 "3d8244b665ecdb104087bad171b0b0f83545133c",
168 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d",
169 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1",
170 "7da9dd3d40d44d92deb9883fb7110443c2d5769a",
171 "e358efb1c11172e40855de620bdb8a8e545cd790",
172 "58806549380c964e7a53ad54821d2eb86fa5b9ce",
173 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f",
174 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1",
175 "8a010d4c5af51fcc34d51be3197878782bdf63e7",
176 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528",
177 "41bcc1f57c60bdec3c4d1e749084a12867f91224",
178 "94645300d6eb51020a7ef8261dee2941cd51b5df",
179 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2",
180 "21cdfde38ac7edbb241ec83d82f31286e90c4629",
181 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe",
182 "68c18db6abfda626cab12d198298d4c39264bfbc",
183 "6b59ae6c20749020ad43175e05110dc33b6a59b5",
184 "39c31de73aafcfcadf0bf414da4495be9de54417",
185 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab",
186 "f6a6d765bf23726329f96020ba8c5e3c0897aafa",
187 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058",
188 "e71d6bb9bd38eea5719f8ba57177997910e2d841",
189 "3d2ccbe51408232a04769546b1bdd74f84558a41",
190 "a1fe9aa885584a0f713d7c6f76c89830fbf28563",
191 "d7085333becdec7759a5229e5fe9ba1e11db0c22",
192 "aaf62842bb98d8a2945c4f643baf50afaeea9307",
193 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692",
194 "d7dd4700f49808541bba99244b7eb5840e0a2439",
195 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7",
196 "8eb1f99d21a84153e88e7958707049d517ab7641",
197 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
198 "568f87f0194ca19b69a5b2bcdef795d89c5721ce",
199 "a37810f46dee8741fe5adbb3f1f2e87012ffc929",
200 "50a09678c49c208f71d40452daca5411279aa674",
201 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08",
202 "b2c8e1ebb9435031fe068442f479d1304096e79f",
203 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1",
204 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134",
205 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf",
206 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5",
207 "e4f110504dd3e4e34f960a39ba91a91c67bf26af",
208 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4",
209 "5dca709c60e0cd50fa85274a2836aec9eb6168e3",
210 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89",
214 static const char *sha1_graphics_a8b8g8r8
[] =
216 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
217 "e0bc877697093ed440e125154e247ca9d65e933c",
218 "c6d7faf5a502299f99d59eef3f7650bd63dbe108",
219 "9d8c05c3ebd786e7d052418e905a80a64bf7853d",
220 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a",
221 "b91c8f21cc4d7994abc551feff5b6927d267a9db",
222 "d49dd2c6a37e975b6dc3d201ccc217a788b30284",
223 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904",
224 "18c3ae944e0afb6c43c21cde093ddb22a27611e4",
225 "b753ebb39d90210cc717f57b53dd439f7de6b077",
226 "38c017dd1fff26b492a57e09f3ce2c4370faf225",
227 "94368cea5033b435454daa56d55546310675131e",
228 "bf57a6a37fb107d29ed3d45695919887abcb7902",
229 "3db0f8bcca3d94920aa57be6321202b8c3c08822",
230 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a",
231 "8e09abb108e137c99527ab4c9bd07d95b9254bbb",
232 "b0178632775d29bec2b16de7b9b8287115c40d0f",
233 "ca7e859647b9498b53fdd92543ad8aea98ff46f3",
234 "3369889a67d6c79a24ee15f7d14374f9995215e4",
235 "473a1fd07df800c87a5d3286b642ace10c61c6af",
236 "10cd25a0ed5cd8f978d7d68236f81d949b938e84",
237 "b8951d2b20518fd129e5113a5f429626893913bf",
238 "e81fc45962f861d53f420e29cb5d33faf5adbec8",
239 "4851c5b7d5bc18590e787c0c218a592ef504e738",
240 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf",
241 "abdf003699364fe45fab7dc61e67c606d0063b40",
242 "89abaadff4e68c738cf9251c51e3609564843381",
243 "77d0ad32938147aa4038c1eced232b7b5a5f88f3",
244 "43d36e57b702ce56eb250bf53f1ecc4680990cfe",
245 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41",
246 "71b9756fdfeedce1e6db201176d21a981b881662",
247 "5319528d9af750c172ae62ee85ddb2eaef73b193",
248 "b7ce8aa3c328eedaed7306234ed9bae67708e627",
249 "19b32a0daa91201725b5e13820c343d0a84ff698",
250 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1",
251 "2ba70994d0b4ce87fdf6fbc33ada11252178061e",
252 "9b81ccc2d956d1de019085f971ba19435fe5feae",
253 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd",
254 "8566c1110ab5cb8f754787b47923c8bff38f790c",
255 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3",
256 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2",
257 "d01071c44259adc94b89978b7d51a058b6dad665",
258 "e6d33b106bcda374e662d338c57a457dbcaa108a",
259 "27ef47377e88f5ac5ad33b19eae27d56c456ac65",
260 "339908a568f384e1f384a3e1b0dd415779203b02",
261 "88fd743d00bd37d2ed722092146795b044d08a6e",
262 "c0537ec24147e74939219213d864ee113cad9967",
263 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2",
264 "eac5d164b83edf2cf85bac242686f9f617ec1fa4",
265 "86c84cc8306975edecc6d4a89a8aff29f59b55a7",
266 "698d6393e97539806351368f95be478c6fbc62b0",
267 "c272d1e0342e6089a0182dc42b37e47889116a9b",
268 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7",
269 "25675c30adfe24d6cae60793b156dfdaa36ac3ba",
270 "849d4abf4b690128a5f70e9b8ac78f20c437de06",
271 "e768fc9f3167ef3144a4cfb1e20126a577f7dd5b",
272 "87f57a31253a38dbf3dc3070473328fa04b68a48",
273 "db64cc4d830fc35ed170b53943e722b2342954d4",
274 "9988ceca44dafbee247aece1f027c06c27c01652",
275 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5",
276 "b76e0724496e471b01ef8b34f8beba69f5bde261",
277 "34201d3d3583f89ce3267d3d0c4e01c64463de4b",
278 "693f5c5fbaeaadb5928d34b035499626fecb8394",
279 "66041875232f64dbfd2d18353aa28e43e8ccb6b5",
280 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8",
281 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6",
285 static const char *sha1_graphics_r10g10b10
[] =
287 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
288 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b",
289 "b1db68f35022c5fd43519ec8e98047e16bc4fff8",
290 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f",
291 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03",
292 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e",
293 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d",
294 "0ad27de0c916c073d0d18484fff899bbdb258db7",
295 "7c05ee5a01dad1e187537701a95382f0a3ec28dc",
296 "b00f0b4448be722d1a19ffe33aaaac4df848d397",
297 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c",
298 "2986b431a0022153e5f875da77cc792e3825ebd5",
299 "ca4b25a5459885ce1e0a36844612087893d425b1",
300 "181bd4616796d89174cedc0332fb320b65aeb0e2",
301 "6c417b1798ee319eeb404efe4aa136ed7ed37966",
302 "9a9f83e2035aa591d18101c919d1fd5b3456b46c",
303 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26",
304 "536eaaa901d652805a8977ecb2dc73f651094c5b",
305 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2",
306 "92cddcabf5365eef1e037f488af52b31669d987f",
307 "2c9c4f27bade080a2cd6f9160422762e267c2f5f",
308 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d",
309 "717778cc9ab30bcfc026a4344ea1bdef870bd247",
310 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e",
311 "d578210815e27fe210eb678a71e6d22ba4b4c196",
312 "c7a027c7079dfcc831ca8bc134a509958273073c",
313 "19cf978596195b848df8709aaf637f83f92b8336",
314 "86ddf268d854f37e5b478c48792b551b57635db6",
315 "8259d388e02542207b6a08d65d553871ce1c4a09",
316 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4",
317 "66f8d78d4971934794478afee28b3a50e97f1b82",
318 "b8f16334bdced439e1c6fc69704bc95f7b46b147",
319 "63798fb175afef78fa8fe8133d9de97a0cc80651",
320 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b",
321 "1ceb85697f649a62b1753438daa14944af7f450c",
322 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39",
323 "1cb0c7d9d89cdbce7b47d19ef0365bb6b2adc831",
324 "f00bac7e18827cfb264fae2e8a0da17b9db18d52",
325 "63c1c6c63e82f3b8bd977a1381b248e05321394d",
326 "ada202d2f526f6995f83412479891c1764b66e5a",
327 "68348e8f54883f4fe295354b024e291c85f1038f",
328 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b",
329 "e9167564031ead3459eee6a3ebb2f58f100d931f",
330 "d39315a1399639f6d4305a342c9ccf02a463b0dd",
331 "46196f50297260df2863e2fa76d2dfcf72006c23",
332 "0790585dfaef94f912b1ee81477d4ac448708708",
333 "589fb8a85d924ad19ed78409ae89475ba479c30a",
334 "43d67bc61ef54014b022891e5c024fc24b1fe797",
335 "5a713a91fd471fd331bd13b0868c994aa2ffe2b2",
336 "fc0c32afb719295f28bcfef22803bef94f798e20",
337 "bb2a421bab95f9b5420704ef44c0f3214a0b5a11",
338 "7735098af7535d8c57266190a13f92d8869e8529",
339 "36f6db4fbe2a1630a7597d3a446f2902755c96ef",
340 "d3f08946300e1700865042aed121870e292d1095",
341 "4782df8e24127e66a434b4e839adebf2dbb223fb",
342 "739707cc85ca63e0580c79618dc0bb8a4a338d95",
343 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095",
344 "317521e576801acaea62c76fe16813cdfe20f4ad",
345 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d",
346 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7",
347 "555b6f04ba8dec9e2a60693dcaac594227052727",
348 "c199b96a71c3aab2d49ccb5b6294bf14eb0dd1eb",
349 "4238fe9d296b5c72b0a8745cc761f308605b2094",
350 "88b6427cf71a6b9a26bfd6026103d50f721651a9",
351 "64cf929548bc5324fb14b053077bf5bc4be3e15c",
352 "1936661eee8073068506131c9e89265b2f8403e8",
356 static const char *sha1_graphics_r6g6b6
[] =
358 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf",
359 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a",
360 "5b9dab3d8411afb25fbbeba0313db526815ac189",
361 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2",
362 "2028d1b0d1acef35dc07027135023f35fb9746b9",
363 "378713720dcb5aadb730435ad0989a68ab189114",
364 "084152773feb01a85df6006f2f4f288a1442d37a",
365 "97b824953f60fc9a91028045baacbe7b7dc82b14",
366 "f33b1931f392bd09b3494efc23cf7d0ed3071014",
367 "287d755448e72e29e4812193e2b6f8098a214d82",
368 "4059d295aa05ace77853d7ee3d74305cdcbec9f5",
369 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1",
370 "e51bcf80211cd06e7d10225534b7a79b5454be27",
371 "9bf91a547f47b29bf370e9b60eae7cd6ce987617",
372 "0b94e0a5b739ab0020130646522e53da35a149ad",
373 "eab6e532845dfd5dc2701ef90669a5f7b63e9539",
374 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1",
375 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af",
376 "084607a5c99a84140d93db57d1b0f3a0f51afdac",
377 "2128157e601ef0d6b3636b7387d3b28e876de728",
378 "8bdcdcd463f0052279d070ac763757f4db975483",
379 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb",
380 "8b6452ebd1f6d189d10ee6647e7704821559cfcb",
381 "c39a25a61c4eade48dea62a97c9fb8714c06a8af",
382 "66b130f83381957cfc4763558c5f5cddf2e3b564",
383 "d548135ce2320499277ce12b80bc35004f8a9787",
384 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e",
385 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a",
386 "e2896035f178b3d20e4f4d1accb1b3d1b4028865",
387 "defd95a10d44cad6e736542920b74efd53e9e7eb",
388 "eaccd012c0fc46e79cae1997ef101979e5654d8d",
389 "3f11a735e52030aa3d0f024d83803698293d10e5",
390 "82f45c5a34fbb9e36d947a876834d33a1f69719c",
391 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc",
392 "3231c4d87faefb7ec5bd377613969c05b70343fc",
393 "00394e438e9edde978e88602c9ad2a572e965bf6",
394 "c0c41390270ba082ee8211576fee39c676813c42",
395 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba",
396 "caa39eb482e8fc2e00f1c6737735c023ac9363ef",
397 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f",
398 "3d6cf3753390a05504b1f50302f767df443f0f40",
399 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a",
400 "da9e896a3a98b330980152b2e4a43cb6e686c730",
401 "0a613357e1e8ec8ff1ad956e46e527a05cab8500",
402 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de",
403 "47499ad13b719de18c59c2bc9b38ed578db50b95",
404 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c",
405 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4",
406 "8ad5cd520cd628b76d2e5a3f318ae1bbb6b4c994",
407 "49341c297a887186bd47d7465d827ab3147f05e3",
408 "514c07281ef6702c35e68b230e897303a8cdec81",
409 "4b41865829b50b2e29beda51b055bd1f908a649c",
410 "325279e76367200d3fd7194d81c09fd139988ece",
411 "c3def160a1e847605ff0fc7edd30397fa90635a0",
412 "2b3e87e0b705b03c7c08f403409ab82cce095ba1",
413 "45c08e11fffc78b2a3574263419e0cb7f8cd9b45",
414 "aecb242c31f31a90f071b6455ea7d808d4ea22e3",
415 "77ea86e51a94b11a8081b29696cb4115687843e3",
416 "d67b897cad72d31e75359094007b1346fd8806ea",
417 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4",
418 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3",
419 "1e5a4ef7f8634847a251d1fcce298c409fd13d87",
420 "481337fbedf181d4324bf7f8299b0327197ff468",
421 "b4b9f0bf127ef11f510f25684ae21d692609c85e",
422 "5da35bad12e3e9b26a0444d30820099481281e45",
423 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42",
427 static const char *sha1_graphics_24
[] =
429 "e993b15c9bd14fb45a15310450b7083c44e42665",
430 "edbd7bab3d957fbc85e89612197cf918f5f5af20",
431 "6a7efb3b6e0b49336df1bd2937ca09a11d976531",
432 "236eb5ca9da70ec7cc719cd2fd291bab14000257",
433 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6",
434 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b",
435 "fd4be592483623dbc800fe28210a1f0daa71999b",
436 "788b8de98c47974fa9f232a6042ae4ca546ddb7d",
437 "a8772e6c44ba633fb384a7c4b50b435f1406107e",
438 "883bc8f305c602edca785e21cd00f488583fb13f",
439 "3bac4e80993f49dc3926e30524115fca9d7a8026",
440 "91369e35be29059a0665782541db4c8b324c6bb2",
441 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501",
442 "593d694cdcc8349b3bfc8257041dbcb27e61da45",
443 "1036b91d93e31cd1d4740d0c8642e115e5a38188",
444 "1898073cdb35ca4d2b21bba933ac16a0b4297317",
445 "5068bff794553cf5a3145ae407c9a2984357844c",
446 "413a7989969c229dee4ab1798362f32f96cf0a10",
447 "0bb222e540b82720d4971e4a2fc626899af03e03",
448 "adc20832d8c43f1cf372d8392535492013cd2306",
449 "45649794dcbcabda487f66f7a80fc1bec79047a1",
450 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9",
451 "9c6afd47dd748a33c585e6655fd4ec1c28976a47",
452 "b4df692ac70a5f9f303270df4641ab014c6cbf46",
453 "8bc3128ba47891366fd7b02fde7ca19100e64b9f",
454 "e649e00efe7fea1eb8b17f7867fe089e5270c44b",
455 "a0bffbbfb0adf6f188479c88da04e25d76ab4822",
456 "b58f19c1800344a2b8e017eb784705bdb2bd8450",
457 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd",
458 "955390669afed2369b15b32fa519f2f921cdf1a0",
459 "201906f7d763b930a98c97f8eeab417f2b65e723",
460 "5313357d50c40c05a3b3a83d0d2013a138c955a1",
461 "701c5af1d0c28294ce7d804b5697643c430d22a0",
462 "b0a959745b2db1d9f449e68e4479a4f36301879c",
463 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212",
464 "e171f6ec77bca91d6b8559911bce296c0bac469e",
465 "33bb75c12f083d799d287fe9caddedbb3892e6fa",
466 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289",
467 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc",
468 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51",
469 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27",
470 "0f79500eda467cd3cbc220abdd37b5dba695d654",
471 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630",
472 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278",
473 "7d479beeb6758c164566638b5c873c188d6a91e7",
474 "80086808fca03e757d812e31d1ae576bf90dac9d",
475 "9560096f1b85ae6d939d736165c44df00a47c424",
476 "1015e0217ea13eaa62c7666b8b81aafd75f8f610",
477 "5578c80048520732557abf3a3a3fa22c85015d7d",
478 "b25ba91487ec945410deb2b51bc1156890c032a8",
479 "4c8c936372755f95051f1159b7ff65a484e1a555",
480 "bf55d4bdb26ae0f358bd67ef01932563519aab98",
481 "d347ca5c6c4b6a61389247c3b6f61564033e8c25",
482 "ee315634ed92da3a32c2675ecd1b369471c60936",
483 "099c688a920f606655b485e8f0a433dc811bc976",
484 "9c044a733335bca43766bda2b317249309155079",
485 "354b92008a8409c62d0fa1dff1532c5943aa37a2",
486 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c",
487 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da",
488 "bf5ec23456efe00e1e0931c17de9040ab2092858",
489 "0bbdf0a0489428f96e3c1d3e5305f9a893820852",
490 "9d86b1b2bbce90efd3c0b9fe20d23ffa3eeecd20",
491 "8f7a0af421101952e674f37154c1e8c4646ea2d2",
492 "d12284f58daabbd173dfae6c7e55fd5d822d89b4",
493 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469",
494 "48658ff76c137185c56a53f3ccf0e958d0296742",
498 static const char *sha1_graphics_r5g5b5
[] =
500 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
501 "847005cf7371f511bcc837251cde07b1796f6113",
502 "a8f75743a930843ec14d516cd048b6e0468e5d89",
503 "d094f51ce9b9daa9c1d9594ea88be2a2db651459",
504 "cf3928e240c9149788e1635b115a4e5baea0dd8f",
505 "a9034a905daa91757b4f63345c0e40638cd53ca8",
506 "15ee915d989e49bb9bab5b834d8f355bd067cd8f",
507 "99474fecf11df7b7035c35be6b8b697be9889418",
508 "cbc2898717f97ebb07c0c7cc04abde936dc5b584",
509 "29c896b591fdf4ddd23e5c0da1818c37e4686d94",
510 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa",
511 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a",
512 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5",
513 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f",
514 "449092689226a1172b6086ba1181d6b6d6499f26",
515 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03",
516 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc",
517 "897d16f4d6a6ddad685d23ed7828d4f676539b75",
518 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56",
519 "6daaf945a955928c5c124c880522ca4634fb2343",
520 "12a288390d16e1efa99d4185301de48a4d433b14",
521 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4",
522 "1d3af561605fd61433035600d8962cb8d266fdd0",
523 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6",
524 "d7d97e28ed316f6596c737eb83baa5948d86b673",
525 "ecc2991277d7314f55b00e0f284ae3703aeef81e",
526 "656bf3b7121bcd620a0a3ad488f0d66604824577",
527 "df5dafe96e528c2cc7fd11e4934e298f53cec34b",
528 "a49530722328ae88fd765792ac0c657efbcce75d",
529 "aa46aa2226e3121eaefa9d0836418e0b69262d69",
530 "333f3f2cf3ff15736d59f92a33c45323d3987d6d",
531 "a6fd83542c3826132e88d3f5e304d604c0056fad",
532 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3",
533 "e428d213ad02651287894f093413949dcb369208",
534 "7df915bedcc5951a1b6f828490f7dbb93212e835",
535 "8720478d904a84c24071e97c731c1ba7882b131e",
536 "76215275593631f5900aad3616d725733dc39493",
537 "573d65665d20f00d36d9782ae2b89772140524ab",
538 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12",
539 "2a66dae03890ff791eabb982949435adb19af02b",
540 "24ac219478ba406f30794550690486b14cbac5e8",
541 "2b28d20690dc92374ebecb5508f8fdc6c7581790",
542 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea",
543 "9b02173f424c098ea0f4cc5db9eb65f69263d127",
544 "a92942269911a88793b3460b6f2a2cd56e48eec1",
545 "059db9f0426b371e464ef3d30f1a4f4aa599e101",
546 "aa4a0a4b7f2697aaf270c89874631974bd9d7183",
547 "a7506e2c001d271593297c9eda9b984d4d894774",
548 "8f447a3820c83662086dfa836da2205b0130fd5f",
549 "2ebf37d81da3f11434652d06bf65d55e96b090aa",
550 "ace2c60bd76b11a002bee852686e8783f102eba1",
551 "dab47c9dc149e570045d699598b14a613bf319b3",
552 "2daca4d26a086ed34894693be0b0374402232809",
553 "904f1d82159bcf5485f323bd12b859dc5e83f8eb",
554 "5bd29f94844351e9a5bd01f25d85608b9b0701b2",
555 "295ec16530126046790fb734e99f86f5b3b74ed8",
556 "d98b0561010606b55a1b9b85fbc93640f681d256",
557 "1c1499051860b7caa25173b328ca9c862f01dd1a",
558 "a655512753bc90e6d4eb3848f69e96db1ad348e5",
559 "2230f36f12d4becb242e2962fa1b3694db2496ca",
560 "d81e41a765d7a2d68073f5fde3f74f09df84001d",
561 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a",
562 "fedc67d1b0797be5f40cd45280844f2b61d29b0a",
563 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05",
564 "af45bf81d119be5cf6845ad41191ba52637e65e9",
568 static const char *sha1_graphics_r4g4b4
[] =
570 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae",
571 "cfa0ab83ee93283ad914c3748f0532da1697af1d",
572 "8bd18697d1ef27492805667a0bc956343ac08667",
573 "e8501c830321584474654f90e40eaf27dc21e6a8",
574 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4",
575 "821177710961d2cb5f7e7dfc0e06e767b6042753",
576 "667124365ffadeea1d8791bedda77a0c7b898de8",
577 "c9f23e684b600dea17575b4b17175fbd9106c3a9",
578 "7678876e50eae35d1eaa096aae25afaa0b864bf3",
579 "fb52b0c373a5f2a60b981604b120962942d2447a",
580 "5ab8dd07436681d762fa04ad7c6d71291c488924",
581 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8",
582 "115a6bd382410a4a1d3c1fa71d8bf02536863e38",
583 "65c6d1228e3b6d63d42647f14217bc1658b70d9a",
584 "25fcb75aa687aac35b8f72640889fe92413e00c5",
585 "3bddf9d53e89560b083302b146cd33791b13d941",
586 "a81504498c7a7bb46340ce74476a42f70f2730b1",
587 "e61a4f2657a444d8c49f84fb944f9f847667bf2b",
588 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8",
589 "1d283aa4d2b2114f7809fe59357d590c7c779aa7",
590 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4",
591 "57ebf8becac1524543da120e88e9cc57ecfdec49",
592 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18",
593 "d591232bbc2592462c819a9486750f64180518fd",
594 "0e183a4c30b3da345129cffe33fe0fc593d8666b",
595 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b",
596 "8933450132bf949ba4bc28626968425b5ed2867d",
597 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2",
598 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49",
599 "233e588cf660e2c9b552cf02065cf63fa6655864",
600 "0740ff74dcd259d9a644ba51ad77ff0d40348951",
601 "a3345acaf272f2e288626906e3056cd0ced70499",
602 "957a86fbe8a96dd068db65e4e624a52bcc84af46",
603 "13b0f240054dc57ba0e2dfde74048496304a2c7f",
604 "51ef267eb9c15487c9430f505e8a6c929eb2170c",
605 "60c0752f592c6426a2f4a71173b44c5c086f4f2a",
606 "9dd123938b0a02601d8d458ecbd6535ddefea724",
607 "815a1e4fc7f3a00c2990c150e87eba0b13f66811",
608 "75ae8c80af4356a1a5eebde6608fbc31e8a95372",
609 "b89ae8de2d975b8adb263ace66fd953d29165a8b",
610 "e901ab4b20bc87370609d7ba1f21aa08abd9eced",
611 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0",
612 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb",
613 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0",
614 "8c40d6d8e0c696c31f04c896e492a2a38703d870",
615 "e13c821c236ea0b67cca64c9da7be15e88fc712f",
616 "9af4907a8144458a73dbb7471784f8c3d9aeffcf",
617 "104e85bad287a62dfe25f0e78280179f18bac765",
618 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7",
619 "fde993dfce1551ef220f5a07ce4acd66e8524ac5",
620 "a80f3df0aea1e1b30d9833039157bca658218f48",
621 "07b10c3f191d0a93e5e5694aae37dcad407e10f5",
622 "f7900e60347029876ba55e8f0c4c02e89deb36b6",
623 "f373a5f37b82e7523c64c08eb509b6191e49b173",
624 "9f0760a05190c9edf9ce2e8be6aaa5557601fe91",
625 "7587a9c87cab1eca827807f351bb67ca184d1ac5",
626 "b53ef0b5c674822e784903a9dbdd3b386d9f2350",
627 "5505d2ed20dc61ffe48832ecf5329162a5ceb734",
628 "9f72be4467219a345b1164205d1fbfda2d64271e",
629 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10",
630 "a79e4cc419b9e1735e275e2823da52875536943a",
631 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be",
632 "f571c7c4aac92491017963032194690c0fa06b42",
633 "91d50b5a604d6c38aa0d08b9af995490f8ec246b",
634 "b53cde47b0e28063770d3b1328c3cc2f774a6300",
638 static const char *sha1_graphics_8_color
[] =
640 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
641 "e313bb57f699587b0bae2f17f5da5d977e6f2a61",
642 "49024d6cbdf1614327dfda9eda17675e76805f7e",
643 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f",
644 "92295ae66712df050cfd6cc9fd2fd4101784c5fc",
645 "84d85009d35ae10abbc435f3913422544105cea2",
646 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f",
647 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32",
648 "f3aa8d89430748178952de56643069d80b40aad6",
649 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd",
650 "0546b87bf5fbe1b8168eed5d4a20649be92734a1",
651 "52b1363e821bf604d9df260bfa97e26d428c33fd",
652 "108732d9909ee5f3542a9b90b3ad96ec82446ab9",
653 "06c76c53dcf3ba5e213d483e27d841404c9aa90a",
654 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c",
655 "89711289be6d5c55734878410e4923d5cca9aca9",
656 "8355caf57d51ad4e14275943088392e37dc75d33",
657 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6",
658 "6f0570da9dea7f043f678088f8362ee458cd79fa",
659 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2",
660 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c",
661 "5092b22af85a08f10a2899888bb9d552f25f828e",
662 "f5dafef807237fe72c74c0bbd47c382ace45bfde",
663 "e91973be2651eeef568700463652838d8cbba976",
664 "1df851515ecf46df5c2d3279535c1763f72353dd",
665 "b68922915ebc2797d58deecf983f7d0cf9a5efbd",
666 "359bd76088a965bb0cee7c44800bc46b2638807e",
667 "64205ccaa277e64eeea0c20e99900ac79858ca2c",
668 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e",
669 "91f988f575338505ba8a40727865a8d3f2298624",
670 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9",
671 "421e8b608378e4f17774dd32ea6446fa0fa16f91",
672 "3b7488731da48635d86be551ab7c8c0f91c78219",
673 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7",
674 "e15a355fc09bfd22267917898e2266168ff410e3",
675 "7a9c326a56a94621377a7258be70ba50042ca9a2",
676 "f994fb5019bf4c1a96eccf89af599eae0aa6b412",
677 "3a71ad6fef147067641e49a5f69b2454e3a5010d",
678 "ea10eac72830dcae19bcb16a076c2b21d844b5b6",
679 "add949d009217ef2b847e34772ba363e4be7b1b8",
680 "0b58666deb3615e912896a764e5c6475989e95e4",
681 "ea74c00c45569007383b632d7f1d2adc82645717",
682 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0",
683 "9dc776c5ab8256b1301c7d1da60544a9410e6715",
684 "46f772c2832b3aad584674db666bd63e48b4f338",
685 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac",
686 "f3dc739da41fb299637c8660e8c46917ddcf87a8",
687 "abd2fff80f74b311072ecdb91ce9ceba268fa6e9",
688 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488",
689 "8269b32b4a34440f1fa37927308debc7eb85f3fa",
690 "65b2c868790806be7ab4aaa6114d445c42a31f98",
691 "678979a45126a76eb629992cd64734862f53a555",
692 "2f7ba8803604c032cb1a1228bc021f0f1c03e245",
693 "52e7c2f8b01592898c13f1e7633881e350244209",
694 "d9d5556b77301952b4caf113337720966bc8e1f5",
695 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f",
696 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4",
697 "2c07272462c68cf5944b03e2aa049475b99143c5",
698 "07ca369fb875d37b9cf855045f528af1827edec4",
699 "5e9e3e71b06c5efe20f93b3838e745b40b878471",
700 "153ae5c9fc2a31b38c4878b25d9026b9f51f132d",
701 "488341e88810d737de0b26de4e4d4fa0e78eb482",
702 "5a42b7eeff8198e7b005e4afa4282e6ffb939906",
703 "26bc25a011e2b60961ee9d6c6141d928ae24389b",
704 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd",
708 static const char *sha1_graphics_8_grayscale
[] =
710 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
711 "df35491dd5038187c05bac06921402ba6d7773a8",
712 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53",
713 "66a686ac22cd0ec326f2c97ef473781cabe9690b",
714 "9bddef7b97b8b03569f07011e66ddd67fe82d787",
715 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f",
716 "0a87689ca33f888f05dbfa21ddec11c069990d8b",
717 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
718 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717",
719 "1fbc234c28a8140965ad0fe30b4b799f6681e864",
720 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733",
721 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f",
722 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843",
723 "114bb377b4e78a1978e1ac09388c48861b5223a3",
724 "8d0a92e6333e1b99591962e2def9bc9121111cf5",
725 "9dc511d6947fe816185cdff93bf0cfe0349b72b4",
726 "216388ddf6b563dd2058a9df65b40b6f72df1715",
727 "47f72be971bd2d3399dabd018201f4f5075e96fe",
728 "f39ab890a2b99d0c31e6e047f2315244972f5ffd",
729 "15b991814d84d6aa252696dd0c6150ef88a8db3f",
730 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a",
731 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9",
732 "b6785a410048bb85e7ea3f0492459972103c935e",
733 "82e641ebe47d9f8cc229b82b8315e69e52f812b1",
734 "15db343049e3a9b31addc5d2ffebc3fe91b39c51",
735 "a895daf1f20371d4d1c3f93c070124cc13e341c3",
736 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04",
737 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545",
738 "33fc8618ce62f5cdd9e06ad61e296f718a99899e",
739 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10",
740 "6d41e6168662e75baacf74d911d7419d54c8d73c",
741 "2404952157ba1519094a2da6bfbf2b0f1356432d",
742 "24caede65b40815a60b83c4edfa06bdc542388cd",
743 "650a51bedd1af92469d2950eb95220db35f95c6e",
744 "3f43aa11e6fccb747cc13224583fb2f951fee08c",
745 "b83f78ae85df87fc7af565db276c60c102274f20",
746 "1bd06e4e11929e5e91c3c9f20def639b20e731e8",
747 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1",
748 "85425940daf119125deb52421b2057acebe6d1cf",
749 "9869b6f088822fb423996f9968e5a931301fc2c3",
750 "a7f81cf3326fa3608acc13cfce2f573912e9d745",
751 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806",
752 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f",
753 "1bd2587399006eed0d46beff397d32081f6bc58e",
754 "640a49455acabca6954a7fbb6af4e872af342d11",
755 "589e7911e09332ee090371deae17b0120ff990b5",
756 "a1a941fa270cda48c648553ed4b427e16e96f8e0",
757 "115c90df05b1ff754dbdfe2a712ef126034d952d",
758 "fb63bbb2f944fb63ed2d7399f07b168740c1034b",
759 "ae45f0d463ff916f3cb630103969fd49e8d09ef4",
760 "2becf041f83d22ac072fef5e0efd9bc1572796fd",
761 "3685c9ae95118a83db3569832c29753276fa1264",
762 "09640bad951c33e7d70a1fced83b1869f65b3fc5",
763 "5eb00252664ec39e61359adb1dade4906a87a248",
764 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854",
765 "dcad1a146c1d0ec2c4cc7f64bd4f45c57a604bfe",
766 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2",
767 "17ae603c199a5d6695d198a7f36e6d7263990951",
768 "1918a33f59d3500204ffc573318a39e9ff754221",
769 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2",
770 "55d302ece31a9b7fc4be4a07a53767ba210273e7",
771 "a6a29836291f9dbca85e25cee60f62ef5faca6d7",
772 "3494a23633405e46af96cb57715617fef1ac252e",
773 "edc1ad2704452354aa6f79fac244a55b6f509c2e",
774 "a3eac75d30f681b3898ee469d368960529634d7d",
775 "e2b393dc3f5833f7868668ea31369e90348768cd",
779 static const char *sha1_graphics_8
[] =
781 "41728d7ff2bb425b5fc06521adeabf6cc73136f3",
782 "512246d4886ab889a090b167ba194577cb95272e",
783 "921e852d4564cb9e5ac15ff68b5207bebea871d1",
784 "9636b0ebefc443ea11949ccd28f6ca454277dd41",
785 "aa9050da55e6b6957c60b7d603fce539cb5c0048",
786 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4",
787 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8",
788 "390b2bf70daba36310683f46af9cd50b9a061396",
789 "82d21737e9a7247397a6c983a9b6d9a0452dd74d",
790 "2a8460af91675e01cbe9384eb6cd3eb2cb420960",
791 "1af53b1218ee9844fcda891b836d42f6b2f66bd5",
792 "da1cc34a9d9b779fc7849e03e214096026506464",
793 "5ba8f99ca034666effa556748c49a0f5a015125f",
794 "b67ba2f55659c75ac72c1112494461bb3086e1a4",
795 "73e2859ce849f756f954718ce3c90f02e31712b6",
796 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9",
797 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218",
798 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff",
799 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0",
800 "7262364067e03c7fa498af1d59d228d6c63b460e",
801 "5241241a355a667ef0834049adf4218e8b3f16b8",
802 "db22d666690948eb966f75b796c72c7150a5c4b9",
803 "af21fb2645b568b049549de375584c4aa3055143",
804 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd",
805 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8",
806 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f",
807 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532",
808 "d599bf210423fe3adbb4f1de87d9360de97827d0",
809 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9",
810 "cc01f17928f7780cefd423ea653b072eea723a1b",
811 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a",
812 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a",
813 "ea39ac62ca2f815a1d029340c6465994b6f03cb0",
814 "9a603513cd81acf70cf8b27b0d544e7f672e9d40",
815 "f4a334e69535de74ee5ed54be93a75120a66e54a",
816 "f751a55fb738b63b6fd7c229c33ef92605d0c9c1",
817 "61907a6685bba93077da40cfb28cf2ab74552fd2",
818 "122015e5e17c1c317c6e51c0e207826b606a4077",
819 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d",
820 "eb2ce16a6ae251f4965135ee776776b5fc02c42c",
821 "acead2745fec0b6c817fa601353bdf2d197b64f7",
822 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61",
823 "d83adc669c0dea0dc4812b93f998514b6f02d805",
824 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412",
825 "9e996fc74eeef53f0a6c31aabb2edce6e103f189",
826 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5",
827 "7d1bfff706b0713e53209407889f83a0da26a81d",
828 "5a1d8f9ea978b820edbc5c9e1c6f1cac022620ad",
829 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2",
830 "c404446958788fac00ee1eff571d682bc21dd7ac",
831 "95060f3dc9e6d01ada42f09a871b69f0699cb77c",
832 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09",
833 "600d6b2713d5e4c0d90c02660245ed26c7ae3033",
834 "0025a440866a404523a8a20e79a8891e45a2ff56",
835 "c04d335933895f836f0a28c1e3f7f444352c3b8e",
836 "bd28d77cd85b20a2384d6b25082cfd884bba683e",
837 "7e591ec8ae9bb61c3a443c93f071cab2b8978394",
838 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef",
839 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b",
840 "293c41a7ed923a4617560481ae8815cebf83701a",
841 "ec06b56f3abe277be42650ebd49dabeaae9e756d",
842 "750c923785ba2afb9ce597516c072f90f014bf95",
843 "bde5a62a065c027561226fbec5155e938ba7f6b3",
844 "fbaa8848a1d3896469c37fd43ab44233f5b875a3",
845 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337",
849 static const char *sha1_graphics_4
[] =
851 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
852 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e",
853 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4",
854 "9401799e6116c35e5f0e5bdca07ea25316757a72",
855 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c",
856 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281",
857 "2505598845fa026ea7187582461efbf06cb6904f",
858 "3981a19363beca8f28d32a5928ac296fd22a5296",
859 "01404024ebb2c266d17d734059524d874491650f",
860 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef",
861 "f35c5d62853be78c5d39fb2f45200dc262aa8e18",
862 "46e94a55f5f58a6b915078d8ffdc725f53aab516",
863 "665bbbc749a5ffeedc0d62aef0661a5ce845b017",
864 "1f26a01730f67d40ea711a50d9d801bac15a642e",
865 "3b53d24178cfacba53103a44dfd5d072b15a6781",
866 "c52cfd57f26037723d37192722fc3a217f280c9e",
867 "e34da6500cf2e424d980714d92737cf6c31a7bda",
868 "d17f4358ae529f920960ed89e535902ee13b0033",
869 "0f44e12ecd1ea7e39433890443626d4fc35204a4",
870 "eb38683e812fd13dca971ba8f4cfd2b6820d3524",
871 "73bbc83f88f1aaa6df0158b63e70bb3165163163",
872 "0dc2690a5c58a2907a8ab06693ebfab6698172eb",
873 "df5f0d6574bdf1781754b5b9f98232a77e439e33",
874 "39c16648cf6c261be71a33cec41867f28e119b94",
875 "26ad5116562e7b58c76a26eaf521e2e40899e944",
876 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8",
877 "4f827ca6927f15191588456f985bf29d2a3b3c24",
878 "6fb102d020e5554116feefc8482104f3ae2036d2",
879 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc",
880 "20c9eb3276c08fdce35755e349bec94b04929812",
881 "628d837163a25c6520f19c0602383176dbad528e",
882 "b5a12cff7100290ad43f5ed17a321b42de048893",
883 "b672afbeeafb44194a821f0def81a8892872937e",
884 "db0124045882b598feea192186cf7eb7a0387866",
885 "602d91471378fe24a2d0248bd8a92b624f099fea",
886 "c93a86adfe58dc2d461f2ed962883d6b90888848",
887 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa",
888 "1a579cd280422131c35e907a023ee0e80749b5a4",
889 "bbf027f506cbb80d359bf4892fcb75f816f2e446",
890 "ed44bded6b17df7fe92b191fd810d1aafbd55f52",
891 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4",
892 "e2a21a965dfd0bd09f9270917f681610efc18ce7",
893 "3e411b004a5be84451860c6da6a4a1a482b77862",
894 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36",
895 "7811c536a6527112b438a6413f3927f2c79086a7",
896 "525ef3615040225752a2fe646ab99ee64e360630",
897 "46760975993f9881b7bbe94123173e6a683d3f25",
898 "c644f460937107214a88d5eb9e846d27abd8c874",
899 "df5feb905a31c288008cf5e82d73ac818a160d82",
900 "4f9658dde0432a711a4d783c1b5aa3365fb7d54b",
901 "09438163dcbede3890a0e6d8e614c97a06759380",
902 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1",
903 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951",
904 "ccf8d11b1e81895e9781f17c227c821228d8714b",
905 "f751e26578193afe6a727ee2a52318c404c56555",
906 "28a6b9f7927e99e53cf46f0333d29168cb10e920",
907 "029552113292cc110fd6b7888e766628950aaeef",
908 "297f6ad15200bffbf15198324ee8f27a61a6f2d4",
909 "70cfa427a1a0d6f2232b1fd544905d48af69cb98",
910 "287ea7db721e641439888cb9f4bac3a5f16124eb",
911 "dd9eaa5325cdf250e89162ac84207978ebb6458e",
912 "42466aab11852741d937c1ff6f3bb711e58415a6",
913 "3024fa38333f83a639b0f0e6ac6d4b9868231157",
914 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e",
915 "9ab46e0c42f82dc73df8a55cbf881abd72397cec",
919 static const char *sha1_graphics_4_grayscale
[] =
921 "fa867e2976a549ecd3b1fa67df54963232fcef8c",
922 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24",
923 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716",
924 "1c201d149c0bd886ff8a427ad513f15a70991174",
925 "44646e67842a4d055bea1fad0434e6e4a0eb5465",
926 "315189097a02024d2eae61d524c4de07a396aee7",
927 "73ac786015dea36ac466a6524dba757d5d238ece",
928 "6e328cc4d53627f034b23706d8bf26afe18512ae",
929 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e",
930 "95e6f509bb1cf9981efc47a0878ab0bd983eb349",
931 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f",
932 "6448226859cab61a61c95d3ed5ed5f216b1bb120",
933 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62",
934 "ec3879342b5a44f6de6efe946243ae5ade00980d",
935 "6e328cc4d53627f034b23706d8bf26afe18512ae",
936 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2",
937 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b",
938 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7",
939 "b2bda683edef912957845a33edc055902a801fed",
940 "b067f0421cb2c83b218b8ab6edbede2ff5723b57",
941 "c8de76f9c0900e5f86c7584fe94d5749376b7b49",
942 "43ee3e187dda14b86aef12371041ae70313b5a65",
943 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8",
944 "d4930552a7845111ffd9db57260be1ab97967c06",
945 "afdf41fca7951c6dd6193320de1295f2c68fe52a",
946 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4",
947 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1",
948 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b",
949 "9b7d6b12385bb9e1cd881758aff342bd5427432b",
950 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600",
951 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe",
952 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9",
953 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985",
954 "f8224430462f6a93f85ef33b8aa7299525990708",
955 "1cf93cecc942b41ab8fae21ea18418a6d64873e5",
956 "71a1705ee14068ee8c6c6680c1bd99703fb6abd7",
957 "94438c82b8812fe81a69d5d1429c5967cdbfed7a",
958 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d",
959 "94ad53c578f6034dfc5c666e363203cdfb00f2cc",
960 "8cd7b0ba8426db344b4cb8820890603020ed65e9",
961 "ad96132f25ca14e1aeb17c86f8d187febf6401c9",
962 "027b05bc82ce4f897c4bf812610a641547368939",
963 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3",
964 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b",
965 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4",
966 "cc96ccaf6b99f60a49b03017515f83cba22b4c40",
967 "5eeb56afea8040a8fb18c11f29931b836474126d",
968 "30c256a783c4874261667bb31307eb282ab9470e",
969 "f8681c09f1abfc38d31e47622cb8798cd896a00e",
970 "0ba7e5d68419702605739acb52fcc01c96cb63d4",
971 "f8d2f196ba8a16f54acb934e61a759ab7d3f2f05",
972 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7",
973 "d374d4d92c940ae42a9b42c14d744341b68a8c14",
974 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f",
975 "c47c2dc806b6b8ff28f300949695d013a46c0083",
976 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63",
977 "c2f61571b067a44b30f56b4658c9606f0edfc0f3",
978 "58f400c9bb78e49a879276fb049edfc9c981740a",
979 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c",
980 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9",
981 "c96a998be5c1d588ef1243cfd2610d056d16947e",
982 "68bee638d59a373f33f308751471b3ef41849582",
983 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9",
984 "2d5123e757cf00e423a89160d7dc4997c3688829",
985 "36dfdad9f3f5cfde6add3cef23368c343d30469a",
989 static const char *sha1_graphics_1
[] =
991 "23366004515f3bc46796ea505d748f8d0f97fbe1",
992 "61ade9054d4477fb89cf830539a5e8b4e45f0688",
993 "ac530c5dbaf837e15b2337347e974184fad73643",
994 "95fdcda26262d5948a9ade77d83fd698e0031050",
995 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13",
996 "f6b61ecf03ad11752775faca1d4404c6bb5065f5",
997 "d7ad44d6f377598268e9968333ae2cf23a0715ca",
998 "5871339cd7e6cee12d4dc45934a89071c73efe6b",
999 "69e9b85b34caf736069ba91e57a5c3fa7c891653",
1000 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6",
1001 "f69ee65ea25676429a28eea79b5b9cb9206b8d01",
1002 "39ff81f77ef4ee772367ed1a63785987c060126e",
1003 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c",
1004 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1",
1005 "7ddf19df5bbdf4475b6ec1bc042425e382502864",
1006 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1007 "400a21caa01e015096ee1afcf1b54e7f8ec515bd",
1008 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca",
1009 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc",
1010 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de",
1011 "13cc63972aee4f6ae27091a8af18de01f1d3a5da",
1012 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e",
1013 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4",
1014 "d1e6091caa4482d3142df3b958606c41ebf4698e",
1015 "07c1116d8286fb665a1005de220eadc3d5999aaf",
1016 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1",
1017 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce",
1018 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0",
1019 "24b1a6241c81dbb950cfbe5da6798fd59eb36266",
1020 "1007d3b531b4bc3553d4547bc88443fc1f497cf6",
1021 "b71ca46be287598f716bb04fac0a52ad139c70db",
1022 "6589e48498e30ab036fbfe94d73427b2b1238a69",
1023 "4dce919117d2e41df9f5d4d0de14f97ae650046d",
1024 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac",
1025 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c",
1026 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0",
1027 "18f4497e43903e8df5b27da4ceebf62b15550a87",
1028 "399e988c922b7fad1c8f6907541c5dda65e60408",
1029 "2fcd25c2d19a01fa631fd19135d9f28b26b86259",
1030 "655cfadeb157233c804d42b58195569c8846e3c1",
1031 "65c8811c609203fd424f5ed5f92ca2268a1dca54",
1032 "a45b297d709e297584eb0f2985294ec0ab53d8ad",
1033 "0d180c37bc26d83a1a11f66168757f3de2493243",
1034 "b362ba4790def178c236c0ae7b0093dbba47cf24",
1035 "d1d2ecf71a37d9eda58fa09454aa871971428ace",
1036 "6672da4e016b6e9de0ca218f8307cce7d48d62c4",
1037 "ee22f43ea867228c6ff937d39e1826e285a107e8",
1038 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c",
1039 "a2a928de9007d765da496abec8c21b23601f8c45",
1040 "41a417c1f25f2619301afa44bfcde85198985792",
1041 "23366004515f3bc46796ea505d748f8d0f97fbe1",
1042 "ba682eb15c0ddffb942e6086e0ccad2353ed7241",
1043 "58273e1fbf961ff2c772d57160d60170e258d3fe",
1044 "88763f8e8fcf4f78fa864325791a9dd35a0bd279",
1045 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f",
1046 "44a28536466dc895feb824b23dfd4a47c6948af8",
1047 "17468a3789f0a6d65c302bda735a01dc2c1a74d9",
1048 "781d8c5cbc28591fd48fce06f984c502fdc6b363",
1049 "df510792a7790cc699532b1420d43c6d4da2ae2f",
1050 "55c26d22f11d80b73383fa57d0fac552d705b092",
1051 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc",
1052 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81",
1053 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b",
1054 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0",
1055 "9ab50a663b74577b656e9849484a909d7ac52eeb",
1056 "8d34215487088b5d4ef63062270ce25c2862643d",
1057 "bbabe686a6955402c90530e7c67f1428868369b3",
1061 static const RECT graphics_bounds
[] =
1064 { 10, 3, 219, 101 },
1065 { 100, 100, 301, 301 },
1067 { 10, 10, 110, 320 },
1068 { 10, 99, 300, 200 },
1069 { 99, 12, 201, 200 },
1070 { 90, 110, 300, 200 },
1071 { 90, 90, 210, 200 },
1072 { 10, 99, 300, 200 },
1073 { 10, 99, 300, 200 },
1074 { 99, 12, 201, 200 },
1075 { 99, 11, 201, 200 },
1076 { 90, 110, 300, 200 },
1077 { 90, 110, 300, 200 },
1078 { 10, 10, 365, 405 },
1079 { 10, 10, 365, 405 },
1080 { 10, 10, 365, 405 },
1081 { 10, 10, 365, 405 },
1082 { 10, 10, 365, 405 },
1083 { 10, 10, 365, 405 },
1084 { 10, 10, 365, 405 },
1085 { 10, 10, 365, 405 },
1086 { 10, 10, 350, 251 },
1087 { 10, 10, 300, 200 },
1088 { 300, 10, 9, 260 },
1089 { 10, 10, 435, 405 },
1090 { 10, 10, 120, 120 },
1091 { 10, 10, 110, 110 },
1092 { 10, 10, 120, 110 },
1093 { 10, 10, 110, 120 },
1094 { 10, 10, 120, 120 },
1095 { 10, 10, 110, 110 },
1096 { 10, 10, 120, 110 },
1097 { 10, 10, 110, 120 },
1099 { 100, 100, 356, 356 },
1100 { 50, 50, 306, 306 },
1101 { 100, 100, 356, 356 },
1102 { 100, 100, 356, 356 },
1103 { 100, 100, 356, 356 },
1104 { 100, 100, 356, 356 },
1105 { 100, 100, 356, 356 },
1106 { 100, 100, 356, 356 },
1107 { 100, 100, 356, 356 },
1108 { 100, 100, 356, 356 },
1109 { 100, 100, 356, 356 },
1110 { 10, 10, 356, 356 },
1111 { 100, 100, 356, 356 },
1114 { 10, 10, 416, 26 },
1116 { 0, 10, 511, 306 },
1117 { 0, 10, 512, 306 },
1121 { 45, 45, 256, 256 },
1122 { 86, 86, 215, 215 },
1123 { 45, 45, 256, 256 },
1128 { -1, -1, -1, -1 } /* the end */
1131 static const char **current_sha1
;
1132 static const RECT
*current_bounds
;
1133 static const char *dst_format
;
1135 static inline DWORD
get_stride(const BITMAPINFO
*bmi
)
1137 return ((bmi
->bmiHeader
.biBitCount
* bmi
->bmiHeader
.biWidth
+ 31) >> 3) & ~3;
1140 static inline DWORD
get_dib_size(const BITMAPINFO
*bmi
)
1142 return get_stride(bmi
) * abs(bmi
->bmiHeader
.biHeight
);
1145 static char *hash_dib(const BITMAPINFO
*bmi
, const void *bits
)
1147 DWORD dib_size
= get_dib_size(bmi
);
1151 DWORD hash_size
= sizeof(hash_buf
);
1153 static const char *hex
= "0123456789abcdef";
1155 if(!crypt_prov
) return NULL
;
1157 if(!CryptCreateHash(crypt_prov
, CALG_SHA1
, 0, 0, &hash
)) return NULL
;
1159 CryptHashData(hash
, bits
, dib_size
, 0);
1161 CryptGetHashParam(hash
, HP_HASHVAL
, NULL
, &hash_size
, 0);
1162 if(hash_size
!= sizeof(hash_buf
)) return NULL
;
1164 CryptGetHashParam(hash
, HP_HASHVAL
, hash_buf
, &hash_size
, 0);
1165 CryptDestroyHash(hash
);
1167 buf
= HeapAlloc(GetProcessHeap(), 0, hash_size
* 2 + 1);
1169 for(i
= 0; i
< hash_size
; i
++)
1171 buf
[i
* 2] = hex
[hash_buf
[i
] >> 4];
1172 buf
[i
* 2 + 1] = hex
[hash_buf
[i
] & 0xf];
1179 static void reset_bounds( HDC hdc
)
1181 current_bounds
= graphics_bounds
;
1182 SetBoundsRect( hdc
, NULL
, DCB_RESET
| DCB_ENABLE
);
1185 static void compare_bounds( HDC hdc
, const char *info
)
1189 GetBoundsRect( hdc
, &rect
, DCB_RESET
);
1191 if (current_bounds
->left
== -1 &&
1192 current_bounds
->top
== -1 &&
1193 current_bounds
->right
== -1 &&
1194 current_bounds
->bottom
== -1)
1196 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect
));
1200 ok( EqualRect( current_bounds
, &rect
), "%s: %s: expected bounds %s got %s\n", dst_format
, info
,
1201 wine_dbgstr_rect( current_bounds
), wine_dbgstr_rect( &rect
));
1205 static void compare_hash_broken_todo(HDC hdc
, const BITMAPINFO
*bmi
, BYTE
*bits
, const char *info
, int num_broken
, BOOL todo
)
1207 char *hash
= hash_dib(bmi
, bits
);
1211 /* reset the bits for the next test */
1212 memset( bits
, 0xcc, get_dib_size(bmi
) );
1216 skip("SHA1 hashing unavailable on this platform\n");
1220 for(i
= 0; i
<= num_broken
; i
++)
1222 if(current_sha1
[i
] == NULL
)
1224 ok(current_sha1
[i
] != NULL
, "missing hash, got \"%s\",\n", hash
);
1225 HeapFree(GetProcessHeap(), 0, hash
);
1230 ok_cond
= !strcmp(hash
, *current_sha1
);
1232 for(i
= 1; i
<= num_broken
; i
++)
1233 ok_cond
= ok_cond
|| broken( !strcmp(hash
, current_sha1
[i
]) );
1236 ok( ok_cond
, "%s: %s: expected hash %s got %s\n",
1237 dst_format
, info
, *current_sha1
, hash
);
1239 current_sha1
+= num_broken
+ 1;
1241 HeapFree(GetProcessHeap(), 0, hash
);
1243 compare_bounds( hdc
, info
);
1246 static void compare_hash(HDC hdc
, const BITMAPINFO
*bmi
, BYTE
*bits
, const char *info
)
1248 compare_hash_broken_todo(hdc
, bmi
, bits
, info
, 0, FALSE
);
1251 static const RECT bias_check
[] =
1253 {100, 100, 200, 150},
1254 {100, 100, 150, 200},
1255 {100, 100, 50, 200},
1263 static const RECT hline_clips
[] =
1265 {120, 120, 140, 120}, /* unclipped */
1266 {100, 122, 140, 122}, /* l edgecase */
1267 { 99, 124, 140, 124}, /* l edgecase clipped */
1268 {120, 126, 200, 126}, /* r edgecase */
1269 {120, 128, 201, 128}, /* r edgecase clipped */
1270 { 99, 130, 201, 130}, /* l and r clipped */
1271 {120, 100, 140, 100}, /* t edgecase */
1272 {120, 99, 140, 99}, /* t edgecase clipped */
1273 {120, 199, 140, 199}, /* b edgecase */
1274 {120, 200, 140, 200}, /* b edgecase clipped */
1275 {120, 132, 310, 132}, /* inside two clip rects */
1276 { 10, 134, 101, 134}, /* r end on l edgecase */
1277 { 10, 136, 100, 136}, /* r end on l edgecase clipped */
1278 {199, 138, 220, 138}, /* l end on r edgecase */
1279 {200, 140, 220, 140} /* l end on r edgecase clipped */
1282 static const RECT vline_clips
[] =
1284 {120, 120, 120, 140}, /* unclipped */
1285 {100, 120, 100, 140}, /* l edgecase */
1286 { 99, 120, 99, 140}, /* l edgecase clipped */
1287 {199, 120, 199, 140}, /* r edgecase */
1288 {200, 120, 200, 140}, /* r edgecase clipped */
1289 {122, 99, 122, 201}, /* t and b clipped */
1290 {124, 100, 124, 140}, /* t edgecase */
1291 {126, 99, 126, 140}, /* t edgecase clipped */
1292 {128, 120, 128, 200}, /* b edgecase */
1293 {130, 120, 130, 201}, /* b edgecase clipped */
1294 {132, 12, 132, 140}, /* inside two clip rects */
1295 {134, 90, 134, 101}, /* b end on t edgecase */
1296 {136, 90, 136, 100}, /* b end on t edgecase clipped */
1297 {138, 199, 138, 220}, /* t end on b edgecase */
1298 {140, 200, 140, 220} /* t end on b edgecase clipped */
1301 static const RECT line_clips
[] =
1303 { 90, 110, 310, 120},
1304 { 90, 120, 295, 130},
1305 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */
1306 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */
1307 { 90, 132, 101, 137}, /* end pt just inside l edge */
1308 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */
1309 {199, 142, 210, 143} /* start pt just inside r edge */
1312 static const RECT wide_lines
[] =
1318 { 10, 100, 10, 200},
1319 { 21, 100, 21, 200},
1320 { 40, 200, 40, 100},
1321 { 61, 200, 61, 100},
1324 static const POINT poly_lines
[] =
1326 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1329 static const POINT polypoly_lines
[] =
1331 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1334 static const DWORD polypoly_counts
[] =
1336 sizeof(polypoly_lines
)/sizeof(polypoly_lines
[0])
1339 static const RECT patblt_clips
[] =
1341 {120, 120, 140, 126}, /* unclipped */
1342 {100, 130, 140, 136}, /* l edgecase */
1343 { 99, 140, 140, 146}, /* l edgecase clipped */
1344 {180, 130, 200, 136}, /* r edgecase */
1345 {180, 140, 201, 146}, /* r edgecase clipped */
1346 {120, 100, 130, 110}, /* t edgecase */
1347 {140, 99, 150, 110}, /* t edgecase clipped */
1348 {120, 180, 130, 200}, /* b edgecase */
1349 {140, 180, 150, 201}, /* b edgecase */
1350 {199, 150, 210, 156}, /* l edge on r edgecase */
1351 {200, 160, 210, 166}, /* l edge on r edgecase clipped */
1352 { 90, 150, 101, 156}, /* r edge on l edgecase */
1353 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */
1354 {160, 90, 166, 101}, /* b edge on t edgecase */
1355 {170, 90, 176, 101}, /* b edge on t edgecase clipped */
1356 {160, 199, 166, 210}, /* t edge on b edgecase */
1357 {170, 200, 176, 210}, /* t edge on b edgecase clipped */
1360 static const RECT rectangles
[] =
1363 {250, 100, 350, 10},
1364 {120, 10, 120, 20}, /* zero width */
1365 {120, 10, 130, 10}, /* zero height */
1366 {120, 40, 121, 41}, /* 1 x 1 */
1367 {130, 50, 132, 52}, /* 2 x 2 */
1368 {140, 60, 143, 63}, /* 3 x 3 */
1369 {150, 70, 154, 74}, /* 4 x 4 */
1370 {120, 20, 121, 30}, /* width == 1 */
1371 {130, 20, 132, 30}, /* width == 2 */
1372 {140, 20, 143, 30}, /* width == 3 */
1373 {200, 20, 210, 21}, /* height == 1 */
1374 {200, 30, 210, 32}, /* height == 2 */
1375 {200, 40, 210, 43} /* height == 3 */
1378 static const BITMAPINFOHEADER dib_brush_header_8888
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 32, BI_RGB
, 0, 0, 0, 0, 0};
1379 static const BITMAPINFOHEADER dib_brush_header_24
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 24, BI_RGB
, 0, 0, 0, 0, 0};
1380 static const BITMAPINFOHEADER dib_brush_header_555
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 16, BI_RGB
, 0, 0, 0, 0, 0};
1381 static const BITMAPINFOHEADER dib_brush_header_8
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 8, BI_RGB
, 0, 0, 0, 0, 0};
1382 static const BITMAPINFOHEADER dib_brush_header_4
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 4, BI_RGB
, 0, 0, 0, 0, 0};
1383 static const BITMAPINFOHEADER dib_brush_header_1
= {sizeof(BITMAPINFOHEADER
), 16, -16, 1, 1, BI_RGB
, 0, 0, 0, 0, 0};
1385 static const BYTE rle8_data
[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1386 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1387 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1388 0x00, 0x01 }; /* <eod> */
1390 static const DWORD four_by_four_data
[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1391 0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1392 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1393 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1395 static const DWORD ddb_brush_bits
[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1396 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1398 static const RGBQUAD default_palette_1
[2] =
1400 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1403 static const RGBQUAD default_palette_4
[16] =
1405 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1406 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 },
1407 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1408 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff },
1411 static const RGBQUAD default_palette_8
[256] =
1413 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 },
1414 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 },
1415 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 },
1416 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 },
1417 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 },
1418 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 },
1419 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 },
1420 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 },
1421 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 },
1422 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 },
1423 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 },
1424 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 },
1425 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 },
1426 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 },
1427 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 },
1428 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 },
1429 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 },
1430 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 },
1431 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 },
1432 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 },
1433 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 },
1434 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 },
1435 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 },
1436 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 },
1437 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 },
1438 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 },
1439 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 },
1440 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 },
1441 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 },
1442 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 },
1443 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 },
1444 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 },
1445 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 },
1446 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 },
1447 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 },
1448 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 },
1449 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 },
1450 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 },
1451 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 },
1452 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 },
1453 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 },
1454 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 },
1455 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 },
1456 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 },
1457 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 },
1458 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 },
1459 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 },
1460 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 },
1461 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 },
1462 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 },
1463 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 },
1464 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 },
1465 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 },
1466 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 },
1467 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 },
1468 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 },
1469 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 },
1470 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 },
1471 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 },
1472 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 },
1473 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 },
1474 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 },
1475 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff },
1476 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }
1479 static HPALETTE
create_default_palette( int bpp
)
1481 char pal_buffer
[sizeof(LOGPALETTE
) + 255 * sizeof(PALETTEENTRY
)];
1482 LOGPALETTE
*pal
= (LOGPALETTE
*)pal_buffer
;
1483 PALETTEENTRY
*entries
= pal
->palPalEntry
;
1486 pal
->palVersion
= 0x300;
1487 pal
->palNumEntries
= 1 << bpp
;
1491 for (i
= 0; i
< 2; i
++)
1493 entries
[i
].peRed
= default_palette_1
[i
].rgbRed
;
1494 entries
[i
].peGreen
= default_palette_1
[i
].rgbGreen
;
1495 entries
[i
].peBlue
= default_palette_1
[i
].rgbBlue
;
1496 entries
[i
].peFlags
= 0;
1500 for (i
= 0; i
< 16; i
++)
1502 entries
[i
].peRed
= default_palette_4
[i
].rgbRed
;
1503 entries
[i
].peGreen
= default_palette_4
[i
].rgbGreen
;
1504 entries
[i
].peBlue
= default_palette_4
[i
].rgbBlue
;
1505 entries
[i
].peFlags
= 0;
1509 for (i
= 0; i
< 256; i
++)
1511 entries
[i
].peRed
= default_palette_8
[i
].rgbRed
;
1512 entries
[i
].peGreen
= default_palette_8
[i
].rgbGreen
;
1513 entries
[i
].peBlue
= default_palette_8
[i
].rgbBlue
;
1514 entries
[i
].peFlags
= 0;
1518 return CreatePalette( pal
);
1521 static inline void solid_patblt( HDC hdc
, int x
, int y
, int width
, int height
, COLORREF color
)
1523 HBRUSH brush
= CreateSolidBrush( color
);
1524 brush
= SelectObject( hdc
, brush
);
1525 PatBlt( hdc
, x
, y
, width
, height
, PATCOPY
);
1526 DeleteObject( SelectObject( hdc
, brush
) );
1529 static void draw_graphics(HDC hdc
, const BITMAPINFO
*bmi
, BYTE
*bits
)
1531 char pal_buffer
[sizeof(LOGPALETTE
) + 255 * sizeof(PALETTEENTRY
)];
1532 LOGPALETTE
*pal
= (LOGPALETTE
*)pal_buffer
;
1533 PALETTEENTRY
*entries
= pal
->palPalEntry
;
1534 HPEN solid_pen
, dashed_pen
, wide_pen
, orig_pen
;
1536 HBRUSH solid_brush
, dib_brush
, hatch_brush
, orig_brush
;
1538 INT i
, j
, x
, y
, hatch_style
;
1541 BYTE dib_src_buf
[sizeof(BITMAPINFO
) + 256 * sizeof(RGBQUAD
)];
1542 BYTE dib_brush_buf
[sizeof(BITMAPINFO
) + 256 * sizeof(RGBQUAD
) + 16 * 16 * sizeof(DWORD
)]; /* Enough for 16 x 16 at 32 bpp */
1543 BITMAPINFO
*src_bi
= (BITMAPINFO
*)dib_src_buf
;
1544 BITMAPINFO
*brush_bi
= (BITMAPINFO
*)dib_brush_buf
;
1545 RGBQUAD
*brush_colors
= brush_bi
->bmiColors
;
1546 BYTE
*brush_bits
, *src_bits
;
1547 BOOL ret
, dib_is_1bpp
= (bmi
->bmiHeader
.biBitCount
== 1);
1548 BOOL dib_is_8bpp_gray
= (bmi
->bmiHeader
.biBitCount
== 8 && bmi
->bmiColors
[1].rgbRed
== 1);
1549 BLENDFUNCTION blend
;
1550 COLORREF old_text
, old_bkgnd
;
1551 HPALETTE hpal
, old_hpal
;
1553 blend
.BlendOp
= AC_SRC_OVER
;
1554 blend
.BlendFlags
= 0;
1556 reset_bounds( hdc
);
1558 memset(bits
, 0xcc, get_dib_size(bmi
));
1559 compare_hash(hdc
, bmi
, bits
, "empty");
1561 src_dc
= CreateCompatibleDC( 0 );
1562 solid_pen
= CreatePen(PS_SOLID
, 1, RGB(0, 0, 0xff));
1563 orig_pen
= SelectObject(hdc
, solid_pen
);
1564 SetBrushOrgEx(hdc
, 0, 0, NULL
);
1566 /* horizontal and vertical lines */
1567 for(i
= 1; i
<= 16; i
++)
1570 MoveToEx(hdc
, 10, i
* 3, NULL
);
1571 LineTo(hdc
, 100, i
* 3); /* l -> r */
1572 MoveToEx(hdc
, 100, 50 + i
* 3, NULL
);
1573 LineTo(hdc
, 10, 50 + i
* 3); /* r -> l */
1574 MoveToEx(hdc
, 120 + i
* 3, 10, NULL
);
1575 LineTo(hdc
, 120 + i
* 3, 100); /* t -> b */
1576 MoveToEx(hdc
, 170 + i
* 3, 100, NULL
);
1577 LineTo(hdc
, 170 + i
* 3, 10); /* b -> t */
1579 compare_hash(hdc
, bmi
, bits
, "h and v solid lines");
1581 /* diagonal lines */
1582 SetROP2(hdc
, R2_COPYPEN
);
1583 for(i
= 0; i
< 16; i
++)
1585 double s
= sin(M_PI
* i
/ 8.0);
1586 double c
= cos(M_PI
* i
/ 8.0);
1588 MoveToEx(hdc
, 200.5 + 10 * c
, 200.5 + 10 * s
, NULL
);
1589 LineTo(hdc
, 200.5 + 100 * c
, 200.5 + 100 * s
);
1591 compare_hash(hdc
, bmi
, bits
, "diagonal solid lines");
1593 for(i
= 0; i
< sizeof(bias_check
) / sizeof(bias_check
[0]); i
++)
1595 MoveToEx(hdc
, bias_check
[i
].left
, bias_check
[i
].top
, NULL
);
1596 LineTo(hdc
, bias_check
[i
].right
, bias_check
[i
].bottom
);
1598 compare_hash(hdc
, bmi
, bits
, "more diagonal solid lines");
1600 /* solid brush PatBlt */
1601 solid_brush
= CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1602 orig_brush
= SelectObject(hdc
, solid_brush
);
1604 for(i
= 0, y
= 10; i
< 256; i
++)
1606 ret
= PatBlt(hdc
, 10, y
, 100, 10, rop3
[i
]);
1608 if(rop_uses_src(rop3
[i
]))
1609 ok(ret
== FALSE
, "got TRUE for %x\n", rop3
[i
]);
1612 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1617 compare_hash(hdc
, bmi
, bits
, "solid patblt");
1620 hrgn
= CreateRectRgn(10, 10, 200, 20);
1621 hrgn2
= CreateRectRgn(100, 100, 200, 200);
1622 CombineRgn(hrgn
, hrgn
, hrgn2
, RGN_OR
);
1623 SetRectRgn(hrgn2
, 290, 100, 300, 200);
1624 CombineRgn(hrgn
, hrgn
, hrgn2
, RGN_OR
);
1625 ExtSelectClipRgn(hdc
, hrgn
, RGN_COPY
);
1626 DeleteObject(hrgn2
);
1628 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
1630 MoveToEx(hdc
, hline_clips
[i
].left
, hline_clips
[i
].top
, NULL
);
1631 LineTo(hdc
, hline_clips
[i
].right
, hline_clips
[i
].bottom
);
1633 compare_hash(hdc
, bmi
, bits
, "clipped solid hlines");
1635 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
1637 MoveToEx(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
, NULL
);
1638 LineTo(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
);
1640 compare_hash(hdc
, bmi
, bits
, "clipped solid vlines");
1642 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
1644 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
1645 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
1647 compare_hash(hdc
, bmi
, bits
, "clipped solid diagonal lines");
1649 /* clipped PatBlt */
1650 for(i
= 0; i
< sizeof(patblt_clips
) / sizeof(patblt_clips
[0]); i
++)
1652 PatBlt(hdc
, patblt_clips
[i
].left
, patblt_clips
[i
].top
,
1653 patblt_clips
[i
].right
- patblt_clips
[i
].left
,
1654 patblt_clips
[i
].bottom
- patblt_clips
[i
].top
, PATCOPY
);
1656 compare_hash(hdc
, bmi
, bits
, "clipped patblt");
1658 /* clipped dashed lines */
1659 dashed_pen
= CreatePen(PS_DASH
, 1, RGB(0xff, 0, 0));
1660 SelectObject(hdc
, dashed_pen
);
1661 SetBkMode(hdc
, TRANSPARENT
);
1662 SetBkColor(hdc
, RGB(0, 0xff, 0));
1664 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
1666 MoveToEx(hdc
, hline_clips
[i
].left
, hline_clips
[i
].top
, NULL
);
1667 LineTo(hdc
, hline_clips
[i
].right
, hline_clips
[i
].bottom
);
1669 compare_hash(hdc
, bmi
, bits
, "clipped dashed hlines");
1671 for(i
= 0; i
< sizeof(hline_clips
)/sizeof(hline_clips
[0]); i
++)
1673 MoveToEx(hdc
, hline_clips
[i
].right
- 1, hline_clips
[i
].bottom
, NULL
);
1674 LineTo(hdc
, hline_clips
[i
].left
- 1, hline_clips
[i
].top
);
1676 compare_hash(hdc
, bmi
, bits
, "clipped dashed hlines r -> l");
1678 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
1680 MoveToEx(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
, NULL
);
1681 LineTo(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
);
1683 compare_hash(hdc
, bmi
, bits
, "clipped dashed vlines");
1685 for(i
= 0; i
< sizeof(vline_clips
)/sizeof(vline_clips
[0]); i
++)
1687 MoveToEx(hdc
, vline_clips
[i
].right
, vline_clips
[i
].bottom
- 1, NULL
);
1688 LineTo(hdc
, vline_clips
[i
].left
, vline_clips
[i
].top
- 1);
1690 compare_hash(hdc
, bmi
, bits
, "clipped dashed vlines b -> t");
1692 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
1694 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
1695 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
1697 compare_hash(hdc
, bmi
, bits
, "clipped dashed diagonal lines");
1699 SetBkMode(hdc
, OPAQUE
);
1701 for(i
= 0; i
< sizeof(line_clips
)/sizeof(line_clips
[0]); i
++)
1703 MoveToEx(hdc
, line_clips
[i
].left
, line_clips
[i
].top
, NULL
);
1704 LineTo(hdc
, line_clips
[i
].right
, line_clips
[i
].bottom
);
1706 compare_hash(hdc
, bmi
, bits
, "clipped opaque dashed diagonal lines");
1708 ExtSelectClipRgn(hdc
, NULL
, RGN_COPY
);
1710 /* 8888 DIB pattern brush */
1712 brush_bi
->bmiHeader
= dib_brush_header_8888
;
1713 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
1714 memset(brush_bits
, 0, 16 * 16 * sizeof(DWORD
));
1715 brush_bits
[2] = 0xff;
1716 brush_bits
[6] = 0xff;
1717 brush_bits
[14] = 0xff;
1718 brush_bits
[65] = 0xff;
1719 brush_bits
[69] = 0xff;
1720 brush_bits
[72] = 0xff;
1722 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1724 SelectObject(hdc
, dib_brush
);
1725 SetBrushOrgEx(hdc
, 1, 1, NULL
);
1727 for(i
= 0, y
= 10; i
< 256; i
++)
1729 if(!rop_uses_src(rop3
[i
]))
1731 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1732 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1736 compare_hash_broken_todo(hdc
, bmi
, bits
, "top-down 8888 dib brush patblt", 0, dib_is_1bpp
);
1738 SelectObject(hdc
, orig_brush
);
1739 DeleteObject(dib_brush
);
1741 /* 8888 bottom-up DIB pattern brush */
1743 brush_bi
->bmiHeader
.biHeight
= -brush_bi
->bmiHeader
.biHeight
;
1745 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1747 SelectObject(hdc
, dib_brush
);
1749 /* This used to set the x origin to 100 as well, but
1750 there's a Windows bug for 24 bpp where the brush's x offset
1751 is incorrectly calculated for rops that involve both D and P */
1752 SetBrushOrgEx(hdc
, 4, 100, NULL
);
1754 for(i
= 0, y
= 10; i
< 256; i
++)
1756 if(!rop_uses_src(rop3
[i
]))
1758 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1759 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1763 compare_hash(hdc
, bmi
, bits
, "bottom-up 8888 dib brush patblt");
1765 SelectObject(hdc
, orig_brush
);
1766 DeleteObject(dib_brush
);
1768 /* 24 bpp dib pattern brush */
1770 brush_bi
->bmiHeader
= dib_brush_header_24
;
1771 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
1772 memset(brush_bits
, 0, 16 * 16 * 3);
1773 brush_bits
[0] = brush_bits
[3] = brush_bits
[6] = brush_bits
[8] = 0xff;
1774 brush_bits
[49] = brush_bits
[52] = 0xff;
1776 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1778 SelectObject(hdc
, dib_brush
);
1779 SetBrushOrgEx(hdc
, 1, 1, NULL
);
1781 for(i
= 0, y
= 10; i
< 256; i
++)
1783 if(!rop_uses_src(rop3
[i
]))
1785 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1786 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1790 compare_hash(hdc
, bmi
, bits
, "top-down 24 bpp brush patblt");
1792 SelectObject(hdc
, orig_brush
);
1793 DeleteObject(dib_brush
);
1795 /* 555 dib pattern brush */
1797 brush_bi
->bmiHeader
= dib_brush_header_555
;
1798 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
);
1799 memset(brush_bits
, 0, 16 * 16 * sizeof(WORD
));
1800 brush_bits
[0] = brush_bits
[1] = 0xff;
1801 brush_bits
[32] = brush_bits
[34] = 0x7c;
1803 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1805 SelectObject(hdc
, dib_brush
);
1806 SetBrushOrgEx(hdc
, 1, 1, NULL
);
1808 for(i
= 0, y
= 10; i
< 256; i
++)
1810 if(!rop_uses_src(rop3
[i
]))
1812 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1813 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1817 compare_hash_broken_todo(hdc
, bmi
, bits
, "top-down 555 dib brush patblt", 0, dib_is_1bpp
);
1819 SelectObject(hdc
, orig_brush
);
1820 DeleteObject(dib_brush
);
1822 SetBrushOrgEx(hdc
, 0, 0, NULL
);
1824 /* 8 bpp dib pattern brush */
1826 brush_bi
->bmiHeader
= dib_brush_header_8
;
1827 brush_bi
->bmiHeader
.biClrUsed
= 3;
1828 memset(brush_colors
, 0, brush_bi
->bmiHeader
.biClrUsed
* sizeof(RGBQUAD
));
1829 brush_colors
[0].rgbRed
= 0xff;
1830 brush_colors
[1].rgbRed
= 0xff;
1831 brush_colors
[1].rgbGreen
= 0xff;
1832 brush_colors
[1].rgbBlue
= 0xff;
1834 brush_bits
= (BYTE
*)brush_bi
+ sizeof(BITMAPINFOHEADER
) + brush_bi
->bmiHeader
.biClrUsed
* sizeof(RGBQUAD
);
1835 memset(brush_bits
, 0, 16 * 16 * sizeof(BYTE
));
1836 brush_bits
[0] = brush_bits
[1] = 1;
1837 brush_bits
[16] = brush_bits
[17] = 2;
1838 brush_bits
[32] = brush_bits
[33] = 6;
1840 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1842 SelectObject(hdc
, dib_brush
);
1843 SetBrushOrgEx(hdc
, 1, 1, NULL
);
1845 for(i
= 0, y
= 10; i
< 256; i
++)
1847 if(!rop_uses_src(rop3
[i
]))
1849 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1850 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1854 compare_hash_broken_todo(hdc
, bmi
, bits
, "top-down 8 bpp dib brush patblt", 0, dib_is_1bpp
);
1856 SelectObject(hdc
, orig_brush
);
1857 DeleteObject(dib_brush
);
1859 /* 4 bpp dib pattern brush */
1861 brush_bi
->bmiHeader
= dib_brush_header_4
;
1862 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1864 SelectObject(hdc
, dib_brush
);
1865 SetBrushOrgEx(hdc
, 1, 1, NULL
);
1867 for(i
= 0, y
= 10; i
< 256; i
++)
1869 if(!rop_uses_src(rop3
[i
]))
1871 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1872 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1876 compare_hash_broken_todo(hdc
, bmi
, bits
, "top-down 4 bpp dib brush patblt", 0, dib_is_1bpp
);
1878 SelectObject(hdc
, orig_brush
);
1879 DeleteObject(dib_brush
);
1881 /* 1 bpp dib pattern brush */
1883 brush_bi
->bmiHeader
= dib_brush_header_1
;
1884 brush_bi
->bmiHeader
.biClrUsed
= 2;
1885 memset(brush_bits
, 0, 16 * 4);
1886 brush_bits
[0] = 0xf0;
1887 brush_bits
[4] = 0xf0;
1888 brush_bits
[8] = 0xf0;
1890 dib_brush
= CreateDIBPatternBrushPt(brush_bi
, DIB_RGB_COLORS
);
1891 SelectObject(hdc
, dib_brush
);
1892 for(i
= 0, y
= 10; i
< 256; i
++)
1894 if(!rop_uses_src(rop3
[i
]))
1896 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1897 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1902 compare_hash_broken_todo(hdc
, bmi
, bits
, "top-down 1 bpp dib brush patblt", 0, dib_is_1bpp
);
1904 SelectObject(hdc
, orig_brush
);
1905 DeleteObject(dib_brush
);
1907 /* 1 bpp ddb pattern brush */
1909 old_text
= GetTextColor( hdc
);
1910 old_bkgnd
= GetBkColor( hdc
);
1911 bmp
= CreateBitmap( 16, 16, 1, 1, ddb_brush_bits
);
1912 dib_brush
= CreatePatternBrush( bmp
);
1913 SelectObject(hdc
, dib_brush
);
1914 for(i
= 0, y
= 10; i
< 256; i
++)
1916 SetTextColor(hdc
, RGB( i
, 2*i
, 255 - i
) );
1917 SetBkColor(hdc
, RGB( 255 - i
, i
/ 3, i
) );
1918 if(!rop_uses_src(rop3
[i
]))
1920 ret
= PatBlt(hdc
, 10 + i
, y
, 100, 20, rop3
[i
]);
1921 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1926 compare_hash_broken_todo(hdc
, bmi
, bits
, "1 bpp ddb brush patblt", 0, dib_is_1bpp
);
1929 SelectObject(hdc
, orig_brush
);
1930 DeleteObject( dib_brush
);
1931 SetBrushOrgEx(hdc
, 0, 0, NULL
);
1932 SetTextColor(hdc
, old_text
);
1933 SetBkColor(hdc
, old_bkgnd
);
1937 SelectObject(hdc
, solid_pen
);
1938 SelectObject(hdc
, solid_brush
);
1940 for(i
= 0; i
< sizeof(rectangles
)/sizeof(rectangles
[0]); i
++)
1942 Rectangle(hdc
, rectangles
[i
].left
, rectangles
[i
].top
, rectangles
[i
].right
, rectangles
[i
].bottom
);
1945 SelectObject(hdc
, dashed_pen
);
1946 for(i
= 0; i
< sizeof(rectangles
)/sizeof(rectangles
[0]); i
++)
1948 Rectangle(hdc
, rectangles
[i
].left
, rectangles
[i
].top
+ 150, rectangles
[i
].right
, rectangles
[i
].bottom
+ 150);
1951 compare_hash(hdc
, bmi
, bits
, "rectangles");
1952 SelectObject(hdc
, solid_pen
);
1956 PaintRgn(hdc
, hrgn
);
1957 compare_hash(hdc
, bmi
, bits
, "PaintRgn");
1959 /* RTL rectangles */
1961 SetLayout(hdc
, LAYOUT_RTL
);
1962 PaintRgn(hdc
, hrgn
);
1963 PatBlt(hdc
, 10, 250, 10, 10, PATCOPY
);
1964 Rectangle(hdc
, 100, 250, 110, 260);
1965 compare_hash(hdc
, bmi
, bits
, "rtl");
1966 SetLayout(hdc
, LAYOUT_LTR
);
1967 DeleteObject( hrgn
);
1969 for(i
= 0, y
= 10; i
< 256; i
++)
1971 if(!rop_uses_src(rop3
[i
]))
1973 for(hatch_style
= HS_HORIZONTAL
; hatch_style
<= HS_DIAGCROSS
; hatch_style
++)
1975 hatch_brush
= CreateHatchBrush(hatch_style
, RGB(0xff, 0, 0));
1976 SelectObject(hdc
, hatch_brush
);
1977 ret
= PatBlt(hdc
, 10 + i
+ 30 * hatch_style
, y
, 20, 20, rop3
[i
]);
1978 ok(ret
, "got FALSE for %x\n", rop3
[i
]);
1979 SelectObject(hdc
, orig_brush
);
1980 DeleteObject(hatch_brush
);
1986 compare_hash(hdc
, bmi
, bits
, "hatch brushes");
1988 /* overlapping blits */
1990 orig_brush
= SelectObject(hdc
, solid_brush
);
1992 Rectangle(hdc
, 10, 10, 100, 100);
1993 Rectangle(hdc
, 20, 15, 30, 40);
1994 Rectangle(hdc
, 15, 15, 20, 20);
1995 Rectangle(hdc
, 15, 20, 50, 45);
1996 BitBlt( hdc
, 20, 20, 100, 100, hdc
, 10, 10, SRCCOPY
);
1997 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY +x, +y");
1999 Rectangle(hdc
, 10, 10, 100, 100);
2000 Rectangle(hdc
, 20, 15, 30, 40);
2001 Rectangle(hdc
, 15, 15, 20, 20);
2002 Rectangle(hdc
, 15, 20, 50, 45);
2003 BitBlt( hdc
, 10, 10, 100, 100, hdc
, 20, 20, SRCCOPY
);
2004 if (bmi
->bmiHeader
.biBitCount
== 1) /* Windows gets this one wrong */
2005 compare_hash_broken_todo(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE
);
2007 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY -x, -y");
2009 Rectangle(hdc
, 10, 10, 100, 100);
2010 Rectangle(hdc
, 20, 15, 30, 40);
2011 Rectangle(hdc
, 15, 15, 20, 20);
2012 Rectangle(hdc
, 15, 20, 50, 45);
2013 BitBlt( hdc
, 20, 10, 100, 100, hdc
, 10, 20, SRCCOPY
);
2014 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY +x, -y");
2016 Rectangle(hdc
, 10, 10, 100, 100);
2017 Rectangle(hdc
, 20, 15, 30, 40);
2018 Rectangle(hdc
, 15, 15, 20, 20);
2019 Rectangle(hdc
, 15, 20, 50, 45);
2020 BitBlt( hdc
, 10, 20, 100, 100, hdc
, 20, 10, SRCCOPY
);
2021 if (bmi
->bmiHeader
.biBitCount
== 1) /* Windows gets this one wrong */
2022 compare_hash_broken_todo(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE
);
2024 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt SRCCOPY -x, +y" );
2026 Rectangle(hdc
, 10, 10, 100, 100);
2027 Rectangle(hdc
, 20, 15, 30, 40);
2028 Rectangle(hdc
, 15, 15, 20, 20);
2029 Rectangle(hdc
, 15, 20, 50, 45);
2030 BitBlt( hdc
, 20, 20, 100, 100, hdc
, 10, 10, PATPAINT
);
2031 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt PATPAINT +x, +y");
2033 Rectangle(hdc
, 10, 10, 100, 100);
2034 Rectangle(hdc
, 20, 15, 30, 40);
2035 Rectangle(hdc
, 15, 15, 20, 20);
2036 Rectangle(hdc
, 15, 20, 50, 45);
2037 BitBlt( hdc
, 10, 10, 100, 100, hdc
, 20, 20, PATPAINT
);
2038 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt PATPAINT -x, -y");
2040 Rectangle(hdc
, 10, 10, 100, 100);
2041 Rectangle(hdc
, 20, 15, 30, 40);
2042 Rectangle(hdc
, 15, 15, 20, 20);
2043 Rectangle(hdc
, 15, 20, 50, 45);
2044 BitBlt( hdc
, 20, 10, 100, 100, hdc
, 10, 20, PATPAINT
);
2045 if (bmi
->bmiHeader
.biBitCount
>= 24) /* Windows gets this one wrong */
2046 compare_hash_broken_todo(hdc
, bmi
, bits
, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE
);
2048 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt PATPAINT +x, -y");
2050 Rectangle(hdc
, 10, 10, 100, 100);
2051 Rectangle(hdc
, 20, 15, 30, 40);
2052 Rectangle(hdc
, 15, 15, 20, 20);
2053 Rectangle(hdc
, 15, 20, 50, 45);
2054 BitBlt( hdc
, 10, 20, 100, 100, hdc
, 20, 10, PATPAINT
);
2055 compare_hash(hdc
, bmi
, bits
, "overlapping BitBlt PATPAINT -x, +y" );
2057 /* blitting with 32-bpp BI_RGB source */
2059 memset( dib_src_buf
, 0, sizeof(dib_src_buf
) );
2060 src_bi
->bmiHeader
.biSize
= sizeof(bmi
->bmiHeader
);
2061 src_bi
->bmiHeader
.biHeight
= 256;
2062 src_bi
->bmiHeader
.biWidth
= 256;
2063 src_bi
->bmiHeader
.biBitCount
= 32;
2064 src_bi
->bmiHeader
.biPlanes
= 1;
2065 src_bi
->bmiHeader
.biCompression
= BI_RGB
;
2066 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2067 SelectObject( src_dc
, bmp
);
2068 for (y
= 0; y
< 256; y
++)
2069 for (x
= 0; x
< 256; x
++)
2071 BYTE a
= (x
+ y
) * 2;
2072 BYTE r
= (BYTE
)(y
+ 2 * x
) * a
/ 255;
2073 BYTE g
= (BYTE
)(x
+ y
/ 3) * a
/ 255;
2074 BYTE b
= (BYTE
)(x
/ 3 + 2 * y
) * a
/ 255;
2075 ((DWORD
*)src_bits
)[y
* 256 + x
] = (a
<< 24) | RGB( r
, g
, b
);
2078 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2080 /* Interesting cases for 1-bpp dst */
2081 BitBlt( hdc
, 1, 4, 2, 2, src_dc
, 0, 0, SRCCOPY
);
2082 BitBlt( hdc
, 1, 8, 16, 2, src_dc
, 0, 0, SRCCOPY
);
2083 BitBlt( hdc
, 1, 12, 15, 2, src_dc
, 0, 0, SRCCOPY
);
2084 BitBlt( hdc
, 0, 16, 8, 2, src_dc
, 0, 0, SRCCOPY
);
2085 BitBlt( hdc
, 0, 20, 9, 2, src_dc
, 0, 0, SRCCOPY
);
2086 BitBlt( hdc
, 7, 24, 1, 2, src_dc
, 0, 0, SRCCOPY
);
2087 BitBlt( hdc
, 7, 28, 2, 2, src_dc
, 0, 0, SRCCOPY
);
2088 BitBlt( hdc
, 7, 32, 9, 2, src_dc
, 0, 0, SRCCOPY
);
2089 BitBlt( hdc
, 7, 36, 10, 2, src_dc
, 0, 0, SRCCOPY
);
2090 compare_hash(hdc
, bmi
, bits
, "BitBlt src 32-bpp SRCCOPY" );
2092 blend
.SourceConstantAlpha
= 0xd0;
2093 blend
.AlphaFormat
= 0;
2094 GdiAlphaBlend( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, 256, 256, blend
);
2095 compare_hash_broken_todo(hdc
, bmi
, bits
, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp
);
2097 blend
.SourceConstantAlpha
= 0xb0;
2098 blend
.AlphaFormat
= AC_SRC_ALPHA
;
2099 GdiAlphaBlend( hdc
, 50, 50, 256, 256, src_dc
, 0, 0, 256, 256, blend
);
2100 compare_hash_broken_todo(hdc
, bmi
, bits
, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp
);
2102 /* blitting with 32-bpp r10g10b10 source */
2104 src_bi
->bmiHeader
.biBitCount
= 32;
2105 src_bi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
2106 ((DWORD
*)src_bi
->bmiColors
)[0] = 0x3ff00000;
2107 ((DWORD
*)src_bi
->bmiColors
)[1] = 0x000ffc00;
2108 ((DWORD
*)src_bi
->bmiColors
)[2] = 0x000003ff;
2109 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2110 SelectObject( src_dc
, bmp
);
2111 for (y
= 0; y
< 256; y
++)
2112 for (x
= 0; x
< 256; x
++)
2114 WORD r
= (7 * x
+ 3 * y
) % 1024;
2115 WORD g
= (11 * x
+ y
/ 3) % 1024;
2116 WORD b
= (x
/ 3 + 9 * y
) % 1024;
2117 ((DWORD
*)src_bits
)[y
* 256 + x
] = r
<< 20 | g
<< 10 | b
;
2120 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2121 compare_hash(hdc
, bmi
, bits
, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2123 /* blitting with 32-bpp b6g6r6 source */
2125 src_bi
->bmiHeader
.biBitCount
= 32;
2126 src_bi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
2127 ((DWORD
*)src_bi
->bmiColors
)[0] = 0x00003f;
2128 ((DWORD
*)src_bi
->bmiColors
)[1] = 0x000fc0;
2129 ((DWORD
*)src_bi
->bmiColors
)[2] = 0x03f000;
2130 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2131 SelectObject( src_dc
, bmp
);
2132 for (y
= 0; y
< 256; y
++)
2133 for (x
= 0; x
< 256; x
++)
2135 BYTE r
= (y
+ 2 * x
) % 64;
2136 BYTE g
= (x
+ y
/ 3) % 64;
2137 BYTE b
= (x
/ 3 + 2 * y
) % 64;
2138 ((DWORD
*)src_bits
)[y
* 256 + x
] = r
| g
<< 6 | b
<< 12;
2141 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2142 compare_hash(hdc
, bmi
, bits
, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2144 /* blitting with 24-bpp source */
2146 src_bi
->bmiHeader
.biBitCount
= 24;
2147 src_bi
->bmiHeader
.biCompression
= BI_RGB
;
2148 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2149 DeleteObject( SelectObject( src_dc
, bmp
) );
2150 for (y
= 0; y
< 256; y
++)
2151 for (x
= 0; x
< 256; x
++)
2153 src_bits
[(y
* 256 + x
) * 3 + 0] = x
+ 3 * y
;
2154 src_bits
[(y
* 256 + x
) * 3 + 1] = 2 * x
+ 7 * y
;
2155 src_bits
[(y
* 256 + x
) * 3 + 2] = 5 * x
+ 12 * y
;
2158 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2159 compare_hash(hdc
, bmi
, bits
, "BitBlt src 24-bpp SRCCOPY" );
2161 blend
.SourceConstantAlpha
= 0xe0;
2162 blend
.AlphaFormat
= 0;
2163 GdiAlphaBlend( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, 256, 256, blend
);
2164 compare_hash_broken_todo(hdc
, bmi
, bits
, "AlphaBlend src 24-bpp", 0, dib_is_1bpp
);
2166 /* blitting with 16-bpp BI_RGB source */
2168 src_bi
->bmiHeader
.biBitCount
= 16;
2169 src_bi
->bmiHeader
.biCompression
= BI_RGB
;
2170 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2171 DeleteObject( SelectObject( src_dc
, bmp
) );
2172 for (y
= 0; y
< 256; y
++)
2173 for (x
= 0; x
< 256; x
++)
2174 ((WORD
*)src_bits
)[y
* 256 + x
] = x
| x
<< 4 | x
<< 8 | y
<< 3 | y
<< 7;
2176 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2177 compare_hash(hdc
, bmi
, bits
, "BitBlt src 16-bpp SRCCOPY" );
2179 /* blitting with 16-bpp b4g4r4 source */
2181 src_bi
->bmiHeader
.biBitCount
= 16;
2182 src_bi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
2183 ((DWORD
*)src_bi
->bmiColors
)[0] = 0x00000f;
2184 ((DWORD
*)src_bi
->bmiColors
)[1] = 0x0000f0;
2185 ((DWORD
*)src_bi
->bmiColors
)[2] = 0x000f00;
2186 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2187 DeleteObject( SelectObject( src_dc
, bmp
) );
2188 for (y
= 0; y
< 256; y
++)
2189 for (x
= 0; x
< 256; x
++)
2190 ((WORD
*)src_bits
)[y
* 256 + x
] = x
| x
<< 4 | x
<< 8 | y
<< 3 | y
<< 7;
2192 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2193 compare_hash(hdc
, bmi
, bits
, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2195 /* blitting with 8-bpp source */
2197 src_bi
->bmiHeader
.biBitCount
= 8;
2198 src_bi
->bmiHeader
.biCompression
= BI_RGB
;
2199 src_bi
->bmiHeader
.biClrUsed
= 160;
2200 for (i
= 0; i
< 256; i
++) ((DWORD
*)src_bi
->bmiColors
)[i
] = i
| (i
* 3) << 8 | (i
/ 2) << 16;
2201 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2202 DeleteObject( SelectObject( src_dc
, bmp
) );
2203 for (y
= 0; y
< 256; y
++)
2204 for (x
= 0; x
< 256; x
++)
2205 src_bits
[y
* 256 + x
] = 3 * x
+ 5 * y
;
2207 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2208 compare_hash(hdc
, bmi
, bits
, "BitBlt src 8-bpp SRCCOPY" );
2210 blend
.SourceConstantAlpha
= 0xd0;
2211 blend
.AlphaFormat
= 0;
2212 GdiAlphaBlend( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, 256, 256, blend
);
2213 compare_hash_broken_todo(hdc
, bmi
, bits
, "AlphaBlend src 8-bpp", 0, dib_is_1bpp
);
2215 /* blitting with 4-bpp source */
2217 src_bi
->bmiHeader
.biBitCount
= 4;
2218 src_bi
->bmiHeader
.biClrUsed
= 12;
2219 for (i
= 0; i
< 16; i
++) ((DWORD
*)src_bi
->bmiColors
)[i
] = i
| (i
* 5) << 8 | (i
* 19) << 16;
2220 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2221 DeleteObject( SelectObject( src_dc
, bmp
) );
2222 for (y
= 0; y
< 256; y
++)
2223 for (x
= 0; x
< 256; x
+= 2)
2224 src_bits
[(y
* 256 + x
) / 2] = 7 * x
+ 3 * y
;
2226 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2227 compare_hash(hdc
, bmi
, bits
, "BitBlt src 4-bpp SRCCOPY" );
2229 /* blitting with 1-bpp source */
2231 src_bi
->bmiHeader
.biBitCount
= 1;
2232 src_bi
->bmiHeader
.biClrUsed
= 0;
2233 for (i
= 0; i
< 2; i
++) ((DWORD
*)src_bi
->bmiColors
)[i
] = (i
+ 37) | (i
* 91) << 8 | (i
* 53) << 16;
2234 bmp
= CreateDIBSection(0, src_bi
, DIB_RGB_COLORS
, (void**)&src_bits
, NULL
, 0);
2235 DeleteObject( SelectObject( src_dc
, bmp
) );
2236 for (y
= 0; y
< 256; y
++)
2237 for (x
= 0; x
< 256; x
+= 8)
2238 src_bits
[(y
* 256 + x
) / 8] = 7 * x
+ 3 * y
;
2240 BitBlt( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, SRCCOPY
);
2241 /* Some interesting src co-ords */
2242 BitBlt( hdc
, 10, 10, 3, 10, src_dc
, 0, 0, SRCCOPY
);
2243 BitBlt( hdc
, 20, 10, 3, 10, src_dc
, 2, 0, SRCCOPY
);
2244 BitBlt( hdc
, 30, 10, 3, 10, src_dc
, 5, 0, SRCCOPY
);
2245 BitBlt( hdc
, 40, 10, 3, 10, src_dc
, 6, 0, SRCCOPY
);
2246 BitBlt( hdc
, 50, 10, 20, 10, src_dc
, 6, 0, SRCCOPY
);
2247 compare_hash(hdc
, bmi
, bits
, "BitBlt src 1-bpp SRCCOPY" );
2249 blend
.SourceConstantAlpha
= 0x90;
2250 blend
.AlphaFormat
= 0;
2251 GdiAlphaBlend( hdc
, 100, 100, 256, 256, src_dc
, 0, 0, 256, 256, blend
);
2252 compare_hash(hdc
, bmi
, bits
, "AlphaBlend src 1-bpp" );
2254 /* blitting with 1-bpp ddb source */
2256 bmp
= CreateBitmap( 16, 16, 1, 1, ddb_brush_bits
);
2257 DeleteObject( SelectObject( src_dc
, bmp
) );
2259 old_text
= GetTextColor( hdc
);
2260 old_bkgnd
= GetBkColor( hdc
);
2261 for (i
= 0; i
< 256; i
+= 13)
2263 SetTextColor(hdc
, RGB( i
, 2*i
, 255 - i
) );
2264 SetBkColor(hdc
, RGB( 255 - i
, i
/ 3, i
) );
2265 BitBlt( hdc
, i
, 0, 13, 13, src_dc
, 0, 0, SRCCOPY
);
2267 for (i
= 0; i
< 256; i
+= 13)
2269 SetTextColor(hdc
, PALETTEINDEX( i
));
2270 SetBkColor(hdc
, PALETTEINDEX( i
+ 3 ));
2271 BitBlt( hdc
, i
, 13, 13, 13, src_dc
, 0, 0, SRCCOPY
);
2273 for (i
= 0; i
< 256; i
+= 13)
2275 SetTextColor(hdc
, DIBINDEX( i
));
2276 SetBkColor(hdc
, DIBINDEX( i
+ 3 ));
2277 BitBlt( hdc
, i
, 26, 13, 13, src_dc
, 0, 0, SRCCOPY
);
2279 SetTextColor( hdc
, old_text
);
2280 SetBkColor( hdc
, old_bkgnd
);
2281 compare_hash(hdc
, bmi
, bits
, "BitBlt src 1-bpp ddb SRCCOPY" );
2283 DeleteObject( bmp
);
2285 /* blitting to 1-bpp ddb dest */
2287 bmp
= CreateBitmap( 16, 16, 1, 1, ddb_brush_bits
);
2288 DeleteObject( SelectObject( src_dc
, bmp
) );
2290 for (y
= 0; y
< 16; y
++)
2291 for (x
= 0; x
< 16; x
++)
2292 SetPixel( hdc
, x
, y
, RGB( 16 * x
, 16 * y
, 8 * (x
+ y
)) );
2293 PatBlt( hdc
, 15, 15, 1, 1, WHITENESS
);
2294 /* source colors are ignored */
2295 SetTextColor( src_dc
, 0xbeef );
2296 SetBkColor( src_dc
, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2297 /* destination text color is also ignored */
2298 SetTextColor( hdc
, 0xbedead );
2301 SetBkColor( hdc
, 0xffffff );
2302 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2303 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2304 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2305 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2306 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2307 SetBkColor( hdc
, 0 );
2308 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2309 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2310 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2311 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2312 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2313 SetBkColor( hdc
, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) ));
2314 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2315 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2316 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2317 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2318 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2319 SetBkColor( hdc
, RGB( 16 * 13, 16 * 14, 8 * (13 + 14) ));
2320 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2321 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2322 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2323 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2324 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2325 SetBkColor( hdc
, PALETTEINDEX( 1 ));
2326 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2327 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2328 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2329 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2330 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2331 SetBkColor( hdc
, DIBINDEX( 2 ));
2332 BitBlt( src_dc
, 0, 0, 16, 16, hdc
, 0, 0, SRCCOPY
);
2333 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2334 StretchDIBits( src_dc
, 0, 0, 16, 16, 0,
2335 bmi
->bmiHeader
.biHeight
- 16, 16, 16, bits
, bmi
, DIB_RGB_COLORS
, SRCCOPY
);
2336 GetBitmapBits( bmp
, 32, bits
+ get_stride(bmi
) * i
++ );
2337 SetTextColor( hdc
, old_text
);
2338 SetBkColor( hdc
, old_bkgnd
);
2339 compare_hash(hdc
, bmi
, bits
, "BitBlt dst 1-bpp ddb");
2342 DeleteObject( bmp
);
2344 /* RLE StretchDIBits */
2345 src_bi
->bmiHeader
.biSize
= sizeof(src_bi
->bmiHeader
);
2346 src_bi
->bmiHeader
.biWidth
= 8;
2347 src_bi
->bmiHeader
.biHeight
= 8;
2348 src_bi
->bmiHeader
.biPlanes
= 1;
2349 src_bi
->bmiHeader
.biBitCount
= 8;
2350 src_bi
->bmiHeader
.biCompression
= BI_RLE8
;
2351 src_bi
->bmiHeader
.biClrUsed
= 0;
2352 src_bi
->bmiHeader
.biSizeImage
= sizeof(rle8_data
);
2354 for (i
= 0; i
< 256; i
++)
2356 src_bi
->bmiColors
[i
].rgbRed
= i
;
2357 src_bi
->bmiColors
[i
].rgbGreen
= i
;
2358 src_bi
->bmiColors
[i
].rgbBlue
= i
;
2359 src_bi
->bmiColors
[i
].rgbReserved
= 0;
2362 StretchDIBits( hdc
, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2363 StretchDIBits( hdc
, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2364 StretchDIBits( hdc
, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2365 StretchDIBits( hdc
, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2366 StretchDIBits( hdc
, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2367 compare_hash_broken_todo(hdc
, bmi
, bits
, "rle stretchdibits", 0, dib_is_1bpp
);
2369 /* 32 bpp StretchDIBits */
2371 src_bi
->bmiHeader
.biWidth
= 4;
2372 src_bi
->bmiHeader
.biHeight
= 4;
2373 src_bi
->bmiHeader
.biPlanes
= 1;
2374 src_bi
->bmiHeader
.biBitCount
= 32;
2375 src_bi
->bmiHeader
.biCompression
= BI_RGB
;
2376 src_bi
->bmiHeader
.biClrUsed
= 0;
2377 src_bi
->bmiHeader
.biSizeImage
= 0;
2379 ret
= StretchDIBits( hdc
, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2380 ok(ret
== 4, "got %d\n", ret
);
2381 ret
= StretchDIBits( hdc
, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2382 ok(ret
== 4, "got %d\n", ret
);
2383 ret
= StretchDIBits( hdc
, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2384 ok(ret
== 4, "got %d\n", ret
);
2385 ret
= StretchDIBits( hdc
, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2386 ok(ret
== 4, "got %d\n", ret
);
2387 ret
= StretchDIBits( hdc
, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2388 ok(ret
== 4, "got %d\n", ret
);
2389 ret
= StretchDIBits( hdc
, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2390 ok(ret
== 4, "got %d\n", ret
);
2392 src_bi
->bmiHeader
.biHeight
= -4;
2394 ret
= StretchDIBits( hdc
, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2395 ok(ret
== 4, "got %d\n", ret
);
2396 ret
= StretchDIBits( hdc
, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2397 ok(ret
== -4, "got %d\n", ret
);
2398 ret
= StretchDIBits( hdc
, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2399 ok(ret
== 4, "got %d\n", ret
);
2400 ret
= StretchDIBits( hdc
, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2401 ok(ret
== -4, "got %d\n", ret
);
2402 ret
= StretchDIBits( hdc
, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCCOPY
);
2403 ok(ret
== 4, "got %d\n", ret
);
2404 ret
= StretchDIBits( hdc
, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data
, src_bi
, DIB_RGB_COLORS
, SRCAND
);
2405 ok(ret
== -4, "got %d\n", ret
);
2407 compare_hash_broken_todo(hdc
, bmi
, bits
, "stretchdibits", dib_is_8bpp_gray
? 1 : 0, dib_is_8bpp_gray
);
2410 for (i
= 0; i
< 256; i
++)
2412 solid_patblt( hdc
, i
* 2, 10, 1, 1, DIBINDEX(i
) );
2413 solid_patblt( hdc
, i
* 2, 20, 1, 1, PALETTEINDEX(i
) );
2414 solid_patblt( hdc
, i
* 2, 30, 1, 1, RGB( (i
& 0x07) << 5, (i
& 0x38) << 2, i
& 0xc0 ) );
2415 solid_patblt( hdc
, i
* 2, 40, 1, 1, PALETTERGB( (i
& 0x07) << 5, (i
& 0x38) << 2, i
& 0xc0 ) );
2416 for (j
= 0; j
< 256; j
++) solid_patblt( hdc
, i
* 2, 50 + j
, 1, 1, (j
<< 24) | i
);
2419 /* A few extra colors that are interesting in the 1bpp case */
2422 solid_patblt( hdc
, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2423 solid_patblt( hdc
, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2426 solid_patblt( hdc
, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) );
2427 solid_patblt( hdc
, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) );
2430 solid_patblt( hdc
, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2431 solid_patblt( hdc
, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2433 compare_hash(hdc
, bmi
, bits
, "Colors");
2435 for (i
= 0; i
< 256; i
++)
2438 s
= SetPixel( hdc
, i
* 2, 10, DIBINDEX(i
) );
2439 g
= GetPixel( hdc
, i
* 2, 10 );
2440 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2442 s
= SetPixel( hdc
, i
* 2, 20, PALETTEINDEX(i
) );
2443 g
= GetPixel( hdc
, i
* 2, 20 );
2444 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2446 s
= SetPixel( hdc
, i
* 2, 30, RGB( (i
& 0x07) << 5, (i
& 0x38) << 2, i
& 0xc0 ) );
2447 g
= GetPixel( hdc
, i
* 2, 30 );
2448 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2450 s
= SetPixel( hdc
, i
* 2, 40, PALETTERGB( (i
& 0x07) << 5, (i
& 0x38) << 2, i
& 0xc0 ) );
2451 g
= GetPixel( hdc
, i
* 2, 40 );
2452 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2454 for (j
= 0; j
< 256; j
++)
2456 s
= SetPixel( hdc
, i
* 2, 50+j
, (j
<< 24) | RGB( (i
& 0x07) << 5, (i
& 0x38) << 2, i
& 0xc0 ));
2457 g
= GetPixel( hdc
, i
* 2, 50+j
);
2458 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2460 s
= SetPixel( hdc
, i
* 2 + 1, 50+j
, (j
<< 24) | i
);
2461 g
= GetPixel( hdc
, i
* 2 + 1, 50+j
);
2462 ok( s
== g
, "got %08x and %08x\n", s
, g
);
2466 compare_hash(hdc
, bmi
, bits
, "SetPixel");
2473 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 },
2474 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 },
2475 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 },
2476 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 }
2478 GRADIENT_RECT rect
[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2482 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2483 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2484 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2486 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2487 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2488 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2490 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2491 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2492 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2494 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2495 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2496 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2498 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2499 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2500 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2502 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2503 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2504 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2506 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2507 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2508 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2510 GRADIENT_TRIANGLE tri
[] =
2512 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
2513 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 }
2516 GdiGradientFill( hdc
, vrect
, 4, rect
, 2, GRADIENT_FILL_RECT_H
);
2517 for (i
= 0; i
< 4; i
++) vrect
[i
].y
+= 250;
2518 GdiGradientFill( hdc
, vrect
, 4, rect
, 2, GRADIENT_FILL_RECT_V
);
2519 /* Wine's 8-bit dithering isn't identical to Windows */
2520 compare_hash_broken_todo(hdc
, bmi
, bits
, "GdiGradientFill", 0, (bmi
->bmiHeader
.biBitCount
<= 8) );
2522 GdiGradientFill( hdc
, vtri
, 7*3, tri
, 7, GRADIENT_FILL_TRIANGLE
);
2523 for (i
= 0; i
< 7*3; i
++) vtri
[i
].y
+= 100;
2524 GdiGradientFill( hdc
, vtri
, 7*3, tri
+ 7, 7, GRADIENT_FILL_TRIANGLE
);
2525 /* Wine's 8-bit dithering isn't identical to Windows */
2526 compare_hash_broken_todo(hdc
, bmi
, bits
, "GdiGradientFill", 0, (bmi
->bmiHeader
.biBitCount
<= 8) );
2531 wide_pen
= CreatePen( PS_SOLID
, 7, RGB( 0xff, 0, 0 ) );
2532 SelectObject( hdc
, wide_pen
);
2534 for (i
= 0; i
< sizeof( wide_lines
) / sizeof( wide_lines
[0] ); i
++)
2536 MoveToEx( hdc
, wide_lines
[i
].left
, wide_lines
[i
].top
, NULL
);
2537 LineTo( hdc
, wide_lines
[i
].right
, wide_lines
[i
].bottom
);
2540 compare_hash(hdc
, bmi
, bits
, "wide pen" );
2542 SelectObject( hdc
, orig_pen
);
2543 DeleteObject( wide_pen
);
2545 log_brush
.lbStyle
= BS_SOLID
;
2546 log_brush
.lbColor
= RGB(0xff, 0, 0);
2547 log_brush
.lbHatch
= 0;
2549 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_FLAT
| PS_JOIN_MITER
| PS_SOLID
,
2550 9, &log_brush
, 0, NULL
);
2551 SelectObject( hdc
, wide_pen
);
2553 Polyline( hdc
, poly_lines
, sizeof(poly_lines
) / sizeof(poly_lines
[0]) );
2554 compare_hash(hdc
, bmi
, bits
, "wide pen - flat caps, mitred" );
2556 SelectObject( hdc
, orig_pen
);
2557 DeleteObject( wide_pen
);
2559 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_SQUARE
| PS_JOIN_BEVEL
| PS_SOLID
,
2560 16, &log_brush
, 0, NULL
);
2561 SelectObject( hdc
, wide_pen
);
2563 Polyline( hdc
, poly_lines
, sizeof(poly_lines
) / sizeof(poly_lines
[0]) );
2564 compare_hash(hdc
, bmi
, bits
, "wide pen - square caps, bevelled" );
2566 SelectObject( hdc
, orig_pen
);
2567 DeleteObject( wide_pen
);
2569 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_FLAT
| PS_JOIN_MITER
| PS_SOLID
,
2570 9, &log_brush
, 0, NULL
);
2571 SelectObject( hdc
, wide_pen
);
2573 PolyPolyline( hdc
, polypoly_lines
, polypoly_counts
, sizeof(polypoly_counts
)/sizeof(polypoly_counts
[0]) );
2574 compare_hash(hdc
, bmi
, bits
, "wide pen - empty segments" );
2576 SelectObject( hdc
, orig_pen
);
2577 DeleteObject( wide_pen
);
2579 /* brushed wide pen */
2581 old_text
= GetTextColor( hdc
);
2582 old_bkgnd
= GetBkColor( hdc
);
2583 bmp
= CreateBitmap( 16, 16, 1, 1, ddb_brush_bits
);
2584 log_brush
.lbStyle
= BS_PATTERN
;
2585 log_brush
.lbColor
= 0;
2586 log_brush
.lbHatch
= (ULONG_PTR
)bmp
;
2587 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_FLAT
| PS_JOIN_BEVEL
| PS_SOLID
,
2588 12, &log_brush
, 0, NULL
);
2589 ok( wide_pen
!= 0, "failed to create pen\n" );
2590 SelectObject( hdc
, wide_pen
);
2591 Polyline( hdc
, poly_lines
, sizeof(poly_lines
) / sizeof(poly_lines
[0]) );
2593 for (i
= 1; i
< 20; i
++)
2595 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_FLAT
| PS_JOIN_BEVEL
| PS_SOLID
,
2596 i
, &log_brush
, 0, NULL
);
2597 ok( wide_pen
!= 0, "failed to create pen\n" );
2598 DeleteObject( SelectObject( hdc
, wide_pen
));
2599 SetTextColor(hdc
, RGB( 2*i
, i
, 255 - i
) );
2600 SetBkColor(hdc
, RGB( 255 - i
, i
, i
/ 3 ) );
2601 MoveToEx( hdc
, 10 * i
, 10, NULL
);
2602 LineTo( hdc
, 10 * i
, 200 + i
);
2603 LineTo( hdc
, 20 * i
, 200 + i
);
2605 compare_hash_broken_todo(hdc
, bmi
, bits
, "wide brushed pen", 0, dib_is_1bpp
);
2607 for (i
= 1; i
< 20; i
++)
2609 wide_pen
= ExtCreatePen( PS_GEOMETRIC
| PS_ENDCAP_FLAT
| PS_JOIN_BEVEL
| (i
% 5),
2610 i
, &log_brush
, 0, NULL
);
2611 DeleteObject( SelectObject( hdc
, wide_pen
));
2612 SetTextColor(hdc
, RGB( 2*i
, i
, 255 - i
) );
2613 SetBkColor(hdc
, RGB( i
, 255 - i
, i
/ 3 ) );
2614 MoveToEx( hdc
, 10 * i
, 10, NULL
);
2615 LineTo( hdc
, 10 * i
, 200 + i
);
2616 LineTo( hdc
, 20 * i
, 200 + i
);
2618 compare_hash_broken_todo(hdc
, bmi
, bits
, "dashed wide brushed pen", 0, dib_is_1bpp
);
2621 SetTextColor(hdc
, old_text
);
2622 SetBkColor(hdc
, old_bkgnd
);
2623 SelectObject( hdc
, orig_pen
);
2627 solid_brush
= CreateSolidBrush( PALETTEINDEX(3) );
2628 solid_pen
= CreatePen( PS_DASH
, 1, PALETTEINDEX(5) );
2629 SetTextColor( hdc
, PALETTEINDEX(38) );
2630 SetBkColor( hdc
, PALETTEINDEX(9) );
2631 SelectObject( hdc
, solid_brush
);
2632 SelectObject( hdc
, solid_pen
);
2634 pal
->palVersion
= 0x300;
2635 pal
->palNumEntries
= 40;
2636 for (i
= 0; i
< 80; i
++)
2638 entries
[i
].peRed
= i
* 3;
2639 entries
[i
].peGreen
= i
* 7;
2640 entries
[i
].peBlue
= 128 - i
;
2641 entries
[i
].peFlags
= 0;
2643 hpal
= CreatePalette( pal
);
2644 old_hpal
= SelectPalette( hdc
, hpal
, FALSE
);
2646 solid_patblt( hdc
, 20, 10, 10, 10, PALETTEINDEX(15) );
2647 Rectangle( hdc
, 0, 0, 10, 10 );
2648 SetPaletteEntries( hpal
, 0, 40, entries
+ 40 );
2649 Rectangle( hdc
, 10, 0, 10, 10 );
2650 SelectObject( hdc
, orig_brush
);
2651 DeleteObject( solid_brush
);
2653 solid_brush
= CreateHatchBrush( HS_CROSS
, PALETTEINDEX(7) );
2654 DeleteObject( SelectObject( hdc
, solid_brush
));
2655 PatBlt( hdc
, 20, 0, 10, 10, PATCOPY
);
2656 SetPaletteEntries( hpal
, 0, 40, entries
);
2657 PatBlt( hdc
, 30, 0, 10, 10, PATCOPY
);
2658 SelectObject( hdc
, orig_brush
);
2659 DeleteObject( solid_brush
);
2661 bmp
= CreateBitmap( 16, 16, 1, 1, ddb_brush_bits
);
2662 dib_brush
= CreatePatternBrush( bmp
);
2663 SelectObject( hdc
, dib_brush
);
2664 PatBlt( hdc
, 40, 0, 10, 10, PATCOPY
);
2665 SetPaletteEntries( hpal
, 0, 40, entries
+ 40 );
2666 PatBlt( hdc
, 50, 0, 10, 10, PATCOPY
);
2667 DeleteObject( bmp
);
2668 SelectObject( hdc
, orig_brush
);
2669 DeleteObject( dib_brush
);
2671 SelectPalette( hdc
, old_hpal
, FALSE
);
2672 DeleteObject( hpal
);
2674 compare_hash_broken_todo(hdc
, bmi
, bits
, "PALETTEINDEX", 0, dib_is_1bpp
);
2678 solid_patblt( hdc
, 0, 0, 512, 512, RGB( 0, 0, 0xff ) );
2679 solid_patblt( hdc
, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) );
2680 solid_patblt( hdc
, 10, 50, 50, 50, RGB( 0, 0, 0xff ) );
2681 solid_patblt( hdc
, 100, 160, 50, 50, RGB( 0, 0, 0xff ) );
2682 solid_patblt( hdc
, 90, 160, 70, 10, RGB( 0, 0, 0xff ) );
2684 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2685 hrgn
= CreateRectRgn( 180, 10, 190, 210 );
2686 ExtSelectClipRgn( hdc
, hrgn
, RGN_DIFF
);
2687 DeleteObject( hrgn
);
2689 solid_brush
= CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2690 SelectObject( hdc
, solid_brush
);
2692 ret
= ExtFloodFill( hdc
, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE
);
2693 ok (ret
, "got ret %d\n", ret
);
2694 compare_hash(hdc
, bmi
, bits
, "flood fill" );
2696 ExtSelectClipRgn( hdc
, NULL
, RGN_COPY
);
2698 ret
= ExtFloodFill( hdc
, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE
);
2699 ok (!ret
, "got ret %d\n", ret
);
2701 SelectObject(hdc
, orig_brush
);
2702 SelectObject(hdc
, orig_pen
);
2703 DeleteObject(solid_brush
);
2704 DeleteObject(wide_pen
);
2705 DeleteObject(dashed_pen
);
2706 DeleteObject(solid_pen
);
2709 static const BYTE ramp
[17] =
2711 0, 0x4d, 0x68, 0x7c,
2712 0x8c, 0x9a, 0xa7, 0xb2,
2713 0xbd, 0xc7, 0xd0, 0xd9,
2714 0xe1, 0xe9, 0xf0, 0xf8,
2718 static inline void get_range(BYTE alpha
, DWORD text_comp
, BYTE
*min_comp
, BYTE
*max_comp
)
2720 *min_comp
= (ramp
[alpha
] * text_comp
) / 0xff;
2721 *max_comp
= ramp
[16 - alpha
] + ((0xff - ramp
[16 - alpha
]) * text_comp
) / 0xff;
2724 static inline BYTE
aa_comp(BYTE dst
, BYTE text
, BYTE alpha
)
2726 BYTE min_comp
, max_comp
;
2728 if (alpha
== 16) return text
;
2729 if (alpha
<= 1) return dst
;
2730 if (text
== dst
) return dst
;
2732 get_range( alpha
, text
, &min_comp
, &max_comp
);