ReactOS 0.4.15-dev-7788-g1ad9096
dib.c
Go to the documentation of this file.
1/*
2 * DIB driver tests.
3 *
4 * Copyright 2011 Huw Davies
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "precomp.h"
22
23#include <wincrypt.h>
24
25#ifndef M_PI
26#define M_PI 3.14159265358979323846
27#endif
28
30
31static const DWORD rop3[256] =
32{
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
65};
66
67static inline BOOL rop_uses_src(DWORD rop)
68{
69 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
70}
71
72static const char *sha1_graphics_a8r8g8b8[] =
73{
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",
140 NULL
141};
142
144{
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",
211 NULL
212};
213
214static const char *sha1_graphics_a8b8g8r8[] =
215{
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",
282 NULL
283};
284
285static const char *sha1_graphics_r10g10b10[] =
286{
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",
353 NULL
354};
355
356static const char *sha1_graphics_r6g6b6[] =
357{
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",
424 NULL
425};
426
427static const char *sha1_graphics_24[] =
428{
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",
495 NULL
496};
497
498static const char *sha1_graphics_r5g5b5[] =
499{
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",
565 NULL
566};
567
568static const char *sha1_graphics_r4g4b4[] =
569{
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",
635 NULL
636};
637
638static const char *sha1_graphics_8_color[] =
639{
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",
705 NULL
706};
707
708static const char *sha1_graphics_8_grayscale[] =
709{
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",
776 NULL
777};
778
779static const char *sha1_graphics_8[] =
780{
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",
846 NULL
847};
848
849static const char *sha1_graphics_4[] =
850{
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",
916 NULL
917};
918
919static const char *sha1_graphics_4_grayscale[] =
920{
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",
986 NULL
987};
988
989static const char *sha1_graphics_1[] =
990{
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",
1058 NULL
1059};
1060
1061static const RECT graphics_bounds[] =
1062{
1063 { 0, 0, 0, 0 },
1064 { 10, 3, 219, 101 },
1065 { 100, 100, 301, 301 },
1066 { 0, 0, 201, 201 },
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 },
1098 { 0, 4, 356, 356 },
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 },
1112 { 0, 0, 260, 39 },
1113 { 0, 0, 16, 16 },
1114 { 10, 10, 416, 26 },
1115 { 10, 8, 60, 104 },
1116 { 0, 10, 511, 306 },
1117 { 0, 10, 512, 306 },
1118 { 1, 1, 300, 512 },
1119 { 0, 0, 500, 512 },
1120 { 5, 5, 206, 206 },
1121 { 45, 45, 256, 256 },
1122 { 86, 86, 215, 215 },
1123 { 45, 45, 256, 256 },
1124 { 8, 0, 392, 231 },
1125 { 8, 0, 392, 231 },
1126 { 0, 0, 60, 20 },
1127 { 0, 0, 512, 512 },
1128 { -1, -1, -1, -1 } /* the end */
1129};
1130
1131static const char **current_sha1;
1132static const RECT *current_bounds;
1133static const char *dst_format;
1134
1135static inline DWORD get_stride(const BITMAPINFO *bmi)
1136{
1137 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1138}
1139
1140static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1141{
1142 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1143}
1144
1145static char *hash_dib(const BITMAPINFO *bmi, const void *bits)
1146{
1147 DWORD dib_size = get_dib_size(bmi);
1149 char *buf;
1150 BYTE hash_buf[20];
1151 DWORD hash_size = sizeof(hash_buf);
1152 int i;
1153 static const char *hex = "0123456789abcdef";
1154
1155 if(!crypt_prov) return NULL;
1156
1157 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL;
1158
1159 CryptHashData(hash, bits, dib_size, 0);
1160
1161 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0);
1162 if(hash_size != sizeof(hash_buf)) return NULL;
1163
1164 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0);
1166
1167 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1);
1168
1169 for(i = 0; i < hash_size; i++)
1170 {
1171 buf[i * 2] = hex[hash_buf[i] >> 4];
1172 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf];
1173 }
1174 buf[i * 2] = '\0';
1175
1176 return buf;
1177}
1178
1179static void reset_bounds( HDC hdc )
1180{
1183}
1184
1185static void compare_bounds( HDC hdc, const char *info )
1186{
1187 RECT rect;
1188
1190
1191 if (current_bounds->left == -1 &&
1192 current_bounds->top == -1 &&
1193 current_bounds->right == -1 &&
1194 current_bounds->bottom == -1)
1195 {
1196 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect ));
1197 return;
1198 }
1199
1200 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info,
1203}
1204
1205static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
1206{
1207 char *hash = hash_dib(bmi, bits);
1208 BOOL ok_cond;
1209 int i;
1210
1211 /* reset the bits for the next test */
1212 memset( bits, 0xcc, get_dib_size(bmi) );
1213
1214 if(!hash)
1215 {
1216 skip("SHA1 hashing unavailable on this platform\n");
1217 return;
1218 }
1219
1220 for(i = 0; i <= num_broken; i++)
1221 {
1222 if(current_sha1[i] == NULL)
1223 {
1224 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash);
1226 return;
1227 }
1228 }
1229
1230 ok_cond = !strcmp(hash, *current_sha1);
1231
1232 for(i = 1; i <= num_broken; i++)
1233 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) );
1234
1236 ok( ok_cond, "%s: %s: expected hash %s got %s\n",
1238
1239 current_sha1 += num_broken + 1;
1240
1242
1244}
1245
1246static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1247{
1249}
1250
1251static const RECT bias_check[] =
1252{
1253 {100, 100, 200, 150},
1254 {100, 100, 150, 200},
1255 {100, 100, 50, 200},
1256 {100, 100, 0, 150},
1257 {100, 100, 0, 50},
1258 {100, 100, 50, 0},
1259 {100, 100, 150, 0},
1260 {100, 100, 200, 50}
1261};
1262
1263static const RECT hline_clips[] =
1264{
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 */
1280};
1281
1282static const RECT vline_clips[] =
1283{
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 */
1299};
1300
1301static const RECT line_clips[] =
1302{
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 */
1310};
1311
1312static const RECT wide_lines[] =
1313{
1314 {100, 10, 200, 10},
1315 {100, 21, 200, 21},
1316 {200, 40, 100, 40},
1317 {200, 61, 100, 61},
1318 { 10, 100, 10, 200},
1319 { 21, 100, 21, 200},
1320 { 40, 200, 40, 100},
1321 { 61, 200, 61, 100},
1322};
1323
1324static const POINT poly_lines[] =
1325{
1326 {100, 100}, {200, 100}, {200, 200}, {100, 200}
1327};
1328
1329static const POINT polypoly_lines[] =
1330{
1331 {100, 100}, {200, 100}, {200, 100}, {200, 200}
1332};
1333
1334static const DWORD polypoly_counts[] =
1335{
1336 sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1337};
1338
1339static const RECT patblt_clips[] =
1340{
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 */
1358};
1359
1360static const RECT rectangles[] =
1361{
1362 {10, 11, 100, 101},
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 */
1376};
1377
1378static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1379static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1380static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1381static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1382static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1383static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1384
1385static 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> */
1389
1390static 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 };
1394
1395static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1396 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1397
1399{
1400 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1401};
1402
1403static const RGBQUAD default_palette_4[16] =
1404{
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 },
1409};
1410
1411static const RGBQUAD default_palette_8[256] =
1412{
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 }
1477};
1478
1479static HPALETTE create_default_palette( int bpp )
1480{
1481 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)];
1482 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer;
1483 PALETTEENTRY *entries = pal->palPalEntry;
1484 int i;
1485
1486 pal->palVersion = 0x300;
1487 pal->palNumEntries = 1 << bpp;
1488 switch (bpp)
1489 {
1490 case 1:
1491 for (i = 0; i < 2; i++)
1492 {
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;
1497 }
1498 break;
1499 case 4:
1500 for (i = 0; i < 16; i++)
1501 {
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;
1506 }
1507 break;
1508 case 8:
1509 for (i = 0; i < 256; i++)
1510 {
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;
1515 }
1516 break;
1517 }
1518 return CreatePalette( pal );
1519}
1520
1521static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color )
1522{
1523 HBRUSH brush = CreateSolidBrush( color );
1524 brush = SelectObject( hdc, brush );
1525 PatBlt( hdc, x, y, width, height, PATCOPY );
1526 DeleteObject( SelectObject( hdc, brush ) );
1527}
1528
1529static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
1530{
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;
1535 LOGBRUSH log_brush;
1536 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush;
1537 HBITMAP bmp;
1538 INT i, j, x, y, hatch_style;
1539 HDC src_dc;
1540 HRGN hrgn, hrgn2;
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;
1552
1553 blend.BlendOp = AC_SRC_OVER;
1554 blend.BlendFlags = 0;
1555
1556 reset_bounds( hdc );
1557
1558 memset(bits, 0xcc, get_dib_size(bmi));
1559 compare_hash(hdc, bmi, bits, "empty");
1560
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);
1565
1566 /* horizontal and vertical lines */
1567 for(i = 1; i <= 16; i++)
1568 {
1569 SetROP2(hdc, 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 */
1578 }
1579 compare_hash(hdc, bmi, bits, "h and v solid lines");
1580
1581 /* diagonal lines */
1583 for(i = 0; i < 16; i++)
1584 {
1585 double s = sin(M_PI * i / 8.0);
1586 double c = cos(M_PI * i / 8.0);
1587
1588 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL);
1589 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s);
1590 }
1591 compare_hash(hdc, bmi, bits, "diagonal solid lines");
1592
1593 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++)
1594 {
1597 }
1598 compare_hash(hdc, bmi, bits, "more diagonal solid lines");
1599
1600 /* solid brush PatBlt */
1601 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff));
1602 orig_brush = SelectObject(hdc, solid_brush);
1603
1604 for(i = 0, y = 10; i < 256; i++)
1605 {
1606 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]);
1607
1608 if(rop_uses_src(rop3[i]))
1609 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]);
1610 else
1611 {
1612 ok(ret, "got FALSE for %x\n", rop3[i]);
1613 y += 20;
1614 }
1615
1616 }
1617 compare_hash(hdc, bmi, bits, "solid patblt");
1618
1619 /* clipped lines */
1620 hrgn = CreateRectRgn(10, 10, 200, 20);
1621 hrgn2 = CreateRectRgn(100, 100, 200, 200);
1623 SetRectRgn(hrgn2, 290, 100, 300, 200);
1627
1628 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1629 {
1632 }
1633 compare_hash(hdc, bmi, bits, "clipped solid hlines");
1634
1635 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1636 {
1639 }
1640 compare_hash(hdc, bmi, bits, "clipped solid vlines");
1641
1642 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1643 {
1646 }
1647 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines");
1648
1649 /* clipped PatBlt */
1650 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++)
1651 {
1655 }
1656 compare_hash(hdc, bmi, bits, "clipped patblt");
1657
1658 /* clipped dashed lines */
1659 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0));
1660 SelectObject(hdc, dashed_pen);
1662 SetBkColor(hdc, RGB(0, 0xff, 0));
1663
1664 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1665 {
1668 }
1669 compare_hash(hdc, bmi, bits, "clipped dashed hlines");
1670
1671 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++)
1672 {
1675 }
1676 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l");
1677
1678 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1679 {
1682 }
1683 compare_hash(hdc, bmi, bits, "clipped dashed vlines");
1684
1685 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++)
1686 {
1689 }
1690 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t");
1691
1692 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1693 {
1696 }
1697 compare_hash(hdc, bmi, bits, "clipped dashed diagonal lines");
1698
1700
1701 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++)
1702 {
1705 }
1706 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines");
1707
1709
1710 /* 8888 DIB pattern brush */
1711
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;
1721
1722 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1723
1724 SelectObject(hdc, dib_brush);
1725 SetBrushOrgEx(hdc, 1, 1, NULL);
1726
1727 for(i = 0, y = 10; i < 256; i++)
1728 {
1729 if(!rop_uses_src(rop3[i]))
1730 {
1731 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1732 ok(ret, "got FALSE for %x\n", rop3[i]);
1733 y += 25;
1734 }
1735 }
1736 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 0, dib_is_1bpp);
1737
1738 SelectObject(hdc, orig_brush);
1739 DeleteObject(dib_brush);
1740
1741 /* 8888 bottom-up DIB pattern brush */
1742
1743 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight;
1744
1745 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1746
1747 SelectObject(hdc, dib_brush);
1748
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);
1753
1754 for(i = 0, y = 10; i < 256; i++)
1755 {
1756 if(!rop_uses_src(rop3[i]))
1757 {
1758 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1759 ok(ret, "got FALSE for %x\n", rop3[i]);
1760 y += 25;
1761 }
1762 }
1763 compare_hash(hdc, bmi, bits, "bottom-up 8888 dib brush patblt");
1764
1765 SelectObject(hdc, orig_brush);
1766 DeleteObject(dib_brush);
1767
1768 /* 24 bpp dib pattern brush */
1769
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;
1775
1776 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1777
1778 SelectObject(hdc, dib_brush);
1779 SetBrushOrgEx(hdc, 1, 1, NULL);
1780
1781 for(i = 0, y = 10; i < 256; i++)
1782 {
1783 if(!rop_uses_src(rop3[i]))
1784 {
1785 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1786 ok(ret, "got FALSE for %x\n", rop3[i]);
1787 y += 25;
1788 }
1789 }
1790 compare_hash(hdc, bmi, bits, "top-down 24 bpp brush patblt");
1791
1792 SelectObject(hdc, orig_brush);
1793 DeleteObject(dib_brush);
1794
1795 /* 555 dib pattern brush */
1796
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;
1802
1803 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1804
1805 SelectObject(hdc, dib_brush);
1806 SetBrushOrgEx(hdc, 1, 1, NULL);
1807
1808 for(i = 0, y = 10; i < 256; i++)
1809 {
1810 if(!rop_uses_src(rop3[i]))
1811 {
1812 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1813 ok(ret, "got FALSE for %x\n", rop3[i]);
1814 y += 25;
1815 }
1816 }
1817 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 0, dib_is_1bpp);
1818
1819 SelectObject(hdc, orig_brush);
1820 DeleteObject(dib_brush);
1821
1822 SetBrushOrgEx(hdc, 0, 0, NULL);
1823
1824 /* 8 bpp dib pattern brush */
1825
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;
1833
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;
1839
1840 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1841
1842 SelectObject(hdc, dib_brush);
1843 SetBrushOrgEx(hdc, 1, 1, NULL);
1844
1845 for(i = 0, y = 10; i < 256; i++)
1846 {
1847 if(!rop_uses_src(rop3[i]))
1848 {
1849 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1850 ok(ret, "got FALSE for %x\n", rop3[i]);
1851 y += 25;
1852 }
1853 }
1854 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", 0, dib_is_1bpp);
1855
1856 SelectObject(hdc, orig_brush);
1857 DeleteObject(dib_brush);
1858
1859 /* 4 bpp dib pattern brush */
1860
1861 brush_bi->bmiHeader = dib_brush_header_4;
1862 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1863
1864 SelectObject(hdc, dib_brush);
1865 SetBrushOrgEx(hdc, 1, 1, NULL);
1866
1867 for(i = 0, y = 10; i < 256; i++)
1868 {
1869 if(!rop_uses_src(rop3[i]))
1870 {
1871 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1872 ok(ret, "got FALSE for %x\n", rop3[i]);
1873 y += 25;
1874 }
1875 }
1876 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", 0, dib_is_1bpp);
1877
1878 SelectObject(hdc, orig_brush);
1879 DeleteObject(dib_brush);
1880
1881 /* 1 bpp dib pattern brush */
1882
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;
1889
1890 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS);
1891 SelectObject(hdc, dib_brush);
1892 for(i = 0, y = 10; i < 256; i++)
1893 {
1894 if(!rop_uses_src(rop3[i]))
1895 {
1896 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1897 ok(ret, "got FALSE for %x\n", rop3[i]);
1898 y += 25;
1899 }
1900 }
1901
1902 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", 0, dib_is_1bpp);
1903
1904 SelectObject(hdc, orig_brush);
1905 DeleteObject(dib_brush);
1906
1907 /* 1 bpp ddb pattern brush */
1908
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++)
1915 {
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]))
1919 {
1920 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]);
1921 ok(ret, "got FALSE for %x\n", rop3[i]);
1922 y += 25;
1923 }
1924 }
1925
1926 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", 0, dib_is_1bpp);
1927
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);
1934
1935 /* Rectangle */
1936
1937 SelectObject(hdc, solid_pen);
1938 SelectObject(hdc, solid_brush);
1939
1940 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1941 {
1943 }
1944
1945 SelectObject(hdc, dashed_pen);
1946 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++)
1947 {
1949 }
1950
1951 compare_hash(hdc, bmi, bits, "rectangles");
1952 SelectObject(hdc, solid_pen);
1953
1954 /* PaintRgn */
1955
1956 PaintRgn(hdc, hrgn);
1957 compare_hash(hdc, bmi, bits, "PaintRgn");
1958
1959 /* RTL rectangles */
1960
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");
1967 DeleteObject( hrgn );
1968
1969 for(i = 0, y = 10; i < 256; i++)
1970 {
1971 if(!rop_uses_src(rop3[i]))
1972 {
1973 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++)
1974 {
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);
1981 }
1982 y += 25;
1983 }
1984 }
1985
1986 compare_hash(hdc, bmi, bits, "hatch brushes");
1987
1988 /* overlapping blits */
1989
1990 orig_brush = SelectObject(hdc, solid_brush);
1991
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");
1998
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);
2006 else
2007 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y");
2008
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");
2015
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 );
2023 else
2024 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" );
2025
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");
2032
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");
2039
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);
2047 else
2048 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y");
2049
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" );
2056
2057 /* blitting with 32-bpp BI_RGB source */
2058
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++)
2070 {
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 );
2076 }
2077
2078 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2079
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" );
2091
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 );
2096
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 );
2101
2102 /* blitting with 32-bpp r10g10b10 source */
2103
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++)
2113 {
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;
2118 }
2119
2120 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2121 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" );
2122
2123 /* blitting with 32-bpp b6g6r6 source */
2124
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++)
2134 {
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;
2139 }
2140
2141 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2142 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" );
2143
2144 /* blitting with 24-bpp source */
2145
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++)
2152 {
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;
2156 }
2157
2158 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2159 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" );
2160
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 );
2165
2166 /* blitting with 16-bpp BI_RGB source */
2167
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;
2175
2176 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2177 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" );
2178
2179 /* blitting with 16-bpp b4g4r4 source */
2180
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;
2191
2192 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2193 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" );
2194
2195 /* blitting with 8-bpp source */
2196
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;
2206
2207 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2208 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" );
2209
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 );
2214
2215 /* blitting with 4-bpp source */
2216
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;
2225
2226 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY );
2227 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" );
2228
2229 /* blitting with 1-bpp source */
2230
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;
2239
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" );
2248
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" );
2253
2254 /* blitting with 1-bpp ddb source */
2255
2256 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2257 DeleteObject( SelectObject( src_dc, bmp ) );
2258
2259 old_text = GetTextColor( hdc );
2260 old_bkgnd = GetBkColor( hdc );
2261 for (i = 0; i < 256; i += 13)
2262 {
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 );
2266 }
2267 for (i = 0; i < 256; i += 13)
2268 {
2270 SetBkColor(hdc, PALETTEINDEX( i + 3 ));
2271 BitBlt( hdc, i, 13, 13, 13, src_dc, 0, 0, SRCCOPY );
2272 }
2273 for (i = 0; i < 256; i += 13)
2274 {
2276 SetBkColor(hdc, DIBINDEX( i + 3 ));
2277 BitBlt( hdc, i, 26, 13, 13, src_dc, 0, 0, SRCCOPY );
2278 }
2279 SetTextColor( hdc, old_text );
2280 SetBkColor( hdc, old_bkgnd );
2281 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp ddb SRCCOPY" );
2282
2283 DeleteObject( bmp );
2284
2285 /* blitting to 1-bpp ddb dest */
2286
2287 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits );
2288 DeleteObject( SelectObject( src_dc, bmp ) );
2289
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 );
2299
2300 i = 16;
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");
2340
2341 DeleteDC( src_dc );
2342 DeleteObject( bmp );
2343
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);
2353
2354 for (i = 0; i < 256; i++)
2355 {
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;
2360 }
2361
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 );
2368
2369 /* 32 bpp StretchDIBits */
2370
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;
2378
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);
2391
2392 src_bi->bmiHeader.biHeight = -4;
2393
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);
2406
2407 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray );
2408
2409 /* Solid colors */
2410 for (i = 0; i < 256; i++)
2411 {
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 );
2417 }
2418
2419 /* A few extra colors that are interesting in the 1bpp case */
2420
2421 /* bk color */
2422 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) );
2423 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) );
2424
2425 /* color 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 ) );
2428
2429 /* color 1 */
2430 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) );
2431 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) );
2432
2433 compare_hash(hdc, bmi, bits, "Colors");
2434
2435 for (i = 0; i < 256; i++)
2436 {
2437 COLORREF s, g;
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 );
2441
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 );
2445
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 );
2449
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 );
2453
2454 for (j = 0; j < 256; j++)
2455 {
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 );
2459
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 );
2463 }
2464 }
2465
2466 compare_hash(hdc, bmi, bits, "SetPixel");
2467
2468 /* gradients */
2469
2470 {
2471 TRIVERTEX vrect[] =
2472 {
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 }
2477 };
2478 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } };
2479
2480 TRIVERTEX vtri[] =
2481 {
2482 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 },
2483 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 },
2484 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 },
2485
2486 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 },
2487 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 },
2488 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 },
2489
2490 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 },
2491 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 },
2492 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 },
2493
2494 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 },
2495 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 },
2496 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 },
2497
2498 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 },
2499 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 },
2500 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 },
2501
2502 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 },
2503 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 },
2504 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 },
2505
2506 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 },
2507 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 },
2508 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 },
2509 };
2510 GRADIENT_TRIANGLE tri[] =
2511 {
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 }
2514 };
2515
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) );
2521
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) );
2527 }
2528
2529 /* wide pen */
2530
2531 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) );
2532 SelectObject( hdc, wide_pen );
2533
2534 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++)
2535 {
2538 }
2539
2540 compare_hash(hdc, bmi, bits, "wide pen" );
2541
2542 SelectObject( hdc, orig_pen );
2543 DeleteObject( wide_pen );
2544
2545 log_brush.lbStyle = BS_SOLID;
2546 log_brush.lbColor = RGB(0xff, 0, 0);
2547 log_brush.lbHatch = 0;
2548
2550 9, &log_brush, 0, NULL );
2551 SelectObject( hdc, wide_pen );
2552
2553 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2554 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" );
2555
2556 SelectObject( hdc, orig_pen );
2557 DeleteObject( wide_pen );
2558
2560 16, &log_brush, 0, NULL );
2561 SelectObject( hdc, wide_pen );
2562
2563 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) );
2564 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" );
2565
2566 SelectObject( hdc, orig_pen );
2567 DeleteObject( wide_pen );
2568
2570 9, &log_brush, 0, NULL );
2571 SelectObject( hdc, wide_pen );
2572
2574 compare_hash(hdc, bmi, bits, "wide pen - empty segments" );
2575
2576 SelectObject( hdc, orig_pen );
2577 DeleteObject( wide_pen );
2578
2579 /* brushed wide pen */
2580
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;
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]) );
2592
2593 for (i = 1; i < 20; i++)
2594 {
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 );
2604 }
2605 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 0, dib_is_1bpp );
2606
2607 for (i = 1; i < 20; i++)
2608 {
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 );
2617 }
2618 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 0, dib_is_1bpp );
2619
2621 SetTextColor(hdc, old_text);
2622 SetBkColor(hdc, old_bkgnd);
2623 SelectObject( hdc, orig_pen );
2624
2625 /* PALETTEINDEX */
2626
2627 solid_brush = CreateSolidBrush( PALETTEINDEX(3) );
2628 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) );
2631 SelectObject( hdc, solid_brush );
2632 SelectObject( hdc, solid_pen );
2633
2634 pal->palVersion = 0x300;
2635 pal->palNumEntries = 40;
2636 for (i = 0; i < 80; i++)
2637 {
2638 entries[i].peRed = i * 3;
2639 entries[i].peGreen = i * 7;
2640 entries[i].peBlue = 128 - i;
2641 entries[i].peFlags = 0;
2642 }
2643 hpal = CreatePalette( pal );
2644 old_hpal = SelectPalette( hdc, hpal, FALSE );
2645
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 );
2652
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 );
2660
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 );
2670
2671 SelectPalette( hdc, old_hpal, FALSE );
2672 DeleteObject( hpal );
2673
2674 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 0, dib_is_1bpp );
2675
2676 /* ExtFloodFill */
2677
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 ) );
2683
2684 /* add a vertical 'bar' to show that the clip rgn stops the flooding */
2685 hrgn = CreateRectRgn( 180, 10, 190, 210 );
2687 DeleteObject( hrgn );
2688
2689 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) );
2690 SelectObject( hdc, solid_brush );
2691
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" );
2695
2697
2698 ret = ExtFloodFill( hdc, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE );
2699 ok (!ret, "got ret %d\n", ret);
2700
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);
2707}
2708
2709static const BYTE ramp[17] =
2710{
2711 0, 0x4d, 0x68, 0x7c,
2712 0x8c, 0x9a, 0xa7, 0xb2,
2713 0xbd, 0xc7, 0xd0, 0xd9,
2714 0xe1, 0xe9, 0xf0, 0xf8,
2715 0xff
2716};
2717
2718static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
2719{
2720 *min_comp = (ramp[alpha] * text_comp) / 0xff;
2721 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff;
2722}
2723
2725{
2726 BYTE min_comp, max_comp;
2727
2728 if (alpha == 16) return text;
2729 if (alpha <= 1) return dst;
2730 if (text == dst) return dst;
2731
2732 get_range( alpha, text, &min_comp, &max_comp );
2733
2734 if (dst > text)
2735 {
2736 DWORD diff = dst - text;
2737 DWORD range = max_comp - text;
2738 dst = text + (diff * range ) / (0xff - text);
2739 return dst;
2740 }
2741 else
2742 {
2743 DWORD diff = text - dst;
2744 DWORD range = text - min_comp ;
2745 dst = text - (diff * range) / text;
2746 return dst;
2747 }
2748}
2749
2751{
2752 COLORREF ret;
2753
2754 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ),
2755 aa_comp( GetGValue(dst), GetGValue(text), glyph ),
2756 aa_comp( GetBValue(dst), GetBValue(text), glyph ) );
2757 return ret;
2758}
2759
2760static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2761
2762static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa )
2763{
2764 DWORD dib_size = get_dib_size(bmi), ret;
2765 LOGFONTA lf;
2766 HFONT font;
2767 GLYPHMETRICS gm;
2768 BYTE g_buf[10000];
2769 int i, stride, x, y;
2770 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
2771 char *eto_hash = NULL, *diy_hash = NULL;
2772 static const char str[] = "Hello Wine";
2773 POINT origin, g_org;
2774 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 };
2776 COLORREF text_color;
2777
2778 for(i = 0; i < dib_size; i++)
2779 bits[i] = vals[i % 4];
2780
2781 memset( &lf, 0, sizeof(lf) );
2782 strcpy( lf.lfFaceName, "Tahoma" );
2783 lf.lfHeight = 24;
2785
2786 font = CreateFontIndirectA( &lf );
2787 font = SelectObject( hdc, font );
2788
2789 GetTextMetricsA( hdc, &tm );
2790 if (!(tm.tmPitchAndFamily & TMPF_VECTOR))
2791 {
2792 skip( "skipping as a bitmap font has been selected for Tahoma.\n" );
2794 return;
2795 }
2796
2797 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) );
2800 origin.x = 10;
2801 origin.y = 100;
2802
2803 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL );
2804 eto_hash = hash_dib( bmi, bits );
2805
2806 for(i = 0; i < dib_size; i++)
2807 bits[i] = vals[i % 4];
2808
2809 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE;
2810
2811 text_color = GetTextColor( hdc );
2812 for (i = 0; i < strlen(str); i++)
2813 {
2814 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP;
2815
2816 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity );
2817
2818 if (ret == GDI_ERROR) continue;
2819
2820 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity );
2821
2822 g_org.x = origin.x + gm.gmptGlyphOrigin.x;
2823 g_org.y = origin.y - gm.gmptGlyphOrigin.y;
2824
2825 origin.x += gm.gmCellIncX;
2826 origin.y += gm.gmCellIncY;
2827
2828 if (!ret) continue;
2829
2830 if (aa)
2831 {
2832 stride = (gm.gmBlackBoxX + 3) & ~3;
2833
2834 for (y = 0; y < gm.gmBlackBoxY; y++)
2835 {
2836 BYTE *g_ptr = g_buf + y * stride;
2837 COLORREF val;
2838
2839 for (x = 0; x < gm.gmBlackBoxX; x++)
2840 {
2841 if (g_ptr[x] <= 1) continue;
2842 if (g_ptr[x] >= 16) val = text_color;
2843 else
2844 {
2845 val = GetPixel( hdc, g_org.x + x, g_org.y + y );
2846 val = aa_colorref( val, text_color, g_ptr[x] );
2847 }
2848 SetPixel( hdc, g_org.x + x, g_org.y + y, val );
2849 }
2850 }
2851 }
2852 else
2853 {
2854 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3;
2855
2856 for (y = 0; y < gm.gmBlackBoxY; y++)
2857 {
2858 BYTE *g_ptr = g_buf + y * stride;
2859 for (x = 0; x < gm.gmBlackBoxX; x++)
2860 {
2861 if (g_ptr[x / 8] & masks[x % 8])
2862 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color );
2863 }
2864 }
2865 }
2866 }
2867
2868 diy_hash = hash_dib( bmi, bits );
2869 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa );
2870
2871 HeapFree( GetProcessHeap(), 0, diy_hash );
2872 HeapFree( GetProcessHeap(), 0, eto_hash );
2873
2874 font = SelectObject( hdc, font );
2875 DeleteObject( font );
2876}
2877
2878static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits )
2879{
2880 draw_text_2( hdc, bmi, bits, FALSE );
2881
2882 /* Rounding errors make these cases hard to test */
2883 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) ||
2884 (bmi->bmiHeader.biBitCount == 16))
2885 return;
2886
2887 draw_text_2( hdc, bmi, bits, TRUE );
2888}
2889
2890static void test_simple_graphics(void)
2891{
2892 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
2893 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
2894 RGBQUAD *colors = bmi->bmiColors;
2895 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
2896 HDC mem_dc;
2897 BYTE *bits;
2898 HBITMAP dib, orig_bm;
2899 DIBSECTION ds;
2900 HPALETTE default_palette, old_hpal;
2901 int i;
2902
2903 mem_dc = CreateCompatibleDC(NULL);
2904
2905 /* a8r8g8b8 */
2906 trace("8888\n");
2907 memset(bmi, 0, sizeof(bmibuf));
2908 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
2909 bmi->bmiHeader.biHeight = 512;
2910 bmi->bmiHeader.biWidth = 512;
2911 bmi->bmiHeader.biBitCount = 32;
2912 bmi->bmiHeader.biPlanes = 1;
2914
2915 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2916 ok(dib != NULL, "ret NULL\n");
2917 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2918 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
2919 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
2920 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
2921 ok(ds.dsBmih.biCompression == BI_RGB, "got %x\n", ds.dsBmih.biCompression);
2922
2923 orig_bm = SelectObject(mem_dc, dib);
2924
2925 default_palette = create_default_palette( 8 );
2926 old_hpal = SelectPalette( mem_dc, default_palette, FALSE );
2927
2928 dst_format = "8888";
2930 draw_graphics(mem_dc, bmi, bits);
2931 draw_text(mem_dc, bmi, bits);
2932
2933 SelectObject(mem_dc, orig_bm);
2935
2936 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/
2937 trace("8888 - bitfields\n");
2938 bmi->bmiHeader.biBitCount = 32;
2940 bit_fields[0] = 0xff0000;
2941 bit_fields[1] = 0x00ff00;
2942 bit_fields[2] = 0x0000ff;
2943
2944 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2945 ok(dib != NULL, "ret NULL\n");
2946 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2947 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
2948 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2949 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
2950 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2951
2952 orig_bm = SelectObject(mem_dc, dib);
2953 SelectPalette( mem_dc, default_palette, FALSE );
2954
2955 dst_format = "8888 - bitfields";
2957 draw_graphics(mem_dc, bmi, bits);
2958 draw_text(mem_dc, bmi, bits);
2959
2960 SelectObject(mem_dc, orig_bm);
2962
2963 /* a8b8g8r8. */
2964 trace("a8b8g8r8\n");
2965 bmi->bmiHeader.biBitCount = 32;
2967 bit_fields[0] = 0x0000ff;
2968 bit_fields[1] = 0x00ff00;
2969 bit_fields[2] = 0xff0000;
2970
2971 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2972 ok(dib != NULL, "ret NULL\n");
2973 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
2974 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]);
2975 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
2976 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]);
2977 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
2978
2979 orig_bm = SelectObject(mem_dc, dib);
2980
2981 dst_format = "a8b8g8r8";
2983 draw_graphics(mem_dc, bmi, bits);
2984 draw_text(mem_dc, bmi, bits);
2985
2986 SelectObject(mem_dc, orig_bm);
2988
2989 /* r10g10b10. */
2990 trace("r10g10b10\n");
2991 bmi->bmiHeader.biBitCount = 32;
2993 bit_fields[0] = 0x3ff00000;
2994 bit_fields[1] = 0x000ffc00;
2995 bit_fields[2] = 0x000003ff;
2996
2997 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
2998 ok(dib != NULL, "ret NULL\n");
2999 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3000 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]);
3001 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]);
3002 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]);
3003 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3004
3005 orig_bm = SelectObject(mem_dc, dib);
3006
3007 dst_format = "r10g10b10";
3009 draw_graphics(mem_dc, bmi, bits);
3010 draw_text(mem_dc, bmi, bits);
3011
3012 SelectObject(mem_dc, orig_bm);
3014
3015 /* r6g6b6. */
3016 trace("r6g6b6\n");
3017 bmi->bmiHeader.biBitCount = 32;
3019 bit_fields[0] = 0x0003f000;
3020 bit_fields[1] = 0x00000fc0;
3021 bit_fields[2] = 0x0000003f;
3022
3023 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3024 ok(dib != NULL, "ret NULL\n");
3025 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3026 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]);
3027 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]);
3028 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]);
3029 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3030
3031 orig_bm = SelectObject(mem_dc, dib);
3032
3033 dst_format = "r6g6b6";
3035 draw_graphics(mem_dc, bmi, bits);
3036 draw_text(mem_dc, bmi, bits);
3037
3038 SelectObject(mem_dc, orig_bm);
3040
3041 /* 24 */
3042 trace("24\n");
3043 bmi->bmiHeader.biBitCount = 24;
3045
3046 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3047 ok(dib != NULL, "ret NULL\n");
3048 orig_bm = SelectObject(mem_dc, dib);
3049
3050 dst_format = "24";
3052 draw_graphics(mem_dc, bmi, bits);
3053 draw_text(mem_dc, bmi, bits);
3054
3055 SelectObject(mem_dc, orig_bm);
3057
3058 /* r5g5b5 */
3059 trace("555\n");
3060 bmi->bmiHeader.biBitCount = 16;
3062
3063 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3064 ok(dib != NULL, "ret NULL\n");
3065 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3066 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
3067 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
3068 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
3069 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3070
3071 orig_bm = SelectObject(mem_dc, dib);
3072
3073 dst_format = "r5g5b5";
3075 draw_graphics(mem_dc, bmi, bits);
3076 draw_text(mem_dc, bmi, bits);
3077
3078 SelectObject(mem_dc, orig_bm);
3080
3081 /* r4g4b4 */
3082 trace("444\n");
3083 bmi->bmiHeader.biBitCount = 16;
3085 bit_fields[0] = 0x0f00;
3086 bit_fields[1] = 0x00f0;
3087 bit_fields[2] = 0x000f;
3088 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3089 ok(dib != NULL, "ret NULL\n");
3090 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
3091 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]);
3092 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]);
3093 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]);
3094 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
3095
3096 orig_bm = SelectObject(mem_dc, dib);
3097
3098 dst_format = "r4g4b4";
3100 draw_graphics(mem_dc, bmi, bits);
3101 draw_text(mem_dc, bmi, bits);
3102
3103 SelectObject(mem_dc, orig_bm);
3105
3106 /* 8 color */
3107 trace("8 color\n");
3108 bmi->bmiHeader.biBitCount = 8;
3110 bmi->bmiHeader.biClrUsed = 236;
3111 for (i = 0; i < 236; i++)
3112 {
3113 colors[i].rgbRed = (i & 0x07) << 5;
3114 colors[i].rgbGreen = (i & 0x38) << 2;
3115 colors[i].rgbBlue = i & 0xc0;
3116 }
3117 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3118 ok(dib != NULL, "ret NULL\n");
3119
3120 orig_bm = SelectObject(mem_dc, dib);
3121
3122 dst_format = "8 color";
3124 draw_graphics(mem_dc, bmi, bits);
3125 draw_text(mem_dc, bmi, bits);
3126
3127 SelectObject(mem_dc, orig_bm);
3129
3130 /* 8 grayscale */
3131 trace("8 grayscale\n");
3132 bmi->bmiHeader.biBitCount = 8;
3134 bmi->bmiHeader.biClrUsed = 256;
3135 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i;
3136
3137 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3138 ok(dib != NULL, "ret NULL\n");
3139
3140 orig_bm = SelectObject(mem_dc, dib);
3141
3142 dst_format = "8 grayscale";
3144 draw_graphics(mem_dc, bmi, bits);
3145 draw_text(mem_dc, bmi, bits);
3146
3147 SelectObject(mem_dc, orig_bm);
3149
3150 /* 8 */
3151 trace("8\n");
3152 bmi->bmiHeader.biBitCount = 8;
3154 bmi->bmiHeader.biClrUsed = 5;
3155 colors[0].rgbRed = 0xff;
3156 colors[0].rgbGreen = 0xff;
3157 colors[0].rgbBlue = 0xff;
3158 colors[1].rgbRed = 0;
3159 colors[1].rgbGreen = 0;
3160 colors[1].rgbBlue = 0;
3161 colors[2].rgbRed = 0xff;
3162 colors[2].rgbGreen = 0;
3163 colors[2].rgbBlue = 0;
3164 colors[3].rgbRed = 0;
3165 colors[3].rgbGreen = 0xff;
3166 colors[3].rgbBlue = 0;
3167 colors[4].rgbRed = 0;
3168 colors[4].rgbGreen = 0;
3169 colors[4].rgbBlue = 0xff;
3170
3171 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3172 ok(dib != NULL, "ret NULL\n");
3173
3174 orig_bm = SelectObject(mem_dc, dib);
3175
3176 dst_format = "8";
3178 draw_graphics(mem_dc, bmi, bits);
3179 draw_text(mem_dc, bmi, bits);
3180
3181 SelectObject(mem_dc, orig_bm);
3183
3184 /* 4 */
3185 trace("4\n");
3186 bmi->bmiHeader.biBitCount = 4;
3187
3188 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3189 ok(dib != NULL, "ret NULL\n");
3190
3191 orig_bm = SelectObject(mem_dc, dib);
3193
3194 dst_format = "4";
3196 draw_graphics(mem_dc, bmi, bits);
3197 draw_text(mem_dc, bmi, bits);
3198
3199 SelectObject(mem_dc, orig_bm);
3201
3202 /* 4 grayscale */
3203 trace("4 grayscale\n");
3204 bmi->bmiHeader.biClrUsed = 16;
3205 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17;
3206
3207 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3208 ok(dib != NULL, "ret NULL\n");
3209
3210 orig_bm = SelectObject(mem_dc, dib);
3211
3212 dst_format = "4 grayscale";
3214 draw_graphics(mem_dc, bmi, bits);
3215 draw_text(mem_dc, bmi, bits);
3216
3217 SelectObject(mem_dc, orig_bm);
3219
3220 /* 1 */
3221 trace("1\n");
3222 bmi->bmiHeader.biBitCount = 1;
3223 bmi->bmiHeader.biClrUsed = 2;
3224
3225 colors[0].rgbRed = 0x00;
3226 colors[0].rgbGreen = 0x01;
3227 colors[0].rgbBlue = 0xff;
3228 colors[1].rgbRed = 0xff;
3229 colors[1].rgbGreen = 0x00;
3230 colors[1].rgbBlue = 0x00;
3231
3232 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
3233 ok(dib != NULL, "ret NULL\n");
3234
3235 orig_bm = SelectObject(mem_dc, dib);
3237
3238 dst_format = "1";
3240 draw_graphics(mem_dc, bmi, bits);
3241 draw_text(mem_dc, bmi, bits);
3242
3243 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE ));
3244 SelectObject(mem_dc, orig_bm);
3246
3247 DeleteDC(mem_dc);
3248}
3249
3251{
3253
3255
3257}
static HRGN hrgn2
static HRGN hrgn
_STLP_DECLSPEC complex< float > _STLP_CALL cos(const complex< float > &)
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
#define broken(x)
Definition: _sntprintf.h:21
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
FORCEINLINE VOID SetPixel(_In_ ULONG Left, _In_ ULONG Top, _In_ UCHAR Color)
Definition: arm.h:50
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
DWORD bpp
Definition: surface.c:185
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:740
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1610
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:890
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:648
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1771
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:358
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
const WCHAR * text
Definition: package.c:1799
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:49
#define BI_RGB
Definition: precomp.h:47
#define RGB(r, g, b)
Definition: precomp.h:62
#define GetBValue(quad)
Definition: precomp.h:66
#define GetGValue(quad)
Definition: precomp.h:65
ULONG RGBQUAD
Definition: precomp.h:50
#define GetRValue(quad)
Definition: precomp.h:64
#define ULONG_PTR
Definition: config.h:101
#define abs(i)
Definition: fconv.c:206
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
pKey DeleteObject()
DWORD WINAPI SetLayout(_In_ HDC hdc, _In_ DWORD dwLayout)
Definition: coord.c:780
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLclampf GLclampf GLclampf alpha
Definition: gl.h:1740
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLsizei stride
Definition: glext.h:5848
GLuint color
Definition: glext.h:6243
const GLubyte * c
Definition: glext.h:8905
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLdouble GLdouble right
Definition: glext.h:10859
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLint * range
Definition: glext.h:7539
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLint left
Definition: glext.h:7726
GLenum GLenum dst
Definition: glext.h:6340
GLint GLint bottom
Definition: glext.h:7726
GLboolean GLboolean g
Definition: glext.h:6204
GLuint GLfloat * val
Definition: glext.h:7180
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define ds
Definition: i386-dis.c:443
int hex(char ch)
#define bits
Definition: infblock.c:15
voidpf uLong int origin
Definition: ioapi.h:144
#define b
Definition: ke_i.h:79
#define BI_BITFIELDS
Definition: mmreg.h:507
#define DIBINDEX(n)
Definition: mmsystem.h:932
BITMAP bmp
Definition: alphablend.c:62
BOOL WINAPI GdiAlphaBlend(HDC hdcDst, int xDst, int yDst, int widthDst, int heightDst, HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc, BLENDFUNCTION blendFunction)
#define AC_SRC_ALPHA
Definition: alphablend.c:9
HDC hdc
Definition: main.c:9
BOOL WINAPI GdiGradientFill(HDC hdc, TRIVERTEX *vert_array, ULONG nvert, void *grad_array, ULONG ngrad, ULONG mode)
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
BOOL todo
Definition: filedlg.c:313
#define LAYOUT_LTR
Definition: dc.c:36
static const RECT hline_clips[]
Definition: dib.c:1263
static const BITMAPINFOHEADER dib_brush_header_24
Definition: dib.c:1379
static const DWORD rop3[256]
Definition: dib.c:31
static const RECT patblt_clips[]
Definition: dib.c:1339
static const char * sha1_graphics_r6g6b6[]
Definition: dib.c:356
static const char ** current_sha1
Definition: dib.c:1131
static const RECT bias_check[]
Definition: dib.c:1251
static const char * sha1_graphics_4[]
Definition: dib.c:849
static BOOL rop_uses_src(DWORD rop)
Definition: dib.c:67
static const char * dst_format
Definition: dib.c:1133
static const char * sha1_graphics_r5g5b5[]
Definition: dib.c:498
static const BYTE ramp[17]
Definition: dib.c:2709
static const char * sha1_graphics_a8r8g8b8[]
Definition: dib.c:72
static const RECT vline_clips[]
Definition: dib.c:1282
static COLORREF aa_colorref(COLORREF dst, COLORREF text, BYTE glyph)
Definition: dib.c:2750
static const RECT line_clips[]
Definition: dib.c:1301
static const DWORD polypoly_counts[]
Definition: dib.c:1334
static const POINT poly_lines[]
Definition: dib.c:1324
static const RGBQUAD default_palette_4[16]
Definition: dib.c:1403
static const char * sha1_graphics_8_grayscale[]
Definition: dib.c:708
static const char * sha1_graphics_24[]
Definition: dib.c:427
static const BYTE masks[8]
Definition: dib.c:2760
static const char * sha1_graphics_a8r8g8b8_bitfields[]
Definition: dib.c:143
static const BYTE rle8_data[20]
Definition: dib.c:1385
static DWORD get_stride(const BITMAPINFO *bmi)
Definition: dib.c:1135
static void draw_text_2(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa)
Definition: dib.c:2762
static const char * sha1_graphics_a8b8g8r8[]
Definition: dib.c:214
static const char * sha1_graphics_r10g10b10[]
Definition: dib.c:285
static const BITMAPINFOHEADER dib_brush_header_8888
Definition: dib.c:1378
static const RGBQUAD default_palette_1[2]
Definition: dib.c:1398
static void test_simple_graphics(void)
Definition: dib.c:2890
static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
Definition: dib.c:1529
static const BITMAPINFOHEADER dib_brush_header_4
Definition: dib.c:1382
static void draw_text(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
Definition: dib.c:2878
static const DWORD four_by_four_data[16]
Definition: dib.c:1390
static const RECT wide_lines[]
Definition: dib.c:1312
static const RGBQUAD default_palette_8[256]
Definition: dib.c:1411
static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo)
Definition: dib.c:1205
static const RECT * current_bounds
Definition: dib.c:1132
static const BITMAPINFOHEADER dib_brush_header_8
Definition: dib.c:1381
static const POINT polypoly_lines[]
Definition: dib.c:1329
static DWORD get_dib_size(const BITMAPINFO *bmi)
Definition: dib.c:1140
static const char * sha1_graphics_8_color[]
Definition: dib.c:638
static const char * sha1_graphics_r4g4b4[]
Definition: dib.c:568
static const RECT rectangles[]
Definition: dib.c:1360
static const RECT graphics_bounds[]
Definition: dib.c:1061
static const BITMAPINFOHEADER dib_brush_header_1
Definition: dib.c:1383
static void solid_patblt(HDC hdc, int x, int y, int width, int height, COLORREF color)
Definition: dib.c:1521
static const char * sha1_graphics_1[]
Definition: dib.c:989
static HCRYPTPROV crypt_prov
Definition: dib.c:29
static BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
Definition: dib.c:2724
static const char * sha1_graphics_8[]
Definition: dib.c:779
static void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
Definition: dib.c:2718
static void compare_bounds(HDC hdc, const char *info)
Definition: dib.c:1185
#define M_PI
Definition: dib.c:26
static HPALETTE create_default_palette(int bpp)
Definition: dib.c:1479
static const DWORD ddb_brush_bits[8]
Definition: dib.c:1395
static const BITMAPINFOHEADER dib_brush_header_555
Definition: dib.c:1380
static char * hash_dib(const BITMAPINFO *bmi, const void *bits)
Definition: dib.c:1145
static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
Definition: dib.c:1246
static const char * sha1_graphics_4_grayscale[]
Definition: dib.c:919
static void reset_bounds(HDC hdc)
Definition: dib.c:1179
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define todo_wine_if(is_todo)
Definition: custom.c:76
static const BYTE dib[]
Definition: ole2.c:201
Definition: mk_font.cpp:20
static int rop(int rop, int src, int dst)
Definition: nanoxwin.c:124
#define DWORD
Definition: nt_native.h:44
const WCHAR * str
#define memset(x, y, z)
Definition: compat.h:39
& rect
Definition: startmenu.cpp:1413
BYTE lfQuality
Definition: dimm.idl:53
LONG lfHeight
Definition: dimm.idl:42
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
BYTE BlendOp
Definition: wingdi.h:2759
BYTE BlendFlags
Definition: wingdi.h:2760
BYTE AlphaFormat
Definition: wingdi.h:2762
BYTE SourceConstantAlpha
Definition: wingdi.h:2761
short gmCellIncX
Definition: wingdi.h:2445
UINT gmBlackBoxY
Definition: wingdi.h:2443
UINT gmBlackBoxX
Definition: wingdi.h:2442
short gmCellIncY
Definition: wingdi.h:2446
POINT gmptGlyphOrigin
Definition: wingdi.h:2444
Definition: wingdi.h:2472
Definition: _hash_fun.h:40
USHORT biBitCount
Definition: precomp.h:37
ULONG biCompression
Definition: precomp.h:38
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
RGBQUAD bmiColors[1]
Definition: wingdi.h:1477
UINT lbStyle
Definition: wingdi.h:1747
ULONG_PTR lbHatch
Definition: wingdi.h:1749
COLORREF lbColor
Definition: wingdi.h:1748
WORD palNumEntries
Definition: wingdi.h:1834
WORD palVersion
Definition: wingdi.h:1833
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
UCHAR rgbRed
Definition: bootanim.c:105
Definition: time.h:68
int32_t INT
Definition: typedefs.h:58
int ret
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
#define PROV_RSA_FULL
Definition: wincrypt.h:2039
#define CRYPT_VERIFYCONTEXT
Definition: wincrypt.h:2069
#define CALG_SHA1
Definition: wincrypt.h:1807
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:46
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:50
#define HP_HASHVAL
Definition: wincrypt.h:2183
DWORD COLORREF
Definition: windef.h:300
#define PALETTEINDEX(i)
Definition: wingdi.h:2943
#define DIB_RGB_COLORS
Definition: wingdi.h:367
#define PS_DASH
Definition: wingdi.h:587
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
BOOL WINAPI Polyline(_In_ HDC hdc, _In_reads_(cpt) const POINT *apt, _In_ int cpt)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
#define DCB_RESET
Definition: wingdi.h:687
#define ANTIALIASED_QUALITY
Definition: wingdi.h:440
#define PATPAINT
Definition: wingdi.h:336
#define PS_JOIN_BEVEL
Definition: wingdi.h:597
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:999
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
HFONT WINAPI CreateFontIndirectA(_In_ const LOGFONTA *)
HPEN WINAPI ExtCreatePen(_In_ DWORD iPenStyle, _In_ DWORD cWidth, _In_ const LOGBRUSH *plbrush, _In_ DWORD cStyle, _In_reads_opt_(cStyle) const DWORD *pstyle)
#define RGN_DIFF
Definition: wingdi.h:358
COLORREF WINAPI GetTextColor(_In_ HDC)
Definition: text.c:861
#define HS_DIAGCROSS
Definition: wingdi.h:578
#define WHITENESS
Definition: wingdi.h:337
BOOL WINAPI SetBrushOrgEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
HBRUSH WINAPI CreateHatchBrush(_In_ int, _In_ COLORREF)
#define PS_ENDCAP_SQUARE
Definition: wingdi.h:595
#define BS_PATTERN
Definition: wingdi.h:1090
UINT WINAPI SetTextAlign(_In_ HDC, _In_ UINT)
Definition: text.c:883
#define AC_SRC_OVER
Definition: wingdi.h:1369
HPALETTE WINAPI CreatePalette(_In_reads_(_Inexpressible_(2 *sizeof(WORD)+plpal->palNumEntries *sizeof(PALETTEENTRY))) const LOGPALETTE *)
#define FLOODFILLSURFACE
Definition: wingdi.h:645
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
struct tagLOGPALETTE LOGPALETTE
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
#define PS_GEOMETRIC
Definition: wingdi.h:583
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
#define PALETTERGB(r, g, b)
Definition: wingdi.h:2942
#define TRANSPARENT
Definition: wingdi.h:950
#define RGN_COPY
Definition: wingdi.h:357
#define HS_CROSS
Definition: wingdi.h:577
#define SRCCOPY
Definition: wingdi.h:333
#define LAYOUT_RTL
Definition: wingdi.h:1371
COLORREF WINAPI GetBkColor(_In_ HDC)
Definition: dc.c:978
LONG WINAPI GetBitmapBits(_In_ HBITMAP hbit, _In_ LONG cb, _Out_writes_bytes_(cb) LPVOID lpvBits)
BOOL WINAPI ExtTextOutA(_In_ HDC hdc, _In_ int x, _In_ int y, _In_ UINT options, _In_opt_ const RECT *lprect, _In_reads_opt_(c) LPCSTR lpString, _In_ UINT c, _In_reads_opt_(c) const INT *lpDx)
#define PATCOPY
Definition: wingdi.h:335
#define TMPF_VECTOR
Definition: wingdi.h:1312
#define OPAQUE
Definition: wingdi.h:949
#define RGN_OR
Definition: wingdi.h:359
#define GDI_ERROR
Definition: wingdi.h:1309
#define DCB_ENABLE
Definition: wingdi.h:686
BOOL WINAPI PatBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
struct tagBITMAPINFO BITMAPINFO
#define TA_BASELINE
Definition: wingdi.h:928
#define GGO_BITMAP
Definition: wingdi.h:849
BOOL WINAPI GetTextMetricsA(_In_ HDC, _Out_ LPTEXTMETRICA)
Definition: text.c:200
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
#define GGO_GRAY4_BITMAP
Definition: wingdi.h:853
int WINAPI SetROP2(_In_ HDC, _In_ int)
Definition: dc.c:1107
HBRUSH WINAPI CreateDIBPatternBrushPt(_In_ const VOID *pvPackedDIB, _In_ UINT uUsage)
#define BI_RLE8
Definition: wingdi.h:35
#define HS_HORIZONTAL
Definition: wingdi.h:580
UINT WINAPI SetPaletteEntries(_In_ HPALETTE hpal, _In_ UINT iStart, _In_ UINT cEntries, _In_reads_(cEntries) CONST PALETTEENTRY *pPalEntries)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI DeleteDC(_In_ HDC)
BOOL WINAPI PaintRgn(_In_ HDC, _In_ HRGN)
Definition: painting.c:250
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
UINT WINAPI SetBoundsRect(_In_ HDC, _In_opt_ LPCRECT, _In_ UINT)
BOOL WINAPI SetRectRgn(_In_ HRGN, _In_ int, _In_ int, _In_ int, _In_ int)
#define PS_JOIN_MITER
Definition: wingdi.h:598
BOOL WINAPI ExtFloodFill(_In_ HDC, _In_ int, _In_ int, _In_ COLORREF, _In_ UINT)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define BS_SOLID
Definition: wingdi.h:1086
#define R2_COPYPEN
Definition: wingdi.h:339
#define PS_SOLID
Definition: wingdi.h:586
BOOL WINAPI PolyPolyline(_In_ HDC hdc, _In_ const POINT *apt, _In_reads_(csz) const DWORD *asz, _In_ DWORD csz)
int WINAPI ExtSelectClipRgn(_In_ HDC, _In_opt_ HRGN, _In_ int)
UINT WINAPI GetBoundsRect(_In_ HDC, _Out_ LPRECT, _In_ UINT)
#define NONANTIALIASED_QUALITY
Definition: wingdi.h:439
#define PS_ENDCAP_FLAT
Definition: wingdi.h:596
#define SRCAND
Definition: wingdi.h:330
int WINAPI StretchDIBits(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ const VOID *, _In_ const BITMAPINFO *, _In_ UINT, _In_ DWORD)
HBRUSH WINAPI CreatePatternBrush(_In_ HBITMAP)
DWORD WINAPI GetGlyphOutlineA(_In_ HDC hdc, _In_ UINT uChar, _In_ UINT fuFormat, _Out_ LPGLYPHMETRICS lpgm, _In_ DWORD cjBuffer, _Out_writes_bytes_opt_(cjBuffer) LPVOID pvBuffer, _In_ CONST MAT2 *lpmat2)
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
unsigned char BYTE
Definition: xxhash.c:193