ReactOS  0.4.13-dev-100-gc8611ae
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 
31 static 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 
67 static inline BOOL rop_uses_src(DWORD rop)
68 {
69  return (((rop & 0xcc0000) >> 2) != (rop & 0x330000));
70 }
71 
72 static 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 
143 static const char *sha1_graphics_a8r8g8b8_bitfields[] =
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 
214 static 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 
285 static 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 
356 static 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 
427 static 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 
498 static 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 
568 static 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 
638 static 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 
708 static 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 
779 static 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 
849 static 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 
919 static 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 
989 static 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 
1061 static 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 
1131 static const char **current_sha1;
1132 static const RECT *current_bounds;
1133 static const char *dst_format;
1134 
1135 static inline DWORD get_stride(const BITMAPINFO *bmi)
1136 {
1137  return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3;
1138 }
1139 
1140 static inline DWORD get_dib_size(const BITMAPINFO *bmi)
1141 {
1142  return get_stride(bmi) * abs(bmi->bmiHeader.biHeight);
1143 }
1144 
1145 static char *hash_dib(const BITMAPINFO *bmi, const void *bits)
1146 {
1147  DWORD dib_size = get_dib_size(bmi);
1148  HCRYPTHASH hash;
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 
1179 static void reset_bounds( HDC hdc )
1180 {
1183 }
1184 
1185 static 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,
1202  current_bounds++;
1203 }
1204 
1205 static 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);
1225  HeapFree(GetProcessHeap(), 0, 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 
1241  HeapFree(GetProcessHeap(), 0, hash);
1242 
1243  compare_bounds( hdc, info );
1244 }
1245 
1246 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
1247 {
1249 }
1250 
1251 static 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 
1263 static 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 
1282 static 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 
1301 static 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 
1312 static 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 
1324 static const POINT poly_lines[] =
1325 {
1326  {100, 100}, {200, 100}, {200, 200}, {100, 200}
1327 };
1328 
1329 static const POINT polypoly_lines[] =
1330 {
1331  {100, 100}, {200, 100}, {200, 100}, {200, 200}
1332 };
1333 
1334 static const DWORD polypoly_counts[] =
1335 {
1336  sizeof(polypoly_lines)/sizeof(polypoly_lines[0])
1337 };
1338 
1339 static 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 
1360 static 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 
1378 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0};
1379 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0};
1380 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0};
1381 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0};
1382 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0};
1383 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0};
1384 
1385 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */
1386  0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */
1387  0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */
1388  0x00, 0x01 }; /* <eod> */
1389 
1390 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1391  0xffffff, 0x00ffff, 0xff00ff, 0xffff00,
1392  0x000000, 0xff0000, 0x00ff00, 0x0000ff,
1393  0xffffff, 0x00ffff, 0xff00ff, 0xffff00 };
1394 
1395 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888,
1396  0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 };
1397 
1398 static const RGBQUAD default_palette_1[2] =
1399 {
1400  { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff }
1401 };
1402 
1403 static 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 
1411 static 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 
1479 static 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 
1521 static 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 
1529 static 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 
1699  SetBkMode(hdc, OPAQUE);
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 
1928  DeleteObject(bmp);
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  {
2275  SetTextColor(hdc, DIBINDEX( i ));
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 
2620  DeleteObject(bmp);
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) );
2629  SetTextColor( hdc, PALETTEINDEX(38) );
2630  SetBkColor( hdc, PALETTEINDEX(9) );
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 
2709 static 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 
2718 static 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 
2760 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
2761 
2762 static 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 };
2775  TEXTMETRICA tm;
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 
2878 static 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 
2890 static 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);
2934  DeleteObject(dib);
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);
2961  DeleteObject(dib);
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);
2987  DeleteObject(dib);
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);
3013  DeleteObject(dib);
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);
3039  DeleteObject(dib);
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);
3056  DeleteObject(dib);
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);
3079  DeleteObject(dib);
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);
3104  DeleteObject(dib);
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);
3128  DeleteObject(dib);
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);
3148  DeleteObject(dib);
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);
3182  DeleteObject(dib);
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);
3200  DeleteObject(dib);
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);
3218  DeleteObject(dib);
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);
3245  DeleteObject(dib);
3246 
3247  DeleteDC(mem_dc);
3248 }
3249 
3251 {
3253 
3255 
3257 }
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
DWORD WINAPI SetLayout(_In_ HDC hdc, _In_ DWORD dwLayout)
Definition: coord.c:765
static const RECT bias_check[]
Definition: dib.c:1251
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
#define abs(i)
Definition: fconv.c:206
static const BITMAPINFOHEADER dib_brush_header_555
Definition: dib.c:1380
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)
#define trace(...)
Definition: kmt_test.h:217
GLint GLint GLsizei width
Definition: gl.h:1546
COLORREF WINAPI GetBkColor(_In_ HDC)
Definition: dc.c:954
#define ANTIALIASED_QUALITY
Definition: wingdi.h:439
static HCRYPTPROV crypt_prov
Definition: dib.c:29
#define PS_ENDCAP_SQUARE
Definition: wingdi.h:594
#define TRUE
Definition: types.h:120
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)
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
static const char * sha1_graphics_4_grayscale[]
Definition: dib.c:919
static const char * sha1_graphics_8[]
Definition: dib.c:779
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1454
HBRUSH WINAPI CreateHatchBrush(_In_ int, _In_ COLORREF)
static const POINT polypoly_lines[]
Definition: dib.c:1329
long y
Definition: polytest.cpp:48
#define LAYOUT_RTL
Definition: wingdi.h:1353
BOOL WINAPI PaintRgn(_In_ HDC, _In_ HRGN)
Definition: painting.c:234
static const char * dst_format
Definition: dib.c:1133
long x
Definition: polytest.cpp:48
UINT lbStyle
Definition: wingdi.h:1725
static const DWORD rop3[256]
Definition: dib.c:31
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static DWORD get_stride(const BITMAPINFO *bmi)
Definition: dib.c:1135
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
Definition: mk_font.cpp:20
static const char * sha1_graphics_a8r8g8b8_bitfields[]
Definition: dib.c:143
HFONT WINAPI CreateFontIndirectA(_In_ const LOGFONTA *)
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
const WCHAR * text
Definition: package.c:1827
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
static const char * sha1_graphics_r5g5b5[]
Definition: dib.c:498
ULONG_PTR lbHatch
Definition: wingdi.h:1727
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
Definition: winddi.h:3706
static HRGN hrgn2
static void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp)
Definition: dib.c:2718
#define HS_HORIZONTAL
Definition: wingdi.h:579
static HDC
Definition: imagelist.c:92
#define GetRValue(rgb)
Definition: wingdi.h:2913
static const char * sha1_graphics_r10g10b10[]
Definition: dib.c:285
BOOL todo
Definition: filedlg.c:313
LONG top
Definition: windef.h:292
UINT WINAPI SetBoundsRect(_In_ HDC, _In_opt_ LPCRECT, _In_ UINT)
static const RGBQUAD default_palette_4[16]
Definition: dib.c:1403
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define ds
Definition: i386-dis.c:434
#define PS_JOIN_BEVEL
Definition: wingdi.h:596
#define GGO_GRAY4_BITMAP
Definition: wingdi.h:852
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
voidpf uLong int origin
Definition: ioapi.h:142
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
static const BYTE rle8_data[20]
Definition: dib.c:1385
static const char * sha1_graphics_8_grayscale[]
Definition: dib.c:708
#define PS_JOIN_MITER
Definition: wingdi.h:597
short gmCellIncY
Definition: wingdi.h:2424
Definition: wingdi.h:2450
#define R2_COPYPEN
Definition: wingdi.h:338
LONG left
Definition: windef.h:291
static const BYTE ramp[17]
Definition: dib.c:2709
UINT WINAPI SetTextAlign(_In_ HDC, _In_ UINT)
Definition: text.c:849
#define AC_SRC_ALPHA
Definition: alphablend.c:9
#define DCB_ENABLE
Definition: wingdi.h:685
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
static const char hex[16]
Definition: profile.c:123
LONG right
Definition: windef.h:293
#define PS_GEOMETRIC
Definition: wingdi.h:582
static VOID NTAPI BitBlt(IN ULONG Left, IN ULONG Top, IN ULONG Width, IN ULONG Height, IN PUCHAR Buffer, IN ULONG BitsPerPixel, IN ULONG Delta)
Definition: vga.c:416
#define DWORD
Definition: nt_native.h:44
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
int32_t INT
Definition: typedefs.h:56
#define BI_BITFIELDS
Definition: mmreg.h:507
static const char * sha1_graphics_8_color[]
Definition: dib.c:638
& rect
Definition: startmenu.cpp:1413
BYTE BlendOp
Definition: wingdi.h:2737
UCHAR rgbBlue
Definition: inbv.c:122
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)
#define GGO_BITMAP
Definition: wingdi.h:848
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:358
UCHAR rgbGreen
Definition: inbv.c:123
WORD palVersion
Definition: wingdi.h:1811
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:975
#define GetGValue(rgb)
Definition: wingdi.h:2914
BOOL WINAPI PatBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
UCHAR rgbRed
Definition: inbv.c:124
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
#define LAYOUT_LTR
Definition: dc.c:39
#define PS_SOLID
Definition: wingdi.h:585
int WINAPI ExtSelectClipRgn(_In_ HDC, _In_opt_ HRGN, _In_ int)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
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
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1615
int hash
Definition: main.c:58
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint color
Definition: glext.h:6243
int WINAPI SetROP2(_In_ HDC, _In_ int)
Definition: dc.c:1083
#define DIBINDEX(n)
Definition: mmsystem.h:932
LONG lfHeight
Definition: dimm.idl:42
static const RECT vline_clips[]
Definition: dib.c:1282
static void draw_text_2(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa)
Definition: dib.c:2762
#define TA_BASELINE
Definition: wingdi.h:927
static int rop(int rop, int src, int dst)
Definition: nanoxwin.c:124
DWORD biCompression
Definition: amvideo.idl:35
#define ok(value,...)
static void compare_bounds(HDC hdc, const char *info)
Definition: dib.c:1185
#define TRANSPARENT
Definition: wingdi.h:949
COLORREF WINAPI GetTextColor(_In_ HDC)
Definition: text.c:827
static const BITMAPINFOHEADER dib_brush_header_1
Definition: dib.c:1383
const WCHAR * str
static const char ** current_sha1
Definition: dib.c:1131
static const RECT graphics_bounds[]
Definition: dib.c:1061
_STLP_DECLSPEC complex< float > _STLP_CALL cos(const complex< float > &)
static const BITMAPINFOHEADER dib_brush_header_24
Definition: dib.c:1379
HPALETTE WINAPI SelectPalette(_In_ HDC, _In_ HPALETTE, _In_ BOOL)
smooth NULL
Definition: ftsmooth.c:416
#define NONANTIALIASED_QUALITY
Definition: wingdi.h:438
#define RGN_OR
Definition: wingdi.h:358
BOOL WINAPI SetBrushOrgEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
GLint GLint bottom
Definition: glext.h:7726
static const RGBQUAD default_palette_8[256]
Definition: dib.c:1411
BOOL WINAPI GetTextMetricsA(_In_ HDC, _Out_ LPTEXTMETRICA)
Definition: text.c:200
static void reset_bounds(HDC hdc)
Definition: dib.c:1179
static const POINT poly_lines[]
Definition: dib.c:1324
#define b
Definition: ke_i.h:79
GLuint GLfloat * val
Definition: glext.h:7180
static COLORREF aa_colorref(COLORREF dst, COLORREF text, BYTE glyph)
Definition: dib.c:2750
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
static const DWORD ddb_brush_bits[8]
Definition: dib.c:1395
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
FORCEINLINE VOID SetPixel(IN ULONG Left, IN ULONG Top, IN UCHAR Color)
Definition: vga.c:99
#define todo_wine_if(is_todo)
Definition: test.h:155
BOOL WINAPI SetRectRgn(_In_ HRGN, _In_ int, _In_ int, _In_ int, _In_ int)
HBRUSH WINAPI CreatePatternBrush(_In_ HBITMAP)
struct tagRGBQUAD RGBQUAD
GLboolean GLboolean g
Definition: glext.h:6204
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
static const RECT patblt_clips[]
Definition: dib.c:1339
static const RECT * current_bounds
Definition: dib.c:1132
GLsizei stride
Definition: glext.h:5848
POINT gmptGlyphOrigin
Definition: wingdi.h:2422
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static void test_simple_graphics(void)
Definition: dib.c:2890
RGBQUAD bmiColors[1]
Definition: wingdi.h:1455
DWORD COLORREF
Definition: windef.h:285
HPALETTE WINAPI CreatePalette(_In_reads_(_Inexpressible_(2 *sizeof(WORD)+plpal->palNumEntries *sizeof(PALETTEENTRY))) const LOGPALETTE *)
#define FLOODFILLSURFACE
Definition: wingdi.h:644
static BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha)
Definition: dib.c:2724
BYTE SourceConstantAlpha
Definition: wingdi.h:2739
#define RGB(r, g, b)
Definition: wingdi.h:2918
LONG WINAPI GetBitmapBits(_In_ HBITMAP hbit, _In_ LONG cb, _Out_writes_bytes_(cb) LPVOID lpvBits)
COLORREF lbColor
Definition: wingdi.h:1726
const GLubyte * c
Definition: glext.h:8905
const char * wine_dbgstr_rect(const RECT *rect)
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint left
Definition: glext.h:7726
static HPALETTE create_default_palette(int bpp)
Definition: dib.c:1479
static const DWORD polypoly_counts[]
Definition: dib.c:1334
UINT WINAPI GetBoundsRect(_In_ HDC, _Out_ LPRECT, _In_ UINT)
GLdouble GLdouble right
Definition: glext.h:10859
BITMAP bmp
Definition: alphablend.c:62
static void draw_text(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
Definition: dib.c:2878
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:895
static char * hash_dib(const BITMAPINFO *bmi, const void *bits)
Definition: dib.c:1145
int ret
static const RGBQUAD default_palette_1[2]
Definition: dib.c:1398
#define OPAQUE
Definition: wingdi.h:948
HDC hdc
Definition: main.c:9
BYTE BlendFlags
Definition: wingdi.h:2738
#define AC_SRC_OVER
Definition: wingdi.h:1351
static HRGN hrgn
Definition: win.c:55
static const char * sha1_graphics_1[]
Definition: dib.c:989
unsigned char BYTE
Definition: mem.h:68
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:745
GLdouble s
Definition: gl.h:2039
Definition: time.h:76
#define WHITENESS
Definition: wingdi.h:336
#define PS_DASH
Definition: wingdi.h:586
short gmCellIncX
Definition: wingdi.h:2423
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
BOOL WINAPI PolyPolyline(_In_ HDC hdc, _In_ const POINT *apt, _In_reads_(csz) const DWORD *asz, _In_ DWORD csz)
#define broken(x)
Definition: _sntprintf.h:21
BYTE lfQuality
Definition: dimm.idl:53
#define TMPF_VECTOR
Definition: wingdi.h:1294
GLenum GLint * range
Definition: glext.h:7539
#define PATCOPY
Definition: wingdi.h:334
#define RGN_COPY
Definition: wingdi.h:356
#define CRYPT_VERIFYCONTEXT
Definition: wincrypt.h:2069
static const RECT rectangles[]
Definition: dib.c:1360
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:50
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:884
static BOOL rop_uses_src(DWORD rop)
Definition: dib.c:67
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
BOOL WINAPI DeleteDC(_In_ HDC)
#define RGN_DIFF
Definition: wingdi.h:357
static const char * sha1_graphics_r6g6b6[]
Definition: dib.c:356
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:46
#define PALETTERGB(r, g, b)
Definition: wingdi.h:2920
static void solid_patblt(HDC hdc, int x, int y, int width, int height, COLORREF color)
Definition: dib.c:1521
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:197
static const char * sha1_graphics_24[]
Definition: dib.c:427
#define HS_CROSS
Definition: wingdi.h:576
GLenum GLenum dst
Definition: glext.h:6340
static const RECT wide_lines[]
Definition: dib.c:1312
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1776
static const BITMAPINFOHEADER dib_brush_header_4
Definition: dib.c:1382
#define CALG_SHA1
Definition: wincrypt.h:1807
#define HS_DIAGCROSS
Definition: wingdi.h:577
UINT WINAPI SetPaletteEntries(_In_ HPALETTE hpal, _In_ UINT iStart, _In_ UINT cEntries, _In_reads_(cEntries) CONST PALETTEENTRY *pPalEntries)
#define DCB_RESET
Definition: wingdi.h:686
#define PS_ENDCAP_FLAT
Definition: wingdi.h:595
static const RECT hline_clips[]
Definition: dib.c:1263
UINT gmBlackBoxY
Definition: wingdi.h:2421
struct tagLOGPALETTE LOGPALETTE
static const DWORD four_by_four_data[16]
Definition: dib.c:1390
#define SRCAND
Definition: wingdi.h:329
BOOL WINAPI GdiGradientFill(HDC hdc, TRIVERTEX *vert_array, ULONG nvert, void *grad_array, ULONG ngrad, ULONG mode)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
static const BYTE dib[]
Definition: ole2.c:201
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
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 BS_PATTERN
Definition: wingdi.h:1072
#define skip(...)
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, ULONG_PTR dwFlags)
Definition: crypt.c:651
UINT gmBlackBoxX
Definition: wingdi.h:2420
BOOL WINAPI Polyline(_In_ HDC hdc, _In_reads_(cpt) const POINT *apt, _In_ int cpt)
GLclampf GLclampf GLclampf alpha
Definition: gl.h:1740
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
static const char * sha1_graphics_a8r8g8b8[]
Definition: dib.c:72
#define M_PI
Definition: dib.c:26
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
LONG bottom
Definition: windef.h:294
#define ULONG_PTR
Definition: config.h:101
#define GetBValue(rgb)
Definition: wingdi.h:2915
static const char * sha1_graphics_r4g4b4[]
Definition: dib.c:568
HPEN WINAPI ExtCreatePen(_In_ DWORD iPenStyle, _In_ DWORD cWidth, _In_ const LOGBRUSH *plbrush, _In_ DWORD cStyle, _In_reads_opt_(cStyle) const DWORD *pstyle)
START_TEST(dib)
Definition: dib.c:3250
DWORD bpp
Definition: surface.c:181
WORD palNumEntries
Definition: wingdi.h:1812
#define BS_SOLID
Definition: wingdi.h:1068
static HBITMAP
Definition: button.c:44
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define DIB_RGB_COLORS
Definition: wingdi.h:366
#define HP_HASHVAL
Definition: wincrypt.h:2183
BYTE AlphaFormat
Definition: wingdi.h:2740
static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info)
Definition: dib.c:1246
#define GDI_ERROR
Definition: wingdi.h:1291
Definition: _hash_fun.h:40
#define BI_RLE8
Definition: wingdi.h:35
#define memset(x, y, z)
Definition: compat.h:39
HBRUSH WINAPI CreateDIBPatternBrushPt(_In_ const VOID *pvPackedDIB, _In_ UINT uUsage)
#define BI_RGB
Definition: precomp.h:35
static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits)
Definition: dib.c:1529
static const RECT line_clips[]
Definition: dib.c:1301
static const BITMAPINFOHEADER dib_brush_header_8888
Definition: dib.c:1378
#define HeapFree(x, y, z)
Definition: compat.h:394
#define SRCCOPY
Definition: wingdi.h:332
#define PROV_RSA_FULL
Definition: wincrypt.h:2039
static DWORD get_dib_size(const BITMAPINFO *bmi)
Definition: dib.c:1140
#define PALETTEINDEX(i)
Definition: wingdi.h:2921
static const char * sha1_graphics_a8b8g8r8[]
Definition: dib.c:214
#define PATPAINT
Definition: wingdi.h:335
BOOL WINAPI ExtFloodFill(_In_ HDC, _In_ int, _In_ int, _In_ COLORREF, _In_ UINT)
struct tagBITMAPINFO BITMAPINFO
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
static const char * sha1_graphics_4[]
Definition: dib.c:849
static const BITMAPINFOHEADER dib_brush_header_8
Definition: dib.c:1381
static const BYTE masks[8]
Definition: dib.c:2760