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 29 static HCRYPTPROV crypt_prov; 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); 1165 CryptDestroyHash(hash); 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 { 1181 current_bounds = graphics_bounds; 1182 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE ); 1183 } 1184 1185 static void compare_bounds( HDC hdc, const char *info ) 1186 { 1187 RECT rect; 1188 1189 GetBoundsRect( hdc, &rect, DCB_RESET ); 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, 1201 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect )); 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 1235 todo_wine_if(todo) 1236 ok( ok_cond, "%s: %s: expected hash %s got %s\n", 1237 dst_format, info, *current_sha1, hash ); 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 { 1248 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE); 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 */ 1582 SetROP2(hdc, R2_COPYPEN); 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 { 1595 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL); 1596 LineTo(hdc, bias_check[i].right, bias_check[i].bottom); 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); 1622 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR); 1623 SetRectRgn(hrgn2, 290, 100, 300, 200); 1624 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR); 1625 ExtSelectClipRgn(hdc, hrgn, RGN_COPY); 1626 DeleteObject(hrgn2); 1627 1628 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++) 1629 { 1630 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL); 1631 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom); 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 { 1637 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL); 1638 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom); 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 { 1644 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL); 1645 LineTo(hdc, line_clips[i].right, line_clips[i].bottom); 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 { 1652 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top, 1653 patblt_clips[i].right - patblt_clips[i].left, 1654 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY); 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); 1661 SetBkMode(hdc, TRANSPARENT); 1662 SetBkColor(hdc, RGB(0, 0xff, 0)); 1663 1664 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++) 1665 { 1666 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL); 1667 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom); 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 { 1673 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL); 1674 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top); 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 { 1680 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL); 1681 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom); 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 { 1687 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL); 1688 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1); 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 { 1694 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL); 1695 LineTo(hdc, line_clips[i].right, line_clips[i].bottom); 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 { 1703 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL); 1704 LineTo(hdc, line_clips[i].right, line_clips[i].bottom); 1705 } 1706 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines"); 1707 1708 ExtSelectClipRgn(hdc, NULL, RGN_COPY); 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 { 1942 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom); 1943 } 1944 1945 SelectObject(hdc, dashed_pen); 1946 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++) 1947 { 1948 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150); 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 1961 SetLayout(hdc, LAYOUT_RTL); 1962 PaintRgn(hdc, hrgn); 1963 PatBlt(hdc, 10, 250, 10, 10, PATCOPY); 1964 Rectangle(hdc, 100, 250, 110, 260); 1965 compare_hash(hdc, bmi, bits, "rtl"); 1966 SetLayout(hdc, LAYOUT_LTR); 1967 DeleteObject( hrgn ); 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 { 2269 SetTextColor(hdc, PALETTEINDEX( i )); 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 { 2536 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL ); 2537 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom ); 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 2549 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID, 2550 9, &log_brush, 0, NULL ); 2551 SelectObject( hdc, wide_pen ); 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 2559 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID, 2560 16, &log_brush, 0, NULL ); 2561 SelectObject( hdc, wide_pen ); 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 2569 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID, 2570 9, &log_brush, 0, NULL ); 2571 SelectObject( hdc, wide_pen ); 2572 2573 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) ); 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; 2587 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID, 2588 12, &log_brush, 0, NULL ); 2589 ok( wide_pen != 0, "failed to create pen\n" ); 2590 SelectObject( hdc, wide_pen ); 2591 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) ); 2592 2593 for (i = 1; i < 20; i++) 2594 { 2595 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID, 2596 i, &log_brush, 0, NULL ); 2597 ok( wide_pen != 0, "failed to create pen\n" ); 2598 DeleteObject( SelectObject( hdc, wide_pen )); 2599 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) ); 2600 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) ); 2601 MoveToEx( hdc, 10 * i, 10, NULL ); 2602 LineTo( hdc, 10 * i, 200 + i ); 2603 LineTo( hdc, 20 * i, 200 + i ); 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 ); 2686 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF ); 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 2696 ExtSelectClipRgn( hdc, NULL, RGN_COPY ); 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 2724 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha) 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 2750 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph ) 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; 2784 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY; 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" ); 2793 DeleteObject( SelectObject( hdc, font ) ); 2794 return; 2795 } 2796 2797 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) ); 2798 SetTextAlign( hdc, TA_BASELINE ); 2799 SetBkMode( hdc, TRANSPARENT ); 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; 2913 bmi->bmiHeader.biCompression = BI_RGB; 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"; 2929 current_sha1 = sha1_graphics_a8r8g8b8; 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; 2939 bmi->bmiHeader.biCompression = BI_BITFIELDS; 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"; 2956 current_sha1 = sha1_graphics_a8r8g8b8_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; 2966 bmi->bmiHeader.biCompression = BI_BITFIELDS; 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"; 2982 current_sha1 = sha1_graphics_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; 2992 bmi->bmiHeader.biCompression = BI_BITFIELDS; 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"; 3008 current_sha1 = sha1_graphics_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; 3018 bmi->bmiHeader.biCompression = BI_BITFIELDS; 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"; 3034 current_sha1 = sha1_graphics_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; 3044 bmi->bmiHeader.biCompression = BI_RGB; 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"; 3051 current_sha1 = sha1_graphics_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; 3061 bmi->bmiHeader.biCompression = BI_RGB; 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"; 3074 current_sha1 = sha1_graphics_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; 3084 bmi->bmiHeader.biCompression = BI_BITFIELDS; 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"; 3099 current_sha1 = sha1_graphics_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; 3109 bmi->bmiHeader.biCompression = BI_RGB; 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"; 3123 current_sha1 = sha1_graphics_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; 3133 bmi->bmiHeader.biCompression = BI_RGB; 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"; 3143 current_sha1 = sha1_graphics_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; 3153 bmi->bmiHeader.biCompression = BI_RGB; 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"; 3177 current_sha1 = sha1_graphics_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); 3192 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE )); 3193 3194 dst_format = "4"; 3195 current_sha1 = sha1_graphics_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"; 3213 current_sha1 = sha1_graphics_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); 3236 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE )); 3237 3238 dst_format = "1"; 3239 current_sha1 = sha1_graphics_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 3250 START_TEST(dib) 3251 { 3252 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); 3253 3254 test_simple_graphics(); 3255 3256 CryptReleaseContext(crypt_prov, 0); 3257 } 3258