| /* | |
| * Copyright 2012, 2016 Dmitry Timoshkov | |
| * Copyright 2012 Hans Leidekker for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #define COBJMACROS | |
| #include "windef.h" | |
| #include "wincodec.h" | |
| #include "wine/test.h" | |
| #include "shlwapi.h" | |
| /* 1x1 pixel PNG image */ | |
| static const char png_no_color_profile[] = { | |
| 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, | |
| 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, | |
| 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xde, 0x00, 0x00, 0x00, | |
| 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, | |
| 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, | |
| 0x4d, 0x45, 0x07, 0xdc, 0x0b, 0x0e, 0x0e, 0x22, 0x17, 0x10, 0xd8, 0xde, | |
| 0x3b, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, | |
| 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59, | |
| 0xe7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, | |
| 0x82 | |
| }; | |
| /* 1x1 pixel PNG image with embedded sRGB profile */ | |
| static const char png_color_profile[] = { | |
| 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, | |
| 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, | |
| 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xde, 0x00, 0x00, 0x0a, | |
| 0x43, 0x69, 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, | |
| 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, 0x53, 0x77, 0x58, | |
| 0x93, 0xf7, 0x16, 0x3e, 0xdf, 0xf7, 0x65, 0x0f, 0x56, 0x42, 0xd8, 0xf0, | |
| 0xb1, 0x97, 0x6c, 0x81, 0x00, 0x22, 0x23, 0xac, 0x08, 0xc8, 0x10, 0x59, | |
| 0xa2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xc5, 0x85, 0x88, | |
| 0x0a, 0x56, 0x14, 0x15, 0x11, 0x9c, 0x48, 0x55, 0xc4, 0x82, 0xd5, 0x0a, | |
| 0x48, 0x9d, 0x88, 0xe2, 0xa0, 0x28, 0xb8, 0x67, 0x41, 0x8a, 0x88, 0x5a, | |
| 0x8b, 0x55, 0x5c, 0x38, 0xee, 0x1f, 0xdc, 0xa7, 0xb5, 0x7d, 0x7a, 0xef, | |
| 0xed, 0xed, 0xfb, 0xd7, 0xfb, 0xbc, 0xe7, 0x9c, 0xe7, 0xfc, 0xce, 0x79, | |
| 0xcf, 0x0f, 0x80, 0x11, 0x12, 0x26, 0x91, 0xe6, 0xa2, 0x6a, 0x00, 0x39, | |
| 0x52, 0x85, 0x3c, 0x3a, 0xd8, 0x1f, 0x8f, 0x4f, 0x48, 0xc4, 0xc9, 0xbd, | |
| 0x80, 0x02, 0x15, 0x48, 0xe0, 0x04, 0x20, 0x10, 0xe6, 0xcb, 0xc2, 0x67, | |
| 0x05, 0xc5, 0x00, 0x00, 0xf0, 0x03, 0x79, 0x78, 0x7e, 0x74, 0xb0, 0x3f, | |
| 0xfc, 0x01, 0xaf, 0x6f, 0x00, 0x02, 0x00, 0x70, 0xd5, 0x2e, 0x24, 0x12, | |
| 0xc7, 0xe1, 0xff, 0x83, 0xba, 0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00, | |
| 0xe0, 0x22, 0x12, 0xe7, 0x0b, 0x01, 0x90, 0x52, 0x00, 0xc8, 0x2e, 0x54, | |
| 0xc8, 0x14, 0x00, 0xc8, 0x18, 0x00, 0xb0, 0x53, 0xb3, 0x64, 0x0a, 0x00, | |
| 0x94, 0x00, 0x00, 0x6c, 0x79, 0x7c, 0x42, 0x22, 0x00, 0xaa, 0x0d, 0x00, | |
| 0xec, 0xf4, 0x49, 0x3e, 0x05, 0x00, 0xd8, 0xa9, 0x93, 0xdc, 0x17, 0x00, | |
| 0xd8, 0xa2, 0x1c, 0xa9, 0x08, 0x00, 0x8d, 0x01, 0x00, 0x99, 0x28, 0x47, | |
| 0x24, 0x02, 0x40, 0xbb, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2c, 0x02, 0xc0, | |
| 0xc2, 0x00, 0xa0, 0xac, 0x40, 0x22, 0x2e, 0x04, 0xc0, 0xae, 0x01, 0x80, | |
| 0x59, 0xb6, 0x32, 0x47, 0x02, 0x80, 0xbd, 0x05, 0x00, 0x76, 0x8e, 0x58, | |
| 0x90, 0x0f, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2c, 0xcc, 0x00, 0x20, | |
| 0x38, 0x02, 0x00, 0x43, 0x1e, 0x13, 0xcd, 0x03, 0x20, 0x4c, 0x03, 0xa0, | |
| 0x30, 0xd2, 0xbf, 0xe0, 0xa9, 0x5f, 0x70, 0x85, 0xb8, 0x48, 0x01, 0x00, | |
| 0xc0, 0xcb, 0x95, 0xcd, 0x97, 0x4b, 0xd2, 0x33, 0x14, 0xb8, 0x95, 0xd0, | |
| 0x1a, 0x77, 0xf2, 0xf0, 0xe0, 0xe2, 0x21, 0xe2, 0xc2, 0x6c, 0xb1, 0x42, | |
| 0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xe4, 0x22, 0x9c, 0x97, 0x9b, 0x23, | |
| 0x13, 0x48, 0xe7, 0x03, 0x4c, 0xce, 0x0c, 0x00, 0x00, 0x1a, 0xf9, 0xd1, | |
| 0xc1, 0xfe, 0x38, 0x3f, 0x90, 0xe7, 0xe6, 0xe4, 0xe1, 0xe6, 0x66, 0xe7, | |
| 0x6c, 0xef, 0xf4, 0xc5, 0xa2, 0xfe, 0x6b, 0xf0, 0x6f, 0x22, 0x3e, 0x21, | |
| 0xf1, 0xdf, 0xfe, 0xbc, 0x8c, 0x02, 0x04, 0x00, 0x10, 0x4e, 0xcf, 0xef, | |
| 0xda, 0x5f, 0xe5, 0xe5, 0xd6, 0x03, 0x70, 0xc7, 0x01, 0xb0, 0x75, 0xbf, | |
| 0x6b, 0xa9, 0x5b, 0x00, 0xda, 0x56, 0x00, 0x68, 0xdf, 0xf9, 0x5d, 0x33, | |
| 0xdb, 0x09, 0xa0, 0x5a, 0x0a, 0xd0, 0x7a, 0xf9, 0x8b, 0x79, 0x38, 0xfc, | |
| 0x40, 0x1e, 0x9e, 0xa1, 0x50, 0xc8, 0x3c, 0x1d, 0x1c, 0x0a, 0x0b, 0x0b, | |
| 0xed, 0x25, 0x62, 0xa1, 0xbd, 0x30, 0xe3, 0x8b, 0x3e, 0xff, 0x33, 0xe1, | |
| 0x6f, 0xe0, 0x8b, 0x7e, 0xf6, 0xfc, 0x40, 0x1e, 0xfe, 0xdb, 0x7a, 0xf0, | |
| 0x00, 0x71, 0x9a, 0x40, 0x99, 0xad, 0xc0, 0xa3, 0x83, 0xfd, 0x71, 0x61, | |
| 0x6e, 0x76, 0xae, 0x52, 0x8e, 0xe7, 0xcb, 0x04, 0x42, 0x31, 0x6e, 0xf7, | |
| 0xe7, 0x23, 0xfe, 0xc7, 0x85, 0x7f, 0xfd, 0x8e, 0x29, 0xd1, 0xe2, 0x34, | |
| 0xb1, 0x5c, 0x2c, 0x15, 0x8a, 0xf1, 0x58, 0x89, 0xb8, 0x50, 0x22, 0x4d, | |
| 0xc7, 0x79, 0xb9, 0x52, 0x91, 0x44, 0x21, 0xc9, 0x95, 0xe2, 0x12, 0xe9, | |
| 0x7f, 0x32, 0xf1, 0x1f, 0x96, 0xfd, 0x09, 0x93, 0x77, 0x0d, 0x00, 0xac, | |
| 0x86, 0x4f, 0xc0, 0x4e, 0xb6, 0x07, 0xb5, 0xcb, 0x6c, 0xc0, 0x7e, 0xee, | |
| 0x01, 0x02, 0x8b, 0x0e, 0x58, 0xd2, 0x76, 0x00, 0x40, 0x7e, 0xf3, 0x2d, | |
| 0x8c, 0x1a, 0x0b, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, 0x79, 0xf7, 0x00, | |
| 0x00, 0x93, 0xbf, 0xf9, 0x8f, 0x40, 0x2b, 0x01, 0x00, 0xcd, 0x97, 0xa4, | |
| 0xe3, 0x00, 0x00, 0xbc, 0xe8, 0x18, 0x5c, 0xa8, 0x94, 0x17, 0x4c, 0xc6, | |
| 0x08, 0x00, 0x00, 0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x07, 0x0c, 0xc1, | |
| 0x14, 0xac, 0xc0, 0x0e, 0x9c, 0xc1, 0x1d, 0xbc, 0xc0, 0x17, 0x02, 0x61, | |
| 0x06, 0x44, 0x40, 0x0c, 0x24, 0xc0, 0x3c, 0x10, 0x42, 0x06, 0xe4, 0x80, | |
| 0x1c, 0x0a, 0xa1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xc0, 0x3a, 0xd8, 0x04, | |
| 0xb5, 0xb0, 0x03, 0x1a, 0xa0, 0x11, 0x9a, 0xe1, 0x10, 0xb4, 0xc1, 0x31, | |
| 0x38, 0x0d, 0xe7, 0xe0, 0x12, 0x5c, 0x81, 0xeb, 0x70, 0x17, 0x06, 0x60, | |
| 0x18, 0x9e, 0xc2, 0x18, 0xbc, 0x86, 0x09, 0x04, 0x41, 0xc8, 0x08, 0x13, | |
| 0x61, 0x21, 0x3a, 0x88, 0x11, 0x62, 0x8e, 0xd8, 0x22, 0xce, 0x08, 0x17, | |
| 0x99, 0x8e, 0x04, 0x22, 0x61, 0x48, 0x34, 0x92, 0x80, 0xa4, 0x20, 0xe9, | |
| 0x88, 0x14, 0x51, 0x22, 0xc5, 0xc8, 0x72, 0xa4, 0x02, 0xa9, 0x42, 0x6a, | |
| 0x91, 0x5d, 0x48, 0x23, 0xf2, 0x2d, 0x72, 0x14, 0x39, 0x8d, 0x5c, 0x40, | |
| 0xfa, 0x90, 0xdb, 0xc8, 0x20, 0x32, 0x8a, 0xfc, 0x8a, 0xbc, 0x47, 0x31, | |
| 0x94, 0x81, 0xb2, 0x51, 0x03, 0xd4, 0x02, 0x75, 0x40, 0xb9, 0xa8, 0x1f, | |
| 0x1a, 0x8a, 0xc6, 0xa0, 0x73, 0xd1, 0x74, 0x34, 0x0f, 0x5d, 0x80, 0x96, | |
| 0xa2, 0x6b, 0xd1, 0x1a, 0xb4, 0x1e, 0x3d, 0x80, 0xb6, 0xa2, 0xa7, 0xd1, | |
| 0x4b, 0xe8, 0x75, 0x74, 0x00, 0x7d, 0x8a, 0x8e, 0x63, 0x80, 0xd1, 0x31, | |
| 0x0e, 0x66, 0x8c, 0xd9, 0x61, 0x5c, 0x8c, 0x87, 0x45, 0x60, 0x89, 0x58, | |
| 0x1a, 0x26, 0xc7, 0x16, 0x63, 0xe5, 0x58, 0x35, 0x56, 0x8f, 0x35, 0x63, | |
| 0x1d, 0x58, 0x37, 0x76, 0x15, 0x1b, 0xc0, 0x9e, 0x61, 0xef, 0x08, 0x24, | |
| 0x02, 0x8b, 0x80, 0x13, 0xec, 0x08, 0x5e, 0x84, 0x10, 0xc2, 0x6c, 0x82, | |
| 0x90, 0x90, 0x47, 0x58, 0x4c, 0x58, 0x43, 0xa8, 0x25, 0xec, 0x23, 0xb4, | |
| 0x12, 0xba, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xc2, 0x27, 0x22, 0x93, | |
| 0xa8, 0x4f, 0xb4, 0x25, 0x7a, 0x12, 0xf9, 0xc4, 0x78, 0x62, 0x3a, 0xb1, | |
| 0x90, 0x58, 0x46, 0xac, 0x26, 0xee, 0x21, 0x1e, 0x21, 0x9e, 0x25, 0x5e, | |
| 0x27, 0x0e, 0x13, 0x5f, 0x93, 0x48, 0x24, 0x0e, 0xc9, 0x92, 0xe4, 0x4e, | |
| 0x0a, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0b, 0x49, 0x6b, 0x48, 0xdb, 0x48, | |
| 0x2d, 0xa4, 0x53, 0xa4, 0x3e, 0xd2, 0x10, 0x69, 0x9c, 0x4c, 0x26, 0xeb, | |
| 0x90, 0x6d, 0xc9, 0xde, 0xe4, 0x08, 0xb2, 0x80, 0xac, 0x20, 0x97, 0x91, | |
| 0xb7, 0x90, 0x0f, 0x90, 0x4f, 0x92, 0xfb, 0xc9, 0xc3, 0xe4, 0xb7, 0x14, | |
| 0x3a, 0xc5, 0x88, 0xe2, 0x4c, 0x09, 0xa2, 0x24, 0x52, 0xa4, 0x94, 0x12, | |
| 0x4a, 0x35, 0x65, 0x3f, 0xe5, 0x04, 0xa5, 0x9f, 0x32, 0x42, 0x99, 0xa0, | |
| 0xaa, 0x51, 0xcd, 0xa9, 0x9e, 0xd4, 0x08, 0xaa, 0x88, 0x3a, 0x9f, 0x5a, | |
| 0x49, 0x6d, 0xa0, 0x76, 0x50, 0x2f, 0x53, 0x87, 0xa9, 0x13, 0x34, 0x75, | |
| 0x9a, 0x25, 0xcd, 0x9b, 0x16, 0x43, 0xcb, 0xa4, 0x2d, 0xa3, 0xd5, 0xd0, | |
| 0x9a, 0x69, 0x67, 0x69, 0xf7, 0x68, 0x2f, 0xe9, 0x74, 0xba, 0x09, 0xdd, | |
| 0x83, 0x1e, 0x45, 0x97, 0xd0, 0x97, 0xd2, 0x6b, 0xe8, 0x07, 0xe9, 0xe7, | |
| 0xe9, 0x83, 0xf4, 0x77, 0x0c, 0x0d, 0x86, 0x0d, 0x83, 0xc7, 0x48, 0x62, | |
| 0x28, 0x19, 0x6b, 0x19, 0x7b, 0x19, 0xa7, 0x18, 0xb7, 0x19, 0x2f, 0x99, | |
| 0x4c, 0xa6, 0x05, 0xd3, 0x97, 0x99, 0xc8, 0x54, 0x30, 0xd7, 0x32, 0x1b, | |
| 0x99, 0x67, 0x98, 0x0f, 0x98, 0x6f, 0x55, 0x58, 0x2a, 0xf6, 0x2a, 0x7c, | |
| 0x15, 0x91, 0xca, 0x12, 0x95, 0x3a, 0x95, 0x56, 0x95, 0x7e, 0x95, 0xe7, | |
| 0xaa, 0x54, 0x55, 0x73, 0x55, 0x3f, 0xd5, 0x79, 0xaa, 0x0b, 0x54, 0xab, | |
| 0x55, 0x0f, 0xab, 0x5e, 0x56, 0x7d, 0xa6, 0x46, 0x55, 0xb3, 0x50, 0xe3, | |
| 0xa9, 0x09, 0xd4, 0x16, 0xab, 0xd5, 0xa9, 0x1d, 0x55, 0xbb, 0xa9, 0x36, | |
| 0xae, 0xce, 0x52, 0x77, 0x52, 0x8f, 0x50, 0xcf, 0x51, 0x5f, 0xa3, 0xbe, | |
| 0x5f, 0xfd, 0x82, 0xfa, 0x63, 0x0d, 0xb2, 0x86, 0x85, 0x46, 0xa0, 0x86, | |
| 0x48, 0xa3, 0x54, 0x63, 0xb7, 0xc6, 0x19, 0x8d, 0x21, 0x16, 0xc6, 0x32, | |
| 0x65, 0xf1, 0x58, 0x42, 0xd6, 0x72, 0x56, 0x03, 0xeb, 0x2c, 0x6b, 0x98, | |
| 0x4d, 0x62, 0x5b, 0xb2, 0xf9, 0xec, 0x4c, 0x76, 0x05, 0xfb, 0x1b, 0x76, | |
| 0x2f, 0x7b, 0x4c, 0x53, 0x43, 0x73, 0xaa, 0x66, 0xac, 0x66, 0x91, 0x66, | |
| 0x9d, 0xe6, 0x71, 0xcd, 0x01, 0x0e, 0xc6, 0xb1, 0xe0, 0xf0, 0x39, 0xd9, | |
| 0x9c, 0x4a, 0xce, 0x21, 0xce, 0x0d, 0xce, 0x7b, 0x2d, 0x03, 0x2d, 0x3f, | |
| 0x2d, 0xb1, 0xd6, 0x6a, 0xad, 0x66, 0xad, 0x7e, 0xad, 0x37, 0xda, 0x7a, | |
| 0xda, 0xbe, 0xda, 0x62, 0xed, 0x72, 0xed, 0x16, 0xed, 0xeb, 0xda, 0xef, | |
| 0x75, 0x70, 0x9d, 0x40, 0x9d, 0x2c, 0x9d, 0xf5, 0x3a, 0x6d, 0x3a, 0xf7, | |
| 0x75, 0x09, 0xba, 0x36, 0xba, 0x51, 0xba, 0x85, 0xba, 0xdb, 0x75, 0xcf, | |
| 0xea, 0x3e, 0xd3, 0x63, 0xeb, 0x79, 0xe9, 0x09, 0xf5, 0xca, 0xf5, 0x0e, | |
| 0xe9, 0xdd, 0xd1, 0x47, 0xf5, 0x6d, 0xf4, 0xa3, 0xf5, 0x17, 0xea, 0xef, | |
| 0xd6, 0xef, 0xd1, 0x1f, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6c, | |
| 0x31, 0x38, 0x63, 0xf0, 0xcc, 0x90, 0x63, 0xe8, 0x6b, 0x98, 0x69, 0xb8, | |
| 0xd1, 0xf0, 0x84, 0xe1, 0xa8, 0x11, 0xcb, 0x68, 0xba, 0x91, 0xc4, 0x68, | |
| 0xa3, 0xd1, 0x49, 0xa3, 0x27, 0xb8, 0x26, 0xee, 0x87, 0x67, 0xe3, 0x35, | |
| 0x78, 0x17, 0x3e, 0x66, 0xac, 0x6f, 0x1c, 0x62, 0xac, 0x34, 0xde, 0x65, | |
| 0xdc, 0x6b, 0x3c, 0x61, 0x62, 0x69, 0x32, 0xdb, 0xa4, 0xc4, 0xa4, 0xc5, | |
| 0xe4, 0xbe, 0x29, 0xcd, 0x94, 0x6b, 0x9a, 0x66, 0xba, 0xd1, 0xb4, 0xd3, | |
| 0x74, 0xcc, 0xcc, 0xc8, 0x2c, 0xdc, 0xac, 0xd8, 0xac, 0xc9, 0xec, 0x8e, | |
| 0x39, 0xd5, 0x9c, 0x6b, 0x9e, 0x61, 0xbe, 0xd9, 0xbc, 0xdb, 0xfc, 0x8d, | |
| 0x85, 0xa5, 0x45, 0x9c, 0xc5, 0x4a, 0x8b, 0x36, 0x8b, 0xc7, 0x96, 0xda, | |
| 0x96, 0x7c, 0xcb, 0x05, 0x96, 0x4d, 0x96, 0xf7, 0xac, 0x98, 0x56, 0x3e, | |
| 0x56, 0x79, 0x56, 0xf5, 0x56, 0xd7, 0xac, 0x49, 0xd6, 0x5c, 0xeb, 0x2c, | |
| 0xeb, 0x6d, 0xd6, 0x57, 0x6c, 0x50, 0x1b, 0x57, 0x9b, 0x0c, 0x9b, 0x3a, | |
| 0x9b, 0xcb, 0xb6, 0xa8, 0xad, 0x9b, 0xad, 0xc4, 0x76, 0x9b, 0x6d, 0xdf, | |
| 0x14, 0xe2, 0x14, 0x8f, 0x29, 0xd2, 0x29, 0xf5, 0x53, 0x6e, 0xda, 0x31, | |
| 0xec, 0xfc, 0xec, 0x0a, 0xec, 0x9a, 0xec, 0x06, 0xed, 0x39, 0xf6, 0x61, | |
| 0xf6, 0x25, 0xf6, 0x6d, 0xf6, 0xcf, 0x1d, 0xcc, 0x1c, 0x12, 0x1d, 0xd6, | |
| 0x3b, 0x74, 0x3b, 0x7c, 0x72, 0x74, 0x75, 0xcc, 0x76, 0x6c, 0x70, 0xbc, | |
| 0xeb, 0xa4, 0xe1, 0x34, 0xc3, 0xa9, 0xc4, 0xa9, 0xc3, 0xe9, 0x57, 0x67, | |
| 0x1b, 0x67, 0xa1, 0x73, 0x9d, 0xf3, 0x35, 0x17, 0xa6, 0x4b, 0x90, 0xcb, | |
| 0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6d, 0xa7, 0x8a, 0xa7, 0x6e, 0x9f, | |
| 0x7a, 0xcb, 0x95, 0xe5, 0x1a, 0xee, 0xba, 0xd2, 0xb5, 0xd3, 0xf5, 0xa3, | |
| 0x9b, 0xbb, 0x9b, 0xdc, 0xad, 0xd9, 0x6d, 0xd4, 0xdd, 0xcc, 0x3d, 0xc5, | |
| 0x7d, 0xab, 0xfb, 0x4d, 0x2e, 0x9b, 0x1b, 0xc9, 0x5d, 0xc3, 0x3d, 0xef, | |
| 0x41, 0xf4, 0xf0, 0xf7, 0x58, 0xe2, 0x71, 0xcc, 0xe3, 0x9d, 0xa7, 0x9b, | |
| 0xa7, 0xc2, 0xf3, 0x90, 0xe7, 0x2f, 0x5e, 0x76, 0x5e, 0x59, 0x5e, 0xfb, | |
| 0xbd, 0x1e, 0x4f, 0xb3, 0x9c, 0x26, 0x9e, 0xd6, 0x30, 0x6d, 0xc8, 0xdb, | |
| 0xc4, 0x5b, 0xe0, 0xbd, 0xcb, 0x7b, 0x60, 0x3a, 0x3e, 0x3d, 0x65, 0xfa, | |
| 0xce, 0xe9, 0x03, 0x3e, 0xc6, 0x3e, 0x02, 0x9f, 0x7a, 0x9f, 0x87, 0xbe, | |
| 0xa6, 0xbe, 0x22, 0xdf, 0x3d, 0xbe, 0x23, 0x7e, 0xd6, 0x7e, 0x99, 0x7e, | |
| 0x07, 0xfc, 0x9e, 0xfb, 0x3b, 0xfa, 0xcb, 0xfd, 0x8f, 0xf8, 0xbf, 0xe1, | |
| 0x79, 0xf2, 0x16, 0xf1, 0x4e, 0x05, 0x60, 0x01, 0xc1, 0x01, 0xe5, 0x01, | |
| 0xbd, 0x81, 0x1a, 0x81, 0xb3, 0x03, 0x6b, 0x03, 0x1f, 0x04, 0x99, 0x04, | |
| 0xa5, 0x07, 0x35, 0x05, 0x8d, 0x05, 0xbb, 0x06, 0x2f, 0x0c, 0x3e, 0x15, | |
| 0x42, 0x0c, 0x09, 0x0d, 0x59, 0x1f, 0x72, 0x93, 0x6f, 0xc0, 0x17, 0xf2, | |
| 0x1b, 0xf9, 0x63, 0x33, 0xdc, 0x67, 0x2c, 0x9a, 0xd1, 0x15, 0xca, 0x08, | |
| 0x9d, 0x15, 0x5a, 0x1b, 0xfa, 0x30, 0xcc, 0x26, 0x4c, 0x1e, 0xd6, 0x11, | |
| 0x8e, 0x86, 0xcf, 0x08, 0xdf, 0x10, 0x7e, 0x6f, 0xa6, 0xf9, 0x4c, 0xe9, | |
| 0xcc, 0xb6, 0x08, 0x88, 0xe0, 0x47, 0x6c, 0x88, 0xb8, 0x1f, 0x69, 0x19, | |
| 0x99, 0x17, 0xf9, 0x7d, 0x14, 0x29, 0x2a, 0x32, 0xaa, 0x2e, 0xea, 0x51, | |
| 0xb4, 0x53, 0x74, 0x71, 0x74, 0xf7, 0x2c, 0xd6, 0xac, 0xe4, 0x59, 0xfb, | |
| 0x67, 0xbd, 0x8e, 0xf1, 0x8f, 0xa9, 0x8c, 0xb9, 0x3b, 0xdb, 0x6a, 0xb6, | |
| 0x72, 0x76, 0x67, 0xac, 0x6a, 0x6c, 0x52, 0x6c, 0x63, 0xec, 0x9b, 0xb8, | |
| 0x80, 0xb8, 0xaa, 0xb8, 0x81, 0x78, 0x87, 0xf8, 0x45, 0xf1, 0x97, 0x12, | |
| 0x74, 0x13, 0x24, 0x09, 0xed, 0x89, 0xe4, 0xc4, 0xd8, 0xc4, 0x3d, 0x89, | |
| 0xe3, 0x73, 0x02, 0xe7, 0x6c, 0x9a, 0x33, 0x9c, 0xe4, 0x9a, 0x54, 0x96, | |
| 0x74, 0x63, 0xae, 0xe5, 0xdc, 0xa2, 0xb9, 0x17, 0xe6, 0xe9, 0xce, 0xcb, | |
| 0x9e, 0x77, 0x3c, 0x59, 0x35, 0x59, 0x90, 0x7c, 0x38, 0x85, 0x98, 0x12, | |
| 0x97, 0xb2, 0x3f, 0xe5, 0x83, 0x20, 0x42, 0x50, 0x2f, 0x18, 0x4f, 0xe5, | |
| 0xa7, 0x6e, 0x4d, 0x1d, 0x13, 0xf2, 0x84, 0x9b, 0x85, 0x4f, 0x45, 0xbe, | |
| 0xa2, 0x8d, 0xa2, 0x51, 0xb1, 0xb7, 0xb8, 0x4a, 0x3c, 0x92, 0xe6, 0x9d, | |
| 0x56, 0x95, 0xf6, 0x38, 0xdd, 0x3b, 0x7d, 0x43, 0xfa, 0x68, 0x86, 0x4f, | |
| 0x46, 0x75, 0xc6, 0x33, 0x09, 0x4f, 0x52, 0x2b, 0x79, 0x91, 0x19, 0x92, | |
| 0xb9, 0x23, 0xf3, 0x4d, 0x56, 0x44, 0xd6, 0xde, 0xac, 0xcf, 0xd9, 0x71, | |
| 0xd9, 0x2d, 0x39, 0x94, 0x9c, 0x94, 0x9c, 0xa3, 0x52, 0x0d, 0x69, 0x96, | |
| 0xb4, 0x2b, 0xd7, 0x30, 0xb7, 0x28, 0xb7, 0x4f, 0x66, 0x2b, 0x2b, 0x93, | |
| 0x0d, 0xe4, 0x79, 0xe6, 0x6d, 0xca, 0x1b, 0x93, 0x87, 0xca, 0xf7, 0xe4, | |
| 0x23, 0xf9, 0x73, 0xf3, 0xdb, 0x15, 0x6c, 0x85, 0x4c, 0xd1, 0xa3, 0xb4, | |
| 0x52, 0xae, 0x50, 0x0e, 0x16, 0x4c, 0x2f, 0xa8, 0x2b, 0x78, 0x5b, 0x18, | |
| 0x5b, 0x78, 0xb8, 0x48, 0xbd, 0x48, 0x5a, 0xd4, 0x33, 0xdf, 0x66, 0xfe, | |
| 0xea, 0xf9, 0x23, 0x0b, 0x82, 0x16, 0x7c, 0xbd, 0x90, 0xb0, 0x50, 0xb8, | |
| 0xb0, 0xb3, 0xd8, 0xb8, 0x78, 0x59, 0xf1, 0xe0, 0x22, 0xbf, 0x45, 0xbb, | |
| 0x16, 0x23, 0x8b, 0x53, 0x17, 0x77, 0x2e, 0x31, 0x5d, 0x52, 0xba, 0x64, | |
| 0x78, 0x69, 0xf0, 0xd2, 0x7d, 0xcb, 0x68, 0xcb, 0xb2, 0x96, 0xfd, 0x50, | |
| 0xe2, 0x58, 0x52, 0x55, 0xf2, 0x6a, 0x79, 0xdc, 0xf2, 0x8e, 0x52, 0x83, | |
| 0xd2, 0xa5, 0xa5, 0x43, 0x2b, 0x82, 0x57, 0x34, 0x95, 0xa9, 0x94, 0xc9, | |
| 0xcb, 0x6e, 0xae, 0xf4, 0x5a, 0xb9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55, | |
| 0xef, 0x6a, 0x97, 0xd5, 0x5b, 0x56, 0x7f, 0x2a, 0x17, 0x95, 0x5f, 0xac, | |
| 0x70, 0xac, 0xa8, 0xae, 0xf8, 0xb0, 0x46, 0xb8, 0xe6, 0xe2, 0x57, 0x4e, | |
| 0x5f, 0xd5, 0x7c, 0xf5, 0x79, 0x6d, 0xda, 0xda, 0xde, 0x4a, 0xb7, 0xca, | |
| 0xed, 0xeb, 0x48, 0xeb, 0xa4, 0xeb, 0x6e, 0xac, 0xf7, 0x59, 0xbf, 0xaf, | |
| 0x4a, 0xbd, 0x6a, 0x41, 0xd5, 0xd0, 0x86, 0xf0, 0x0d, 0xad, 0x1b, 0xf1, | |
| 0x8d, 0xe5, 0x1b, 0x5f, 0x6d, 0x4a, 0xde, 0x74, 0xa1, 0x7a, 0x6a, 0xf5, | |
| 0x8e, 0xcd, 0xb4, 0xcd, 0xca, 0xcd, 0x03, 0x35, 0x61, 0x35, 0xed, 0x5b, | |
| 0xcc, 0xb6, 0xac, 0xdb, 0xf2, 0xa1, 0x36, 0xa3, 0xf6, 0x7a, 0x9d, 0x7f, | |
| 0x5d, 0xcb, 0x56, 0xfd, 0xad, 0xab, 0xb7, 0xbe, 0xd9, 0x26, 0xda, 0xd6, | |
| 0xbf, 0xdd, 0x77, 0x7b, 0xf3, 0x0e, 0x83, 0x1d, 0x15, 0x3b, 0xde, 0xef, | |
| 0x94, 0xec, 0xbc, 0xb5, 0x2b, 0x78, 0x57, 0x6b, 0xbd, 0x45, 0x7d, 0xf5, | |
| 0x6e, 0xd2, 0xee, 0x82, 0xdd, 0x8f, 0x1a, 0x62, 0x1b, 0xba, 0xbf, 0xe6, | |
| 0x7e, 0xdd, 0xb8, 0x47, 0x77, 0x4f, 0xc5, 0x9e, 0x8f, 0x7b, 0xa5, 0x7b, | |
| 0x07, 0xf6, 0x45, 0xef, 0xeb, 0x6a, 0x74, 0x6f, 0x6c, 0xdc, 0xaf, 0xbf, | |
| 0xbf, 0xb2, 0x09, 0x6d, 0x52, 0x36, 0x8d, 0x1e, 0x48, 0x3a, 0x70, 0xe5, | |
| 0x9b, 0x80, 0x6f, 0xda, 0x9b, 0xed, 0x9a, 0x77, 0xb5, 0x70, 0x5a, 0x2a, | |
| 0x0e, 0xc2, 0x41, 0xe5, 0xc1, 0x27, 0xdf, 0xa6, 0x7c, 0x7b, 0xe3, 0x50, | |
| 0xe8, 0xa1, 0xce, 0xc3, 0xdc, 0xc3, 0xcd, 0xdf, 0x99, 0x7f, 0xb7, 0xf5, | |
| 0x08, 0xeb, 0x48, 0x79, 0x2b, 0xd2, 0x3a, 0xbf, 0x75, 0xac, 0x2d, 0xa3, | |
| 0x6d, 0xa0, 0x3d, 0xa1, 0xbd, 0xef, 0xe8, 0x8c, 0xa3, 0x9d, 0x1d, 0x5e, | |
| 0x1d, 0x47, 0xbe, 0xb7, 0xff, 0x7e, 0xef, 0x31, 0xe3, 0x63, 0x75, 0xc7, | |
| 0x35, 0x8f, 0x57, 0x9e, 0xa0, 0x9d, 0x28, 0x3d, 0xf1, 0xf9, 0xe4, 0x82, | |
| 0x93, 0xe3, 0xa7, 0x64, 0xa7, 0x9e, 0x9d, 0x4e, 0x3f, 0x3d, 0xd4, 0x99, | |
| 0xdc, 0x79, 0xf7, 0x4c, 0xfc, 0x99, 0x6b, 0x5d, 0x51, 0x5d, 0xbd, 0x67, | |
| 0x43, 0xcf, 0x9e, 0x3f, 0x17, 0x74, 0xee, 0x4c, 0xb7, 0x5f, 0xf7, 0xc9, | |
| 0xf3, 0xde, 0xe7, 0x8f, 0x5d, 0xf0, 0xbc, 0x70, 0xf4, 0x22, 0xf7, 0x62, | |
| 0xdb, 0x25, 0xb7, 0x4b, 0xad, 0x3d, 0xae, 0x3d, 0x47, 0x7e, 0x70, 0xfd, | |
| 0xe1, 0x48, 0xaf, 0x5b, 0x6f, 0xeb, 0x65, 0xf7, 0xcb, 0xed, 0x57, 0x3c, | |
| 0xae, 0x74, 0xf4, 0x4d, 0xeb, 0x3b, 0xd1, 0xef, 0xd3, 0x7f, 0xfa, 0x6a, | |
| 0xc0, 0xd5, 0x73, 0xd7, 0xf8, 0xd7, 0x2e, 0x5d, 0x9f, 0x79, 0xbd, 0xef, | |
| 0xc6, 0xec, 0x1b, 0xb7, 0x6e, 0x26, 0xdd, 0x1c, 0xb8, 0x25, 0xba, 0xf5, | |
| 0xf8, 0x76, 0xf6, 0xed, 0x17, 0x77, 0x0a, 0xee, 0x4c, 0xdc, 0x5d, 0x7a, | |
| 0x8f, 0x78, 0xaf, 0xfc, 0xbe, 0xda, 0xfd, 0xea, 0x07, 0xfa, 0x0f, 0xea, | |
| 0x7f, 0xb4, 0xfe, 0xb1, 0x65, 0xc0, 0x6d, 0xe0, 0xf8, 0x60, 0xc0, 0x60, | |
| 0xcf, 0xc3, 0x59, 0x0f, 0xef, 0x0e, 0x09, 0x87, 0x9e, 0xfe, 0x94, 0xff, | |
| 0xd3, 0x87, 0xe1, 0xd2, 0x47, 0xcc, 0x47, 0xd5, 0x23, 0x46, 0x23, 0x8d, | |
| 0x8f, 0x9d, 0x1f, 0x1f, 0x1b, 0x0d, 0x1a, 0xbd, 0xf2, 0x64, 0xce, 0x93, | |
| 0xe1, 0xa7, 0xb2, 0xa7, 0x13, 0xcf, 0xca, 0x7e, 0x56, 0xff, 0x79, 0xeb, | |
| 0x73, 0xab, 0xe7, 0xdf, 0xfd, 0xe2, 0xfb, 0x4b, 0xcf, 0x58, 0xfc, 0xd8, | |
| 0xf0, 0x0b, 0xf9, 0x8b, 0xcf, 0xbf, 0xae, 0x79, 0xa9, 0xf3, 0x72, 0xef, | |
| 0xab, 0xa9, 0xaf, 0x3a, 0xc7, 0x23, 0xc7, 0x1f, 0xbc, 0xce, 0x79, 0x3d, | |
| 0xf1, 0xa6, 0xfc, 0xad, 0xce, 0xdb, 0x7d, 0xef, 0xb8, 0xef, 0xba, 0xdf, | |
| 0xc7, 0xbd, 0x1f, 0x99, 0x28, 0xfc, 0x40, 0xfe, 0x50, 0xf3, 0xd1, 0xfa, | |
| 0x63, 0xc7, 0xa7, 0xd0, 0x4f, 0xf7, 0x3e, 0xe7, 0x7c, 0xfe, 0xfc, 0x2f, | |
| 0xf7, 0x84, 0xf3, 0xfb, 0x80, 0x39, 0x25, 0x11, 0x00, 0x00, 0x00, 0x09, | |
| 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, | |
| 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, | |
| 0x45, 0x07, 0xdc, 0x0b, 0x0e, 0x0e, 0x25, 0x16, 0x28, 0x9e, 0x78, 0x6a, | |
| 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, | |
| 0xff, 0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59, 0xe7, | |
| 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 | |
| }; | |
| static IWICImagingFactory *factory; | |
| static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder) | |
| { | |
| HRESULT hr; | |
| IStream *stream; | |
| GUID format; | |
| LONG refcount; | |
| ULARGE_INTEGER pos; | |
| LARGE_INTEGER zero; | |
| *decoder = NULL; | |
| stream = SHCreateMemStream (image_data, image_size); | |
| ok(stream != NULL, "SHCreateMemStream error\n"); | |
| hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, decoder); | |
| if (hr == S_OK) | |
| { | |
| hr = IWICBitmapDecoder_GetContainerFormat(*decoder, &format); | |
| ok(hr == S_OK, "GetContainerFormat error %#x\n", hr); | |
| ok(IsEqualGUID(&format, &GUID_ContainerFormatPng), | |
| "wrong container format %s\n", wine_dbgstr_guid(&format)); | |
| zero.QuadPart = 0; | |
| IStream_Seek (stream, zero, STREAM_SEEK_CUR, &pos); | |
| ok(pos.QuadPart < image_size, "seek beyond the end of stream: %x%08x >= %x\n", | |
| (UINT)(pos.QuadPart >> 32), (UINT)pos.QuadPart, image_size); | |
| refcount = IStream_Release(stream); | |
| ok(refcount > 0, "expected stream refcount > 0\n"); | |
| } | |
| return hr; | |
| } | |
| static WCHAR *save_profile( BYTE *buffer, UINT size ) | |
| { | |
| static const WCHAR tstW[] = {'t','s','t',0}; | |
| WCHAR path[MAX_PATH], filename[MAX_PATH], *ret; | |
| HANDLE handle; | |
| DWORD count; | |
| GetTempPathW(MAX_PATH, path); | |
| GetTempFileNameW(path, tstW, 0, filename); | |
| handle = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); | |
| if (handle == INVALID_HANDLE_VALUE) return NULL; | |
| WriteFile(handle, buffer, size, &count, NULL); | |
| CloseHandle( handle ); | |
| ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR)); | |
| lstrcpyW(ret, filename); | |
| return ret; | |
| } | |
| static void test_color_contexts(void) | |
| { | |
| HRESULT hr; | |
| IWICBitmapDecoder *decoder; | |
| IWICBitmapFrameDecode *frame; | |
| IWICColorContext *context; | |
| WICColorContextType type; | |
| UINT count, colorspace, size; | |
| WCHAR *tmpfile; | |
| BYTE *buffer; | |
| BOOL ret; | |
| hr = create_decoder(png_no_color_profile, sizeof(png_no_color_profile), &decoder); | |
| ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr); | |
| if (hr != S_OK) return; | |
| /* global color context */ | |
| hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, NULL); | |
| ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr); | |
| count = 0xdeadbeef; | |
| hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count); | |
| ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr); | |
| ok(count == 0xdeadbeef, "unexpected count %u\n", count); | |
| /* frame color context */ | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, NULL); | |
| ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr); | |
| count = 0xdeadbeef; | |
| hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count); | |
| ok(hr == S_OK, "GetColorContexts error %#x\n", hr); | |
| ok(!count, "unexpected count %u\n", count); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| hr = create_decoder(png_color_profile, sizeof(png_color_profile), &decoder); | |
| ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr); | |
| if (hr != S_OK) return; | |
| /* global color context */ | |
| count = 0xdeadbeef; | |
| hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count); | |
| ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr); | |
| ok(count == 0xdeadbeef, "unexpected count %u\n", count); | |
| /* frame color context */ | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| count = 0xdeadbeef; | |
| hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count); | |
| ok(hr == S_OK, "GetColorContexts error %#x\n", hr); | |
| ok(count == 1, "unexpected count %u\n", count); | |
| hr = IWICImagingFactory_CreateColorContext(factory, NULL); | |
| ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr); | |
| hr = IWICImagingFactory_CreateColorContext(factory, &context); | |
| ok(hr == S_OK, "CreateColorContext error %#x\n", hr); | |
| hr = IWICColorContext_GetType(context, NULL); | |
| ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr); | |
| type = 0xdeadbeef; | |
| hr = IWICColorContext_GetType(context, &type); | |
| ok(hr == S_OK, "GetType error %#x\n", hr); | |
| ok(type == WICColorContextUninitialized, "unexpected type %u\n", type); | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL); | |
| ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr); | |
| size = 0; | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size); | |
| ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr); | |
| ok(!size, "unexpected size %u\n", size); | |
| hr = IWICColorContext_GetExifColorSpace(context, NULL); | |
| ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr); | |
| colorspace = 0xdeadbeef; | |
| hr = IWICColorContext_GetExifColorSpace(context, &colorspace); | |
| ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr); | |
| ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace); | |
| hr = IWICColorContext_InitializeFromExifColorSpace(context, 0); | |
| ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr); | |
| hr = IWICColorContext_InitializeFromExifColorSpace(context, 1); | |
| ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr); | |
| hr = IWICColorContext_InitializeFromExifColorSpace(context, 2); | |
| ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr); | |
| colorspace = 0xdeadbeef; | |
| hr = IWICColorContext_GetExifColorSpace(context, &colorspace); | |
| ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr); | |
| ok(colorspace == 2, "unexpected color space %u\n", colorspace); | |
| size = 0; | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size); | |
| ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr); | |
| ok(!size, "unexpected size %u\n", size); | |
| type = 0xdeadbeef; | |
| hr = IWICColorContext_GetType(context, &type); | |
| ok(hr == S_OK, "GetType error %#x\n", hr); | |
| ok(type == WICColorContextExifColorSpace, "unexpected type %u\n", type); | |
| hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count); | |
| ok(hr == WINCODEC_ERR_WRONGSTATE, "GetColorContexts error %#x\n", hr); | |
| IWICColorContext_Release(context); | |
| IWICBitmapFrameDecode_Release(frame); | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICImagingFactory_CreateColorContext(factory, &context); | |
| ok(hr == S_OK, "CreateColorContext error %#x\n", hr); | |
| count = 1; | |
| hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count); | |
| ok(hr == S_OK, "GetColorContexts error %#x\n", hr); | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL); | |
| ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr); | |
| size = 0; | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size); | |
| ok(hr == S_OK, "GetProfileBytes error %#x\n", hr); | |
| ok(size, "unexpected size %u\n", size); | |
| buffer = HeapAlloc(GetProcessHeap(), 0, size); | |
| hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size); | |
| ok(hr == S_OK, "GetProfileBytes error %#x\n", hr); | |
| tmpfile = save_profile( buffer, size ); | |
| HeapFree(GetProcessHeap(), 0, buffer); | |
| type = 0xdeadbeef; | |
| hr = IWICColorContext_GetType(context, &type); | |
| ok(hr == S_OK, "GetType error %#x\n", hr); | |
| ok(type == WICColorContextProfile, "unexpected type %u\n", type); | |
| colorspace = 0xdeadbeef; | |
| hr = IWICColorContext_GetExifColorSpace(context, &colorspace); | |
| ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr); | |
| ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace); | |
| hr = IWICColorContext_InitializeFromExifColorSpace(context, 1); | |
| ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr); | |
| if (tmpfile) | |
| { | |
| hr = IWICColorContext_InitializeFromFilename(context, NULL); | |
| ok(hr == E_INVALIDARG, "InitializeFromFilename error %#x\n", hr); | |
| hr = IWICColorContext_InitializeFromFilename(context, tmpfile); | |
| ok(hr == S_OK, "InitializeFromFilename error %#x\n", hr); | |
| ret = DeleteFileW(tmpfile); | |
| ok(ret, "DeleteFileW failed %u\n", GetLastError()); | |
| type = 0xdeadbeef; | |
| hr = IWICColorContext_GetType(context, &type); | |
| ok(hr == S_OK, "GetType error %#x\n", hr); | |
| ok(type == WICColorContextProfile, "unexpected type %u\n", type); | |
| colorspace = 0xdeadbeef; | |
| hr = IWICColorContext_GetExifColorSpace(context, &colorspace); | |
| ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr); | |
| ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace); | |
| hr = IWICColorContext_InitializeFromExifColorSpace(context, 1); | |
| ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr); | |
| size = 0; | |
| hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size); | |
| ok(hr == S_OK, "GetProfileBytes error %#x\n", hr); | |
| ok(size, "unexpected size %u\n", size); | |
| buffer = HeapAlloc(GetProcessHeap(), 0, size); | |
| hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size); | |
| ok(hr == S_OK, "GetProfileBytes error %#x\n", hr); | |
| HeapFree(GetProcessHeap(), 0, buffer); | |
| HeapFree(GetProcessHeap(), 0, tmpfile); | |
| } | |
| IWICColorContext_Release(context); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| } | |
| /* 1 bpp 1x1 pixel PNG image with PLTE and tRNS chunks */ | |
| static const char png_PLTE_tRNS[] = { | |
| 0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a, | |
| 0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x03,0x00,0x00,0x00,0x25,0xdb,0x56,0xca, | |
| 0x00,0x00,0x00,0x06,'P','L','T','E',0x01,0x02,0x03,0x04,0x05,0x06,0x95,0x53,0x6f,0x48, | |
| 0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a, | |
| 0x00,0x00,0x00,0x0a,'I','D','A','T',0x18,0xd3,0x63,0x68,0x00,0x00,0x00,0x82,0x00,0x81,0xa7,0x01,0xba,0x10, | |
| 0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82 | |
| }; | |
| static void test_png_palette(void) | |
| { | |
| HRESULT hr; | |
| IWICBitmapDecoder *decoder; | |
| IWICBitmapFrameDecode *frame; | |
| IWICPalette *palette; | |
| GUID format; | |
| UINT count, ret; | |
| WICColor color[256]; | |
| hr = create_decoder(png_PLTE_tRNS, sizeof(png_PLTE_tRNS), &decoder); | |
| ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr); | |
| if (hr != S_OK) return; | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); | |
| ok(hr == S_OK, "GetPixelFormat error %#x\n", hr); | |
| ok(IsEqualGUID(&format, &GUID_WICPixelFormat1bppIndexed), | |
| "got wrong format %s\n", wine_dbgstr_guid(&format)); | |
| hr = IWICImagingFactory_CreatePalette(factory, &palette); | |
| ok(hr == S_OK, "CreatePalette error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_CopyPalette(frame, palette); | |
| ok(hr == S_OK, "CopyPalette error %#x\n", hr); | |
| hr = IWICPalette_GetColorCount(palette, &count); | |
| ok(hr == S_OK, "GetColorCount error %#x\n", hr); | |
| ok(count == 2, "expected 2, got %u\n", count); | |
| hr = IWICPalette_GetColors(palette, 256, color, &ret); | |
| ok(hr == S_OK, "GetColors error %#x\n", hr); | |
| ok(ret == count, "expected %u, got %u\n", count, ret); | |
| ok(color[0] == 0xff010203, "expected 0xff010203, got %#x\n", color[0]); | |
| ok(color[1] == 0x00040506, "expected 0x00040506, got %#x\n", color[1]); | |
| IWICPalette_Release(palette); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| } | |
| /* RGB 24 bpp 1x1 pixel PNG image */ | |
| static const char png_1x1_data[] = { | |
| 0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a, | |
| 0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53,0xde, | |
| 0x00,0x00,0x03,0x00,'P','L','T','E', | |
| 0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08, | |
| 0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10, | |
| 0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18, | |
| 0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20, | |
| 0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28, | |
| 0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30, | |
| 0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, | |
| 0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, | |
| 0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48, | |
| 0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50, | |
| 0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58, | |
| 0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60, | |
| 0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68, | |
| 0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70, | |
| 0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78, | |
| 0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80, | |
| 0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08, | |
| 0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10, | |
| 0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18, | |
| 0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20, | |
| 0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28, | |
| 0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30, | |
| 0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, | |
| 0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, | |
| 0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48, | |
| 0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50, | |
| 0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58, | |
| 0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60, | |
| 0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68, | |
| 0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70, | |
| 0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78, | |
| 0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80, | |
| 0x76,0xb6,0x24,0x31, | |
| 0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a, | |
| 0x00,0x00,0x00,0x0c,'I','D','A','T',0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,0xe7, | |
| 0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82 | |
| }; | |
| static BOOL is_valid_png_type_depth(int color_type, int bit_depth, BOOL plte) | |
| { | |
| switch (color_type) | |
| { | |
| case 0: /* Grayscale */ | |
| return bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8 || bit_depth == 16; | |
| case 2: /* True Color */ | |
| return bit_depth == 8 || bit_depth == 16; | |
| case 3: /* Indexed Color */ | |
| return (bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8) && plte; | |
| case 4: /* Grayscale with alpha */ | |
| return bit_depth == 8 || bit_depth == 16; | |
| case 6: /* True Color with alpha */ | |
| return bit_depth == 8 || bit_depth == 16; | |
| default: | |
| ok(0, "unknown PNG type %d, depth %d\n", color_type, bit_depth); | |
| return FALSE; | |
| } | |
| } | |
| static void test_color_formats(void) | |
| { | |
| static const struct | |
| { | |
| char bit_depth, color_type; | |
| const GUID *format; | |
| const GUID *format_PLTE; | |
| const GUID *format_PLTE_tRNS; | |
| BOOL todo; | |
| BOOL todo_load; | |
| } td[] = | |
| { | |
| /* 2 - PNG_COLOR_TYPE_RGB */ | |
| { 1, 2, NULL, NULL, NULL }, | |
| { 2, 2, NULL, NULL, NULL }, | |
| { 4, 2, NULL, NULL, NULL }, | |
| { 8, 2, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR }, | |
| /* libpng refuses to load our test image complaining about extra compressed data, | |
| * but libpng is still able to load the image with other combination of type/depth | |
| * making RGB 16 bpp case special for some reason. Therefore todo = TRUE. | |
| */ | |
| { 16, 2, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, TRUE, TRUE }, | |
| { 24, 2, NULL, NULL, NULL }, | |
| { 32, 2, NULL, NULL, NULL }, | |
| /* 0 - PNG_COLOR_TYPE_GRAY */ | |
| { 1, 0, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormat1bppIndexed }, | |
| { 2, 0, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppIndexed }, | |
| { 4, 0, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppIndexed }, | |
| { 8, 0, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppIndexed }, | |
| { 16, 0, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat64bppRGBA }, | |
| { 24, 0, NULL, NULL, NULL }, | |
| { 32, 0, NULL, NULL, NULL }, | |
| /* 3 - PNG_COLOR_TYPE_PALETTE */ | |
| { 1, 3, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed }, | |
| { 2, 3, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed }, | |
| { 4, 3, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed }, | |
| { 8, 3, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed }, | |
| { 16, 3, NULL, NULL, NULL }, | |
| { 24, 3, NULL, NULL, NULL }, | |
| { 32, 3, NULL, NULL, NULL }, | |
| }; | |
| char buf[sizeof(png_1x1_data)]; | |
| HRESULT hr; | |
| IWICBitmapDecoder *decoder; | |
| IWICBitmapFrameDecode *frame; | |
| GUID format; | |
| int i, PLTE_off = 0, tRNS_off = 0; | |
| memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); | |
| for (i = 0; i < sizeof(png_1x1_data) - 4; i++) | |
| { | |
| if (!memcmp(buf + i, "tRNS", 4)) | |
| tRNS_off = i; | |
| else if (!memcmp(buf + i, "PLTE", 4)) | |
| PLTE_off = i; | |
| } | |
| ok(PLTE_off && tRNS_off, "PLTE offset %d, tRNS offset %d\n", PLTE_off, tRNS_off); | |
| if (!PLTE_off || !tRNS_off) return; | |
| /* In order to test the image data with and without PLTE and tRNS chunks | |
| * it's been decided to simply sero out the chunk id for testing puposes, | |
| * and under Windows such images get loaded just fine. But unfortunately | |
| * libpng refuses to load such images complaining about unknown chunk type. | |
| * A workaround for this libpng limitation is to mark the "disabled" chunks | |
| * with tEXt id. | |
| */ | |
| for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) | |
| { | |
| /* with the tRNS and PLTE chunks */ | |
| memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); | |
| buf[24] = td[i].bit_depth; | |
| buf[25] = td[i].color_type; | |
| hr = create_decoder(buf, sizeof(buf), &decoder); | |
| if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE)) | |
| todo_wine | |
| ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr); | |
| else | |
| todo_wine_if(td[i].todo_load) | |
| ok(hr == S_OK, "%d: Failed to load PNG image data (type %d, bpp %d) %#x\n", i, td[i].color_type, td[i].bit_depth, hr); | |
| if (hr != S_OK) goto next_1; | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); | |
| ok(hr == S_OK, "GetPixelFormat error %#x\n", hr); | |
| todo_wine_if(td[i].todo) | |
| ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS), | |
| "PLTE+tRNS: expected %s, got %s (type %d, bpp %d)\n", | |
| wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| next_1: | |
| /* without the tRNS chunk */ | |
| memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); | |
| buf[24] = td[i].bit_depth; | |
| buf[25] = td[i].color_type; | |
| memcpy(buf + tRNS_off, "tEXt", 4); | |
| hr = create_decoder(buf, sizeof(buf), &decoder); | |
| if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE)) | |
| todo_wine | |
| ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr); | |
| else | |
| todo_wine_if(td[i].todo_load) | |
| ok(hr == S_OK, "%d: Failed to load PNG image data (type %d, bpp %d) %#x\n", i, td[i].color_type, td[i].bit_depth, hr); | |
| if (hr != S_OK) goto next_2; | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); | |
| ok(hr == S_OK, "GetPixelFormat error %#x\n", hr); | |
| ok(IsEqualGUID(&format, td[i].format_PLTE), | |
| "PLTE: expected %s, got %s (type %d, bpp %d)\n", | |
| wine_dbgstr_guid(td[i].format_PLTE), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| next_2: | |
| /* without the tRNS and PLTE chunks */ | |
| memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); | |
| buf[24] = td[i].bit_depth; | |
| buf[25] = td[i].color_type; | |
| memcpy(buf + PLTE_off, "tEXt", 4); | |
| memcpy(buf + tRNS_off, "tEXt", 4); | |
| hr = create_decoder(buf, sizeof(buf), &decoder); | |
| if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE)) | |
| todo_wine | |
| ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr); | |
| else | |
| todo_wine_if(td[i].todo_load) | |
| ok(hr == S_OK, "%d: Failed to load PNG image data (type %d, bpp %d) %#x\n", i, td[i].color_type, td[i].bit_depth, hr); | |
| if (hr != S_OK) goto next_3; | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); | |
| ok(hr == S_OK, "GetPixelFormat error %#x\n", hr); | |
| ok(IsEqualGUID(&format, td[i].format), | |
| "expected %s, got %s (type %d, bpp %d)\n", | |
| wine_dbgstr_guid(td[i].format), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| next_3: | |
| /* without the PLTE chunk */ | |
| memcpy(buf, png_1x1_data, sizeof(png_1x1_data)); | |
| buf[24] = td[i].bit_depth; | |
| buf[25] = td[i].color_type; | |
| memcpy(buf + PLTE_off, "tEXt", 4); | |
| hr = create_decoder(buf, sizeof(buf), &decoder); | |
| if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE)) | |
| todo_wine | |
| ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr); | |
| else | |
| todo_wine_if(td[i].todo_load) | |
| ok(hr == S_OK, "%d: Failed to load PNG image data (type %d, bpp %d) %#x\n", i, td[i].color_type, td[i].bit_depth, hr); | |
| if (hr != S_OK) continue; | |
| hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame); | |
| ok(hr == S_OK, "GetFrame error %#x\n", hr); | |
| hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format); | |
| ok(hr == S_OK, "GetPixelFormat error %#x\n", hr); | |
| todo_wine_if(td[i].todo) | |
| ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS), | |
| "tRNS: expected %s, got %s (type %d, bpp %d)\n", | |
| wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth); | |
| IWICBitmapFrameDecode_Release(frame); | |
| IWICBitmapDecoder_Release(decoder); | |
| } | |
| } | |
| START_TEST(pngformat) | |
| { | |
| HRESULT hr; | |
| CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); | |
| hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, | |
| &IID_IWICImagingFactory, (void **)&factory); | |
| ok(hr == S_OK, "CoCreateInstance error %#x\n", hr); | |
| if (FAILED(hr)) return; | |
| test_color_contexts(); | |
| test_png_palette(); | |
| test_color_formats(); | |
| IWICImagingFactory_Release(factory); | |
| CoUninitialize(); | |
| } |