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 <stdarg.h> 22 #include <stdio.h> 23 #include <math.h> 24 25 #include "windef.h" 26 #include "winbase.h" 27 #include "wingdi.h" 28 #include "winuser.h" 29 #include "wincrypt.h" 30 #include "mmsystem.h" /* DIBINDEX */ 31 32 #include "wine/test.h" 33 34 #ifndef M_PI 35 #define M_PI 3.14159265358979323846 36 #endif 37 38 static HCRYPTPROV crypt_prov; 39 40 static const DWORD rop3[256] = 41 { 42 0x000042, 0x010289, 0x020C89, 0x0300AA, 0x040C88, 0x0500A9, 0x060865, 0x0702C5, 43 0x080F08, 0x090245, 0x0A0329, 0x0B0B2A, 0x0C0324, 0x0D0B25, 0x0E08A5, 0x0F0001, 44 0x100C85, 0x1100A6, 0x120868, 0x1302C8, 0x140869, 0x1502C9, 0x165CCA, 0x171D54, 45 0x180D59, 0x191CC8, 0x1A06C5, 0x1B0768, 0x1C06CA, 0x1D0766, 0x1E01A5, 0x1F0385, 46 0x200F09, 0x210248, 0x220326, 0x230B24, 0x240D55, 0x251CC5, 0x2606C8, 0x271868, 47 0x280369, 0x2916CA, 0x2A0CC9, 0x2B1D58, 0x2C0784, 0x2D060A, 0x2E064A, 0x2F0E2A, 48 0x30032A, 0x310B28, 0x320688, 0x330008, 0x3406C4, 0x351864, 0x3601A8, 0x370388, 49 0x38078A, 0x390604, 0x3A0644, 0x3B0E24, 0x3C004A, 0x3D18A4, 0x3E1B24, 0x3F00EA, 50 0x400F0A, 0x410249, 0x420D5D, 0x431CC4, 0x440328, 0x450B29, 0x4606C6, 0x47076A, 51 0x480368, 0x4916C5, 0x4A0789, 0x4B0605, 0x4C0CC8, 0x4D1954, 0x4E0645, 0x4F0E25, 52 0x500325, 0x510B26, 0x5206C9, 0x530764, 0x5408A9, 0x550009, 0x5601A9, 0x570389, 53 0x580785, 0x590609, 0x5A0049, 0x5B18A9, 0x5C0649, 0x5D0E29, 0x5E1B29, 0x5F00E9, 54 0x600365, 0x6116C6, 0x620786, 0x630608, 0x640788, 0x650606, 0x660046, 0x6718A8, 55 0x6858A6, 0x690145, 0x6A01E9, 0x6B178A, 0x6C01E8, 0x6D1785, 0x6E1E28, 0x6F0C65, 56 0x700CC5, 0x711D5C, 0x720648, 0x730E28, 0x740646, 0x750E26, 0x761B28, 0x7700E6, 57 0x7801E5, 0x791786, 0x7A1E29, 0x7B0C68, 0x7C1E24, 0x7D0C69, 0x7E0955, 0x7F03C9, 58 0x8003E9, 0x810975, 0x820C49, 0x831E04, 0x840C48, 0x851E05, 0x8617A6, 0x8701C5, 59 0x8800C6, 0x891B08, 0x8A0E06, 0x8B0666, 0x8C0E08, 0x8D0668, 0x8E1D7C, 0x8F0CE5, 60 0x900C45, 0x911E08, 0x9217A9, 0x9301C4, 0x9417AA, 0x9501C9, 0x960169, 0x97588A, 61 0x981888, 0x990066, 0x9A0709, 0x9B07A8, 0x9C0704, 0x9D07A6, 0x9E16E6, 0x9F0345, 62 0xA000C9, 0xA11B05, 0xA20E09, 0xA30669, 0xA41885, 0xA50065, 0xA60706, 0xA707A5, 63 0xA803A9, 0xA90189, 0xAA0029, 0xAB0889, 0xAC0744, 0xAD06E9, 0xAE0B06, 0xAF0229, 64 0xB00E05, 0xB10665, 0xB21974, 0xB30CE8, 0xB4070A, 0xB507A9, 0xB616E9, 0xB70348, 65 0xB8074A, 0xB906E6, 0xBA0B09, 0xBB0226, 0xBC1CE4, 0xBD0D7D, 0xBE0269, 0xBF08C9, 66 0xC000CA, 0xC11B04, 0xC21884, 0xC3006A, 0xC40E04, 0xC50664, 0xC60708, 0xC707AA, 67 0xC803A8, 0xC90184, 0xCA0749, 0xCB06E4, 0xCC0020, 0xCD0888, 0xCE0B08, 0xCF0224, 68 0xD00E0A, 0xD1066A, 0xD20705, 0xD307A4, 0xD41D78, 0xD50CE9, 0xD616EA, 0xD70349, 69 0xD80745, 0xD906E8, 0xDA1CE9, 0xDB0D75, 0xDC0B04, 0xDD0228, 0xDE0268, 0xDF08C8, 70 0xE003A5, 0xE10185, 0xE20746, 0xE306EA, 0xE40748, 0xE506E5, 0xE61CE8, 0xE70D79, 71 0xE81D74, 0xE95CE6, 0xEA02E9, 0xEB0849, 0xEC02E8, 0xED0848, 0xEE0086, 0xEF0A08, 72 0xF00021, 0xF10885, 0xF20B05, 0xF3022A, 0xF40B0A, 0xF50225, 0xF60265, 0xF708C5, 73 0xF802E5, 0xF90845, 0xFA0089, 0xFB0A09, 0xFC008A, 0xFD0A0A, 0xFE02A9, 0xFF0062 74 }; 75 76 static inline BOOL rop_uses_src(DWORD rop) 77 { 78 return (((rop & 0xcc0000) >> 2) != (rop & 0x330000)); 79 } 80 81 static const char *sha1_graphics_a8r8g8b8[] = 82 { 83 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf", 84 "2426172d9e8fec27d9228088f382ef3c93717da9", 85 "9e8f27ca952cdba01dbf25d07c34e86a7820c012", 86 "664fac17803859a4015c6ae29e5538e314d5c827", 87 "17b2c177bdce5e94433574a928bda5c94a8cdfa5", 88 "fe6cc678fb13a3ead67839481bf22348adc69f52", 89 "d51bd330cec510cdccf5394328bd8e5411901e9e", 90 "df4aebf98d91f11be560dd232123b3ae327303d7", 91 "f2af53dd073a09b1031d0032d28da35c82adc566", 92 "eb5a963a6f7b25533ddfb8915e70865d037bd156", 93 "c387917268455017aa0b28bed73aa6554044bbb3", 94 "dcae44fee010dbf7a107797a503923fd8b1abe2e", 95 "6c530622a025d872a642e8f950867884d7b136cb", 96 "7c07d91b8f68fb31821701b3dcb96de018bf0c66", 97 "b2261353decda2712b83538ab434a49ce21f3172", 98 "35f731c0f6356b8f30651bb3cbe0d922c49deba5", 99 "9b9874c1c1d92afa554137e191d34ea33acc322f", 100 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e", 101 "d7398de15b2837a58a62a701ca1b3384625afec4", 102 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae", 103 "5246ef357e7317b9d141a3294d300c195da76cb7", 104 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3", 105 "3d8244b665ecdb104087bad171b0b0f83545133c", 106 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d", 107 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1", 108 "7da9dd3d40d44d92deb9883fb7110443c2d5769a", 109 "e358efb1c11172e40855de620bdb8a8e545cd790", 110 "58806549380c964e7a53ad54821d2eb86fa5b9ce", 111 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f", 112 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1", 113 "8a010d4c5af51fcc34d51be3197878782bdf63e7", 114 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528", 115 "41bcc1f57c60bdec3c4d1e749084a12867f91224", 116 "94645300d6eb51020a7ef8261dee2941cd51b5df", 117 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2", 118 "21cdfde38ac7edbb241ec83d82f31286e90c4629", 119 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe", 120 "68c18db6abfda626cab12d198298d4c39264bfbc", 121 "6b59ae6c20749020ad43175e05110dc33b6a59b5", 122 "39c31de73aafcfcadf0bf414da4495be9de54417", 123 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab", 124 "f6a6d765bf23726329f96020ba8c5e3c0897aafa", 125 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058", 126 "e71d6bb9bd38eea5719f8ba57177997910e2d841", 127 "3d2ccbe51408232a04769546b1bdd74f84558a41", 128 "a1fe9aa885584a0f713d7c6f76c89830fbf28563", 129 "d7085333becdec7759a5229e5fe9ba1e11db0c22", 130 "aaf62842bb98d8a2945c4f643baf50afaeea9307", 131 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692", 132 "d7dd4700f49808541bba99244b7eb5840e0a2439", 133 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7", 134 "8eb1f99d21a84153e88e7958707049d517ab7641", 135 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7", 136 "568f87f0194ca19b69a5b2bcdef795d89c5721ce", 137 "a37810f46dee8741fe5adbb3f1f2e87012ffc929", 138 "50a09678c49c208f71d40452daca5411279aa674", 139 "e462052a03dbe4ec3814db7700e166d00d4d686f", 140 "a27917d4db49ce77989fae246015aeb2a28520ee", 141 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1", 142 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134", 143 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf", 144 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5", 145 "2b3198bd5c0a87db5dab13df8bbe14363d02acec", 146 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4", 147 "5dca709c60e0cd50fa85274a2836aec9eb6168e3", 148 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89", 149 NULL 150 }; 151 152 static const char *sha1_graphics_a8r8g8b8_bitfields[] = 153 { 154 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf", 155 "2426172d9e8fec27d9228088f382ef3c93717da9", 156 "9e8f27ca952cdba01dbf25d07c34e86a7820c012", 157 "664fac17803859a4015c6ae29e5538e314d5c827", 158 "17b2c177bdce5e94433574a928bda5c94a8cdfa5", 159 "fe6cc678fb13a3ead67839481bf22348adc69f52", 160 "d51bd330cec510cdccf5394328bd8e5411901e9e", 161 "df4aebf98d91f11be560dd232123b3ae327303d7", 162 "f2af53dd073a09b1031d0032d28da35c82adc566", 163 "eb5a963a6f7b25533ddfb8915e70865d037bd156", 164 "c387917268455017aa0b28bed73aa6554044bbb3", 165 "dcae44fee010dbf7a107797a503923fd8b1abe2e", 166 "6c530622a025d872a642e8f950867884d7b136cb", 167 "7c07d91b8f68fb31821701b3dcb96de018bf0c66", 168 "b2261353decda2712b83538ab434a49ce21f3172", 169 "35f731c0f6356b8f30651bb3cbe0d922c49deba5", 170 "9b9874c1c1d92afa554137e191d34ea33acc322f", 171 "c311dd74325e8cebfc8529a6d24a6fa4ecb7137e", 172 "d7398de15b2837a58a62a701ca1b3384625afec4", 173 "a78b28472bb7ff480ddedd06b9cf2daa775fa7ae", 174 "5246ef357e7317b9d141a3294d300c195da76cb7", 175 "87f6b6a19f021ca5912d285e14ce2ff9474d79f3", 176 "3d8244b665ecdb104087bad171b0b0f83545133c", 177 "e2a8eef4aeda3a0f6c950075acba38f1f9e0814d", 178 "8b66f14d51ecdeea12bc993302bb9b7d3ec085a1", 179 "7da9dd3d40d44d92deb9883fb7110443c2d5769a", 180 "e358efb1c11172e40855de620bdb8a8e545cd790", 181 "58806549380c964e7a53ad54821d2eb86fa5b9ce", 182 "7fc30d3058c235ce39088de0a598b8c7fe7ca61f", 183 "52a6c769c227f2bb1949097c4c87fed5ee0cbcb1", 184 "8a010d4c5af51fcc34d51be3197878782bdf63e7", 185 "c84c2c33e22eb7e5c4a2faad3b3b99a359d77528", 186 "41bcc1f57c60bdec3c4d1e749084a12867f91224", 187 "94645300d6eb51020a7ef8261dee2941cd51b5df", 188 "c56f5bdc9cac4f0bc81c33295d9aed8eaf4cb1f2", 189 "21cdfde38ac7edbb241ec83d82f31286e90c4629", 190 "0e6fc62522b0d6d2019f826ac0b586b91bd0d4fe", 191 "68c18db6abfda626cab12d198298d4c39264bfbc", 192 "6b59ae6c20749020ad43175e05110dc33b6a59b5", 193 "39c31de73aafcfcadf0bf414da4495be9de54417", 194 "132949f59bfeb88dc2047e6eaecb8512aea3d9ab", 195 "f6a6d765bf23726329f96020ba8c5e3c0897aafa", 196 "a7aa311cdc6137f15b9ef9cb1a92ac54ec02f058", 197 "e71d6bb9bd38eea5719f8ba57177997910e2d841", 198 "3d2ccbe51408232a04769546b1bdd74f84558a41", 199 "a1fe9aa885584a0f713d7c6f76c89830fbf28563", 200 "d7085333becdec7759a5229e5fe9ba1e11db0c22", 201 "aaf62842bb98d8a2945c4f643baf50afaeea9307", 202 "d7e34fa02db7ad52327f80389bd1ba1b72b6c692", 203 "d7dd4700f49808541bba99244b7eb5840e0a2439", 204 "00b4e9b243a36a7210a48bcb7c2d410d9cd8c8c7", 205 "8eb1f99d21a84153e88e7958707049d517ab7641", 206 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7", 207 "568f87f0194ca19b69a5b2bcdef795d89c5721ce", 208 "a37810f46dee8741fe5adbb3f1f2e87012ffc929", 209 "50a09678c49c208f71d40452daca5411279aa674", 210 "0cda6b3297003b3ccd6d5baa17e1ca9bb7c56f08", 211 "b2c8e1ebb9435031fe068442f479d1304096e79f", 212 "657514a4ca1f2b6ca7a125ad58dfed82099a37d1", 213 "5e0549fdcf0fc7c50054dccc51d37fc734ab8134", 214 "eca1998a4d79fb81b2a4103f79e3b846a864eaaf", 215 "e4acfcf2d001fbc431d9af59ab3d3ca7c2d965e5", 216 "e4f110504dd3e4e34f960a39ba91a91c67bf26af", 217 "aebb1b3baa4fd5213bf80a5ad7a50d54de8fdba4", 218 "5dca709c60e0cd50fa85274a2836aec9eb6168e3", 219 "cc4e1372ddf6e303a7fd159090c9d3a1f8ec2a89", 220 NULL 221 }; 222 223 static const char *sha1_graphics_a8b8g8r8[] = 224 { 225 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf", 226 "e0bc877697093ed440e125154e247ca9d65e933c", 227 "c6d7faf5a502299f99d59eef3f7650bd63dbe108", 228 "9d8c05c3ebd786e7d052418e905a80a64bf7853d", 229 "3da12af0a810fd993fa3dbe23328a4fcd2b6c92a", 230 "b91c8f21cc4d7994abc551feff5b6927d267a9db", 231 "d49dd2c6a37e975b6dc3d201ccc217a788b30284", 232 "ca6753f9eb44529cf8c67cd6abcd4ed1ef758904", 233 "18c3ae944e0afb6c43c21cde093ddb22a27611e4", 234 "b753ebb39d90210cc717f57b53dd439f7de6b077", 235 "38c017dd1fff26b492a57e09f3ce2c4370faf225", 236 "94368cea5033b435454daa56d55546310675131e", 237 "bf57a6a37fb107d29ed3d45695919887abcb7902", 238 "3db0f8bcca3d94920aa57be6321202b8c3c08822", 239 "1f1fc165a4dae7ba118ddccb58a279bfe3876b0a", 240 "8e09abb108e137c99527ab4c9bd07d95b9254bbb", 241 "b0178632775d29bec2b16de7b9b8287115c40d0f", 242 "ca7e859647b9498b53fdd92543ad8aea98ff46f3", 243 "3369889a67d6c79a24ee15f7d14374f9995215e4", 244 "473a1fd07df800c87a5d3286b642ace10c61c6af", 245 "10cd25a0ed5cd8f978d7d68236f81d949b938e84", 246 "b8951d2b20518fd129e5113a5f429626893913bf", 247 "e81fc45962f861d53f420e29cb5d33faf5adbec8", 248 "4851c5b7d5bc18590e787c0c218a592ef504e738", 249 "9aa506e3df33e0d5298755aa4144e10eb4b5adcf", 250 "abdf003699364fe45fab7dc61e67c606d0063b40", 251 "89abaadff4e68c738cf9251c51e3609564843381", 252 "77d0ad32938147aa4038c1eced232b7b5a5f88f3", 253 "43d36e57b702ce56eb250bf53f1ecc4680990cfe", 254 "fd6e0ebb52710ebcdd8dd69931165c83c4930b41", 255 "71b9756fdfeedce1e6db201176d21a981b881662", 256 "5319528d9af750c172ae62ee85ddb2eaef73b193", 257 "b7ce8aa3c328eedaed7306234ed9bae67708e627", 258 "19b32a0daa91201725b5e13820c343d0a84ff698", 259 "abca6a80a99b05722d2d87ce2a8b94ef1ae549e1", 260 "2ba70994d0b4ce87fdf6fbc33ada11252178061e", 261 "9b81ccc2d956d1de019085f971ba19435fe5feae", 262 "075c4cb50e2cf96ab5d132c9f7bb1c1deb4735bd", 263 "8566c1110ab5cb8f754787b47923c8bff38f790c", 264 "89e90d6159d59886bbbf0c40a7cd01293c3cfda3", 265 "3a598f1eb35c1412b0c131e9d9e36a4aef9534d2", 266 "d01071c44259adc94b89978b7d51a058b6dad665", 267 "e6d33b106bcda374e662d338c57a457dbcaa108a", 268 "27ef47377e88f5ac5ad33b19eae27d56c456ac65", 269 "339908a568f384e1f384a3e1b0dd415779203b02", 270 "88fd743d00bd37d2ed722092146795b044d08a6e", 271 "c0537ec24147e74939219213d864ee113cad9967", 272 "118bf4c5bddc206ba737f7aa8b239940cd1aadc2", 273 "eac5d164b83edf2cf85bac242686f9f617ec1fa4", 274 "86c84cc8306975edecc6d4a89a8aff29f59b55a7", 275 "698d6393e97539806351368f95be478c6fbc62b0", 276 "c272d1e0342e6089a0182dc42b37e47889116a9b", 277 "af99228aa4cfbd1f61bd824db046144a3c6c2ed7", 278 "25675c30adfe24d6cae60793b156dfdaa36ac3ba", 279 "849d4abf4b690128a5f70e9b8ac78f20c437de06", 280 "e768fc9f3167ef3144a4cfb1e20126a577f7dd5b", 281 "87f57a31253a38dbf3dc3070473328fa04b68a48", 282 "db64cc4d830fc35ed170b53943e722b2342954d4", 283 "9988ceca44dafbee247aece1f027c06c27c01652", 284 "d80d45a97bc877b50ba2c3f720d5197f2f1c5fc5", 285 "b76e0724496e471b01ef8b34f8beba69f5bde261", 286 "34201d3d3583f89ce3267d3d0c4e01c64463de4b", 287 "693f5c5fbaeaadb5928d34b035499626fecb8394", 288 "66041875232f64dbfd2d18353aa28e43e8ccb6b5", 289 "f19f5d8e2c96328f06f3985d02ff474fa37b1ea8", 290 "d26eeb6b2d345b587d4305a1234ec0842a96d4b6", 291 NULL 292 }; 293 294 static const char *sha1_graphics_r10g10b10[] = 295 { 296 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf", 297 "b340b5d4750dd3dcd95d73c41b2c3a17f799210b", 298 "b1db68f35022c5fd43519ec8e98047e16bc4fff8", 299 "6e1902eb24865e74066fa9f2a7a49e6f9154f62f", 300 "35df9f4b0965fedf7bca36aa4f17b0fa20e2cd03", 301 "5652e1feb7d4f22c8a2721fd141157e0b9ef965e", 302 "22d89d5933f8b9bd60e9b22e42e7f5659269b63d", 303 "0ad27de0c916c073d0d18484fff899bbdb258db7", 304 "7c05ee5a01dad1e187537701a95382f0a3ec28dc", 305 "b00f0b4448be722d1a19ffe33aaaac4df848d397", 306 "7e5ce5c05a54e83890f022ba4e9853e4b254bf0c", 307 "2986b431a0022153e5f875da77cc792e3825ebd5", 308 "ca4b25a5459885ce1e0a36844612087893d425b1", 309 "181bd4616796d89174cedc0332fb320b65aeb0e2", 310 "6c417b1798ee319eeb404efe4aa136ed7ed37966", 311 "9a9f83e2035aa591d18101c919d1fd5b3456b46c", 312 "74ce9f5658cd8aeae4601fe72fcef07d9f75ec26", 313 "536eaaa901d652805a8977ecb2dc73f651094c5b", 314 "b8b1ac11bcc7174c5b23c18cc7919d09a04255c2", 315 "92cddcabf5365eef1e037f488af52b31669d987f", 316 "2c9c4f27bade080a2cd6f9160422762e267c2f5f", 317 "c7ce29d189dc06ba57e64f0cc32202f5a25ba48d", 318 "717778cc9ab30bcfc026a4344ea1bdef870bd247", 319 "7ac4cb547c8f4ce5079c95afad9d0e2b0cd76a0e", 320 "d578210815e27fe210eb678a71e6d22ba4b4c196", 321 "c7a027c7079dfcc831ca8bc134a509958273073c", 322 "19cf978596195b848df8709aaf637f83f92b8336", 323 "86ddf268d854f37e5b478c48792b551b57635db6", 324 "8259d388e02542207b6a08d65d553871ce1c4a09", 325 "faea73ff9436223f8c4ee76ac9861a6609ac4ae4", 326 "66f8d78d4971934794478afee28b3a50e97f1b82", 327 "b8f16334bdced439e1c6fc69704bc95f7b46b147", 328 "63798fb175afef78fa8fe8133d9de97a0cc80651", 329 "5f629ab51719dd0ca5a67d880eb2631f5b598a7b", 330 "1ceb85697f649a62b1753438daa14944af7f450c", 331 "98ce4dbc04eb48fa0f96ef813db5b4dfa1b2dd39", 332 "1cb0c7d9d89cdbce7b47d19ef0365bb6b2adc831", 333 "f00bac7e18827cfb264fae2e8a0da17b9db18d52", 334 "63c1c6c63e82f3b8bd977a1381b248e05321394d", 335 "ada202d2f526f6995f83412479891c1764b66e5a", 336 "68348e8f54883f4fe295354b024e291c85f1038f", 337 "07f55f85a5bb70de5841ea4f62a9af3d29d3d94b", 338 "e9167564031ead3459eee6a3ebb2f58f100d931f", 339 "d39315a1399639f6d4305a342c9ccf02a463b0dd", 340 "46196f50297260df2863e2fa76d2dfcf72006c23", 341 "0790585dfaef94f912b1ee81477d4ac448708708", 342 "589fb8a85d924ad19ed78409ae89475ba479c30a", 343 "43d67bc61ef54014b022891e5c024fc24b1fe797", 344 "5a713a91fd471fd331bd13b0868c994aa2ffe2b2", 345 "fc0c32afb719295f28bcfef22803bef94f798e20", 346 "bb2a421bab95f9b5420704ef44c0f3214a0b5a11", 347 "7735098af7535d8c57266190a13f92d8869e8529", 348 "36f6db4fbe2a1630a7597d3a446f2902755c96ef", 349 "d3f08946300e1700865042aed121870e292d1095", 350 "4782df8e24127e66a434b4e839adebf2dbb223fb", 351 "739707cc85ca63e0580c79618dc0bb8a4a338d95", 352 "8ea5d7e4bebc40a1d91b04b12e1c11a42c188095", 353 "317521e576801acaea62c76fe16813cdfe20f4ad", 354 "ce0fc29bb0281d6c955d64e239254ef9e6dbc06d", 355 "5ab49e7b61eddd3bab4182f362a38e1ab6a5a3b7", 356 "555b6f04ba8dec9e2a60693dcaac594227052727", 357 "c199b96a71c3aab2d49ccb5b6294bf14eb0dd1eb", 358 "4238fe9d296b5c72b0a8745cc761f308605b2094", 359 "88b6427cf71a6b9a26bfd6026103d50f721651a9", 360 "64cf929548bc5324fb14b053077bf5bc4be3e15c", 361 "1936661eee8073068506131c9e89265b2f8403e8", 362 NULL 363 }; 364 365 static const char *sha1_graphics_r6g6b6[] = 366 { 367 "a3cadd34d95d3d5cc23344f69aab1c2e55935fcf", 368 "a1adb32e70188a00f82fe58156b4da74f3ef7a0a", 369 "5b9dab3d8411afb25fbbeba0313db526815ac189", 370 "6415f551e28e1b38b2d721f0a9e003b7d215f6b2", 371 "2028d1b0d1acef35dc07027135023f35fb9746b9", 372 "378713720dcb5aadb730435ad0989a68ab189114", 373 "084152773feb01a85df6006f2f4f288a1442d37a", 374 "97b824953f60fc9a91028045baacbe7b7dc82b14", 375 "f33b1931f392bd09b3494efc23cf7d0ed3071014", 376 "287d755448e72e29e4812193e2b6f8098a214d82", 377 "4059d295aa05ace77853d7ee3d74305cdcbec9f5", 378 "2557ebd4fdacc0e5bcce3dae88a46dd247654ea1", 379 "e51bcf80211cd06e7d10225534b7a79b5454be27", 380 "9bf91a547f47b29bf370e9b60eae7cd6ce987617", 381 "0b94e0a5b739ab0020130646522e53da35a149ad", 382 "eab6e532845dfd5dc2701ef90669a5f7b63e9539", 383 "90deb2e2502186b3c62a58ec9b1c9d2b7b4089c1", 384 "a4e451f76a77bbc3e224a41e9b4fa78cb841a8af", 385 "084607a5c99a84140d93db57d1b0f3a0f51afdac", 386 "2128157e601ef0d6b3636b7387d3b28e876de728", 387 "8bdcdcd463f0052279d070ac763757f4db975483", 388 "9ea0ad22d7b61598fe36e9c942242e8e07e32edb", 389 "8b6452ebd1f6d189d10ee6647e7704821559cfcb", 390 "c39a25a61c4eade48dea62a97c9fb8714c06a8af", 391 "66b130f83381957cfc4763558c5f5cddf2e3b564", 392 "d548135ce2320499277ce12b80bc35004f8a9787", 393 "85a4f3f1b4b0a170198f1bb5d225fcf77887665e", 394 "971a0b786d5bccb1bfb9cbb054740e4eb36f9b7a", 395 "e2896035f178b3d20e4f4d1accb1b3d1b4028865", 396 "defd95a10d44cad6e736542920b74efd53e9e7eb", 397 "eaccd012c0fc46e79cae1997ef101979e5654d8d", 398 "3f11a735e52030aa3d0f024d83803698293d10e5", 399 "82f45c5a34fbb9e36d947a876834d33a1f69719c", 400 "3d27002f4fe3c943468b7e3ef6985962c41ac8dc", 401 "3231c4d87faefb7ec5bd377613969c05b70343fc", 402 "00394e438e9edde978e88602c9ad2a572e965bf6", 403 "c0c41390270ba082ee8211576fee39c676813c42", 404 "996fb708ddc4b94eb8d1585bd83a5c8a1e2633ba", 405 "caa39eb482e8fc2e00f1c6737735c023ac9363ef", 406 "c1250ff2b67e6d2a8baccc5c93f8f5ad933c5c4f", 407 "3d6cf3753390a05504b1f50302f767df443f0f40", 408 "b7cf1bafe002673ae58ff50feea61ee32a1ae10a", 409 "da9e896a3a98b330980152b2e4a43cb6e686c730", 410 "0a613357e1e8ec8ff1ad956e46e527a05cab8500", 411 "bdd8ed3ca3ad107b43731ec253ecaa34750a10de", 412 "47499ad13b719de18c59c2bc9b38ed578db50b95", 413 "643e82ac67ab2b0c034a3fcfa498b072a5f2be5c", 414 "cd01f2c0a63b2229d4467d2f874d58edca32b3d4", 415 "8ad5cd520cd628b76d2e5a3f318ae1bbb6b4c994", 416 "49341c297a887186bd47d7465d827ab3147f05e3", 417 "514c07281ef6702c35e68b230e897303a8cdec81", 418 "4b41865829b50b2e29beda51b055bd1f908a649c", 419 "325279e76367200d3fd7194d81c09fd139988ece", 420 "c3def160a1e847605ff0fc7edd30397fa90635a0", 421 "2b3e87e0b705b03c7c08f403409ab82cce095ba1", 422 "45c08e11fffc78b2a3574263419e0cb7f8cd9b45", 423 "aecb242c31f31a90f071b6455ea7d808d4ea22e3", 424 "77ea86e51a94b11a8081b29696cb4115687843e3", 425 "d67b897cad72d31e75359094007b1346fd8806ea", 426 "442bcf4d94a649c9406c3b0bf2f00cb7c6a4d1d4", 427 "3d0853f4f7580d7cd5148c21c34d878ecf39a5f3", 428 "1e5a4ef7f8634847a251d1fcce298c409fd13d87", 429 "481337fbedf181d4324bf7f8299b0327197ff468", 430 "b4b9f0bf127ef11f510f25684ae21d692609c85e", 431 "5da35bad12e3e9b26a0444d30820099481281e45", 432 "045ddaf752e7ffc7ded792f36af3c7c0cfeeae42", 433 NULL 434 }; 435 436 static const char *sha1_graphics_24[] = 437 { 438 "e993b15c9bd14fb45a15310450b7083c44e42665", 439 "edbd7bab3d957fbc85e89612197cf918f5f5af20", 440 "6a7efb3b6e0b49336df1bd2937ca09a11d976531", 441 "236eb5ca9da70ec7cc719cd2fd291bab14000257", 442 "f98023c7cd8c068f2d7a77ce3600004b90ea12d6", 443 "5c4cb9cea2226fc671bb4a11f8253343ee94bb4b", 444 "fd4be592483623dbc800fe28210a1f0daa71999b", 445 "788b8de98c47974fa9f232a6042ae4ca546ddb7d", 446 "a8772e6c44ba633fb384a7c4b50b435f1406107e", 447 "883bc8f305c602edca785e21cd00f488583fb13f", 448 "3bac4e80993f49dc3926e30524115fca9d7a8026", 449 "91369e35be29059a0665782541db4c8b324c6bb2", 450 "0fa8cf332a56bb6d7e14e85861fdd60f51d70501", 451 "593d694cdcc8349b3bfc8257041dbcb27e61da45", 452 "1036b91d93e31cd1d4740d0c8642e115e5a38188", 453 "1898073cdb35ca4d2b21bba933ac16a0b4297317", 454 "5068bff794553cf5a3145ae407c9a2984357844c", 455 "413a7989969c229dee4ab1798362f32f96cf0a10", 456 "0bb222e540b82720d4971e4a2fc626899af03e03", 457 "adc20832d8c43f1cf372d8392535492013cd2306", 458 "45649794dcbcabda487f66f7a80fc1bec79047a1", 459 "367c2dc1e91ff9ea0e984d6fb3000cfb4e0ae7e9", 460 "9c6afd47dd748a33c585e6655fd4ec1c28976a47", 461 "b4df692ac70a5f9f303270df4641ab014c6cbf46", 462 "8bc3128ba47891366fd7b02fde7ca19100e64b9f", 463 "e649e00efe7fea1eb8b17f7867fe089e5270c44b", 464 "a0bffbbfb0adf6f188479c88da04e25d76ab4822", 465 "b58f19c1800344a2b8e017eb784705bdb2bd8450", 466 "5747a6d5c6ce79731c55e8cf33f7da3025cd35fd", 467 "955390669afed2369b15b32fa519f2f921cdf1a0", 468 "201906f7d763b930a98c97f8eeab417f2b65e723", 469 "5313357d50c40c05a3b3a83d0d2013a138c955a1", 470 "701c5af1d0c28294ce7d804b5697643c430d22a0", 471 "b0a959745b2db1d9f449e68e4479a4f36301879c", 472 "63f764b9bd2f4876ab1ee0f3c0eb55b5a7de5212", 473 "e171f6ec77bca91d6b8559911bce296c0bac469e", 474 "33bb75c12f083d799d287fe9caddedbb3892e6fa", 475 "26e7e1c300ba0c5aaaef03eeb71d529f6def9289", 476 "b1f602d2a74095cc0115ae2ae07b642498e6c0fc", 477 "03d5eb8e3a6662e6dc183f88ee2f285065fc9c51", 478 "f4c312f9a37ddc54a27f6b1421dab1ce0cec0c27", 479 "0f79500eda467cd3cbc220abdd37b5dba695d654", 480 "8d4e3e9d81cc30aaad555ed9e27aed7c615de630", 481 "84c43a3cbd7d8c1ac9a0e9b6f07620158079b278", 482 "7d479beeb6758c164566638b5c873c188d6a91e7", 483 "80086808fca03e757d812e31d1ae576bf90dac9d", 484 "9560096f1b85ae6d939d736165c44df00a47c424", 485 "1015e0217ea13eaa62c7666b8b81aafd75f8f610", 486 "5578c80048520732557abf3a3a3fa22c85015d7d", 487 "b25ba91487ec945410deb2b51bc1156890c032a8", 488 "4c8c936372755f95051f1159b7ff65a484e1a555", 489 "bf55d4bdb26ae0f358bd67ef01932563519aab98", 490 "d347ca5c6c4b6a61389247c3b6f61564033e8c25", 491 "ee315634ed92da3a32c2675ecd1b369471c60936", 492 "099c688a920f606655b485e8f0a433dc811bc976", 493 "9c044a733335bca43766bda2b317249309155079", 494 "354b92008a8409c62d0fa1dff1532c5943aa37a2", 495 "8dc9cb7deae5c24d1eae004d53893fa6caf4723c", 496 "cf311a96d41bd98fdbdfb5dfaac4ba1ba9b7d6da", 497 "bf5ec23456efe00e1e0931c17de9040ab2092858", 498 "0bbdf0a0489428f96e3c1d3e5305f9a893820852", 499 "9d86b1b2bbce90efd3c0b9fe20d23ffa3eeecd20", 500 "8f7a0af421101952e674f37154c1e8c4646ea2d2", 501 "d12284f58daabbd173dfae6c7e55fd5d822d89b4", 502 "cc5ed4c9e925f0a457a7437fbb8054528cdd9469", 503 "48658ff76c137185c56a53f3ccf0e958d0296742", 504 NULL 505 }; 506 507 static const char *sha1_graphics_r5g5b5[] = 508 { 509 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae", 510 "847005cf7371f511bcc837251cde07b1796f6113", 511 "a8f75743a930843ec14d516cd048b6e0468e5d89", 512 "d094f51ce9b9daa9c1d9594ea88be2a2db651459", 513 "cf3928e240c9149788e1635b115a4e5baea0dd8f", 514 "a9034a905daa91757b4f63345c0e40638cd53ca8", 515 "15ee915d989e49bb9bab5b834d8f355bd067cd8f", 516 "99474fecf11df7b7035c35be6b8b697be9889418", 517 "cbc2898717f97ebb07c0c7cc04abde936dc5b584", 518 "29c896b591fdf4ddd23e5c0da1818c37e4686d94", 519 "4b5b275d33c1ebfe5bdc61df2ad125e865b800fa", 520 "92df731fa1f89550d9d4f7ea36c13f2e57c4b02a", 521 "420e39ff3bdd04c4b6cc2c98e99cb7993c7a0de5", 522 "1fabf0fdd046857b1974e31c1c1764fa9d1a762f", 523 "449092689226a1172b6086ba1181d6b6d6499f26", 524 "1a92a60f190d33ef06d9decb56fd3fdd33f3af03", 525 "e61f5978c2e28c0c6d8f5eefe0f840c975586efc", 526 "897d16f4d6a6ddad685d23ed7828d4f676539b75", 527 "9d21bcfdeaf1ca5d47eb823bdefc24d7a95f4f56", 528 "6daaf945a955928c5c124c880522ca4634fb2343", 529 "12a288390d16e1efa99d4185301de48a4d433b14", 530 "ea92af2538b76f41a3a03eaa11ac395c9b6197c4", 531 "1d3af561605fd61433035600d8962cb8d266fdd0", 532 "3a50ce21b3563a604b4fc9f247a30f5a981f1ba6", 533 "d7d97e28ed316f6596c737eb83baa5948d86b673", 534 "ecc2991277d7314f55b00e0f284ae3703aeef81e", 535 "656bf3b7121bcd620a0a3ad488f0d66604824577", 536 "df5dafe96e528c2cc7fd11e4934e298f53cec34b", 537 "a49530722328ae88fd765792ac0c657efbcce75d", 538 "aa46aa2226e3121eaefa9d0836418e0b69262d69", 539 "333f3f2cf3ff15736d59f92a33c45323d3987d6d", 540 "a6fd83542c3826132e88d3f5e304d604c0056fad", 541 "a8d6a5285a927ba3a3be34b06a06c70a20d4c1b3", 542 "e428d213ad02651287894f093413949dcb369208", 543 "7df915bedcc5951a1b6f828490f7dbb93212e835", 544 "8720478d904a84c24071e97c731c1ba7882b131e", 545 "76215275593631f5900aad3616d725733dc39493", 546 "573d65665d20f00d36d9782ae2b89772140524ab", 547 "c3d4a1425e17de9e05e3f6dfc6a24c26bfd5ee12", 548 "2a66dae03890ff791eabb982949435adb19af02b", 549 "24ac219478ba406f30794550690486b14cbac5e8", 550 "2b28d20690dc92374ebecb5508f8fdc6c7581790", 551 "6c652ecce55e71fee16bc1c9b2c5ae4161bdd2ea", 552 "9b02173f424c098ea0f4cc5db9eb65f69263d127", 553 "a92942269911a88793b3460b6f2a2cd56e48eec1", 554 "059db9f0426b371e464ef3d30f1a4f4aa599e101", 555 "aa4a0a4b7f2697aaf270c89874631974bd9d7183", 556 "a7506e2c001d271593297c9eda9b984d4d894774", 557 "8f447a3820c83662086dfa836da2205b0130fd5f", 558 "2ebf37d81da3f11434652d06bf65d55e96b090aa", 559 "ace2c60bd76b11a002bee852686e8783f102eba1", 560 "dab47c9dc149e570045d699598b14a613bf319b3", 561 "2daca4d26a086ed34894693be0b0374402232809", 562 "904f1d82159bcf5485f323bd12b859dc5e83f8eb", 563 "5bd29f94844351e9a5bd01f25d85608b9b0701b2", 564 "295ec16530126046790fb734e99f86f5b3b74ed8", 565 "d98b0561010606b55a1b9b85fbc93640f681d256", 566 "1c1499051860b7caa25173b328ca9c862f01dd1a", 567 "a655512753bc90e6d4eb3848f69e96db1ad348e5", 568 "2230f36f12d4becb242e2962fa1b3694db2496ca", 569 "d81e41a765d7a2d68073f5fde3f74f09df84001d", 570 "0de013c2c6aba9f99cbcf5f8cfd3212ded7ae72a", 571 "fedc67d1b0797be5f40cd45280844f2b61d29b0a", 572 "a848b1b0293b05b3f9358a3ffcb21a2e5fdecf05", 573 "af45bf81d119be5cf6845ad41191ba52637e65e9", 574 NULL 575 }; 576 577 static const char *sha1_graphics_r4g4b4[] = 578 { 579 "2a2ab8b3c019e70b788ade028b0e9e53ffc529ae", 580 "cfa0ab83ee93283ad914c3748f0532da1697af1d", 581 "8bd18697d1ef27492805667a0bc956343ac08667", 582 "e8501c830321584474654f90e40eaf27dc21e6a8", 583 "d95ab10fcfb8447b41742e89f1ae8cd297a32fc4", 584 "821177710961d2cb5f7e7dfc0e06e767b6042753", 585 "667124365ffadeea1d8791bedda77a0c7b898de8", 586 "c9f23e684b600dea17575b4b17175fbd9106c3a9", 587 "7678876e50eae35d1eaa096aae25afaa0b864bf3", 588 "fb52b0c373a5f2a60b981604b120962942d2447a", 589 "5ab8dd07436681d762fa04ad7c6d71291c488924", 590 "0167981d9e1490a2ebd396ff7582f0943aa8e1b8", 591 "115a6bd382410a4a1d3c1fa71d8bf02536863e38", 592 "65c6d1228e3b6d63d42647f14217bc1658b70d9a", 593 "25fcb75aa687aac35b8f72640889fe92413e00c5", 594 "3bddf9d53e89560b083302b146cd33791b13d941", 595 "a81504498c7a7bb46340ce74476a42f70f2730b1", 596 "e61a4f2657a444d8c49f84fb944f9f847667bf2b", 597 "32b6e0aa79b7e96cd0ab2da167f6463c011023a8", 598 "1d283aa4d2b2114f7809fe59357d590c7c779aa7", 599 "29640e2ddd2d3016da14507c3ce9b2ce32f39bb4", 600 "57ebf8becac1524543da120e88e9cc57ecfdec49", 601 "e68ef3ffd7401244cdea79781eab12d7a5e8ca18", 602 "d591232bbc2592462c819a9486750f64180518fd", 603 "0e183a4c30b3da345129cffe33fe0fc593d8666b", 604 "f14d9a4bd8a365b7c8f068a0dad481b6eb2b178b", 605 "8933450132bf949ba4bc28626968425b5ed2867d", 606 "e4a9dcc3e565cd3a6b7087dd1433f3898bb9cdb2", 607 "eca4f9b16b3bddfd0735fdd792e0ccaadfb9ba49", 608 "233e588cf660e2c9b552cf02065cf63fa6655864", 609 "0740ff74dcd259d9a644ba51ad77ff0d40348951", 610 "a3345acaf272f2e288626906e3056cd0ced70499", 611 "957a86fbe8a96dd068db65e4e624a52bcc84af46", 612 "13b0f240054dc57ba0e2dfde74048496304a2c7f", 613 "51ef267eb9c15487c9430f505e8a6c929eb2170c", 614 "60c0752f592c6426a2f4a71173b44c5c086f4f2a", 615 "9dd123938b0a02601d8d458ecbd6535ddefea724", 616 "815a1e4fc7f3a00c2990c150e87eba0b13f66811", 617 "75ae8c80af4356a1a5eebde6608fbc31e8a95372", 618 "b89ae8de2d975b8adb263ace66fd953d29165a8b", 619 "e901ab4b20bc87370609d7ba1f21aa08abd9eced", 620 "e9105c6ed8355519e0cf2d2217ed7af43cec8ba0", 621 "3cbf5fffdd73f9639f3eb34ec1ab3055bc8618fb", 622 "8e2e70ade90711c4ac01352aa0373fce36ff5dc0", 623 "8c40d6d8e0c696c31f04c896e492a2a38703d870", 624 "e13c821c236ea0b67cca64c9da7be15e88fc712f", 625 "9af4907a8144458a73dbb7471784f8c3d9aeffcf", 626 "104e85bad287a62dfe25f0e78280179f18bac765", 627 "f0acb3cfcda62e95bee5f7bc8830ffeb3dd7e5a7", 628 "fde993dfce1551ef220f5a07ce4acd66e8524ac5", 629 "a80f3df0aea1e1b30d9833039157bca658218f48", 630 "07b10c3f191d0a93e5e5694aae37dcad407e10f5", 631 "f7900e60347029876ba55e8f0c4c02e89deb36b6", 632 "f373a5f37b82e7523c64c08eb509b6191e49b173", 633 "9f0760a05190c9edf9ce2e8be6aaa5557601fe91", 634 "7587a9c87cab1eca827807f351bb67ca184d1ac5", 635 "b53ef0b5c674822e784903a9dbdd3b386d9f2350", 636 "5505d2ed20dc61ffe48832ecf5329162a5ceb734", 637 "9f72be4467219a345b1164205d1fbfda2d64271e", 638 "13d1634e03bc49cfe14a32278d9b1f5ddbb9be10", 639 "a79e4cc419b9e1735e275e2823da52875536943a", 640 "b0182002cb1f4fba9df3c21a4d046ab41ce7e9be", 641 "f571c7c4aac92491017963032194690c0fa06b42", 642 "91d50b5a604d6c38aa0d08b9af995490f8ec246b", 643 "b53cde47b0e28063770d3b1328c3cc2f774a6300", 644 NULL 645 }; 646 647 static const char *sha1_graphics_8_color[] = 648 { 649 "41728d7ff2bb425b5fc06521adeabf6cc73136f3", 650 "e313bb57f699587b0bae2f17f5da5d977e6f2a61", 651 "49024d6cbdf1614327dfda9eda17675e76805f7e", 652 "63ba8ab7e7996857d52d4c2b995cfcd304daf25f", 653 "92295ae66712df050cfd6cc9fd2fd4101784c5fc", 654 "84d85009d35ae10abbc435f3913422544105cea2", 655 "eae349c2a481d6e8bfdf9a7f4f49384a14716a5f", 656 "6c51068ca1db36d948eaa34aed4a44d2cd1e8b32", 657 "f3aa8d89430748178952de56643069d80b40aad6", 658 "bd5fed74e2f1b097ef4c20bd30edfc6ee11eeccd", 659 "0546b87bf5fbe1b8168eed5d4a20649be92734a1", 660 "52b1363e821bf604d9df260bfa97e26d428c33fd", 661 "108732d9909ee5f3542a9b90b3ad96ec82446ab9", 662 "06c76c53dcf3ba5e213d483e27d841404c9aa90a", 663 "ae8fcdbdd44ba58e9bd46a4c56eb54f37483913c", 664 "89711289be6d5c55734878410e4923d5cca9aca9", 665 "8355caf57d51ad4e14275943088392e37dc75d33", 666 "5992b2e331a0e0f752598cc8d083cbecb5f4dde6", 667 "6f0570da9dea7f043f678088f8362ee458cd79fa", 668 "940db409d4c3e5640275724f9e5f7c1a0d2e21b2", 669 "242ce86967ea62fa69c1e6f597ccbcf2f0b1602c", 670 "5092b22af85a08f10a2899888bb9d552f25f828e", 671 "f5dafef807237fe72c74c0bbd47c382ace45bfde", 672 "e91973be2651eeef568700463652838d8cbba976", 673 "1df851515ecf46df5c2d3279535c1763f72353dd", 674 "b68922915ebc2797d58deecf983f7d0cf9a5efbd", 675 "359bd76088a965bb0cee7c44800bc46b2638807e", 676 "64205ccaa277e64eeea0c20e99900ac79858ca2c", 677 "2cdee35d43d62da09b4ddfddbd0948ddbb9fc48e", 678 "91f988f575338505ba8a40727865a8d3f2298624", 679 "d2b4557492ebb2e0f640a0a2f6fc3bdc8d8f36f9", 680 "421e8b608378e4f17774dd32ea6446fa0fa16f91", 681 "3b7488731da48635d86be551ab7c8c0f91c78219", 682 "4fd49cb49853ef950fd0b7e2e35718a71c8374c7", 683 "e15a355fc09bfd22267917898e2266168ff410e3", 684 "7a9c326a56a94621377a7258be70ba50042ca9a2", 685 "f994fb5019bf4c1a96eccf89af599eae0aa6b412", 686 "3a71ad6fef147067641e49a5f69b2454e3a5010d", 687 "ea10eac72830dcae19bcb16a076c2b21d844b5b6", 688 "add949d009217ef2b847e34772ba363e4be7b1b8", 689 "0b58666deb3615e912896a764e5c6475989e95e4", 690 "ea74c00c45569007383b632d7f1d2adc82645717", 691 "5ac22e1a33b0204fdc7a68d54ee94648e96079a0", 692 "9dc776c5ab8256b1301c7d1da60544a9410e6715", 693 "46f772c2832b3aad584674db666bd63e48b4f338", 694 "a9f9ca0049235db51ab7359a5fc3d21be42d2aac", 695 "f3dc739da41fb299637c8660e8c46917ddcf87a8", 696 "abd2fff80f74b311072ecdb91ce9ceba268fa6e9", 697 "9ae38bb94c7b4c0c6dfebbee23d1de4db9b77488", 698 "8269b32b4a34440f1fa37927308debc7eb85f3fa", 699 "65b2c868790806be7ab4aaa6114d445c42a31f98", 700 "678979a45126a76eb629992cd64734862f53a555", 701 "2f7ba8803604c032cb1a1228bc021f0f1c03e245", 702 "52e7c2f8b01592898c13f1e7633881e350244209", 703 "d9d5556b77301952b4caf113337720966bc8e1f5", 704 "e58d9c0acf0219d0839e1dbd162e08a765ed7f0f", 705 "34ca0f9660e1889f9f2c0deb80535d3c4f349fa4", 706 "2c07272462c68cf5944b03e2aa049475b99143c5", 707 "07ca369fb875d37b9cf855045f528af1827edec4", 708 "5e9e3e71b06c5efe20f93b3838e745b40b878471", 709 "153ae5c9fc2a31b38c4878b25d9026b9f51f132d", 710 "488341e88810d737de0b26de4e4d4fa0e78eb482", 711 "5a42b7eeff8198e7b005e4afa4282e6ffb939906", 712 "26bc25a011e2b60961ee9d6c6141d928ae24389b", 713 "6a1f6e1d494bf6b0ece7af5fa164ebaadb3a19bd", 714 NULL 715 }; 716 717 static const char *sha1_graphics_8_grayscale[] = 718 { 719 "41728d7ff2bb425b5fc06521adeabf6cc73136f3", 720 "df35491dd5038187c05bac06921402ba6d7773a8", 721 "c8cd6d34e011d5f9ca4b1190eec3b416e5e68e53", 722 "66a686ac22cd0ec326f2c97ef473781cabe9690b", 723 "9bddef7b97b8b03569f07011e66ddd67fe82d787", 724 "2a4cea20974bcfb92cf40b05746fc7eb465c4b0f", 725 "0a87689ca33f888f05dbfa21ddec11c069990d8b", 726 "8d0a92e6333e1b99591962e2def9bc9121111cf5", 727 "409c9f29f6fa2e312c8e0b4b3c59acb4d84d8717", 728 "1fbc234c28a8140965ad0fe30b4b799f6681e864", 729 "1fc709d5d3e55d5f96c451c209cd73c59dbfe733", 730 "96b6a32e057d5faeae57086cbb62a8e7b3e6e86f", 731 "aa66ea7c9b7214339858b9fc9bd4720d05e8c843", 732 "114bb377b4e78a1978e1ac09388c48861b5223a3", 733 "8d0a92e6333e1b99591962e2def9bc9121111cf5", 734 "9dc511d6947fe816185cdff93bf0cfe0349b72b4", 735 "216388ddf6b563dd2058a9df65b40b6f72df1715", 736 "47f72be971bd2d3399dabd018201f4f5075e96fe", 737 "f39ab890a2b99d0c31e6e047f2315244972f5ffd", 738 "15b991814d84d6aa252696dd0c6150ef88a8db3f", 739 "1cb52f2a4d17b9b0d8375d016aa8cf0677fcd29a", 740 "9a6cfd68523e40ea1d52847d7747da912cfe2ca9", 741 "b6785a410048bb85e7ea3f0492459972103c935e", 742 "82e641ebe47d9f8cc229b82b8315e69e52f812b1", 743 "15db343049e3a9b31addc5d2ffebc3fe91b39c51", 744 "a895daf1f20371d4d1c3f93c070124cc13e341c3", 745 "3ddc872384ed8f9eaef472aa14a1d79a2c3f3b04", 746 "bd7d8c1cb4b2adc31cf8c7d39a4fa1e3ac7f2545", 747 "33fc8618ce62f5cdd9e06ad61e296f718a99899e", 748 "dcaa7fe030ae4d3029e38ca584047eeb2d17fe10", 749 "6d41e6168662e75baacf74d911d7419d54c8d73c", 750 "2404952157ba1519094a2da6bfbf2b0f1356432d", 751 "24caede65b40815a60b83c4edfa06bdc542388cd", 752 "650a51bedd1af92469d2950eb95220db35f95c6e", 753 "3f43aa11e6fccb747cc13224583fb2f951fee08c", 754 "b83f78ae85df87fc7af565db276c60c102274f20", 755 "1bd06e4e11929e5e91c3c9f20def639b20e731e8", 756 "d63a6086547e90d2ba84aaebfeae24f3ba0c04f1", 757 "85425940daf119125deb52421b2057acebe6d1cf", 758 "9869b6f088822fb423996f9968e5a931301fc2c3", 759 "a7f81cf3326fa3608acc13cfce2f573912e9d745", 760 "e9c16e43a8f589ae85289c5c3ffea6b22fba1806", 761 "84a4bc0c2c5d36d016da4df95a5d8d6c8ce3ba6f", 762 "1bd2587399006eed0d46beff397d32081f6bc58e", 763 "640a49455acabca6954a7fbb6af4e872af342d11", 764 "589e7911e09332ee090371deae17b0120ff990b5", 765 "a1a941fa270cda48c648553ed4b427e16e96f8e0", 766 "115c90df05b1ff754dbdfe2a712ef126034d952d", 767 "fb63bbb2f944fb63ed2d7399f07b168740c1034b", 768 "ae45f0d463ff916f3cb630103969fd49e8d09ef4", 769 "2becf041f83d22ac072fef5e0efd9bc1572796fd", 770 "3685c9ae95118a83db3569832c29753276fa1264", 771 "09640bad951c33e7d70a1fced83b1869f65b3fc5", 772 "5eb00252664ec39e61359adb1dade4906a87a248", 773 "ee7b9b292ea9fb559ef5ebf6a2a5586d38c7f854", 774 "dcad1a146c1d0ec2c4cc7f64bd4f45c57a604bfe", 775 "0ca8775d9a61ccc251d1e6f2e3cfd26a24ae24a2", 776 "17ae603c199a5d6695d198a7f36e6d7263990951", 777 "1918a33f59d3500204ffc573318a39e9ff754221", 778 "5449d1aef0d2d6af9ac3fd7adb32c23ddc9be1e2", 779 "55d302ece31a9b7fc4be4a07a53767ba210273e7", 780 "a6a29836291f9dbca85e25cee60f62ef5faca6d7", 781 "3494a23633405e46af96cb57715617fef1ac252e", 782 "edc1ad2704452354aa6f79fac244a55b6f509c2e", 783 "a3eac75d30f681b3898ee469d368960529634d7d", 784 "e2b393dc3f5833f7868668ea31369e90348768cd", 785 NULL 786 }; 787 788 static const char *sha1_graphics_8[] = 789 { 790 "41728d7ff2bb425b5fc06521adeabf6cc73136f3", 791 "512246d4886ab889a090b167ba194577cb95272e", 792 "921e852d4564cb9e5ac15ff68b5207bebea871d1", 793 "9636b0ebefc443ea11949ccd28f6ca454277dd41", 794 "aa9050da55e6b6957c60b7d603fce539cb5c0048", 795 "e2b93aca15fb1233ac09a713dced1f4cd950b1e4", 796 "3e3a603fc26cc305aa27f88da7d2a3b0073877d8", 797 "390b2bf70daba36310683f46af9cd50b9a061396", 798 "82d21737e9a7247397a6c983a9b6d9a0452dd74d", 799 "2a8460af91675e01cbe9384eb6cd3eb2cb420960", 800 "1af53b1218ee9844fcda891b836d42f6b2f66bd5", 801 "da1cc34a9d9b779fc7849e03e214096026506464", 802 "5ba8f99ca034666effa556748c49a0f5a015125f", 803 "b67ba2f55659c75ac72c1112494461bb3086e1a4", 804 "73e2859ce849f756f954718ce3c90f02e31712b6", 805 "b1dff0f5dd233b44ee568878c5d3f8ae1d80c6d9", 806 "1f27dc1a1316fb7a4a78fe40fcd4bdae3aaad218", 807 "6e375e1485a1e45ac6ab10af49645d5fb2e76dff", 808 "cfc67c325c7cdf96d90af9b3cceb8d0504cbb3b0", 809 "7262364067e03c7fa498af1d59d228d6c63b460e", 810 "5241241a355a667ef0834049adf4218e8b3f16b8", 811 "db22d666690948eb966f75b796c72c7150a5c4b9", 812 "af21fb2645b568b049549de375584c4aa3055143", 813 "1f13ea0034db4b0ffa4ddcff9664fd892058f9cd", 814 "3caf512cfddfd463d0750cfe3cadb58548eb2ae8", 815 "4e5e7d5fd64818b2b3d3e793c88f603b699d2f0f", 816 "c4efce8f7ed2d380ea5dc6fe1ef8448a27827532", 817 "d599bf210423fe3adbb4f1de87d9360de97827d0", 818 "bae7c8b789e4e9b336c03c4daee3bce63fe039d9", 819 "cc01f17928f7780cefd423ea653b072eea723a1b", 820 "c005662a47f14c2f1b7c7fb3b0ef0fc390c6ea6a", 821 "675cde16a6ad2bcd8d7e72780b07a0ccd8d0393a", 822 "ea39ac62ca2f815a1d029340c6465994b6f03cb0", 823 "9a603513cd81acf70cf8b27b0d544e7f672e9d40", 824 "f4a334e69535de74ee5ed54be93a75120a66e54a", 825 "f751a55fb738b63b6fd7c229c33ef92605d0c9c1", 826 "61907a6685bba93077da40cfb28cf2ab74552fd2", 827 "122015e5e17c1c317c6e51c0e207826b606a4077", 828 "c21851589a5f8a45ea5f9bb3e72f4f88d0a6697d", 829 "eb2ce16a6ae251f4965135ee776776b5fc02c42c", 830 "acead2745fec0b6c817fa601353bdf2d197b64f7", 831 "1f1379089d7c6e8d733aaa4eaffbe02db6255b61", 832 "d83adc669c0dea0dc4812b93f998514b6f02d805", 833 "9e8ceb7c3cd68e043b6d875c8c84a1e394962412", 834 "9e996fc74eeef53f0a6c31aabb2edce6e103f189", 835 "6b8abd1785304d6531c1e4cc65c1ffcdcb2196a5", 836 "7d1bfff706b0713e53209407889f83a0da26a81d", 837 "5a1d8f9ea978b820edbc5c9e1c6f1cac022620ad", 838 "31e667c2dbb81dcf81d01cb88f794e88ddb90ff2", 839 "c404446958788fac00ee1eff571d682bc21dd7ac", 840 "95060f3dc9e6d01ada42f09a871b69f0699cb77c", 841 "465d9cd0a77ab4fcf035aa67544b2a26269e0b09", 842 "600d6b2713d5e4c0d90c02660245ed26c7ae3033", 843 "0025a440866a404523a8a20e79a8891e45a2ff56", 844 "c04d335933895f836f0a28c1e3f7f444352c3b8e", 845 "bd28d77cd85b20a2384d6b25082cfd884bba683e", 846 "7e591ec8ae9bb61c3a443c93f071cab2b8978394", 847 "f81c70b6ee2d4690f9f7c797c66582b176f8dcef", 848 "d3f359cac7318ce09e0531d51c8c2b316cf3a23b", 849 "293c41a7ed923a4617560481ae8815cebf83701a", 850 "ec06b56f3abe277be42650ebd49dabeaae9e756d", 851 "750c923785ba2afb9ce597516c072f90f014bf95", 852 "bde5a62a065c027561226fbec5155e938ba7f6b3", 853 "fbaa8848a1d3896469c37fd43ab44233f5b875a3", 854 "c2ac98ef716fd8a5ac8f08ce66293d9a96344337", 855 NULL 856 }; 857 858 static const char *sha1_graphics_4[] = 859 { 860 "fa867e2976a549ecd3b1fa67df54963232fcef8c", 861 "256d742b4da96b373b4fa5663d0ad3b5faab5c8e", 862 "d96d8f4232b930bccd53b903b5efaf8c0bdb16f4", 863 "9401799e6116c35e5f0e5bdca07ea25316757a72", 864 "482ae2b0ef1d64752b5ef11cc7f35a33eb55d07c", 865 "dcfb3e01100b41c0f75a1c5f84b6de6b90138281", 866 "2505598845fa026ea7187582461efbf06cb6904f", 867 "3981a19363beca8f28d32a5928ac296fd22a5296", 868 "01404024ebb2c266d17d734059524d874491650f", 869 "c87bbff3f83b8ec11bb03cfa9bc9ee5166c4c7ef", 870 "f35c5d62853be78c5d39fb2f45200dc262aa8e18", 871 "46e94a55f5f58a6b915078d8ffdc725f53aab516", 872 "665bbbc749a5ffeedc0d62aef0661a5ce845b017", 873 "1f26a01730f67d40ea711a50d9d801bac15a642e", 874 "3b53d24178cfacba53103a44dfd5d072b15a6781", 875 "c52cfd57f26037723d37192722fc3a217f280c9e", 876 "e34da6500cf2e424d980714d92737cf6c31a7bda", 877 "d17f4358ae529f920960ed89e535902ee13b0033", 878 "0f44e12ecd1ea7e39433890443626d4fc35204a4", 879 "eb38683e812fd13dca971ba8f4cfd2b6820d3524", 880 "73bbc83f88f1aaa6df0158b63e70bb3165163163", 881 "0dc2690a5c58a2907a8ab06693ebfab6698172eb", 882 "df5f0d6574bdf1781754b5b9f98232a77e439e33", 883 "39c16648cf6c261be71a33cec41867f28e119b94", 884 "26ad5116562e7b58c76a26eaf521e2e40899e944", 885 "1bcc54eaf8e3c2b7c59ecccb23c240181d7ba8b8", 886 "4f827ca6927f15191588456f985bf29d2a3b3c24", 887 "6fb102d020e5554116feefc8482104f3ae2036d2", 888 "ae546ffd30b837afc7dfcb5c9ce4f01d15b35ddc", 889 "20c9eb3276c08fdce35755e349bec94b04929812", 890 "628d837163a25c6520f19c0602383176dbad528e", 891 "b5a12cff7100290ad43f5ed17a321b42de048893", 892 "b672afbeeafb44194a821f0def81a8892872937e", 893 "db0124045882b598feea192186cf7eb7a0387866", 894 "602d91471378fe24a2d0248bd8a92b624f099fea", 895 "c93a86adfe58dc2d461f2ed962883d6b90888848", 896 "21aa1ff238a2d78efed1aa658ac8fe21b1e64daa", 897 "1a579cd280422131c35e907a023ee0e80749b5a4", 898 "bbf027f506cbb80d359bf4892fcb75f816f2e446", 899 "ed44bded6b17df7fe92b191fd810d1aafbd55f52", 900 "a49bcb1ace42d548254d9e96d22088b1fe2e75b4", 901 "e2a21a965dfd0bd09f9270917f681610efc18ce7", 902 "3e411b004a5be84451860c6da6a4a1a482b77862", 903 "3b3d2f18fdc75e938ca43cc2d0b41fa67c1c5d36", 904 "7811c536a6527112b438a6413f3927f2c79086a7", 905 "525ef3615040225752a2fe646ab99ee64e360630", 906 "46760975993f9881b7bbe94123173e6a683d3f25", 907 "c644f460937107214a88d5eb9e846d27abd8c874", 908 "df5feb905a31c288008cf5e82d73ac818a160d82", 909 "4f9658dde0432a711a4d783c1b5aa3365fb7d54b", 910 "09438163dcbede3890a0e6d8e614c97a06759380", 911 "d8af3868c66c7d6dac35ec8ee0317b38a6910bb1", 912 "ec8e2aebfb4a1c28ebcd0e053b9e4d8638b50951", 913 "ccf8d11b1e81895e9781f17c227c821228d8714b", 914 "f751e26578193afe6a727ee2a52318c404c56555", 915 "28a6b9f7927e99e53cf46f0333d29168cb10e920", 916 "029552113292cc110fd6b7888e766628950aaeef", 917 "297f6ad15200bffbf15198324ee8f27a61a6f2d4", 918 "70cfa427a1a0d6f2232b1fd544905d48af69cb98", 919 "287ea7db721e641439888cb9f4bac3a5f16124eb", 920 "dd9eaa5325cdf250e89162ac84207978ebb6458e", 921 "42466aab11852741d937c1ff6f3bb711e58415a6", 922 "3024fa38333f83a639b0f0e6ac6d4b9868231157", 923 "7ae780dcc7cf04dda50648bfc07cc6a7a2f2189e", 924 "9ab46e0c42f82dc73df8a55cbf881abd72397cec", 925 NULL 926 }; 927 928 static const char *sha1_graphics_4_grayscale[] = 929 { 930 "fa867e2976a549ecd3b1fa67df54963232fcef8c", 931 "6611ea6cb24bcf34c5f3688d57e2874aecb39c24", 932 "5ab1d3f8f5938c5d20a2fa3237e319077b21e716", 933 "1c201d149c0bd886ff8a427ad513f15a70991174", 934 "44646e67842a4d055bea1fad0434e6e4a0eb5465", 935 "315189097a02024d2eae61d524c4de07a396aee7", 936 "73ac786015dea36ac466a6524dba757d5d238ece", 937 "6e328cc4d53627f034b23706d8bf26afe18512ae", 938 "3c5b90cfeafdc1c99c8c62317d07276fdf66803e", 939 "95e6f509bb1cf9981efc47a0878ab0bd983eb349", 940 "2e1bc3b00e4ecc62b03785533dc0faeeda38d53f", 941 "6448226859cab61a61c95d3ed5ed5f216b1bb120", 942 "7f1cb06597b14edbea03b860aec3cebc4ebc3d62", 943 "ec3879342b5a44f6de6efe946243ae5ade00980d", 944 "6e328cc4d53627f034b23706d8bf26afe18512ae", 945 "51b50968a3a0570d5ed690fe44ba1a78a4d62ce2", 946 "d5bab61f78ac3355aa2e0776b2d5d9d71d61e77b", 947 "fa47c5195405f6a0eefba3e3a60ad463c7ee94c7", 948 "b2bda683edef912957845a33edc055902a801fed", 949 "b067f0421cb2c83b218b8ab6edbede2ff5723b57", 950 "c8de76f9c0900e5f86c7584fe94d5749376b7b49", 951 "43ee3e187dda14b86aef12371041ae70313b5a65", 952 "7fab79b7f1a5cb2ec31ed8eeaf213b3d8dcde4d8", 953 "d4930552a7845111ffd9db57260be1ab97967c06", 954 "afdf41fca7951c6dd6193320de1295f2c68fe52a", 955 "f2f1f331fe6b1b31d7c9ddd37793b375fc01d3d4", 956 "f0af0f1edcb837bdf1535c1f5e9988c21ae9bfd1", 957 "71c4577baaf35f12f6707b1e2f78a1e8c0d41d0b", 958 "9b7d6b12385bb9e1cd881758aff342bd5427432b", 959 "6fdd5aa022da2a8af6f1d02b6072ebc068b4b600", 960 "643fab30f1a59dc37f1e0f1a6006076fbf90a5fe", 961 "6edbc0b95e9ae3348ce7d12c44f9c8082b5f2aa9", 962 "9c0da52c4ceaa8fdfcff7351328dd520bb57e985", 963 "f8224430462f6a93f85ef33b8aa7299525990708", 964 "1cf93cecc942b41ab8fae21ea18418a6d64873e5", 965 "71a1705ee14068ee8c6c6680c1bd99703fb6abd7", 966 "94438c82b8812fe81a69d5d1429c5967cdbfed7a", 967 "764ea26f10fe11f7bdb538a26fc33d44b3a95d6d", 968 "94ad53c578f6034dfc5c666e363203cdfb00f2cc", 969 "8cd7b0ba8426db344b4cb8820890603020ed65e9", 970 "ad96132f25ca14e1aeb17c86f8d187febf6401c9", 971 "027b05bc82ce4f897c4bf812610a641547368939", 972 "3f131e855ba1611d8fb0f16a6979f8f56aacc7f3", 973 "ae64d1dc52dcfa8c644f953c4601fa2fbefec37b", 974 "2f3fb1bd8f416198d70e06f6d519571cd5eb4ef4", 975 "cc96ccaf6b99f60a49b03017515f83cba22b4c40", 976 "5eeb56afea8040a8fb18c11f29931b836474126d", 977 "30c256a783c4874261667bb31307eb282ab9470e", 978 "f8681c09f1abfc38d31e47622cb8798cd896a00e", 979 "0ba7e5d68419702605739acb52fcc01c96cb63d4", 980 "f8d2f196ba8a16f54acb934e61a759ab7d3f2f05", 981 "b5ee51cfc73acb59a2f6124509ea236f8fc7f9f7", 982 "d374d4d92c940ae42a9b42c14d744341b68a8c14", 983 "06a6a224be0f5cdc51ac4704f9f57fc1f3813d6f", 984 "c47c2dc806b6b8ff28f300949695d013a46c0083", 985 "ada3b7c34946e584dcdf4203e07cfa3dad02bc63", 986 "c2f61571b067a44b30f56b4658c9606f0edfc0f3", 987 "58f400c9bb78e49a879276fb049edfc9c981740a", 988 "cb3794f676d6e9502f27172ac7d79a12ca2ba32c", 989 "aa89612798fbc4e11a73b6233c0ac4832e6af2f9", 990 "c96a998be5c1d588ef1243cfd2610d056d16947e", 991 "68bee638d59a373f33f308751471b3ef41849582", 992 "8fa37e26cdae406c2d1c81b1175dcf0311cf60c9", 993 "2d5123e757cf00e423a89160d7dc4997c3688829", 994 "36dfdad9f3f5cfde6add3cef23368c343d30469a", 995 NULL 996 }; 997 998 static const char *sha1_graphics_1[] = 999 { 1000 "23366004515f3bc46796ea505d748f8d0f97fbe1", 1001 "61ade9054d4477fb89cf830539a5e8b4e45f0688", 1002 "ac530c5dbaf837e15b2337347e974184fad73643", 1003 "95fdcda26262d5948a9ade77d83fd698e0031050", 1004 "1dd5cee06af78d026e5da8bfe3f45e1cf51faa13", 1005 "f6b61ecf03ad11752775faca1d4404c6bb5065f5", 1006 "d7ad44d6f377598268e9968333ae2cf23a0715ca", 1007 "5871339cd7e6cee12d4dc45934a89071c73efe6b", 1008 "69e9b85b34caf736069ba91e57a5c3fa7c891653", 1009 "21d5d9e47bb07de2cf7bc99b7725390d03a6cde6", 1010 "f69ee65ea25676429a28eea79b5b9cb9206b8d01", 1011 "39ff81f77ef4ee772367ed1a63785987c060126e", 1012 "4c686508a994ca4c7a0a73b8c0fe52423c180d9c", 1013 "b0cc1f5e244ae0c0835a9866a46abdfcd56d1cb1", 1014 "7ddf19df5bbdf4475b6ec1bc042425e382502864", 1015 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca", 1016 "400a21caa01e015096ee1afcf1b54e7f8ec515bd", 1017 "144c9a846e5e37ac6efd5ed3a97ec231479e8fca", 1018 "a4964d8bbf80fe785f906bc0f7c5b113242a58fc", 1019 "adb2818f6d3845dd140bc0f9abdbaa89d2a8c3de", 1020 "13cc63972aee4f6ae27091a8af18de01f1d3a5da", 1021 "4d95c3d1e170f004c80aa8c52feafb8e0e90760e", 1022 "ef2db9fb75a672f69bab88e5d08fe64f50ec2bc4", 1023 "d1e6091caa4482d3142df3b958606c41ebf4698e", 1024 "07c1116d8286fb665a1005de220eadc3d5999aaf", 1025 "4afb0649488f6e6f7d3a2b8bf438d82f2c88f4d1", 1026 "f2fe295317e795a88edd0b2c52618b8cb0e7f2ce", 1027 "c86eeaeed09871dee4b43722ba512d2d3af7f4d0", 1028 "24b1a6241c81dbb950cfbe5da6798fd59eb36266", 1029 "1007d3b531b4bc3553d4547bc88443fc1f497cf6", 1030 "b71ca46be287598f716bb04fac0a52ad139c70db", 1031 "6589e48498e30ab036fbfe94d73427b2b1238a69", 1032 "4dce919117d2e41df9f5d4d0de14f97ae650046d", 1033 "22c2e078f69d73b7a5cb3f7dcbb8fbaa007ef3ac", 1034 "be36cda370650e6d5fb0570aeb8ced491d0c2b1c", 1035 "4c34cb8e47f9ff4b4348aa2d40cce7cb54d65cb0", 1036 "18f4497e43903e8df5b27da4ceebf62b15550a87", 1037 "399e988c922b7fad1c8f6907541c5dda65e60408", 1038 "2fcd25c2d19a01fa631fd19135d9f28b26b86259", 1039 "655cfadeb157233c804d42b58195569c8846e3c1", 1040 "65c8811c609203fd424f5ed5f92ca2268a1dca54", 1041 "a45b297d709e297584eb0f2985294ec0ab53d8ad", 1042 "0d180c37bc26d83a1a11f66168757f3de2493243", 1043 "b362ba4790def178c236c0ae7b0093dbba47cf24", 1044 "d1d2ecf71a37d9eda58fa09454aa871971428ace", 1045 "6672da4e016b6e9de0ca218f8307cce7d48d62c4", 1046 "ee22f43ea867228c6ff937d39e1826e285a107e8", 1047 "832c3c3afd056e5d1cdfb2f466f27225c4adcc6c", 1048 "a2a928de9007d765da496abec8c21b23601f8c45", 1049 "41a417c1f25f2619301afa44bfcde85198985792", 1050 "23366004515f3bc46796ea505d748f8d0f97fbe1", 1051 "ba682eb15c0ddffb942e6086e0ccad2353ed7241", 1052 "58273e1fbf961ff2c772d57160d60170e258d3fe", 1053 "88763f8e8fcf4f78fa864325791a9dd35a0bd279", 1054 "013cee26bac8f815eadad4bfc012d9b5d01c3b7f", 1055 "44a28536466dc895feb824b23dfd4a47c6948af8", 1056 "17468a3789f0a6d65c302bda735a01dc2c1a74d9", 1057 "781d8c5cbc28591fd48fce06f984c502fdc6b363", 1058 "df510792a7790cc699532b1420d43c6d4da2ae2f", 1059 "55c26d22f11d80b73383fa57d0fac552d705b092", 1060 "14443b33a9879bf829ed3b06e1aef0d7dcf662cc", 1061 "53ab1fcccd09fa5cbff77497f36a70a3b3cb8b81", 1062 "4842a30dd7fdf38ddc3ddec85c08efe13a0e2e0b", 1063 "cc76db6da5ba1776f20240a5ad97a26a9cdf96b0", 1064 "9ab50a663b74577b656e9849484a909d7ac52eeb", 1065 "8d34215487088b5d4ef63062270ce25c2862643d", 1066 "bbabe686a6955402c90530e7c67f1428868369b3", 1067 NULL 1068 }; 1069 1070 static const RECT graphics_bounds[] = 1071 { 1072 { 0, 0, 0, 0 }, 1073 { 10, 3, 219, 101 }, 1074 { 100, 100, 301, 301 }, 1075 { 0, 0, 201, 201 }, 1076 { 10, 10, 110, 320 }, 1077 { 10, 99, 300, 200 }, 1078 { 99, 12, 201, 200 }, 1079 { 90, 110, 300, 200 }, 1080 { 90, 90, 210, 200 }, 1081 { 10, 99, 300, 200 }, 1082 { 10, 99, 300, 200 }, 1083 { 99, 12, 201, 200 }, 1084 { 99, 11, 201, 200 }, 1085 { 90, 110, 300, 200 }, 1086 { 90, 110, 300, 200 }, 1087 { 10, 10, 365, 405 }, 1088 { 10, 10, 365, 405 }, 1089 { 10, 10, 365, 405 }, 1090 { 10, 10, 365, 405 }, 1091 { 10, 10, 365, 405 }, 1092 { 10, 10, 365, 405 }, 1093 { 10, 10, 365, 405 }, 1094 { 10, 10, 365, 405 }, 1095 { 10, 10, 350, 251 }, 1096 { 10, 10, 300, 200 }, 1097 { 300, 10, 9, 260 }, 1098 { 10, 10, 435, 405 }, 1099 { 10, 10, 120, 120 }, 1100 { 10, 10, 110, 110 }, 1101 { 10, 10, 120, 110 }, 1102 { 10, 10, 110, 120 }, 1103 { 10, 10, 120, 120 }, 1104 { 10, 10, 110, 110 }, 1105 { 10, 10, 120, 110 }, 1106 { 10, 10, 110, 120 }, 1107 { 0, 4, 356, 356 }, 1108 { 100, 100, 356, 356 }, 1109 { 50, 50, 306, 306 }, 1110 { 100, 100, 356, 356 }, 1111 { 100, 100, 356, 356 }, 1112 { 100, 100, 356, 356 }, 1113 { 100, 100, 356, 356 }, 1114 { 100, 100, 356, 356 }, 1115 { 100, 100, 356, 356 }, 1116 { 100, 100, 356, 356 }, 1117 { 100, 100, 356, 356 }, 1118 { 100, 100, 356, 356 }, 1119 { 10, 10, 356, 356 }, 1120 { 100, 100, 356, 356 }, 1121 { 0, 0, 260, 39 }, 1122 { 0, 0, 16, 16 }, 1123 { 10, 10, 416, 26 }, 1124 { 10, 8, 60, 104 }, 1125 { 0, 10, 511, 306 }, 1126 { 0, 10, 512, 306 }, 1127 { 1, 1, 300, 512 }, 1128 { 0, 0, 500, 512 }, 1129 { 5, 5, 206, 206 }, 1130 { 45, 45, 256, 256 }, 1131 { 86, 86, 215, 215 }, 1132 { 45, 45, 256, 256 }, 1133 { 8, 0, 392, 231 }, 1134 { 8, 0, 392, 231 }, 1135 { 0, 0, 60, 20 }, 1136 { 0, 0, 512, 512 }, 1137 { -1, -1, -1, -1 } /* the end */ 1138 }; 1139 1140 static const char **current_sha1; 1141 static const RECT *current_bounds; 1142 static const char *dst_format; 1143 1144 static inline DWORD get_stride(const BITMAPINFO *bmi) 1145 { 1146 return ((bmi->bmiHeader.biBitCount * bmi->bmiHeader.biWidth + 31) >> 3) & ~3; 1147 } 1148 1149 static inline DWORD get_dib_size(const BITMAPINFO *bmi) 1150 { 1151 return get_stride(bmi) * abs(bmi->bmiHeader.biHeight); 1152 } 1153 1154 static char *hash_dib(const BITMAPINFO *bmi, const void *bits) 1155 { 1156 DWORD dib_size = get_dib_size(bmi); 1157 HCRYPTHASH hash; 1158 char *buf; 1159 BYTE hash_buf[20]; 1160 DWORD hash_size = sizeof(hash_buf); 1161 int i; 1162 static const char *hex = "0123456789abcdef"; 1163 1164 if(!crypt_prov) return NULL; 1165 1166 if(!CryptCreateHash(crypt_prov, CALG_SHA1, 0, 0, &hash)) return NULL; 1167 1168 CryptHashData(hash, bits, dib_size, 0); 1169 1170 CryptGetHashParam(hash, HP_HASHVAL, NULL, &hash_size, 0); 1171 if(hash_size != sizeof(hash_buf)) return NULL; 1172 1173 CryptGetHashParam(hash, HP_HASHVAL, hash_buf, &hash_size, 0); 1174 CryptDestroyHash(hash); 1175 1176 buf = HeapAlloc(GetProcessHeap(), 0, hash_size * 2 + 1); 1177 1178 for(i = 0; i < hash_size; i++) 1179 { 1180 buf[i * 2] = hex[hash_buf[i] >> 4]; 1181 buf[i * 2 + 1] = hex[hash_buf[i] & 0xf]; 1182 } 1183 buf[i * 2] = '\0'; 1184 1185 return buf; 1186 } 1187 1188 static void reset_bounds( HDC hdc ) 1189 { 1190 current_bounds = graphics_bounds; 1191 SetBoundsRect( hdc, NULL, DCB_RESET | DCB_ENABLE ); 1192 } 1193 1194 static void compare_bounds( HDC hdc, const char *info ) 1195 { 1196 RECT rect; 1197 1198 GetBoundsRect( hdc, &rect, DCB_RESET ); 1199 1200 if (current_bounds->left == -1 && 1201 current_bounds->top == -1 && 1202 current_bounds->right == -1 && 1203 current_bounds->bottom == -1) 1204 { 1205 ok( 0, "missing bounds, got %s,\n", wine_dbgstr_rect( &rect )); 1206 return; 1207 } 1208 1209 ok( EqualRect( current_bounds, &rect ), "%s: %s: expected bounds %s got %s\n", dst_format, info, 1210 wine_dbgstr_rect( current_bounds ), wine_dbgstr_rect( &rect )); 1211 current_bounds++; 1212 } 1213 1214 static void compare_hash_broken_todo(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info, int num_broken, BOOL todo) 1215 { 1216 char *hash = hash_dib(bmi, bits); 1217 BOOL ok_cond; 1218 int i; 1219 1220 /* reset the bits for the next test */ 1221 memset( bits, 0xcc, get_dib_size(bmi) ); 1222 1223 if(!hash) 1224 { 1225 skip("SHA1 hashing unavailable on this platform\n"); 1226 return; 1227 } 1228 1229 for(i = 0; i <= num_broken; i++) 1230 { 1231 if(current_sha1[i] == NULL) 1232 { 1233 ok(current_sha1[i] != NULL, "missing hash, got \"%s\",\n", hash); 1234 HeapFree(GetProcessHeap(), 0, hash); 1235 return; 1236 } 1237 } 1238 1239 ok_cond = !strcmp(hash, *current_sha1); 1240 1241 for(i = 1; i <= num_broken; i++) 1242 ok_cond = ok_cond || broken( !strcmp(hash, current_sha1[i]) ); 1243 1244 todo_wine_if(todo) 1245 ok( ok_cond, "%s: %s: expected hash %s got %s\n", 1246 dst_format, info, *current_sha1, hash ); 1247 1248 current_sha1 += num_broken + 1; 1249 1250 HeapFree(GetProcessHeap(), 0, hash); 1251 1252 compare_bounds( hdc, info ); 1253 } 1254 1255 static void compare_hash(HDC hdc, const BITMAPINFO *bmi, BYTE *bits, const char *info) 1256 { 1257 compare_hash_broken_todo(hdc, bmi, bits, info, 0, FALSE); 1258 } 1259 1260 static const RECT bias_check[] = 1261 { 1262 {100, 100, 200, 150}, 1263 {100, 100, 150, 200}, 1264 {100, 100, 50, 200}, 1265 {100, 100, 0, 150}, 1266 {100, 100, 0, 50}, 1267 {100, 100, 50, 0}, 1268 {100, 100, 150, 0}, 1269 {100, 100, 200, 50} 1270 }; 1271 1272 static const RECT hline_clips[] = 1273 { 1274 {120, 120, 140, 120}, /* unclipped */ 1275 {100, 122, 140, 122}, /* l edgecase */ 1276 { 99, 124, 140, 124}, /* l edgecase clipped */ 1277 {120, 126, 200, 126}, /* r edgecase */ 1278 {120, 128, 201, 128}, /* r edgecase clipped */ 1279 { 99, 130, 201, 130}, /* l and r clipped */ 1280 {120, 100, 140, 100}, /* t edgecase */ 1281 {120, 99, 140, 99}, /* t edgecase clipped */ 1282 {120, 199, 140, 199}, /* b edgecase */ 1283 {120, 200, 140, 200}, /* b edgecase clipped */ 1284 {120, 132, 310, 132}, /* inside two clip rects */ 1285 { 10, 134, 101, 134}, /* r end on l edgecase */ 1286 { 10, 136, 100, 136}, /* r end on l edgecase clipped */ 1287 {199, 138, 220, 138}, /* l end on r edgecase */ 1288 {200, 140, 220, 140} /* l end on r edgecase clipped */ 1289 }; 1290 1291 static const RECT vline_clips[] = 1292 { 1293 {120, 120, 120, 140}, /* unclipped */ 1294 {100, 120, 100, 140}, /* l edgecase */ 1295 { 99, 120, 99, 140}, /* l edgecase clipped */ 1296 {199, 120, 199, 140}, /* r edgecase */ 1297 {200, 120, 200, 140}, /* r edgecase clipped */ 1298 {122, 99, 122, 201}, /* t and b clipped */ 1299 {124, 100, 124, 140}, /* t edgecase */ 1300 {126, 99, 126, 140}, /* t edgecase clipped */ 1301 {128, 120, 128, 200}, /* b edgecase */ 1302 {130, 120, 130, 201}, /* b edgecase clipped */ 1303 {132, 12, 132, 140}, /* inside two clip rects */ 1304 {134, 90, 134, 101}, /* b end on t edgecase */ 1305 {136, 90, 136, 100}, /* b end on t edgecase clipped */ 1306 {138, 199, 138, 220}, /* t end on b edgecase */ 1307 {140, 200, 140, 220} /* t end on b edgecase clipped */ 1308 }; 1309 1310 static const RECT line_clips[] = 1311 { 1312 { 90, 110, 310, 120}, 1313 { 90, 120, 295, 130}, 1314 { 90, 190, 110, 240}, /* totally clipped, moving outcodes */ 1315 { 90, 130, 100, 135}, /* totally clipped, end pt on l edge */ 1316 { 90, 132, 101, 137}, /* end pt just inside l edge */ 1317 {200, 140, 210, 141}, /* totally clipped, start pt on r edge */ 1318 {199, 142, 210, 143} /* start pt just inside r edge */ 1319 }; 1320 1321 static const RECT wide_lines[] = 1322 { 1323 {100, 10, 200, 10}, 1324 {100, 21, 200, 21}, 1325 {200, 40, 100, 40}, 1326 {200, 61, 100, 61}, 1327 { 10, 100, 10, 200}, 1328 { 21, 100, 21, 200}, 1329 { 40, 200, 40, 100}, 1330 { 61, 200, 61, 100}, 1331 }; 1332 1333 static const POINT poly_lines[] = 1334 { 1335 {100, 100}, {200, 100}, {200, 200}, {100, 200} 1336 }; 1337 1338 static const POINT polypoly_lines[] = 1339 { 1340 {100, 100}, {200, 100}, {200, 100}, {200, 200} 1341 }; 1342 1343 static const DWORD polypoly_counts[] = 1344 { 1345 sizeof(polypoly_lines)/sizeof(polypoly_lines[0]) 1346 }; 1347 1348 static const RECT patblt_clips[] = 1349 { 1350 {120, 120, 140, 126}, /* unclipped */ 1351 {100, 130, 140, 136}, /* l edgecase */ 1352 { 99, 140, 140, 146}, /* l edgecase clipped */ 1353 {180, 130, 200, 136}, /* r edgecase */ 1354 {180, 140, 201, 146}, /* r edgecase clipped */ 1355 {120, 100, 130, 110}, /* t edgecase */ 1356 {140, 99, 150, 110}, /* t edgecase clipped */ 1357 {120, 180, 130, 200}, /* b edgecase */ 1358 {140, 180, 150, 201}, /* b edgecase */ 1359 {199, 150, 210, 156}, /* l edge on r edgecase */ 1360 {200, 160, 210, 166}, /* l edge on r edgecase clipped */ 1361 { 90, 150, 101, 156}, /* r edge on l edgecase */ 1362 { 90, 160, 100, 166}, /* r edge on l edgecase clipped */ 1363 {160, 90, 166, 101}, /* b edge on t edgecase */ 1364 {170, 90, 176, 101}, /* b edge on t edgecase clipped */ 1365 {160, 199, 166, 210}, /* t edge on b edgecase */ 1366 {170, 200, 176, 210}, /* t edge on b edgecase clipped */ 1367 }; 1368 1369 static const RECT rectangles[] = 1370 { 1371 {10, 11, 100, 101}, 1372 {250, 100, 350, 10}, 1373 {120, 10, 120, 20}, /* zero width */ 1374 {120, 10, 130, 10}, /* zero height */ 1375 {120, 40, 121, 41}, /* 1 x 1 */ 1376 {130, 50, 132, 52}, /* 2 x 2 */ 1377 {140, 60, 143, 63}, /* 3 x 3 */ 1378 {150, 70, 154, 74}, /* 4 x 4 */ 1379 {120, 20, 121, 30}, /* width == 1 */ 1380 {130, 20, 132, 30}, /* width == 2 */ 1381 {140, 20, 143, 30}, /* width == 3 */ 1382 {200, 20, 210, 21}, /* height == 1 */ 1383 {200, 30, 210, 32}, /* height == 2 */ 1384 {200, 40, 210, 43} /* height == 3 */ 1385 }; 1386 1387 static const BITMAPINFOHEADER dib_brush_header_8888 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 32, BI_RGB, 0, 0, 0, 0, 0}; 1388 static const BITMAPINFOHEADER dib_brush_header_24 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 24, BI_RGB, 0, 0, 0, 0, 0}; 1389 static const BITMAPINFOHEADER dib_brush_header_555 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 16, BI_RGB, 0, 0, 0, 0, 0}; 1390 static const BITMAPINFOHEADER dib_brush_header_8 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 8, BI_RGB, 0, 0, 0, 0, 0}; 1391 static const BITMAPINFOHEADER dib_brush_header_4 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 4, BI_RGB, 0, 0, 0, 0, 0}; 1392 static const BITMAPINFOHEADER dib_brush_header_1 = {sizeof(BITMAPINFOHEADER), 16, -16, 1, 1, BI_RGB, 0, 0, 0, 0, 0}; 1393 1394 static const BYTE rle8_data[20] = { 0x03, 0x02, 0x04, 0xf0, 0x00, 0x00, /* 2, 2, 2, f0, f0, f0, f0, <eol> */ 1395 0x00, 0x03, 0x04, 0x05, 0x06, 0x00, /* 4, 5, 6, <pad> */ 1396 0x00, 0x02, 0x01, 0x02, 0x05, 0x80, /* dx=1, dy=2, 80, 80, 80, 80, (80) */ 1397 0x00, 0x01 }; /* <eod> */ 1398 1399 static const DWORD four_by_four_data[16] = { 0x000000, 0xff0000, 0x00ff00, 0x0000ff, 1400 0xffffff, 0x00ffff, 0xff00ff, 0xffff00, 1401 0x000000, 0xff0000, 0x00ff00, 0x0000ff, 1402 0xffffff, 0x00ffff, 0xff00ff, 0xffff00 }; 1403 1404 static const DWORD ddb_brush_bits[8] = { 0x11112222, 0x33334444, 0x55556666, 0x77778888, 1405 0xaaaaaaaa, 0x00000000, 0x98765432, 0xabcdef00 }; 1406 1407 static const RGBQUAD default_palette_1[2] = 1408 { 1409 { 0x00, 0x00, 0x00 }, { 0xff, 0xff, 0xff } 1410 }; 1411 1412 static const RGBQUAD default_palette_4[16] = 1413 { 1414 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 }, 1415 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x80 }, 1416 { 0xc0, 0xc0, 0xc0 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff }, 1417 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff }, 1418 }; 1419 1420 static const RGBQUAD default_palette_8[256] = 1421 { 1422 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x80 }, { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x80 }, 1423 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x80 }, { 0x80, 0x80, 0x00 }, { 0xc0, 0xc0, 0xc0 }, 1424 { 0xc0, 0xdc, 0xc0 }, { 0xf0, 0xca, 0xa6 }, { 0x00, 0x20, 0x40 }, { 0x00, 0x20, 0x60 }, 1425 { 0x00, 0x20, 0x80 }, { 0x00, 0x20, 0xa0 }, { 0x00, 0x20, 0xc0 }, { 0x00, 0x20, 0xe0 }, 1426 { 0x00, 0x40, 0x00 }, { 0x00, 0x40, 0x20 }, { 0x00, 0x40, 0x40 }, { 0x00, 0x40, 0x60 }, 1427 { 0x00, 0x40, 0x80 }, { 0x00, 0x40, 0xa0 }, { 0x00, 0x40, 0xc0 }, { 0x00, 0x40, 0xe0 }, 1428 { 0x00, 0x60, 0x00 }, { 0x00, 0x60, 0x20 }, { 0x00, 0x60, 0x40 }, { 0x00, 0x60, 0x60 }, 1429 { 0x00, 0x60, 0x80 }, { 0x00, 0x60, 0xa0 }, { 0x00, 0x60, 0xc0 }, { 0x00, 0x60, 0xe0 }, 1430 { 0x00, 0x80, 0x00 }, { 0x00, 0x80, 0x20 }, { 0x00, 0x80, 0x40 }, { 0x00, 0x80, 0x60 }, 1431 { 0x00, 0x80, 0x80 }, { 0x00, 0x80, 0xa0 }, { 0x00, 0x80, 0xc0 }, { 0x00, 0x80, 0xe0 }, 1432 { 0x00, 0xa0, 0x00 }, { 0x00, 0xa0, 0x20 }, { 0x00, 0xa0, 0x40 }, { 0x00, 0xa0, 0x60 }, 1433 { 0x00, 0xa0, 0x80 }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa0, 0xc0 }, { 0x00, 0xa0, 0xe0 }, 1434 { 0x00, 0xc0, 0x00 }, { 0x00, 0xc0, 0x20 }, { 0x00, 0xc0, 0x40 }, { 0x00, 0xc0, 0x60 }, 1435 { 0x00, 0xc0, 0x80 }, { 0x00, 0xc0, 0xa0 }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc0, 0xe0 }, 1436 { 0x00, 0xe0, 0x00 }, { 0x00, 0xe0, 0x20 }, { 0x00, 0xe0, 0x40 }, { 0x00, 0xe0, 0x60 }, 1437 { 0x00, 0xe0, 0x80 }, { 0x00, 0xe0, 0xa0 }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe0, 0xe0 }, 1438 { 0x40, 0x00, 0x00 }, { 0x40, 0x00, 0x20 }, { 0x40, 0x00, 0x40 }, { 0x40, 0x00, 0x60 }, 1439 { 0x40, 0x00, 0x80 }, { 0x40, 0x00, 0xa0 }, { 0x40, 0x00, 0xc0 }, { 0x40, 0x00, 0xe0 }, 1440 { 0x40, 0x20, 0x00 }, { 0x40, 0x20, 0x20 }, { 0x40, 0x20, 0x40 }, { 0x40, 0x20, 0x60 }, 1441 { 0x40, 0x20, 0x80 }, { 0x40, 0x20, 0xa0 }, { 0x40, 0x20, 0xc0 }, { 0x40, 0x20, 0xe0 }, 1442 { 0x40, 0x40, 0x00 }, { 0x40, 0x40, 0x20 }, { 0x40, 0x40, 0x40 }, { 0x40, 0x40, 0x60 }, 1443 { 0x40, 0x40, 0x80 }, { 0x40, 0x40, 0xa0 }, { 0x40, 0x40, 0xc0 }, { 0x40, 0x40, 0xe0 }, 1444 { 0x40, 0x60, 0x00 }, { 0x40, 0x60, 0x20 }, { 0x40, 0x60, 0x40 }, { 0x40, 0x60, 0x60 }, 1445 { 0x40, 0x60, 0x80 }, { 0x40, 0x60, 0xa0 }, { 0x40, 0x60, 0xc0 }, { 0x40, 0x60, 0xe0 }, 1446 { 0x40, 0x80, 0x00 }, { 0x40, 0x80, 0x20 }, { 0x40, 0x80, 0x40 }, { 0x40, 0x80, 0x60 }, 1447 { 0x40, 0x80, 0x80 }, { 0x40, 0x80, 0xa0 }, { 0x40, 0x80, 0xc0 }, { 0x40, 0x80, 0xe0 }, 1448 { 0x40, 0xa0, 0x00 }, { 0x40, 0xa0, 0x20 }, { 0x40, 0xa0, 0x40 }, { 0x40, 0xa0, 0x60 }, 1449 { 0x40, 0xa0, 0x80 }, { 0x40, 0xa0, 0xa0 }, { 0x40, 0xa0, 0xc0 }, { 0x40, 0xa0, 0xe0 }, 1450 { 0x40, 0xc0, 0x00 }, { 0x40, 0xc0, 0x20 }, { 0x40, 0xc0, 0x40 }, { 0x40, 0xc0, 0x60 }, 1451 { 0x40, 0xc0, 0x80 }, { 0x40, 0xc0, 0xa0 }, { 0x40, 0xc0, 0xc0 }, { 0x40, 0xc0, 0xe0 }, 1452 { 0x40, 0xe0, 0x00 }, { 0x40, 0xe0, 0x20 }, { 0x40, 0xe0, 0x40 }, { 0x40, 0xe0, 0x60 }, 1453 { 0x40, 0xe0, 0x80 }, { 0x40, 0xe0, 0xa0 }, { 0x40, 0xe0, 0xc0 }, { 0x40, 0xe0, 0xe0 }, 1454 { 0x80, 0x00, 0x00 }, { 0x80, 0x00, 0x20 }, { 0x80, 0x00, 0x40 }, { 0x80, 0x00, 0x60 }, 1455 { 0x80, 0x00, 0x80 }, { 0x80, 0x00, 0xa0 }, { 0x80, 0x00, 0xc0 }, { 0x80, 0x00, 0xe0 }, 1456 { 0x80, 0x20, 0x00 }, { 0x80, 0x20, 0x20 }, { 0x80, 0x20, 0x40 }, { 0x80, 0x20, 0x60 }, 1457 { 0x80, 0x20, 0x80 }, { 0x80, 0x20, 0xa0 }, { 0x80, 0x20, 0xc0 }, { 0x80, 0x20, 0xe0 }, 1458 { 0x80, 0x40, 0x00 }, { 0x80, 0x40, 0x20 }, { 0x80, 0x40, 0x40 }, { 0x80, 0x40, 0x60 }, 1459 { 0x80, 0x40, 0x80 }, { 0x80, 0x40, 0xa0 }, { 0x80, 0x40, 0xc0 }, { 0x80, 0x40, 0xe0 }, 1460 { 0x80, 0x60, 0x00 }, { 0x80, 0x60, 0x20 }, { 0x80, 0x60, 0x40 }, { 0x80, 0x60, 0x60 }, 1461 { 0x80, 0x60, 0x80 }, { 0x80, 0x60, 0xa0 }, { 0x80, 0x60, 0xc0 }, { 0x80, 0x60, 0xe0 }, 1462 { 0x80, 0x80, 0x00 }, { 0x80, 0x80, 0x20 }, { 0x80, 0x80, 0x40 }, { 0x80, 0x80, 0x60 }, 1463 { 0x80, 0x80, 0x80 }, { 0x80, 0x80, 0xa0 }, { 0x80, 0x80, 0xc0 }, { 0x80, 0x80, 0xe0 }, 1464 { 0x80, 0xa0, 0x00 }, { 0x80, 0xa0, 0x20 }, { 0x80, 0xa0, 0x40 }, { 0x80, 0xa0, 0x60 }, 1465 { 0x80, 0xa0, 0x80 }, { 0x80, 0xa0, 0xa0 }, { 0x80, 0xa0, 0xc0 }, { 0x80, 0xa0, 0xe0 }, 1466 { 0x80, 0xc0, 0x00 }, { 0x80, 0xc0, 0x20 }, { 0x80, 0xc0, 0x40 }, { 0x80, 0xc0, 0x60 }, 1467 { 0x80, 0xc0, 0x80 }, { 0x80, 0xc0, 0xa0 }, { 0x80, 0xc0, 0xc0 }, { 0x80, 0xc0, 0xe0 }, 1468 { 0x80, 0xe0, 0x00 }, { 0x80, 0xe0, 0x20 }, { 0x80, 0xe0, 0x40 }, { 0x80, 0xe0, 0x60 }, 1469 { 0x80, 0xe0, 0x80 }, { 0x80, 0xe0, 0xa0 }, { 0x80, 0xe0, 0xc0 }, { 0x80, 0xe0, 0xe0 }, 1470 { 0xc0, 0x00, 0x00 }, { 0xc0, 0x00, 0x20 }, { 0xc0, 0x00, 0x40 }, { 0xc0, 0x00, 0x60 }, 1471 { 0xc0, 0x00, 0x80 }, { 0xc0, 0x00, 0xa0 }, { 0xc0, 0x00, 0xc0 }, { 0xc0, 0x00, 0xe0 }, 1472 { 0xc0, 0x20, 0x00 }, { 0xc0, 0x20, 0x20 }, { 0xc0, 0x20, 0x40 }, { 0xc0, 0x20, 0x60 }, 1473 { 0xc0, 0x20, 0x80 }, { 0xc0, 0x20, 0xa0 }, { 0xc0, 0x20, 0xc0 }, { 0xc0, 0x20, 0xe0 }, 1474 { 0xc0, 0x40, 0x00 }, { 0xc0, 0x40, 0x20 }, { 0xc0, 0x40, 0x40 }, { 0xc0, 0x40, 0x60 }, 1475 { 0xc0, 0x40, 0x80 }, { 0xc0, 0x40, 0xa0 }, { 0xc0, 0x40, 0xc0 }, { 0xc0, 0x40, 0xe0 }, 1476 { 0xc0, 0x60, 0x00 }, { 0xc0, 0x60, 0x20 }, { 0xc0, 0x60, 0x40 }, { 0xc0, 0x60, 0x60 }, 1477 { 0xc0, 0x60, 0x80 }, { 0xc0, 0x60, 0xa0 }, { 0xc0, 0x60, 0xc0 }, { 0xc0, 0x60, 0xe0 }, 1478 { 0xc0, 0x80, 0x00 }, { 0xc0, 0x80, 0x20 }, { 0xc0, 0x80, 0x40 }, { 0xc0, 0x80, 0x60 }, 1479 { 0xc0, 0x80, 0x80 }, { 0xc0, 0x80, 0xa0 }, { 0xc0, 0x80, 0xc0 }, { 0xc0, 0x80, 0xe0 }, 1480 { 0xc0, 0xa0, 0x00 }, { 0xc0, 0xa0, 0x20 }, { 0xc0, 0xa0, 0x40 }, { 0xc0, 0xa0, 0x60 }, 1481 { 0xc0, 0xa0, 0x80 }, { 0xc0, 0xa0, 0xa0 }, { 0xc0, 0xa0, 0xc0 }, { 0xc0, 0xa0, 0xe0 }, 1482 { 0xc0, 0xc0, 0x00 }, { 0xc0, 0xc0, 0x20 }, { 0xc0, 0xc0, 0x40 }, { 0xc0, 0xc0, 0x60 }, 1483 { 0xc0, 0xc0, 0x80 }, { 0xc0, 0xc0, 0xa0 }, { 0xf0, 0xfb, 0xff }, { 0xa4, 0xa0, 0xa0 }, 1484 { 0x80, 0x80, 0x80 }, { 0x00, 0x00, 0xff }, { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0xff }, 1485 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0xff }, { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0xff } 1486 }; 1487 1488 static HPALETTE create_default_palette( int bpp ) 1489 { 1490 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)]; 1491 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer; 1492 PALETTEENTRY *entries = pal->palPalEntry; 1493 int i; 1494 1495 pal->palVersion = 0x300; 1496 pal->palNumEntries = 1 << bpp; 1497 switch (bpp) 1498 { 1499 case 1: 1500 for (i = 0; i < 2; i++) 1501 { 1502 entries[i].peRed = default_palette_1[i].rgbRed; 1503 entries[i].peGreen = default_palette_1[i].rgbGreen; 1504 entries[i].peBlue = default_palette_1[i].rgbBlue; 1505 entries[i].peFlags = 0; 1506 } 1507 break; 1508 case 4: 1509 for (i = 0; i < 16; i++) 1510 { 1511 entries[i].peRed = default_palette_4[i].rgbRed; 1512 entries[i].peGreen = default_palette_4[i].rgbGreen; 1513 entries[i].peBlue = default_palette_4[i].rgbBlue; 1514 entries[i].peFlags = 0; 1515 } 1516 break; 1517 case 8: 1518 for (i = 0; i < 256; i++) 1519 { 1520 entries[i].peRed = default_palette_8[i].rgbRed; 1521 entries[i].peGreen = default_palette_8[i].rgbGreen; 1522 entries[i].peBlue = default_palette_8[i].rgbBlue; 1523 entries[i].peFlags = 0; 1524 } 1525 break; 1526 } 1527 return CreatePalette( pal ); 1528 } 1529 1530 static inline void solid_patblt( HDC hdc, int x, int y, int width, int height, COLORREF color ) 1531 { 1532 HBRUSH brush = CreateSolidBrush( color ); 1533 brush = SelectObject( hdc, brush ); 1534 PatBlt( hdc, x, y, width, height, PATCOPY ); 1535 DeleteObject( SelectObject( hdc, brush ) ); 1536 } 1537 1538 static void draw_graphics(HDC hdc, const BITMAPINFO *bmi, BYTE *bits) 1539 { 1540 char pal_buffer[sizeof(LOGPALETTE) + 255 * sizeof(PALETTEENTRY)]; 1541 LOGPALETTE *pal = (LOGPALETTE *)pal_buffer; 1542 PALETTEENTRY *entries = pal->palPalEntry; 1543 HPEN solid_pen, dashed_pen, wide_pen, orig_pen; 1544 LOGBRUSH log_brush; 1545 HBRUSH solid_brush, dib_brush, hatch_brush, orig_brush; 1546 HBITMAP bmp; 1547 INT i, j, x, y, hatch_style; 1548 HDC src_dc; 1549 HRGN hrgn, hrgn2; 1550 BYTE dib_src_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]; 1551 BYTE dib_brush_buf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD) + 16 * 16 * sizeof(DWORD)]; /* Enough for 16 x 16 at 32 bpp */ 1552 BITMAPINFO *src_bi = (BITMAPINFO*)dib_src_buf; 1553 BITMAPINFO *brush_bi = (BITMAPINFO*)dib_brush_buf; 1554 RGBQUAD *brush_colors = brush_bi->bmiColors; 1555 BYTE *brush_bits, *src_bits; 1556 BOOL ret, dib_is_1bpp = (bmi->bmiHeader.biBitCount == 1); 1557 BOOL dib_is_8bpp_gray = (bmi->bmiHeader.biBitCount == 8 && bmi->bmiColors[1].rgbRed == 1); 1558 BLENDFUNCTION blend; 1559 COLORREF old_text, old_bkgnd; 1560 HPALETTE hpal, old_hpal; 1561 1562 blend.BlendOp = AC_SRC_OVER; 1563 blend.BlendFlags = 0; 1564 1565 reset_bounds( hdc ); 1566 1567 memset(bits, 0xcc, get_dib_size(bmi)); 1568 compare_hash(hdc, bmi, bits, "empty"); 1569 1570 src_dc = CreateCompatibleDC( 0 ); 1571 solid_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0xff)); 1572 orig_pen = SelectObject(hdc, solid_pen); 1573 SetBrushOrgEx(hdc, 0, 0, NULL); 1574 1575 /* horizontal and vertical lines */ 1576 for(i = 1; i <= 16; i++) 1577 { 1578 SetROP2(hdc, i); 1579 MoveToEx(hdc, 10, i * 3, NULL); 1580 LineTo(hdc, 100, i * 3); /* l -> r */ 1581 MoveToEx(hdc, 100, 50 + i * 3, NULL); 1582 LineTo(hdc, 10, 50 + i * 3); /* r -> l */ 1583 MoveToEx(hdc, 120 + i * 3, 10, NULL); 1584 LineTo(hdc, 120 + i * 3, 100); /* t -> b */ 1585 MoveToEx(hdc, 170 + i * 3, 100, NULL); 1586 LineTo(hdc, 170 + i * 3, 10); /* b -> t */ 1587 } 1588 compare_hash(hdc, bmi, bits, "h and v solid lines"); 1589 1590 /* diagonal lines */ 1591 SetROP2(hdc, R2_COPYPEN); 1592 for(i = 0; i < 16; i++) 1593 { 1594 double s = sin(M_PI * i / 8.0); 1595 double c = cos(M_PI * i / 8.0); 1596 1597 MoveToEx(hdc, 200.5 + 10 * c, 200.5 + 10 * s, NULL); 1598 LineTo(hdc, 200.5 + 100 * c, 200.5 + 100 * s); 1599 } 1600 compare_hash(hdc, bmi, bits, "diagonal solid lines"); 1601 1602 for(i = 0; i < sizeof(bias_check) / sizeof(bias_check[0]); i++) 1603 { 1604 MoveToEx(hdc, bias_check[i].left, bias_check[i].top, NULL); 1605 LineTo(hdc, bias_check[i].right, bias_check[i].bottom); 1606 } 1607 compare_hash(hdc, bmi, bits, "more diagonal solid lines"); 1608 1609 /* solid brush PatBlt */ 1610 solid_brush = CreateSolidBrush(RGB(0x33, 0xaa, 0xff)); 1611 orig_brush = SelectObject(hdc, solid_brush); 1612 1613 for(i = 0, y = 10; i < 256; i++) 1614 { 1615 ret = PatBlt(hdc, 10, y, 100, 10, rop3[i]); 1616 1617 if(rop_uses_src(rop3[i])) 1618 ok(ret == FALSE, "got TRUE for %x\n", rop3[i]); 1619 else 1620 { 1621 ok(ret, "got FALSE for %x\n", rop3[i]); 1622 y += 20; 1623 } 1624 1625 } 1626 compare_hash(hdc, bmi, bits, "solid patblt"); 1627 1628 /* clipped lines */ 1629 hrgn = CreateRectRgn(10, 10, 200, 20); 1630 hrgn2 = CreateRectRgn(100, 100, 200, 200); 1631 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR); 1632 SetRectRgn(hrgn2, 290, 100, 300, 200); 1633 CombineRgn(hrgn, hrgn, hrgn2, RGN_OR); 1634 ExtSelectClipRgn(hdc, hrgn, RGN_COPY); 1635 DeleteObject(hrgn2); 1636 1637 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++) 1638 { 1639 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL); 1640 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom); 1641 } 1642 compare_hash(hdc, bmi, bits, "clipped solid hlines"); 1643 1644 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++) 1645 { 1646 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL); 1647 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom); 1648 } 1649 compare_hash(hdc, bmi, bits, "clipped solid vlines"); 1650 1651 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++) 1652 { 1653 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL); 1654 LineTo(hdc, line_clips[i].right, line_clips[i].bottom); 1655 } 1656 compare_hash(hdc, bmi, bits, "clipped solid diagonal lines"); 1657 1658 /* clipped PatBlt */ 1659 for(i = 0; i < sizeof(patblt_clips) / sizeof(patblt_clips[0]); i++) 1660 { 1661 PatBlt(hdc, patblt_clips[i].left, patblt_clips[i].top, 1662 patblt_clips[i].right - patblt_clips[i].left, 1663 patblt_clips[i].bottom - patblt_clips[i].top, PATCOPY); 1664 } 1665 compare_hash(hdc, bmi, bits, "clipped patblt"); 1666 1667 /* clipped dashed lines */ 1668 dashed_pen = CreatePen(PS_DASH, 1, RGB(0xff, 0, 0)); 1669 SelectObject(hdc, dashed_pen); 1670 SetBkMode(hdc, TRANSPARENT); 1671 SetBkColor(hdc, RGB(0, 0xff, 0)); 1672 1673 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++) 1674 { 1675 MoveToEx(hdc, hline_clips[i].left, hline_clips[i].top, NULL); 1676 LineTo(hdc, hline_clips[i].right, hline_clips[i].bottom); 1677 } 1678 compare_hash(hdc, bmi, bits, "clipped dashed hlines"); 1679 1680 for(i = 0; i < sizeof(hline_clips)/sizeof(hline_clips[0]); i++) 1681 { 1682 MoveToEx(hdc, hline_clips[i].right - 1, hline_clips[i].bottom, NULL); 1683 LineTo(hdc, hline_clips[i].left - 1, hline_clips[i].top); 1684 } 1685 compare_hash(hdc, bmi, bits, "clipped dashed hlines r -> l"); 1686 1687 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++) 1688 { 1689 MoveToEx(hdc, vline_clips[i].left, vline_clips[i].top, NULL); 1690 LineTo(hdc, vline_clips[i].right, vline_clips[i].bottom); 1691 } 1692 compare_hash(hdc, bmi, bits, "clipped dashed vlines"); 1693 1694 for(i = 0; i < sizeof(vline_clips)/sizeof(vline_clips[0]); i++) 1695 { 1696 MoveToEx(hdc, vline_clips[i].right, vline_clips[i].bottom - 1, NULL); 1697 LineTo(hdc, vline_clips[i].left, vline_clips[i].top - 1); 1698 } 1699 compare_hash(hdc, bmi, bits, "clipped dashed vlines b -> t"); 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 dashed diagonal lines"); 1707 1708 SetBkMode(hdc, OPAQUE); 1709 1710 for(i = 0; i < sizeof(line_clips)/sizeof(line_clips[0]); i++) 1711 { 1712 MoveToEx(hdc, line_clips[i].left, line_clips[i].top, NULL); 1713 LineTo(hdc, line_clips[i].right, line_clips[i].bottom); 1714 } 1715 compare_hash(hdc, bmi, bits, "clipped opaque dashed diagonal lines"); 1716 1717 ExtSelectClipRgn(hdc, NULL, RGN_COPY); 1718 1719 /* 8888 DIB pattern brush */ 1720 1721 brush_bi->bmiHeader = dib_brush_header_8888; 1722 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER); 1723 memset(brush_bits, 0, 16 * 16 * sizeof(DWORD)); 1724 brush_bits[2] = 0xff; 1725 brush_bits[6] = 0xff; 1726 brush_bits[14] = 0xff; 1727 brush_bits[65] = 0xff; 1728 brush_bits[69] = 0xff; 1729 brush_bits[72] = 0xff; 1730 1731 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1732 1733 SelectObject(hdc, dib_brush); 1734 SetBrushOrgEx(hdc, 1, 1, NULL); 1735 1736 for(i = 0, y = 10; i < 256; i++) 1737 { 1738 if(!rop_uses_src(rop3[i])) 1739 { 1740 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1741 ok(ret, "got FALSE for %x\n", rop3[i]); 1742 y += 25; 1743 } 1744 } 1745 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8888 dib brush patblt", 0, dib_is_1bpp); 1746 1747 SelectObject(hdc, orig_brush); 1748 DeleteObject(dib_brush); 1749 1750 /* 8888 bottom-up DIB pattern brush */ 1751 1752 brush_bi->bmiHeader.biHeight = -brush_bi->bmiHeader.biHeight; 1753 1754 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1755 1756 SelectObject(hdc, dib_brush); 1757 1758 /* This used to set the x origin to 100 as well, but 1759 there's a Windows bug for 24 bpp where the brush's x offset 1760 is incorrectly calculated for rops that involve both D and P */ 1761 SetBrushOrgEx(hdc, 4, 100, NULL); 1762 1763 for(i = 0, y = 10; i < 256; i++) 1764 { 1765 if(!rop_uses_src(rop3[i])) 1766 { 1767 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1768 ok(ret, "got FALSE for %x\n", rop3[i]); 1769 y += 25; 1770 } 1771 } 1772 compare_hash(hdc, bmi, bits, "bottom-up 8888 dib brush patblt"); 1773 1774 SelectObject(hdc, orig_brush); 1775 DeleteObject(dib_brush); 1776 1777 /* 24 bpp dib pattern brush */ 1778 1779 brush_bi->bmiHeader = dib_brush_header_24; 1780 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER); 1781 memset(brush_bits, 0, 16 * 16 * 3); 1782 brush_bits[0] = brush_bits[3] = brush_bits[6] = brush_bits[8] = 0xff; 1783 brush_bits[49] = brush_bits[52] = 0xff; 1784 1785 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1786 1787 SelectObject(hdc, dib_brush); 1788 SetBrushOrgEx(hdc, 1, 1, NULL); 1789 1790 for(i = 0, y = 10; i < 256; i++) 1791 { 1792 if(!rop_uses_src(rop3[i])) 1793 { 1794 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1795 ok(ret, "got FALSE for %x\n", rop3[i]); 1796 y += 25; 1797 } 1798 } 1799 compare_hash(hdc, bmi, bits, "top-down 24 bpp brush patblt"); 1800 1801 SelectObject(hdc, orig_brush); 1802 DeleteObject(dib_brush); 1803 1804 /* 555 dib pattern brush */ 1805 1806 brush_bi->bmiHeader = dib_brush_header_555; 1807 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER); 1808 memset(brush_bits, 0, 16 * 16 * sizeof(WORD)); 1809 brush_bits[0] = brush_bits[1] = 0xff; 1810 brush_bits[32] = brush_bits[34] = 0x7c; 1811 1812 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1813 1814 SelectObject(hdc, dib_brush); 1815 SetBrushOrgEx(hdc, 1, 1, NULL); 1816 1817 for(i = 0, y = 10; i < 256; i++) 1818 { 1819 if(!rop_uses_src(rop3[i])) 1820 { 1821 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1822 ok(ret, "got FALSE for %x\n", rop3[i]); 1823 y += 25; 1824 } 1825 } 1826 compare_hash_broken_todo(hdc, bmi, bits, "top-down 555 dib brush patblt", 0, dib_is_1bpp); 1827 1828 SelectObject(hdc, orig_brush); 1829 DeleteObject(dib_brush); 1830 1831 SetBrushOrgEx(hdc, 0, 0, NULL); 1832 1833 /* 8 bpp dib pattern brush */ 1834 1835 brush_bi->bmiHeader = dib_brush_header_8; 1836 brush_bi->bmiHeader.biClrUsed = 3; 1837 memset(brush_colors, 0, brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD)); 1838 brush_colors[0].rgbRed = 0xff; 1839 brush_colors[1].rgbRed = 0xff; 1840 brush_colors[1].rgbGreen = 0xff; 1841 brush_colors[1].rgbBlue = 0xff; 1842 1843 brush_bits = (BYTE*)brush_bi + sizeof(BITMAPINFOHEADER) + brush_bi->bmiHeader.biClrUsed * sizeof(RGBQUAD); 1844 memset(brush_bits, 0, 16 * 16 * sizeof(BYTE)); 1845 brush_bits[0] = brush_bits[1] = 1; 1846 brush_bits[16] = brush_bits[17] = 2; 1847 brush_bits[32] = brush_bits[33] = 6; 1848 1849 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1850 1851 SelectObject(hdc, dib_brush); 1852 SetBrushOrgEx(hdc, 1, 1, NULL); 1853 1854 for(i = 0, y = 10; i < 256; i++) 1855 { 1856 if(!rop_uses_src(rop3[i])) 1857 { 1858 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1859 ok(ret, "got FALSE for %x\n", rop3[i]); 1860 y += 25; 1861 } 1862 } 1863 compare_hash_broken_todo(hdc, bmi, bits, "top-down 8 bpp dib brush patblt", 0, dib_is_1bpp); 1864 1865 SelectObject(hdc, orig_brush); 1866 DeleteObject(dib_brush); 1867 1868 /* 4 bpp dib pattern brush */ 1869 1870 brush_bi->bmiHeader = dib_brush_header_4; 1871 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1872 1873 SelectObject(hdc, dib_brush); 1874 SetBrushOrgEx(hdc, 1, 1, NULL); 1875 1876 for(i = 0, y = 10; i < 256; i++) 1877 { 1878 if(!rop_uses_src(rop3[i])) 1879 { 1880 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1881 ok(ret, "got FALSE for %x\n", rop3[i]); 1882 y += 25; 1883 } 1884 } 1885 compare_hash_broken_todo(hdc, bmi, bits, "top-down 4 bpp dib brush patblt", 0, dib_is_1bpp); 1886 1887 SelectObject(hdc, orig_brush); 1888 DeleteObject(dib_brush); 1889 1890 /* 1 bpp dib pattern brush */ 1891 1892 brush_bi->bmiHeader = dib_brush_header_1; 1893 brush_bi->bmiHeader.biClrUsed = 2; 1894 memset(brush_bits, 0, 16 * 4); 1895 brush_bits[0] = 0xf0; 1896 brush_bits[4] = 0xf0; 1897 brush_bits[8] = 0xf0; 1898 1899 dib_brush = CreateDIBPatternBrushPt(brush_bi, DIB_RGB_COLORS); 1900 SelectObject(hdc, dib_brush); 1901 for(i = 0, y = 10; i < 256; i++) 1902 { 1903 if(!rop_uses_src(rop3[i])) 1904 { 1905 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1906 ok(ret, "got FALSE for %x\n", rop3[i]); 1907 y += 25; 1908 } 1909 } 1910 1911 compare_hash_broken_todo(hdc, bmi, bits, "top-down 1 bpp dib brush patblt", 0, dib_is_1bpp); 1912 1913 SelectObject(hdc, orig_brush); 1914 DeleteObject(dib_brush); 1915 1916 /* 1 bpp ddb pattern brush */ 1917 1918 old_text = GetTextColor( hdc ); 1919 old_bkgnd = GetBkColor( hdc ); 1920 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits ); 1921 dib_brush = CreatePatternBrush( bmp ); 1922 SelectObject(hdc, dib_brush); 1923 for(i = 0, y = 10; i < 256; i++) 1924 { 1925 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) ); 1926 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) ); 1927 if(!rop_uses_src(rop3[i])) 1928 { 1929 ret = PatBlt(hdc, 10 + i, y, 100, 20, rop3[i]); 1930 ok(ret, "got FALSE for %x\n", rop3[i]); 1931 y += 25; 1932 } 1933 } 1934 1935 compare_hash_broken_todo(hdc, bmi, bits, "1 bpp ddb brush patblt", 0, dib_is_1bpp); 1936 1937 DeleteObject(bmp); 1938 SelectObject(hdc, orig_brush); 1939 DeleteObject( dib_brush ); 1940 SetBrushOrgEx(hdc, 0, 0, NULL); 1941 SetTextColor(hdc, old_text); 1942 SetBkColor(hdc, old_bkgnd); 1943 1944 /* Rectangle */ 1945 1946 SelectObject(hdc, solid_pen); 1947 SelectObject(hdc, solid_brush); 1948 1949 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++) 1950 { 1951 Rectangle(hdc, rectangles[i].left, rectangles[i].top, rectangles[i].right, rectangles[i].bottom); 1952 } 1953 1954 SelectObject(hdc, dashed_pen); 1955 for(i = 0; i < sizeof(rectangles)/sizeof(rectangles[0]); i++) 1956 { 1957 Rectangle(hdc, rectangles[i].left, rectangles[i].top + 150, rectangles[i].right, rectangles[i].bottom + 150); 1958 } 1959 1960 compare_hash(hdc, bmi, bits, "rectangles"); 1961 SelectObject(hdc, solid_pen); 1962 1963 /* PaintRgn */ 1964 1965 PaintRgn(hdc, hrgn); 1966 compare_hash(hdc, bmi, bits, "PaintRgn"); 1967 1968 /* RTL rectangles */ 1969 1970 SetLayout(hdc, LAYOUT_RTL); 1971 PaintRgn(hdc, hrgn); 1972 PatBlt(hdc, 10, 250, 10, 10, PATCOPY); 1973 Rectangle(hdc, 100, 250, 110, 260); 1974 compare_hash(hdc, bmi, bits, "rtl"); 1975 SetLayout(hdc, LAYOUT_LTR); 1976 DeleteObject( hrgn ); 1977 1978 for(i = 0, y = 10; i < 256; i++) 1979 { 1980 if(!rop_uses_src(rop3[i])) 1981 { 1982 for(hatch_style = HS_HORIZONTAL; hatch_style <= HS_DIAGCROSS; hatch_style++) 1983 { 1984 hatch_brush = CreateHatchBrush(hatch_style, RGB(0xff, 0, 0)); 1985 SelectObject(hdc, hatch_brush); 1986 ret = PatBlt(hdc, 10 + i + 30 * hatch_style, y, 20, 20, rop3[i]); 1987 ok(ret, "got FALSE for %x\n", rop3[i]); 1988 SelectObject(hdc, orig_brush); 1989 DeleteObject(hatch_brush); 1990 } 1991 y += 25; 1992 } 1993 } 1994 1995 compare_hash(hdc, bmi, bits, "hatch brushes"); 1996 1997 /* overlapping blits */ 1998 1999 orig_brush = SelectObject(hdc, solid_brush); 2000 2001 Rectangle(hdc, 10, 10, 100, 100); 2002 Rectangle(hdc, 20, 15, 30, 40); 2003 Rectangle(hdc, 15, 15, 20, 20); 2004 Rectangle(hdc, 15, 20, 50, 45); 2005 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, SRCCOPY ); 2006 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, +y"); 2007 2008 Rectangle(hdc, 10, 10, 100, 100); 2009 Rectangle(hdc, 20, 15, 30, 40); 2010 Rectangle(hdc, 15, 15, 20, 20); 2011 Rectangle(hdc, 15, 20, 50, 45); 2012 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, SRCCOPY ); 2013 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */ 2014 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y",1, FALSE); 2015 else 2016 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, -y"); 2017 2018 Rectangle(hdc, 10, 10, 100, 100); 2019 Rectangle(hdc, 20, 15, 30, 40); 2020 Rectangle(hdc, 15, 15, 20, 20); 2021 Rectangle(hdc, 15, 20, 50, 45); 2022 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, SRCCOPY ); 2023 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY +x, -y"); 2024 2025 Rectangle(hdc, 10, 10, 100, 100); 2026 Rectangle(hdc, 20, 15, 30, 40); 2027 Rectangle(hdc, 15, 15, 20, 20); 2028 Rectangle(hdc, 15, 20, 50, 45); 2029 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, SRCCOPY ); 2030 if (bmi->bmiHeader.biBitCount == 1) /* Windows gets this one wrong */ 2031 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y", 1, FALSE ); 2032 else 2033 compare_hash(hdc, bmi, bits, "overlapping BitBlt SRCCOPY -x, +y" ); 2034 2035 Rectangle(hdc, 10, 10, 100, 100); 2036 Rectangle(hdc, 20, 15, 30, 40); 2037 Rectangle(hdc, 15, 15, 20, 20); 2038 Rectangle(hdc, 15, 20, 50, 45); 2039 BitBlt( hdc, 20, 20, 100, 100, hdc, 10, 10, PATPAINT ); 2040 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, +y"); 2041 2042 Rectangle(hdc, 10, 10, 100, 100); 2043 Rectangle(hdc, 20, 15, 30, 40); 2044 Rectangle(hdc, 15, 15, 20, 20); 2045 Rectangle(hdc, 15, 20, 50, 45); 2046 BitBlt( hdc, 10, 10, 100, 100, hdc, 20, 20, PATPAINT ); 2047 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, -y"); 2048 2049 Rectangle(hdc, 10, 10, 100, 100); 2050 Rectangle(hdc, 20, 15, 30, 40); 2051 Rectangle(hdc, 15, 15, 20, 20); 2052 Rectangle(hdc, 15, 20, 50, 45); 2053 BitBlt( hdc, 20, 10, 100, 100, hdc, 10, 20, PATPAINT ); 2054 if (bmi->bmiHeader.biBitCount >= 24) /* Windows gets this one wrong */ 2055 compare_hash_broken_todo(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y", 1, FALSE); 2056 else 2057 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT +x, -y"); 2058 2059 Rectangle(hdc, 10, 10, 100, 100); 2060 Rectangle(hdc, 20, 15, 30, 40); 2061 Rectangle(hdc, 15, 15, 20, 20); 2062 Rectangle(hdc, 15, 20, 50, 45); 2063 BitBlt( hdc, 10, 20, 100, 100, hdc, 20, 10, PATPAINT ); 2064 compare_hash(hdc, bmi, bits, "overlapping BitBlt PATPAINT -x, +y" ); 2065 2066 /* blitting with 32-bpp BI_RGB source */ 2067 2068 memset( dib_src_buf, 0, sizeof(dib_src_buf) ); 2069 src_bi->bmiHeader.biSize = sizeof(bmi->bmiHeader); 2070 src_bi->bmiHeader.biHeight = 256; 2071 src_bi->bmiHeader.biWidth = 256; 2072 src_bi->bmiHeader.biBitCount = 32; 2073 src_bi->bmiHeader.biPlanes = 1; 2074 src_bi->bmiHeader.biCompression = BI_RGB; 2075 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2076 SelectObject( src_dc, bmp ); 2077 for (y = 0; y < 256; y++) 2078 for (x = 0; x < 256; x++) 2079 { 2080 BYTE a = (x + y) * 2; 2081 BYTE r = (BYTE)(y + 2 * x) * a / 255; 2082 BYTE g = (BYTE)(x + y / 3) * a / 255; 2083 BYTE b = (BYTE)(x / 3 + 2 * y) * a / 255; 2084 ((DWORD *)src_bits)[y * 256 + x] = (a << 24) | RGB( r, g, b ); 2085 } 2086 2087 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2088 2089 /* Interesting cases for 1-bpp dst */ 2090 BitBlt( hdc, 1, 4, 2, 2, src_dc, 0, 0, SRCCOPY ); 2091 BitBlt( hdc, 1, 8, 16, 2, src_dc, 0, 0, SRCCOPY ); 2092 BitBlt( hdc, 1, 12, 15, 2, src_dc, 0, 0, SRCCOPY ); 2093 BitBlt( hdc, 0, 16, 8, 2, src_dc, 0, 0, SRCCOPY ); 2094 BitBlt( hdc, 0, 20, 9, 2, src_dc, 0, 0, SRCCOPY ); 2095 BitBlt( hdc, 7, 24, 1, 2, src_dc, 0, 0, SRCCOPY ); 2096 BitBlt( hdc, 7, 28, 2, 2, src_dc, 0, 0, SRCCOPY ); 2097 BitBlt( hdc, 7, 32, 9, 2, src_dc, 0, 0, SRCCOPY ); 2098 BitBlt( hdc, 7, 36, 10, 2, src_dc, 0, 0, SRCCOPY ); 2099 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp SRCCOPY" ); 2100 2101 blend.SourceConstantAlpha = 0xd0; 2102 blend.AlphaFormat = 0; 2103 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend ); 2104 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp no alpha", 0, dib_is_1bpp ); 2105 2106 blend.SourceConstantAlpha = 0xb0; 2107 blend.AlphaFormat = AC_SRC_ALPHA; 2108 GdiAlphaBlend( hdc, 50, 50, 256, 256, src_dc, 0, 0, 256, 256, blend ); 2109 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 32-bpp alpha", 0, dib_is_1bpp ); 2110 2111 /* blitting with 32-bpp r10g10b10 source */ 2112 2113 src_bi->bmiHeader.biBitCount = 32; 2114 src_bi->bmiHeader.biCompression = BI_BITFIELDS; 2115 ((DWORD *)src_bi->bmiColors)[0] = 0x3ff00000; 2116 ((DWORD *)src_bi->bmiColors)[1] = 0x000ffc00; 2117 ((DWORD *)src_bi->bmiColors)[2] = 0x000003ff; 2118 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2119 SelectObject( src_dc, bmp ); 2120 for (y = 0; y < 256; y++) 2121 for (x = 0; x < 256; x++) 2122 { 2123 WORD r = (7 * x + 3 * y) % 1024; 2124 WORD g = (11 * x + y / 3) % 1024; 2125 WORD b = (x / 3 + 9 * y) % 1024; 2126 ((DWORD *)src_bits)[y * 256 + x] = r << 20 | g << 10 | b; 2127 } 2128 2129 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2130 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp r10g10b10 SRCCOPY" ); 2131 2132 /* blitting with 32-bpp b6g6r6 source */ 2133 2134 src_bi->bmiHeader.biBitCount = 32; 2135 src_bi->bmiHeader.biCompression = BI_BITFIELDS; 2136 ((DWORD *)src_bi->bmiColors)[0] = 0x00003f; 2137 ((DWORD *)src_bi->bmiColors)[1] = 0x000fc0; 2138 ((DWORD *)src_bi->bmiColors)[2] = 0x03f000; 2139 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2140 SelectObject( src_dc, bmp ); 2141 for (y = 0; y < 256; y++) 2142 for (x = 0; x < 256; x++) 2143 { 2144 BYTE r = (y + 2 * x) % 64; 2145 BYTE g = (x + y / 3) % 64; 2146 BYTE b = (x / 3 + 2 * y) % 64; 2147 ((DWORD *)src_bits)[y * 256 + x] = r | g << 6 | b << 12; 2148 } 2149 2150 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2151 compare_hash(hdc, bmi, bits, "BitBlt src 32-bpp b6g6r6 SRCCOPY" ); 2152 2153 /* blitting with 24-bpp source */ 2154 2155 src_bi->bmiHeader.biBitCount = 24; 2156 src_bi->bmiHeader.biCompression = BI_RGB; 2157 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2158 DeleteObject( SelectObject( src_dc, bmp ) ); 2159 for (y = 0; y < 256; y++) 2160 for (x = 0; x < 256; x++) 2161 { 2162 src_bits[(y * 256 + x) * 3 + 0] = x + 3 * y; 2163 src_bits[(y * 256 + x) * 3 + 1] = 2 * x + 7 * y; 2164 src_bits[(y * 256 + x) * 3 + 2] = 5 * x + 12 * y; 2165 } 2166 2167 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2168 compare_hash(hdc, bmi, bits, "BitBlt src 24-bpp SRCCOPY" ); 2169 2170 blend.SourceConstantAlpha = 0xe0; 2171 blend.AlphaFormat = 0; 2172 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend ); 2173 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 24-bpp", 0, dib_is_1bpp ); 2174 2175 /* blitting with 16-bpp BI_RGB source */ 2176 2177 src_bi->bmiHeader.biBitCount = 16; 2178 src_bi->bmiHeader.biCompression = BI_RGB; 2179 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2180 DeleteObject( SelectObject( src_dc, bmp ) ); 2181 for (y = 0; y < 256; y++) 2182 for (x = 0; x < 256; x++) 2183 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7; 2184 2185 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2186 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp SRCCOPY" ); 2187 2188 /* blitting with 16-bpp b4g4r4 source */ 2189 2190 src_bi->bmiHeader.biBitCount = 16; 2191 src_bi->bmiHeader.biCompression = BI_BITFIELDS; 2192 ((DWORD *)src_bi->bmiColors)[0] = 0x00000f; 2193 ((DWORD *)src_bi->bmiColors)[1] = 0x0000f0; 2194 ((DWORD *)src_bi->bmiColors)[2] = 0x000f00; 2195 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2196 DeleteObject( SelectObject( src_dc, bmp ) ); 2197 for (y = 0; y < 256; y++) 2198 for (x = 0; x < 256; x++) 2199 ((WORD *)src_bits)[y * 256 + x] = x | x << 4 | x << 8 | y << 3 | y << 7; 2200 2201 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2202 compare_hash(hdc, bmi, bits, "BitBlt src 16-bpp b4g4r4 SRCCOPY" ); 2203 2204 /* blitting with 8-bpp source */ 2205 2206 src_bi->bmiHeader.biBitCount = 8; 2207 src_bi->bmiHeader.biCompression = BI_RGB; 2208 src_bi->bmiHeader.biClrUsed = 160; 2209 for (i = 0; i < 256; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 3) << 8 | (i / 2) << 16; 2210 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2211 DeleteObject( SelectObject( src_dc, bmp ) ); 2212 for (y = 0; y < 256; y++) 2213 for (x = 0; x < 256; x++) 2214 src_bits[y * 256 + x] = 3 * x + 5 * y; 2215 2216 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2217 compare_hash(hdc, bmi, bits, "BitBlt src 8-bpp SRCCOPY" ); 2218 2219 blend.SourceConstantAlpha = 0xd0; 2220 blend.AlphaFormat = 0; 2221 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend ); 2222 compare_hash_broken_todo(hdc, bmi, bits, "AlphaBlend src 8-bpp", 0, dib_is_1bpp ); 2223 2224 /* blitting with 4-bpp source */ 2225 2226 src_bi->bmiHeader.biBitCount = 4; 2227 src_bi->bmiHeader.biClrUsed = 12; 2228 for (i = 0; i < 16; i++) ((DWORD *)src_bi->bmiColors)[i] = i | (i * 5) << 8 | (i * 19) << 16; 2229 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2230 DeleteObject( SelectObject( src_dc, bmp ) ); 2231 for (y = 0; y < 256; y++) 2232 for (x = 0; x < 256; x += 2) 2233 src_bits[(y * 256 + x) / 2] = 7 * x + 3 * y; 2234 2235 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2236 compare_hash(hdc, bmi, bits, "BitBlt src 4-bpp SRCCOPY" ); 2237 2238 /* blitting with 1-bpp source */ 2239 2240 src_bi->bmiHeader.biBitCount = 1; 2241 src_bi->bmiHeader.biClrUsed = 0; 2242 for (i = 0; i < 2; i++) ((DWORD *)src_bi->bmiColors)[i] = (i + 37) | (i * 91) << 8 | (i * 53) << 16; 2243 bmp = CreateDIBSection(0, src_bi, DIB_RGB_COLORS, (void**)&src_bits, NULL, 0); 2244 DeleteObject( SelectObject( src_dc, bmp ) ); 2245 for (y = 0; y < 256; y++) 2246 for (x = 0; x < 256; x += 8) 2247 src_bits[(y * 256 + x) / 8] = 7 * x + 3 * y; 2248 2249 BitBlt( hdc, 100, 100, 256, 256, src_dc, 0, 0, SRCCOPY ); 2250 /* Some interesting src co-ords */ 2251 BitBlt( hdc, 10, 10, 3, 10, src_dc, 0, 0, SRCCOPY ); 2252 BitBlt( hdc, 20, 10, 3, 10, src_dc, 2, 0, SRCCOPY ); 2253 BitBlt( hdc, 30, 10, 3, 10, src_dc, 5, 0, SRCCOPY ); 2254 BitBlt( hdc, 40, 10, 3, 10, src_dc, 6, 0, SRCCOPY ); 2255 BitBlt( hdc, 50, 10, 20, 10, src_dc, 6, 0, SRCCOPY ); 2256 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp SRCCOPY" ); 2257 2258 blend.SourceConstantAlpha = 0x90; 2259 blend.AlphaFormat = 0; 2260 GdiAlphaBlend( hdc, 100, 100, 256, 256, src_dc, 0, 0, 256, 256, blend ); 2261 compare_hash(hdc, bmi, bits, "AlphaBlend src 1-bpp" ); 2262 2263 /* blitting with 1-bpp ddb source */ 2264 2265 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits ); 2266 DeleteObject( SelectObject( src_dc, bmp ) ); 2267 2268 old_text = GetTextColor( hdc ); 2269 old_bkgnd = GetBkColor( hdc ); 2270 for (i = 0; i < 256; i += 13) 2271 { 2272 SetTextColor(hdc, RGB( i, 2*i, 255 - i ) ); 2273 SetBkColor(hdc, RGB( 255 - i, i / 3, i ) ); 2274 BitBlt( hdc, i, 0, 13, 13, src_dc, 0, 0, SRCCOPY ); 2275 } 2276 for (i = 0; i < 256; i += 13) 2277 { 2278 SetTextColor(hdc, PALETTEINDEX( i )); 2279 SetBkColor(hdc, PALETTEINDEX( i + 3 )); 2280 BitBlt( hdc, i, 13, 13, 13, src_dc, 0, 0, SRCCOPY ); 2281 } 2282 for (i = 0; i < 256; i += 13) 2283 { 2284 SetTextColor(hdc, DIBINDEX( i )); 2285 SetBkColor(hdc, DIBINDEX( i + 3 )); 2286 BitBlt( hdc, i, 26, 13, 13, src_dc, 0, 0, SRCCOPY ); 2287 } 2288 SetTextColor( hdc, old_text ); 2289 SetBkColor( hdc, old_bkgnd ); 2290 compare_hash(hdc, bmi, bits, "BitBlt src 1-bpp ddb SRCCOPY" ); 2291 2292 DeleteObject( bmp ); 2293 2294 /* blitting to 1-bpp ddb dest */ 2295 2296 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits ); 2297 DeleteObject( SelectObject( src_dc, bmp ) ); 2298 2299 for (y = 0; y < 16; y++) 2300 for (x = 0; x < 16; x++) 2301 SetPixel( hdc, x, y, RGB( 16 * x, 16 * y, 8 * (x + y)) ); 2302 PatBlt( hdc, 15, 15, 1, 1, WHITENESS ); 2303 /* source colors are ignored */ 2304 SetTextColor( src_dc, 0xbeef ); 2305 SetBkColor( src_dc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) )); 2306 /* destination text color is also ignored */ 2307 SetTextColor( hdc, 0xbedead ); 2308 2309 i = 16; 2310 SetBkColor( hdc, 0xffffff ); 2311 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2312 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2313 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2314 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2315 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2316 SetBkColor( hdc, 0 ); 2317 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2318 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2319 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2320 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2321 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2322 SetBkColor( hdc, RGB( 16 * 2, 16 * 3, 8 * (2 + 3) )); 2323 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2324 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2325 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2326 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2327 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2328 SetBkColor( hdc, RGB( 16 * 13, 16 * 14, 8 * (13 + 14) )); 2329 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2330 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2331 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2332 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2333 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2334 SetBkColor( hdc, PALETTEINDEX( 1 )); 2335 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2336 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2337 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2338 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2339 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2340 SetBkColor( hdc, DIBINDEX( 2 )); 2341 BitBlt( src_dc, 0, 0, 16, 16, hdc, 0, 0, SRCCOPY ); 2342 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2343 StretchDIBits( src_dc, 0, 0, 16, 16, 0, 2344 bmi->bmiHeader.biHeight - 16, 16, 16, bits, bmi, DIB_RGB_COLORS, SRCCOPY ); 2345 GetBitmapBits( bmp, 32, bits + get_stride(bmi) * i++ ); 2346 SetTextColor( hdc, old_text ); 2347 SetBkColor( hdc, old_bkgnd ); 2348 compare_hash(hdc, bmi, bits, "BitBlt dst 1-bpp ddb"); 2349 2350 DeleteDC( src_dc ); 2351 DeleteObject( bmp ); 2352 2353 /* RLE StretchDIBits */ 2354 src_bi->bmiHeader.biSize = sizeof(src_bi->bmiHeader); 2355 src_bi->bmiHeader.biWidth = 8; 2356 src_bi->bmiHeader.biHeight = 8; 2357 src_bi->bmiHeader.biPlanes = 1; 2358 src_bi->bmiHeader.biBitCount = 8; 2359 src_bi->bmiHeader.biCompression = BI_RLE8; 2360 src_bi->bmiHeader.biClrUsed = 0; 2361 src_bi->bmiHeader.biSizeImage = sizeof(rle8_data); 2362 2363 for (i = 0; i < 256; i++) 2364 { 2365 src_bi->bmiColors[i].rgbRed = i; 2366 src_bi->bmiColors[i].rgbGreen = i; 2367 src_bi->bmiColors[i].rgbBlue = i; 2368 src_bi->bmiColors[i].rgbReserved = 0; 2369 } 2370 2371 StretchDIBits( hdc, 10, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2372 StretchDIBits( hdc, 100, 10, 7, 7, 0, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2373 StretchDIBits( hdc, 200, 10, 7, 7, 0, 1, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2374 StretchDIBits( hdc, 300, 10, 7, 7, 1, 0, 7, 7, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2375 StretchDIBits( hdc, 400, 10, 16, 16, 0, 0, 8, 8, rle8_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2376 compare_hash_broken_todo(hdc, bmi, bits, "rle stretchdibits", 0, dib_is_1bpp ); 2377 2378 /* 32 bpp StretchDIBits */ 2379 2380 src_bi->bmiHeader.biWidth = 4; 2381 src_bi->bmiHeader.biHeight = 4; 2382 src_bi->bmiHeader.biPlanes = 1; 2383 src_bi->bmiHeader.biBitCount = 32; 2384 src_bi->bmiHeader.biCompression = BI_RGB; 2385 src_bi->bmiHeader.biClrUsed = 0; 2386 src_bi->bmiHeader.biSizeImage = 0; 2387 2388 ret = StretchDIBits( hdc, 10, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2389 ok(ret == 4, "got %d\n", ret); 2390 ret = StretchDIBits( hdc, 20, 10, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2391 ok(ret == 4, "got %d\n", ret); 2392 ret = StretchDIBits( hdc, 30, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2393 ok(ret == 4, "got %d\n", ret); 2394 ret = StretchDIBits( hdc, 40, 10, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2395 ok(ret == 4, "got %d\n", ret); 2396 ret = StretchDIBits( hdc, 50, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2397 ok(ret == 4, "got %d\n", ret); 2398 ret = StretchDIBits( hdc, 60, 10, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2399 ok(ret == 4, "got %d\n", ret); 2400 2401 src_bi->bmiHeader.biHeight = -4; 2402 2403 ret = StretchDIBits( hdc, 10, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2404 ok(ret == 4, "got %d\n", ret); 2405 ret = StretchDIBits( hdc, 20, 100, 4, 4, 0, 0, 4, 4, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2406 ok(ret == -4, "got %d\n", ret); 2407 ret = StretchDIBits( hdc, 30, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2408 ok(ret == 4, "got %d\n", ret); 2409 ret = StretchDIBits( hdc, 40, 100, 3, 3, 1, 1, 3, 3, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2410 ok(ret == -4, "got %d\n", ret); 2411 ret = StretchDIBits( hdc, 50, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCCOPY ); 2412 ok(ret == 4, "got %d\n", ret); 2413 ret = StretchDIBits( hdc, 60, 100, -2, -2, 2, 3, -2, -2, four_by_four_data, src_bi, DIB_RGB_COLORS, SRCAND ); 2414 ok(ret == -4, "got %d\n", ret); 2415 2416 compare_hash_broken_todo(hdc, bmi, bits, "stretchdibits", dib_is_8bpp_gray ? 1 : 0, dib_is_8bpp_gray ); 2417 2418 /* Solid colors */ 2419 for (i = 0; i < 256; i++) 2420 { 2421 solid_patblt( hdc, i * 2, 10, 1, 1, DIBINDEX(i) ); 2422 solid_patblt( hdc, i * 2, 20, 1, 1, PALETTEINDEX(i) ); 2423 solid_patblt( hdc, i * 2, 30, 1, 1, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) ); 2424 solid_patblt( hdc, i * 2, 40, 1, 1, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) ); 2425 for (j = 0; j < 256; j++) solid_patblt( hdc, i * 2, 50 + j, 1, 1, (j << 24) | i ); 2426 } 2427 2428 /* A few extra colors that are interesting in the 1bpp case */ 2429 2430 /* bk color */ 2431 solid_patblt( hdc, 0, 50, 1, 1, RGB( 0, 0xff, 0 ) ); 2432 solid_patblt( hdc, 2, 50, 1, 1, PALETTERGB( 0, 0xff, 0 ) ); 2433 2434 /* color 0 */ 2435 solid_patblt( hdc, 4, 50, 1, 1, RGB( 0, 0x1, 0xff ) ); 2436 solid_patblt( hdc, 6, 50, 1, 1, PALETTERGB( 0, 0x1, 0xff ) ); 2437 2438 /* color 1 */ 2439 solid_patblt( hdc, 8, 50, 1, 1, RGB( 0xff, 0, 0 ) ); 2440 solid_patblt( hdc, 10, 50, 1, 1, PALETTERGB( 0xff, 0, 0 ) ); 2441 2442 compare_hash(hdc, bmi, bits, "Colors"); 2443 2444 for (i = 0; i < 256; i++) 2445 { 2446 COLORREF s, g; 2447 s = SetPixel( hdc, i * 2, 10, DIBINDEX(i) ); 2448 g = GetPixel( hdc, i * 2, 10 ); 2449 ok( s == g, "got %08x and %08x\n", s, g ); 2450 2451 s = SetPixel( hdc, i * 2, 20, PALETTEINDEX(i) ); 2452 g = GetPixel( hdc, i * 2, 20 ); 2453 ok( s == g, "got %08x and %08x\n", s, g ); 2454 2455 s = SetPixel( hdc, i * 2, 30, RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) ); 2456 g = GetPixel( hdc, i * 2, 30 ); 2457 ok( s == g, "got %08x and %08x\n", s, g ); 2458 2459 s = SetPixel( hdc, i * 2, 40, PALETTERGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 ) ); 2460 g = GetPixel( hdc, i * 2, 40 ); 2461 ok( s == g, "got %08x and %08x\n", s, g ); 2462 2463 for (j = 0; j < 256; j++) 2464 { 2465 s = SetPixel( hdc, i * 2, 50+j, (j << 24) | RGB( (i & 0x07) << 5, (i & 0x38) << 2, i & 0xc0 )); 2466 g = GetPixel( hdc, i * 2, 50+j ); 2467 ok( s == g, "got %08x and %08x\n", s, g ); 2468 2469 s = SetPixel( hdc, i * 2 + 1, 50+j, (j << 24) | i ); 2470 g = GetPixel( hdc, i * 2 + 1, 50+j ); 2471 ok( s == g, "got %08x and %08x\n", s, g ); 2472 } 2473 } 2474 2475 compare_hash(hdc, bmi, bits, "SetPixel"); 2476 2477 /* gradients */ 2478 2479 { 2480 TRIVERTEX vrect[] = 2481 { 2482 { 1, 1, 0xff00, 0x8000, 0x0000, 0x8000 }, 2483 { 200, 200, 0x0000, 0x0000, 0xff00, 0xff00 }, 2484 { 180, 180, 0x1234, 0x5678, 0x9abc, 0xdef0 }, 2485 { 300, 300, 0xff00, 0xff00, 0xff00, 0x0000 } 2486 }; 2487 GRADIENT_RECT rect[] = { { 0, 1 }, { 2, 3 }, { 2, 1 } }; 2488 2489 TRIVERTEX vtri[] = 2490 { 2491 { 250, 0, 0xff00, 0x0000, 0xff00, 0xff00 }, 2492 { 500, 500, 0x0000, 0xff00, 0x0000, 0xff00 }, 2493 { 0, 500, 0x0000, 0x0000, 0xff00, 0xff00 }, 2494 2495 { 10, 0, 0x8000, 0x0000, 0x8000, 0x8000 }, 2496 { 0, 20, 0xff00, 0xff00, 0xff00, 0x0000 }, 2497 { 5, 30, 0x4000, 0xc000, 0x7000, 0x9000 }, 2498 2499 { 30, 0, 0x9000, 0x8800, 0xcc00, 0xff00 }, 2500 { 5, 12, 0x9900, 0xaa00, 0xbb00, 0xcc00 }, 2501 { 0, 30, 0x5000, 0xd000, 0x9000, 0xbb00 }, 2502 2503 { 35, 3, 0xaa00, 0x6500, 0x4300, 0x2100 }, 2504 { 50, 6, 0x9800, 0x9800, 0x9800, 0x2000 }, 2505 { 60, 10, 0x0100, 0x0200, 0x0300, 0x3000 }, 2506 2507 { 60, 2, 0x0700, 0x0800, 0x0900, 0xff00 }, 2508 { 73, 10, 0x9900, 0x8800, 0x7700, 0xff00 }, 2509 { 66, 23, 0x1100, 0x2200, 0x3300, 0xff00 }, 2510 2511 { 80, 1, 0xa000, 0x6000, 0x4000, 0x2000 }, 2512 { 76, 9, 0x7000, 0x5000, 0x3000, 0x1000 }, 2513 { 85, 23, 0x3300, 0x3300, 0x3300, 0x3300 }, 2514 2515 { 90, 4, 0x4400, 0x5500, 0x6600, 0x9900 }, 2516 { 95, 12, 0x4500, 0x5600, 0x6700, 0x9900 }, 2517 { 85, 14, 0x4600, 0x5700, 0x6800, 0x9900 }, 2518 }; 2519 GRADIENT_TRIANGLE tri[] = 2520 { 2521 { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }, { 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 }, 2522 { 2, 1, 0 }, { 3, 5, 4 }, { 7, 6, 8 }, { 10, 11, 9 }, { 14, 13, 12 }, { 17, 15, 16 }, { 19, 20, 18 } 2523 }; 2524 2525 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_H ); 2526 for (i = 0; i < 4; i++) vrect[i].y += 250; 2527 GdiGradientFill( hdc, vrect, 4, rect, 2, GRADIENT_FILL_RECT_V ); 2528 /* Wine's 8-bit dithering isn't identical to Windows */ 2529 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) ); 2530 2531 GdiGradientFill( hdc, vtri, 7*3, tri, 7, GRADIENT_FILL_TRIANGLE ); 2532 for (i = 0; i < 7*3; i++) vtri[i].y += 100; 2533 GdiGradientFill( hdc, vtri, 7*3, tri + 7, 7, GRADIENT_FILL_TRIANGLE ); 2534 /* Wine's 8-bit dithering isn't identical to Windows */ 2535 compare_hash_broken_todo(hdc, bmi, bits, "GdiGradientFill", 0, (bmi->bmiHeader.biBitCount <= 8) ); 2536 } 2537 2538 /* wide pen */ 2539 2540 wide_pen = CreatePen( PS_SOLID, 7, RGB( 0xff, 0, 0 ) ); 2541 SelectObject( hdc, wide_pen ); 2542 2543 for (i = 0; i < sizeof( wide_lines ) / sizeof( wide_lines[0] ); i++) 2544 { 2545 MoveToEx( hdc, wide_lines[i].left, wide_lines[i].top, NULL ); 2546 LineTo( hdc, wide_lines[i].right, wide_lines[i].bottom ); 2547 } 2548 2549 compare_hash(hdc, bmi, bits, "wide pen" ); 2550 2551 SelectObject( hdc, orig_pen ); 2552 DeleteObject( wide_pen ); 2553 2554 log_brush.lbStyle = BS_SOLID; 2555 log_brush.lbColor = RGB(0xff, 0, 0); 2556 log_brush.lbHatch = 0; 2557 2558 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID, 2559 9, &log_brush, 0, NULL ); 2560 SelectObject( hdc, wide_pen ); 2561 2562 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) ); 2563 compare_hash(hdc, bmi, bits, "wide pen - flat caps, mitred" ); 2564 2565 SelectObject( hdc, orig_pen ); 2566 DeleteObject( wide_pen ); 2567 2568 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_SQUARE | PS_JOIN_BEVEL | PS_SOLID, 2569 16, &log_brush, 0, NULL ); 2570 SelectObject( hdc, wide_pen ); 2571 2572 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) ); 2573 compare_hash(hdc, bmi, bits, "wide pen - square caps, bevelled" ); 2574 2575 SelectObject( hdc, orig_pen ); 2576 DeleteObject( wide_pen ); 2577 2578 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_MITER | PS_SOLID, 2579 9, &log_brush, 0, NULL ); 2580 SelectObject( hdc, wide_pen ); 2581 2582 PolyPolyline( hdc, polypoly_lines, polypoly_counts, sizeof(polypoly_counts)/sizeof(polypoly_counts[0]) ); 2583 compare_hash(hdc, bmi, bits, "wide pen - empty segments" ); 2584 2585 SelectObject( hdc, orig_pen ); 2586 DeleteObject( wide_pen ); 2587 2588 /* brushed wide pen */ 2589 2590 old_text = GetTextColor( hdc ); 2591 old_bkgnd = GetBkColor( hdc ); 2592 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits ); 2593 log_brush.lbStyle = BS_PATTERN; 2594 log_brush.lbColor = 0; 2595 log_brush.lbHatch = (ULONG_PTR)bmp; 2596 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID, 2597 12, &log_brush, 0, NULL ); 2598 ok( wide_pen != 0, "failed to create pen\n" ); 2599 SelectObject( hdc, wide_pen ); 2600 Polyline( hdc, poly_lines, sizeof(poly_lines) / sizeof(poly_lines[0]) ); 2601 2602 for (i = 1; i < 20; i++) 2603 { 2604 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | PS_SOLID, 2605 i, &log_brush, 0, NULL ); 2606 ok( wide_pen != 0, "failed to create pen\n" ); 2607 DeleteObject( SelectObject( hdc, wide_pen )); 2608 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) ); 2609 SetBkColor(hdc, RGB( 255 - i, i, i / 3 ) ); 2610 MoveToEx( hdc, 10 * i, 10, NULL ); 2611 LineTo( hdc, 10 * i, 200 + i ); 2612 LineTo( hdc, 20 * i, 200 + i ); 2613 } 2614 compare_hash_broken_todo(hdc, bmi, bits, "wide brushed pen", 0, dib_is_1bpp ); 2615 2616 for (i = 1; i < 20; i++) 2617 { 2618 wide_pen = ExtCreatePen( PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_JOIN_BEVEL | (i % 5), 2619 i, &log_brush, 0, NULL ); 2620 DeleteObject( SelectObject( hdc, wide_pen )); 2621 SetTextColor(hdc, RGB( 2*i, i, 255 - i ) ); 2622 SetBkColor(hdc, RGB( i, 255 - i, i / 3 ) ); 2623 MoveToEx( hdc, 10 * i, 10, NULL ); 2624 LineTo( hdc, 10 * i, 200 + i ); 2625 LineTo( hdc, 20 * i, 200 + i ); 2626 } 2627 compare_hash_broken_todo(hdc, bmi, bits, "dashed wide brushed pen", 0, dib_is_1bpp ); 2628 2629 DeleteObject(bmp); 2630 SetTextColor(hdc, old_text); 2631 SetBkColor(hdc, old_bkgnd); 2632 SelectObject( hdc, orig_pen ); 2633 2634 /* PALETTEINDEX */ 2635 2636 solid_brush = CreateSolidBrush( PALETTEINDEX(3) ); 2637 solid_pen = CreatePen( PS_DASH, 1, PALETTEINDEX(5) ); 2638 SetTextColor( hdc, PALETTEINDEX(38) ); 2639 SetBkColor( hdc, PALETTEINDEX(9) ); 2640 SelectObject( hdc, solid_brush ); 2641 SelectObject( hdc, solid_pen ); 2642 2643 pal->palVersion = 0x300; 2644 pal->palNumEntries = 40; 2645 for (i = 0; i < 80; i++) 2646 { 2647 entries[i].peRed = i * 3; 2648 entries[i].peGreen = i * 7; 2649 entries[i].peBlue = 128 - i; 2650 entries[i].peFlags = 0; 2651 } 2652 hpal = CreatePalette( pal ); 2653 old_hpal = SelectPalette( hdc, hpal, FALSE ); 2654 2655 solid_patblt( hdc, 20, 10, 10, 10, PALETTEINDEX(15) ); 2656 Rectangle( hdc, 0, 0, 10, 10 ); 2657 SetPaletteEntries( hpal, 0, 40, entries + 40 ); 2658 Rectangle( hdc, 10, 0, 10, 10 ); 2659 SelectObject( hdc, orig_brush ); 2660 DeleteObject( solid_brush ); 2661 2662 solid_brush = CreateHatchBrush( HS_CROSS, PALETTEINDEX(7) ); 2663 DeleteObject( SelectObject( hdc, solid_brush )); 2664 PatBlt( hdc, 20, 0, 10, 10, PATCOPY ); 2665 SetPaletteEntries( hpal, 0, 40, entries ); 2666 PatBlt( hdc, 30, 0, 10, 10, PATCOPY ); 2667 SelectObject( hdc, orig_brush ); 2668 DeleteObject( solid_brush ); 2669 2670 bmp = CreateBitmap( 16, 16, 1, 1, ddb_brush_bits ); 2671 dib_brush = CreatePatternBrush( bmp ); 2672 SelectObject( hdc, dib_brush ); 2673 PatBlt( hdc, 40, 0, 10, 10, PATCOPY ); 2674 SetPaletteEntries( hpal, 0, 40, entries + 40 ); 2675 PatBlt( hdc, 50, 0, 10, 10, PATCOPY ); 2676 DeleteObject( bmp ); 2677 SelectObject( hdc, orig_brush ); 2678 DeleteObject( dib_brush ); 2679 2680 SelectPalette( hdc, old_hpal, FALSE ); 2681 DeleteObject( hpal ); 2682 2683 compare_hash_broken_todo(hdc, bmi, bits, "PALETTEINDEX", 0, dib_is_1bpp ); 2684 2685 /* ExtFloodFill */ 2686 2687 solid_patblt( hdc, 0, 0, 512, 512, RGB( 0, 0, 0xff ) ); 2688 solid_patblt( hdc, 10, 10, 200, 200, RGB( 0, 0xff, 0 ) ); 2689 solid_patblt( hdc, 10, 50, 50, 50, RGB( 0, 0, 0xff ) ); 2690 solid_patblt( hdc, 100, 160, 50, 50, RGB( 0, 0, 0xff ) ); 2691 solid_patblt( hdc, 90, 160, 70, 10, RGB( 0, 0, 0xff ) ); 2692 2693 /* add a vertical 'bar' to show that the clip rgn stops the flooding */ 2694 hrgn = CreateRectRgn( 180, 10, 190, 210 ); 2695 ExtSelectClipRgn( hdc, hrgn, RGN_DIFF ); 2696 DeleteObject( hrgn ); 2697 2698 solid_brush = CreateSolidBrush( RGB( 0xff, 0, 0 ) ); 2699 SelectObject( hdc, solid_brush ); 2700 2701 ret = ExtFloodFill( hdc, 100, 100, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE ); 2702 ok (ret, "got ret %d\n", ret); 2703 compare_hash(hdc, bmi, bits, "flood fill" ); 2704 2705 ExtSelectClipRgn( hdc, NULL, RGN_COPY ); 2706 2707 ret = ExtFloodFill( hdc, -1, -1, RGB( 0, 0xff, 0 ), FLOODFILLSURFACE ); 2708 ok (!ret, "got ret %d\n", ret); 2709 2710 SelectObject(hdc, orig_brush); 2711 SelectObject(hdc, orig_pen); 2712 DeleteObject(solid_brush); 2713 DeleteObject(wide_pen); 2714 DeleteObject(dashed_pen); 2715 DeleteObject(solid_pen); 2716 } 2717 2718 static const BYTE ramp[17] = 2719 { 2720 0, 0x4d, 0x68, 0x7c, 2721 0x8c, 0x9a, 0xa7, 0xb2, 2722 0xbd, 0xc7, 0xd0, 0xd9, 2723 0xe1, 0xe9, 0xf0, 0xf8, 2724 0xff 2725 }; 2726 2727 static inline void get_range(BYTE alpha, DWORD text_comp, BYTE *min_comp, BYTE *max_comp) 2728 { 2729 *min_comp = (ramp[alpha] * text_comp) / 0xff; 2730 *max_comp = ramp[16 - alpha] + ((0xff - ramp[16 - alpha]) * text_comp) / 0xff; 2731 } 2732 2733 static inline BYTE aa_comp(BYTE dst, BYTE text, BYTE alpha) 2734 { 2735 BYTE min_comp, max_comp; 2736 2737 if (alpha == 16) return text; 2738 if (alpha <= 1) return dst; 2739 if (text == dst) return dst; 2740 2741 get_range( alpha, text, &min_comp, &max_comp ); 2742 2743 if (dst > text) 2744 { 2745 DWORD diff = dst - text; 2746 DWORD range = max_comp - text; 2747 dst = text + (diff * range ) / (0xff - text); 2748 return dst; 2749 } 2750 else 2751 { 2752 DWORD diff = text - dst; 2753 DWORD range = text - min_comp ; 2754 dst = text - (diff * range) / text; 2755 return dst; 2756 } 2757 } 2758 2759 static inline COLORREF aa_colorref( COLORREF dst, COLORREF text, BYTE glyph ) 2760 { 2761 COLORREF ret; 2762 2763 ret = RGB( aa_comp( GetRValue(dst), GetRValue(text), glyph ), 2764 aa_comp( GetGValue(dst), GetGValue(text), glyph ), 2765 aa_comp( GetBValue(dst), GetBValue(text), glyph ) ); 2766 return ret; 2767 } 2768 2769 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; 2770 2771 static void draw_text_2( HDC hdc, const BITMAPINFO *bmi, BYTE *bits, BOOL aa ) 2772 { 2773 DWORD dib_size = get_dib_size(bmi), ret; 2774 LOGFONTA lf; 2775 HFONT font; 2776 GLYPHMETRICS gm; 2777 BYTE g_buf[10000]; 2778 int i, stride, x, y; 2779 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} }; 2780 char *eto_hash = NULL, *diy_hash = NULL; 2781 static const char str[] = "Hello Wine"; 2782 POINT origin, g_org; 2783 static const BYTE vals[4] = { 0x00, 0x00, 0x00, 0x00 }; 2784 TEXTMETRICA tm; 2785 COLORREF text_color; 2786 2787 for(i = 0; i < dib_size; i++) 2788 bits[i] = vals[i % 4]; 2789 2790 memset( &lf, 0, sizeof(lf) ); 2791 strcpy( lf.lfFaceName, "Tahoma" ); 2792 lf.lfHeight = 24; 2793 lf.lfQuality = aa ? ANTIALIASED_QUALITY : NONANTIALIASED_QUALITY; 2794 2795 font = CreateFontIndirectA( &lf ); 2796 font = SelectObject( hdc, font ); 2797 2798 GetTextMetricsA( hdc, &tm ); 2799 if (!(tm.tmPitchAndFamily & TMPF_VECTOR)) 2800 { 2801 skip( "skipping as a bitmap font has been selected for Tahoma.\n" ); 2802 DeleteObject( SelectObject( hdc, font ) ); 2803 return; 2804 } 2805 2806 SetTextColor( hdc, RGB(0xff, 0x00, 0x00) ); 2807 SetTextAlign( hdc, TA_BASELINE ); 2808 SetBkMode( hdc, TRANSPARENT ); 2809 origin.x = 10; 2810 origin.y = 100; 2811 2812 ExtTextOutA( hdc, origin.x, origin.y, 0, NULL, str, strlen(str), NULL ); 2813 eto_hash = hash_dib( bmi, bits ); 2814 2815 for(i = 0; i < dib_size; i++) 2816 bits[i] = vals[i % 4]; 2817 2818 if (bmi->bmiHeader.biBitCount <= 8) aa = FALSE; 2819 2820 text_color = GetTextColor( hdc ); 2821 for (i = 0; i < strlen(str); i++) 2822 { 2823 DWORD ggo_flags = aa ? GGO_GRAY4_BITMAP : GGO_BITMAP; 2824 2825 ret = GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, 0, NULL, &identity ); 2826 2827 if (ret == GDI_ERROR) continue; 2828 2829 if (ret) GetGlyphOutlineA( hdc, str[i], ggo_flags, &gm, sizeof(g_buf), g_buf, &identity ); 2830 2831 g_org.x = origin.x + gm.gmptGlyphOrigin.x; 2832 g_org.y = origin.y - gm.gmptGlyphOrigin.y; 2833 2834 origin.x += gm.gmCellIncX; 2835 origin.y += gm.gmCellIncY; 2836 2837 if (!ret) continue; 2838 2839 if (aa) 2840 { 2841 stride = (gm.gmBlackBoxX + 3) & ~3; 2842 2843 for (y = 0; y < gm.gmBlackBoxY; y++) 2844 { 2845 BYTE *g_ptr = g_buf + y * stride; 2846 COLORREF val; 2847 2848 for (x = 0; x < gm.gmBlackBoxX; x++) 2849 { 2850 if (g_ptr[x] <= 1) continue; 2851 if (g_ptr[x] >= 16) val = text_color; 2852 else 2853 { 2854 val = GetPixel( hdc, g_org.x + x, g_org.y + y ); 2855 val = aa_colorref( val, text_color, g_ptr[x] ); 2856 } 2857 SetPixel( hdc, g_org.x + x, g_org.y + y, val ); 2858 } 2859 } 2860 } 2861 else 2862 { 2863 stride = ((gm.gmBlackBoxX + 31) >> 3) & ~3; 2864 2865 for (y = 0; y < gm.gmBlackBoxY; y++) 2866 { 2867 BYTE *g_ptr = g_buf + y * stride; 2868 for (x = 0; x < gm.gmBlackBoxX; x++) 2869 { 2870 if (g_ptr[x / 8] & masks[x % 8]) 2871 SetPixel( hdc, g_org.x + x, g_org.y + y, text_color ); 2872 } 2873 } 2874 } 2875 } 2876 2877 diy_hash = hash_dib( bmi, bits ); 2878 ok( !strcmp( eto_hash, diy_hash ), "hash mismatch - aa %d\n", aa ); 2879 2880 HeapFree( GetProcessHeap(), 0, diy_hash ); 2881 HeapFree( GetProcessHeap(), 0, eto_hash ); 2882 2883 font = SelectObject( hdc, font ); 2884 DeleteObject( font ); 2885 } 2886 2887 static void draw_text( HDC hdc, const BITMAPINFO *bmi, BYTE *bits ) 2888 { 2889 draw_text_2( hdc, bmi, bits, FALSE ); 2890 2891 /* Rounding errors make these cases hard to test */ 2892 if ((bmi->bmiHeader.biCompression == BI_BITFIELDS && ((DWORD*)bmi->bmiColors)[0] == 0x3f000) || 2893 (bmi->bmiHeader.biBitCount == 16)) 2894 return; 2895 2896 draw_text_2( hdc, bmi, bits, TRUE ); 2897 } 2898 2899 static void test_simple_graphics(void) 2900 { 2901 char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]; 2902 BITMAPINFO *bmi = (BITMAPINFO *)bmibuf; 2903 RGBQUAD *colors = bmi->bmiColors; 2904 DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER)); 2905 HDC mem_dc; 2906 BYTE *bits; 2907 HBITMAP dib, orig_bm; 2908 DIBSECTION ds; 2909 HPALETTE default_palette, old_hpal; 2910 int i; 2911 2912 mem_dc = CreateCompatibleDC(NULL); 2913 2914 /* a8r8g8b8 */ 2915 trace("8888\n"); 2916 memset(bmi, 0, sizeof(bmibuf)); 2917 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader); 2918 bmi->bmiHeader.biHeight = 512; 2919 bmi->bmiHeader.biWidth = 512; 2920 bmi->bmiHeader.biBitCount = 32; 2921 bmi->bmiHeader.biPlanes = 1; 2922 bmi->bmiHeader.biCompression = BI_RGB; 2923 2924 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 2925 ok(dib != NULL, "ret NULL\n"); 2926 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 2927 ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]); 2928 ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]); 2929 ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]); 2930 ok(ds.dsBmih.biCompression == BI_RGB, "got %x\n", ds.dsBmih.biCompression); 2931 2932 orig_bm = SelectObject(mem_dc, dib); 2933 2934 default_palette = create_default_palette( 8 ); 2935 old_hpal = SelectPalette( mem_dc, default_palette, FALSE ); 2936 2937 dst_format = "8888"; 2938 current_sha1 = sha1_graphics_a8r8g8b8; 2939 draw_graphics(mem_dc, bmi, bits); 2940 draw_text(mem_dc, bmi, bits); 2941 2942 SelectObject(mem_dc, orig_bm); 2943 DeleteObject(dib); 2944 2945 /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/ 2946 trace("8888 - bitfields\n"); 2947 bmi->bmiHeader.biBitCount = 32; 2948 bmi->bmiHeader.biCompression = BI_BITFIELDS; 2949 bit_fields[0] = 0xff0000; 2950 bit_fields[1] = 0x00ff00; 2951 bit_fields[2] = 0x0000ff; 2952 2953 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 2954 ok(dib != NULL, "ret NULL\n"); 2955 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 2956 ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]); 2957 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]); 2958 ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]); 2959 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 2960 2961 orig_bm = SelectObject(mem_dc, dib); 2962 SelectPalette( mem_dc, default_palette, FALSE ); 2963 2964 dst_format = "8888 - bitfields"; 2965 current_sha1 = sha1_graphics_a8r8g8b8_bitfields; 2966 draw_graphics(mem_dc, bmi, bits); 2967 draw_text(mem_dc, bmi, bits); 2968 2969 SelectObject(mem_dc, orig_bm); 2970 DeleteObject(dib); 2971 2972 /* a8b8g8r8. */ 2973 trace("a8b8g8r8\n"); 2974 bmi->bmiHeader.biBitCount = 32; 2975 bmi->bmiHeader.biCompression = BI_BITFIELDS; 2976 bit_fields[0] = 0x0000ff; 2977 bit_fields[1] = 0x00ff00; 2978 bit_fields[2] = 0xff0000; 2979 2980 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 2981 ok(dib != NULL, "ret NULL\n"); 2982 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 2983 ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]); 2984 ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]); 2985 ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]); 2986 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 2987 2988 orig_bm = SelectObject(mem_dc, dib); 2989 2990 dst_format = "a8b8g8r8"; 2991 current_sha1 = sha1_graphics_a8b8g8r8; 2992 draw_graphics(mem_dc, bmi, bits); 2993 draw_text(mem_dc, bmi, bits); 2994 2995 SelectObject(mem_dc, orig_bm); 2996 DeleteObject(dib); 2997 2998 /* r10g10b10. */ 2999 trace("r10g10b10\n"); 3000 bmi->bmiHeader.biBitCount = 32; 3001 bmi->bmiHeader.biCompression = BI_BITFIELDS; 3002 bit_fields[0] = 0x3ff00000; 3003 bit_fields[1] = 0x000ffc00; 3004 bit_fields[2] = 0x000003ff; 3005 3006 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3007 ok(dib != NULL, "ret NULL\n"); 3008 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 3009 ok(ds.dsBitfields[0] == 0x3ff00000, "got %08x\n", ds.dsBitfields[0]); 3010 ok(ds.dsBitfields[1] == 0x000ffc00, "got %08x\n", ds.dsBitfields[1]); 3011 ok(ds.dsBitfields[2] == 0x000003ff, "got %08x\n", ds.dsBitfields[2]); 3012 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 3013 3014 orig_bm = SelectObject(mem_dc, dib); 3015 3016 dst_format = "r10g10b10"; 3017 current_sha1 = sha1_graphics_r10g10b10; 3018 draw_graphics(mem_dc, bmi, bits); 3019 draw_text(mem_dc, bmi, bits); 3020 3021 SelectObject(mem_dc, orig_bm); 3022 DeleteObject(dib); 3023 3024 /* r6g6b6. */ 3025 trace("r6g6b6\n"); 3026 bmi->bmiHeader.biBitCount = 32; 3027 bmi->bmiHeader.biCompression = BI_BITFIELDS; 3028 bit_fields[0] = 0x0003f000; 3029 bit_fields[1] = 0x00000fc0; 3030 bit_fields[2] = 0x0000003f; 3031 3032 dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3033 ok(dib != NULL, "ret NULL\n"); 3034 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 3035 ok(ds.dsBitfields[0] == 0x0003f000, "got %08x\n", ds.dsBitfields[0]); 3036 ok(ds.dsBitfields[1] == 0x00000fc0, "got %08x\n", ds.dsBitfields[1]); 3037 ok(ds.dsBitfields[2] == 0x0000003f, "got %08x\n", ds.dsBitfields[2]); 3038 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 3039 3040 orig_bm = SelectObject(mem_dc, dib); 3041 3042 dst_format = "r6g6b6"; 3043 current_sha1 = sha1_graphics_r6g6b6; 3044 draw_graphics(mem_dc, bmi, bits); 3045 draw_text(mem_dc, bmi, bits); 3046 3047 SelectObject(mem_dc, orig_bm); 3048 DeleteObject(dib); 3049 3050 /* 24 */ 3051 trace("24\n"); 3052 bmi->bmiHeader.biBitCount = 24; 3053 bmi->bmiHeader.biCompression = BI_RGB; 3054 3055 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3056 ok(dib != NULL, "ret NULL\n"); 3057 orig_bm = SelectObject(mem_dc, dib); 3058 3059 dst_format = "24"; 3060 current_sha1 = sha1_graphics_24; 3061 draw_graphics(mem_dc, bmi, bits); 3062 draw_text(mem_dc, bmi, bits); 3063 3064 SelectObject(mem_dc, orig_bm); 3065 DeleteObject(dib); 3066 3067 /* r5g5b5 */ 3068 trace("555\n"); 3069 bmi->bmiHeader.biBitCount = 16; 3070 bmi->bmiHeader.biCompression = BI_RGB; 3071 3072 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3073 ok(dib != NULL, "ret NULL\n"); 3074 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 3075 ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]); 3076 ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]); 3077 ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]); 3078 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 3079 3080 orig_bm = SelectObject(mem_dc, dib); 3081 3082 dst_format = "r5g5b5"; 3083 current_sha1 = sha1_graphics_r5g5b5; 3084 draw_graphics(mem_dc, bmi, bits); 3085 draw_text(mem_dc, bmi, bits); 3086 3087 SelectObject(mem_dc, orig_bm); 3088 DeleteObject(dib); 3089 3090 /* r4g4b4 */ 3091 trace("444\n"); 3092 bmi->bmiHeader.biBitCount = 16; 3093 bmi->bmiHeader.biCompression = BI_BITFIELDS; 3094 bit_fields[0] = 0x0f00; 3095 bit_fields[1] = 0x00f0; 3096 bit_fields[2] = 0x000f; 3097 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3098 ok(dib != NULL, "ret NULL\n"); 3099 ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); 3100 ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]); 3101 ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]); 3102 ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]); 3103 ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); 3104 3105 orig_bm = SelectObject(mem_dc, dib); 3106 3107 dst_format = "r4g4b4"; 3108 current_sha1 = sha1_graphics_r4g4b4; 3109 draw_graphics(mem_dc, bmi, bits); 3110 draw_text(mem_dc, bmi, bits); 3111 3112 SelectObject(mem_dc, orig_bm); 3113 DeleteObject(dib); 3114 3115 /* 8 color */ 3116 trace("8 color\n"); 3117 bmi->bmiHeader.biBitCount = 8; 3118 bmi->bmiHeader.biCompression = BI_RGB; 3119 bmi->bmiHeader.biClrUsed = 236; 3120 for (i = 0; i < 236; i++) 3121 { 3122 colors[i].rgbRed = (i & 0x07) << 5; 3123 colors[i].rgbGreen = (i & 0x38) << 2; 3124 colors[i].rgbBlue = i & 0xc0; 3125 } 3126 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3127 ok(dib != NULL, "ret NULL\n"); 3128 3129 orig_bm = SelectObject(mem_dc, dib); 3130 3131 dst_format = "8 color"; 3132 current_sha1 = sha1_graphics_8_color; 3133 draw_graphics(mem_dc, bmi, bits); 3134 draw_text(mem_dc, bmi, bits); 3135 3136 SelectObject(mem_dc, orig_bm); 3137 DeleteObject(dib); 3138 3139 /* 8 grayscale */ 3140 trace("8 grayscale\n"); 3141 bmi->bmiHeader.biBitCount = 8; 3142 bmi->bmiHeader.biCompression = BI_RGB; 3143 bmi->bmiHeader.biClrUsed = 256; 3144 for (i = 0; i < 256; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i; 3145 3146 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3147 ok(dib != NULL, "ret NULL\n"); 3148 3149 orig_bm = SelectObject(mem_dc, dib); 3150 3151 dst_format = "8 grayscale"; 3152 current_sha1 = sha1_graphics_8_grayscale; 3153 draw_graphics(mem_dc, bmi, bits); 3154 draw_text(mem_dc, bmi, bits); 3155 3156 SelectObject(mem_dc, orig_bm); 3157 DeleteObject(dib); 3158 3159 /* 8 */ 3160 trace("8\n"); 3161 bmi->bmiHeader.biBitCount = 8; 3162 bmi->bmiHeader.biCompression = BI_RGB; 3163 bmi->bmiHeader.biClrUsed = 5; 3164 colors[0].rgbRed = 0xff; 3165 colors[0].rgbGreen = 0xff; 3166 colors[0].rgbBlue = 0xff; 3167 colors[1].rgbRed = 0; 3168 colors[1].rgbGreen = 0; 3169 colors[1].rgbBlue = 0; 3170 colors[2].rgbRed = 0xff; 3171 colors[2].rgbGreen = 0; 3172 colors[2].rgbBlue = 0; 3173 colors[3].rgbRed = 0; 3174 colors[3].rgbGreen = 0xff; 3175 colors[3].rgbBlue = 0; 3176 colors[4].rgbRed = 0; 3177 colors[4].rgbGreen = 0; 3178 colors[4].rgbBlue = 0xff; 3179 3180 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3181 ok(dib != NULL, "ret NULL\n"); 3182 3183 orig_bm = SelectObject(mem_dc, dib); 3184 3185 dst_format = "8"; 3186 current_sha1 = sha1_graphics_8; 3187 draw_graphics(mem_dc, bmi, bits); 3188 draw_text(mem_dc, bmi, bits); 3189 3190 SelectObject(mem_dc, orig_bm); 3191 DeleteObject(dib); 3192 3193 /* 4 */ 3194 trace("4\n"); 3195 bmi->bmiHeader.biBitCount = 4; 3196 3197 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3198 ok(dib != NULL, "ret NULL\n"); 3199 3200 orig_bm = SelectObject(mem_dc, dib); 3201 DeleteObject( SelectPalette( mem_dc, create_default_palette(4), FALSE )); 3202 3203 dst_format = "4"; 3204 current_sha1 = sha1_graphics_4; 3205 draw_graphics(mem_dc, bmi, bits); 3206 draw_text(mem_dc, bmi, bits); 3207 3208 SelectObject(mem_dc, orig_bm); 3209 DeleteObject(dib); 3210 3211 /* 4 grayscale */ 3212 trace("4 grayscale\n"); 3213 bmi->bmiHeader.biClrUsed = 16; 3214 for (i = 0; i < 16; i++) colors[i].rgbRed = colors[i].rgbGreen = colors[i].rgbBlue = i * 17; 3215 3216 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3217 ok(dib != NULL, "ret NULL\n"); 3218 3219 orig_bm = SelectObject(mem_dc, dib); 3220 3221 dst_format = "4 grayscale"; 3222 current_sha1 = sha1_graphics_4_grayscale; 3223 draw_graphics(mem_dc, bmi, bits); 3224 draw_text(mem_dc, bmi, bits); 3225 3226 SelectObject(mem_dc, orig_bm); 3227 DeleteObject(dib); 3228 3229 /* 1 */ 3230 trace("1\n"); 3231 bmi->bmiHeader.biBitCount = 1; 3232 bmi->bmiHeader.biClrUsed = 2; 3233 3234 colors[0].rgbRed = 0x00; 3235 colors[0].rgbGreen = 0x01; 3236 colors[0].rgbBlue = 0xff; 3237 colors[1].rgbRed = 0xff; 3238 colors[1].rgbGreen = 0x00; 3239 colors[1].rgbBlue = 0x00; 3240 3241 dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); 3242 ok(dib != NULL, "ret NULL\n"); 3243 3244 orig_bm = SelectObject(mem_dc, dib); 3245 DeleteObject( SelectPalette( mem_dc, create_default_palette(1), FALSE )); 3246 3247 dst_format = "1"; 3248 current_sha1 = sha1_graphics_1; 3249 draw_graphics(mem_dc, bmi, bits); 3250 draw_text(mem_dc, bmi, bits); 3251 3252 DeleteObject( SelectPalette( mem_dc, old_hpal, FALSE )); 3253 SelectObject(mem_dc, orig_bm); 3254 DeleteObject(dib); 3255 3256 DeleteDC(mem_dc); 3257 } 3258 3259 START_TEST(dib) 3260 { 3261 CryptAcquireContextW(&crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); 3262 3263 test_simple_graphics(); 3264 3265 CryptReleaseContext(crypt_prov, 0); 3266 } 3267