ReactOS  0.4.14-dev-376-gaedba84
pngformat.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012, 2016 Dmitry Timoshkov
3  * Copyright 2012 Hans Leidekker for CodeWeavers
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include <stdarg.h>
21 #include <stdio.h>
22 
23 #define COBJMACROS
24 
25 #include "windef.h"
26 #include "wincodec.h"
27 #include "wine/test.h"
28 #include "shlwapi.h"
29 
30 /* 1x1 pixel PNG image */
31 static const char png_no_color_profile[] = {
32  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
33  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
34  0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xde, 0x00, 0x00, 0x00,
35  0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
36  0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49,
37  0x4d, 0x45, 0x07, 0xdc, 0x0b, 0x0e, 0x0e, 0x22, 0x17, 0x10, 0xd8, 0xde,
38  0x3b, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
39  0xf8, 0xff, 0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59,
40  0xe7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
41  0x82
42 };
43 
44 /* 1x1 pixel PNG image with embedded sRGB profile */
45 static const char png_color_profile[] = {
46  0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
47  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
48  0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xde, 0x00, 0x00, 0x0a,
49  0x43, 0x69, 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f,
50  0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x78, 0xda, 0x9d, 0x53, 0x77, 0x58,
51  0x93, 0xf7, 0x16, 0x3e, 0xdf, 0xf7, 0x65, 0x0f, 0x56, 0x42, 0xd8, 0xf0,
52  0xb1, 0x97, 0x6c, 0x81, 0x00, 0x22, 0x23, 0xac, 0x08, 0xc8, 0x10, 0x59,
53  0xa2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xc5, 0x85, 0x88,
54  0x0a, 0x56, 0x14, 0x15, 0x11, 0x9c, 0x48, 0x55, 0xc4, 0x82, 0xd5, 0x0a,
55  0x48, 0x9d, 0x88, 0xe2, 0xa0, 0x28, 0xb8, 0x67, 0x41, 0x8a, 0x88, 0x5a,
56  0x8b, 0x55, 0x5c, 0x38, 0xee, 0x1f, 0xdc, 0xa7, 0xb5, 0x7d, 0x7a, 0xef,
57  0xed, 0xed, 0xfb, 0xd7, 0xfb, 0xbc, 0xe7, 0x9c, 0xe7, 0xfc, 0xce, 0x79,
58  0xcf, 0x0f, 0x80, 0x11, 0x12, 0x26, 0x91, 0xe6, 0xa2, 0x6a, 0x00, 0x39,
59  0x52, 0x85, 0x3c, 0x3a, 0xd8, 0x1f, 0x8f, 0x4f, 0x48, 0xc4, 0xc9, 0xbd,
60  0x80, 0x02, 0x15, 0x48, 0xe0, 0x04, 0x20, 0x10, 0xe6, 0xcb, 0xc2, 0x67,
61  0x05, 0xc5, 0x00, 0x00, 0xf0, 0x03, 0x79, 0x78, 0x7e, 0x74, 0xb0, 0x3f,
62  0xfc, 0x01, 0xaf, 0x6f, 0x00, 0x02, 0x00, 0x70, 0xd5, 0x2e, 0x24, 0x12,
63  0xc7, 0xe1, 0xff, 0x83, 0xba, 0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00,
64  0xe0, 0x22, 0x12, 0xe7, 0x0b, 0x01, 0x90, 0x52, 0x00, 0xc8, 0x2e, 0x54,
65  0xc8, 0x14, 0x00, 0xc8, 0x18, 0x00, 0xb0, 0x53, 0xb3, 0x64, 0x0a, 0x00,
66  0x94, 0x00, 0x00, 0x6c, 0x79, 0x7c, 0x42, 0x22, 0x00, 0xaa, 0x0d, 0x00,
67  0xec, 0xf4, 0x49, 0x3e, 0x05, 0x00, 0xd8, 0xa9, 0x93, 0xdc, 0x17, 0x00,
68  0xd8, 0xa2, 0x1c, 0xa9, 0x08, 0x00, 0x8d, 0x01, 0x00, 0x99, 0x28, 0x47,
69  0x24, 0x02, 0x40, 0xbb, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2c, 0x02, 0xc0,
70  0xc2, 0x00, 0xa0, 0xac, 0x40, 0x22, 0x2e, 0x04, 0xc0, 0xae, 0x01, 0x80,
71  0x59, 0xb6, 0x32, 0x47, 0x02, 0x80, 0xbd, 0x05, 0x00, 0x76, 0x8e, 0x58,
72  0x90, 0x0f, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2c, 0xcc, 0x00, 0x20,
73  0x38, 0x02, 0x00, 0x43, 0x1e, 0x13, 0xcd, 0x03, 0x20, 0x4c, 0x03, 0xa0,
74  0x30, 0xd2, 0xbf, 0xe0, 0xa9, 0x5f, 0x70, 0x85, 0xb8, 0x48, 0x01, 0x00,
75  0xc0, 0xcb, 0x95, 0xcd, 0x97, 0x4b, 0xd2, 0x33, 0x14, 0xb8, 0x95, 0xd0,
76  0x1a, 0x77, 0xf2, 0xf0, 0xe0, 0xe2, 0x21, 0xe2, 0xc2, 0x6c, 0xb1, 0x42,
77  0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xe4, 0x22, 0x9c, 0x97, 0x9b, 0x23,
78  0x13, 0x48, 0xe7, 0x03, 0x4c, 0xce, 0x0c, 0x00, 0x00, 0x1a, 0xf9, 0xd1,
79  0xc1, 0xfe, 0x38, 0x3f, 0x90, 0xe7, 0xe6, 0xe4, 0xe1, 0xe6, 0x66, 0xe7,
80  0x6c, 0xef, 0xf4, 0xc5, 0xa2, 0xfe, 0x6b, 0xf0, 0x6f, 0x22, 0x3e, 0x21,
81  0xf1, 0xdf, 0xfe, 0xbc, 0x8c, 0x02, 0x04, 0x00, 0x10, 0x4e, 0xcf, 0xef,
82  0xda, 0x5f, 0xe5, 0xe5, 0xd6, 0x03, 0x70, 0xc7, 0x01, 0xb0, 0x75, 0xbf,
83  0x6b, 0xa9, 0x5b, 0x00, 0xda, 0x56, 0x00, 0x68, 0xdf, 0xf9, 0x5d, 0x33,
84  0xdb, 0x09, 0xa0, 0x5a, 0x0a, 0xd0, 0x7a, 0xf9, 0x8b, 0x79, 0x38, 0xfc,
85  0x40, 0x1e, 0x9e, 0xa1, 0x50, 0xc8, 0x3c, 0x1d, 0x1c, 0x0a, 0x0b, 0x0b,
86  0xed, 0x25, 0x62, 0xa1, 0xbd, 0x30, 0xe3, 0x8b, 0x3e, 0xff, 0x33, 0xe1,
87  0x6f, 0xe0, 0x8b, 0x7e, 0xf6, 0xfc, 0x40, 0x1e, 0xfe, 0xdb, 0x7a, 0xf0,
88  0x00, 0x71, 0x9a, 0x40, 0x99, 0xad, 0xc0, 0xa3, 0x83, 0xfd, 0x71, 0x61,
89  0x6e, 0x76, 0xae, 0x52, 0x8e, 0xe7, 0xcb, 0x04, 0x42, 0x31, 0x6e, 0xf7,
90  0xe7, 0x23, 0xfe, 0xc7, 0x85, 0x7f, 0xfd, 0x8e, 0x29, 0xd1, 0xe2, 0x34,
91  0xb1, 0x5c, 0x2c, 0x15, 0x8a, 0xf1, 0x58, 0x89, 0xb8, 0x50, 0x22, 0x4d,
92  0xc7, 0x79, 0xb9, 0x52, 0x91, 0x44, 0x21, 0xc9, 0x95, 0xe2, 0x12, 0xe9,
93  0x7f, 0x32, 0xf1, 0x1f, 0x96, 0xfd, 0x09, 0x93, 0x77, 0x0d, 0x00, 0xac,
94  0x86, 0x4f, 0xc0, 0x4e, 0xb6, 0x07, 0xb5, 0xcb, 0x6c, 0xc0, 0x7e, 0xee,
95  0x01, 0x02, 0x8b, 0x0e, 0x58, 0xd2, 0x76, 0x00, 0x40, 0x7e, 0xf3, 0x2d,
96  0x8c, 0x1a, 0x0b, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, 0x79, 0xf7, 0x00,
97  0x00, 0x93, 0xbf, 0xf9, 0x8f, 0x40, 0x2b, 0x01, 0x00, 0xcd, 0x97, 0xa4,
98  0xe3, 0x00, 0x00, 0xbc, 0xe8, 0x18, 0x5c, 0xa8, 0x94, 0x17, 0x4c, 0xc6,
99  0x08, 0x00, 0x00, 0x44, 0xa0, 0x81, 0x2a, 0xb0, 0x41, 0x07, 0x0c, 0xc1,
100  0x14, 0xac, 0xc0, 0x0e, 0x9c, 0xc1, 0x1d, 0xbc, 0xc0, 0x17, 0x02, 0x61,
101  0x06, 0x44, 0x40, 0x0c, 0x24, 0xc0, 0x3c, 0x10, 0x42, 0x06, 0xe4, 0x80,
102  0x1c, 0x0a, 0xa1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xc0, 0x3a, 0xd8, 0x04,
103  0xb5, 0xb0, 0x03, 0x1a, 0xa0, 0x11, 0x9a, 0xe1, 0x10, 0xb4, 0xc1, 0x31,
104  0x38, 0x0d, 0xe7, 0xe0, 0x12, 0x5c, 0x81, 0xeb, 0x70, 0x17, 0x06, 0x60,
105  0x18, 0x9e, 0xc2, 0x18, 0xbc, 0x86, 0x09, 0x04, 0x41, 0xc8, 0x08, 0x13,
106  0x61, 0x21, 0x3a, 0x88, 0x11, 0x62, 0x8e, 0xd8, 0x22, 0xce, 0x08, 0x17,
107  0x99, 0x8e, 0x04, 0x22, 0x61, 0x48, 0x34, 0x92, 0x80, 0xa4, 0x20, 0xe9,
108  0x88, 0x14, 0x51, 0x22, 0xc5, 0xc8, 0x72, 0xa4, 0x02, 0xa9, 0x42, 0x6a,
109  0x91, 0x5d, 0x48, 0x23, 0xf2, 0x2d, 0x72, 0x14, 0x39, 0x8d, 0x5c, 0x40,
110  0xfa, 0x90, 0xdb, 0xc8, 0x20, 0x32, 0x8a, 0xfc, 0x8a, 0xbc, 0x47, 0x31,
111  0x94, 0x81, 0xb2, 0x51, 0x03, 0xd4, 0x02, 0x75, 0x40, 0xb9, 0xa8, 0x1f,
112  0x1a, 0x8a, 0xc6, 0xa0, 0x73, 0xd1, 0x74, 0x34, 0x0f, 0x5d, 0x80, 0x96,
113  0xa2, 0x6b, 0xd1, 0x1a, 0xb4, 0x1e, 0x3d, 0x80, 0xb6, 0xa2, 0xa7, 0xd1,
114  0x4b, 0xe8, 0x75, 0x74, 0x00, 0x7d, 0x8a, 0x8e, 0x63, 0x80, 0xd1, 0x31,
115  0x0e, 0x66, 0x8c, 0xd9, 0x61, 0x5c, 0x8c, 0x87, 0x45, 0x60, 0x89, 0x58,
116  0x1a, 0x26, 0xc7, 0x16, 0x63, 0xe5, 0x58, 0x35, 0x56, 0x8f, 0x35, 0x63,
117  0x1d, 0x58, 0x37, 0x76, 0x15, 0x1b, 0xc0, 0x9e, 0x61, 0xef, 0x08, 0x24,
118  0x02, 0x8b, 0x80, 0x13, 0xec, 0x08, 0x5e, 0x84, 0x10, 0xc2, 0x6c, 0x82,
119  0x90, 0x90, 0x47, 0x58, 0x4c, 0x58, 0x43, 0xa8, 0x25, 0xec, 0x23, 0xb4,
120  0x12, 0xba, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xc2, 0x27, 0x22, 0x93,
121  0xa8, 0x4f, 0xb4, 0x25, 0x7a, 0x12, 0xf9, 0xc4, 0x78, 0x62, 0x3a, 0xb1,
122  0x90, 0x58, 0x46, 0xac, 0x26, 0xee, 0x21, 0x1e, 0x21, 0x9e, 0x25, 0x5e,
123  0x27, 0x0e, 0x13, 0x5f, 0x93, 0x48, 0x24, 0x0e, 0xc9, 0x92, 0xe4, 0x4e,
124  0x0a, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0b, 0x49, 0x6b, 0x48, 0xdb, 0x48,
125  0x2d, 0xa4, 0x53, 0xa4, 0x3e, 0xd2, 0x10, 0x69, 0x9c, 0x4c, 0x26, 0xeb,
126  0x90, 0x6d, 0xc9, 0xde, 0xe4, 0x08, 0xb2, 0x80, 0xac, 0x20, 0x97, 0x91,
127  0xb7, 0x90, 0x0f, 0x90, 0x4f, 0x92, 0xfb, 0xc9, 0xc3, 0xe4, 0xb7, 0x14,
128  0x3a, 0xc5, 0x88, 0xe2, 0x4c, 0x09, 0xa2, 0x24, 0x52, 0xa4, 0x94, 0x12,
129  0x4a, 0x35, 0x65, 0x3f, 0xe5, 0x04, 0xa5, 0x9f, 0x32, 0x42, 0x99, 0xa0,
130  0xaa, 0x51, 0xcd, 0xa9, 0x9e, 0xd4, 0x08, 0xaa, 0x88, 0x3a, 0x9f, 0x5a,
131  0x49, 0x6d, 0xa0, 0x76, 0x50, 0x2f, 0x53, 0x87, 0xa9, 0x13, 0x34, 0x75,
132  0x9a, 0x25, 0xcd, 0x9b, 0x16, 0x43, 0xcb, 0xa4, 0x2d, 0xa3, 0xd5, 0xd0,
133  0x9a, 0x69, 0x67, 0x69, 0xf7, 0x68, 0x2f, 0xe9, 0x74, 0xba, 0x09, 0xdd,
134  0x83, 0x1e, 0x45, 0x97, 0xd0, 0x97, 0xd2, 0x6b, 0xe8, 0x07, 0xe9, 0xe7,
135  0xe9, 0x83, 0xf4, 0x77, 0x0c, 0x0d, 0x86, 0x0d, 0x83, 0xc7, 0x48, 0x62,
136  0x28, 0x19, 0x6b, 0x19, 0x7b, 0x19, 0xa7, 0x18, 0xb7, 0x19, 0x2f, 0x99,
137  0x4c, 0xa6, 0x05, 0xd3, 0x97, 0x99, 0xc8, 0x54, 0x30, 0xd7, 0x32, 0x1b,
138  0x99, 0x67, 0x98, 0x0f, 0x98, 0x6f, 0x55, 0x58, 0x2a, 0xf6, 0x2a, 0x7c,
139  0x15, 0x91, 0xca, 0x12, 0x95, 0x3a, 0x95, 0x56, 0x95, 0x7e, 0x95, 0xe7,
140  0xaa, 0x54, 0x55, 0x73, 0x55, 0x3f, 0xd5, 0x79, 0xaa, 0x0b, 0x54, 0xab,
141  0x55, 0x0f, 0xab, 0x5e, 0x56, 0x7d, 0xa6, 0x46, 0x55, 0xb3, 0x50, 0xe3,
142  0xa9, 0x09, 0xd4, 0x16, 0xab, 0xd5, 0xa9, 0x1d, 0x55, 0xbb, 0xa9, 0x36,
143  0xae, 0xce, 0x52, 0x77, 0x52, 0x8f, 0x50, 0xcf, 0x51, 0x5f, 0xa3, 0xbe,
144  0x5f, 0xfd, 0x82, 0xfa, 0x63, 0x0d, 0xb2, 0x86, 0x85, 0x46, 0xa0, 0x86,
145  0x48, 0xa3, 0x54, 0x63, 0xb7, 0xc6, 0x19, 0x8d, 0x21, 0x16, 0xc6, 0x32,
146  0x65, 0xf1, 0x58, 0x42, 0xd6, 0x72, 0x56, 0x03, 0xeb, 0x2c, 0x6b, 0x98,
147  0x4d, 0x62, 0x5b, 0xb2, 0xf9, 0xec, 0x4c, 0x76, 0x05, 0xfb, 0x1b, 0x76,
148  0x2f, 0x7b, 0x4c, 0x53, 0x43, 0x73, 0xaa, 0x66, 0xac, 0x66, 0x91, 0x66,
149  0x9d, 0xe6, 0x71, 0xcd, 0x01, 0x0e, 0xc6, 0xb1, 0xe0, 0xf0, 0x39, 0xd9,
150  0x9c, 0x4a, 0xce, 0x21, 0xce, 0x0d, 0xce, 0x7b, 0x2d, 0x03, 0x2d, 0x3f,
151  0x2d, 0xb1, 0xd6, 0x6a, 0xad, 0x66, 0xad, 0x7e, 0xad, 0x37, 0xda, 0x7a,
152  0xda, 0xbe, 0xda, 0x62, 0xed, 0x72, 0xed, 0x16, 0xed, 0xeb, 0xda, 0xef,
153  0x75, 0x70, 0x9d, 0x40, 0x9d, 0x2c, 0x9d, 0xf5, 0x3a, 0x6d, 0x3a, 0xf7,
154  0x75, 0x09, 0xba, 0x36, 0xba, 0x51, 0xba, 0x85, 0xba, 0xdb, 0x75, 0xcf,
155  0xea, 0x3e, 0xd3, 0x63, 0xeb, 0x79, 0xe9, 0x09, 0xf5, 0xca, 0xf5, 0x0e,
156  0xe9, 0xdd, 0xd1, 0x47, 0xf5, 0x6d, 0xf4, 0xa3, 0xf5, 0x17, 0xea, 0xef,
157  0xd6, 0xef, 0xd1, 0x1f, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6c,
158  0x31, 0x38, 0x63, 0xf0, 0xcc, 0x90, 0x63, 0xe8, 0x6b, 0x98, 0x69, 0xb8,
159  0xd1, 0xf0, 0x84, 0xe1, 0xa8, 0x11, 0xcb, 0x68, 0xba, 0x91, 0xc4, 0x68,
160  0xa3, 0xd1, 0x49, 0xa3, 0x27, 0xb8, 0x26, 0xee, 0x87, 0x67, 0xe3, 0x35,
161  0x78, 0x17, 0x3e, 0x66, 0xac, 0x6f, 0x1c, 0x62, 0xac, 0x34, 0xde, 0x65,
162  0xdc, 0x6b, 0x3c, 0x61, 0x62, 0x69, 0x32, 0xdb, 0xa4, 0xc4, 0xa4, 0xc5,
163  0xe4, 0xbe, 0x29, 0xcd, 0x94, 0x6b, 0x9a, 0x66, 0xba, 0xd1, 0xb4, 0xd3,
164  0x74, 0xcc, 0xcc, 0xc8, 0x2c, 0xdc, 0xac, 0xd8, 0xac, 0xc9, 0xec, 0x8e,
165  0x39, 0xd5, 0x9c, 0x6b, 0x9e, 0x61, 0xbe, 0xd9, 0xbc, 0xdb, 0xfc, 0x8d,
166  0x85, 0xa5, 0x45, 0x9c, 0xc5, 0x4a, 0x8b, 0x36, 0x8b, 0xc7, 0x96, 0xda,
167  0x96, 0x7c, 0xcb, 0x05, 0x96, 0x4d, 0x96, 0xf7, 0xac, 0x98, 0x56, 0x3e,
168  0x56, 0x79, 0x56, 0xf5, 0x56, 0xd7, 0xac, 0x49, 0xd6, 0x5c, 0xeb, 0x2c,
169  0xeb, 0x6d, 0xd6, 0x57, 0x6c, 0x50, 0x1b, 0x57, 0x9b, 0x0c, 0x9b, 0x3a,
170  0x9b, 0xcb, 0xb6, 0xa8, 0xad, 0x9b, 0xad, 0xc4, 0x76, 0x9b, 0x6d, 0xdf,
171  0x14, 0xe2, 0x14, 0x8f, 0x29, 0xd2, 0x29, 0xf5, 0x53, 0x6e, 0xda, 0x31,
172  0xec, 0xfc, 0xec, 0x0a, 0xec, 0x9a, 0xec, 0x06, 0xed, 0x39, 0xf6, 0x61,
173  0xf6, 0x25, 0xf6, 0x6d, 0xf6, 0xcf, 0x1d, 0xcc, 0x1c, 0x12, 0x1d, 0xd6,
174  0x3b, 0x74, 0x3b, 0x7c, 0x72, 0x74, 0x75, 0xcc, 0x76, 0x6c, 0x70, 0xbc,
175  0xeb, 0xa4, 0xe1, 0x34, 0xc3, 0xa9, 0xc4, 0xa9, 0xc3, 0xe9, 0x57, 0x67,
176  0x1b, 0x67, 0xa1, 0x73, 0x9d, 0xf3, 0x35, 0x17, 0xa6, 0x4b, 0x90, 0xcb,
177  0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6d, 0xa7, 0x8a, 0xa7, 0x6e, 0x9f,
178  0x7a, 0xcb, 0x95, 0xe5, 0x1a, 0xee, 0xba, 0xd2, 0xb5, 0xd3, 0xf5, 0xa3,
179  0x9b, 0xbb, 0x9b, 0xdc, 0xad, 0xd9, 0x6d, 0xd4, 0xdd, 0xcc, 0x3d, 0xc5,
180  0x7d, 0xab, 0xfb, 0x4d, 0x2e, 0x9b, 0x1b, 0xc9, 0x5d, 0xc3, 0x3d, 0xef,
181  0x41, 0xf4, 0xf0, 0xf7, 0x58, 0xe2, 0x71, 0xcc, 0xe3, 0x9d, 0xa7, 0x9b,
182  0xa7, 0xc2, 0xf3, 0x90, 0xe7, 0x2f, 0x5e, 0x76, 0x5e, 0x59, 0x5e, 0xfb,
183  0xbd, 0x1e, 0x4f, 0xb3, 0x9c, 0x26, 0x9e, 0xd6, 0x30, 0x6d, 0xc8, 0xdb,
184  0xc4, 0x5b, 0xe0, 0xbd, 0xcb, 0x7b, 0x60, 0x3a, 0x3e, 0x3d, 0x65, 0xfa,
185  0xce, 0xe9, 0x03, 0x3e, 0xc6, 0x3e, 0x02, 0x9f, 0x7a, 0x9f, 0x87, 0xbe,
186  0xa6, 0xbe, 0x22, 0xdf, 0x3d, 0xbe, 0x23, 0x7e, 0xd6, 0x7e, 0x99, 0x7e,
187  0x07, 0xfc, 0x9e, 0xfb, 0x3b, 0xfa, 0xcb, 0xfd, 0x8f, 0xf8, 0xbf, 0xe1,
188  0x79, 0xf2, 0x16, 0xf1, 0x4e, 0x05, 0x60, 0x01, 0xc1, 0x01, 0xe5, 0x01,
189  0xbd, 0x81, 0x1a, 0x81, 0xb3, 0x03, 0x6b, 0x03, 0x1f, 0x04, 0x99, 0x04,
190  0xa5, 0x07, 0x35, 0x05, 0x8d, 0x05, 0xbb, 0x06, 0x2f, 0x0c, 0x3e, 0x15,
191  0x42, 0x0c, 0x09, 0x0d, 0x59, 0x1f, 0x72, 0x93, 0x6f, 0xc0, 0x17, 0xf2,
192  0x1b, 0xf9, 0x63, 0x33, 0xdc, 0x67, 0x2c, 0x9a, 0xd1, 0x15, 0xca, 0x08,
193  0x9d, 0x15, 0x5a, 0x1b, 0xfa, 0x30, 0xcc, 0x26, 0x4c, 0x1e, 0xd6, 0x11,
194  0x8e, 0x86, 0xcf, 0x08, 0xdf, 0x10, 0x7e, 0x6f, 0xa6, 0xf9, 0x4c, 0xe9,
195  0xcc, 0xb6, 0x08, 0x88, 0xe0, 0x47, 0x6c, 0x88, 0xb8, 0x1f, 0x69, 0x19,
196  0x99, 0x17, 0xf9, 0x7d, 0x14, 0x29, 0x2a, 0x32, 0xaa, 0x2e, 0xea, 0x51,
197  0xb4, 0x53, 0x74, 0x71, 0x74, 0xf7, 0x2c, 0xd6, 0xac, 0xe4, 0x59, 0xfb,
198  0x67, 0xbd, 0x8e, 0xf1, 0x8f, 0xa9, 0x8c, 0xb9, 0x3b, 0xdb, 0x6a, 0xb6,
199  0x72, 0x76, 0x67, 0xac, 0x6a, 0x6c, 0x52, 0x6c, 0x63, 0xec, 0x9b, 0xb8,
200  0x80, 0xb8, 0xaa, 0xb8, 0x81, 0x78, 0x87, 0xf8, 0x45, 0xf1, 0x97, 0x12,
201  0x74, 0x13, 0x24, 0x09, 0xed, 0x89, 0xe4, 0xc4, 0xd8, 0xc4, 0x3d, 0x89,
202  0xe3, 0x73, 0x02, 0xe7, 0x6c, 0x9a, 0x33, 0x9c, 0xe4, 0x9a, 0x54, 0x96,
203  0x74, 0x63, 0xae, 0xe5, 0xdc, 0xa2, 0xb9, 0x17, 0xe6, 0xe9, 0xce, 0xcb,
204  0x9e, 0x77, 0x3c, 0x59, 0x35, 0x59, 0x90, 0x7c, 0x38, 0x85, 0x98, 0x12,
205  0x97, 0xb2, 0x3f, 0xe5, 0x83, 0x20, 0x42, 0x50, 0x2f, 0x18, 0x4f, 0xe5,
206  0xa7, 0x6e, 0x4d, 0x1d, 0x13, 0xf2, 0x84, 0x9b, 0x85, 0x4f, 0x45, 0xbe,
207  0xa2, 0x8d, 0xa2, 0x51, 0xb1, 0xb7, 0xb8, 0x4a, 0x3c, 0x92, 0xe6, 0x9d,
208  0x56, 0x95, 0xf6, 0x38, 0xdd, 0x3b, 0x7d, 0x43, 0xfa, 0x68, 0x86, 0x4f,
209  0x46, 0x75, 0xc6, 0x33, 0x09, 0x4f, 0x52, 0x2b, 0x79, 0x91, 0x19, 0x92,
210  0xb9, 0x23, 0xf3, 0x4d, 0x56, 0x44, 0xd6, 0xde, 0xac, 0xcf, 0xd9, 0x71,
211  0xd9, 0x2d, 0x39, 0x94, 0x9c, 0x94, 0x9c, 0xa3, 0x52, 0x0d, 0x69, 0x96,
212  0xb4, 0x2b, 0xd7, 0x30, 0xb7, 0x28, 0xb7, 0x4f, 0x66, 0x2b, 0x2b, 0x93,
213  0x0d, 0xe4, 0x79, 0xe6, 0x6d, 0xca, 0x1b, 0x93, 0x87, 0xca, 0xf7, 0xe4,
214  0x23, 0xf9, 0x73, 0xf3, 0xdb, 0x15, 0x6c, 0x85, 0x4c, 0xd1, 0xa3, 0xb4,
215  0x52, 0xae, 0x50, 0x0e, 0x16, 0x4c, 0x2f, 0xa8, 0x2b, 0x78, 0x5b, 0x18,
216  0x5b, 0x78, 0xb8, 0x48, 0xbd, 0x48, 0x5a, 0xd4, 0x33, 0xdf, 0x66, 0xfe,
217  0xea, 0xf9, 0x23, 0x0b, 0x82, 0x16, 0x7c, 0xbd, 0x90, 0xb0, 0x50, 0xb8,
218  0xb0, 0xb3, 0xd8, 0xb8, 0x78, 0x59, 0xf1, 0xe0, 0x22, 0xbf, 0x45, 0xbb,
219  0x16, 0x23, 0x8b, 0x53, 0x17, 0x77, 0x2e, 0x31, 0x5d, 0x52, 0xba, 0x64,
220  0x78, 0x69, 0xf0, 0xd2, 0x7d, 0xcb, 0x68, 0xcb, 0xb2, 0x96, 0xfd, 0x50,
221  0xe2, 0x58, 0x52, 0x55, 0xf2, 0x6a, 0x79, 0xdc, 0xf2, 0x8e, 0x52, 0x83,
222  0xd2, 0xa5, 0xa5, 0x43, 0x2b, 0x82, 0x57, 0x34, 0x95, 0xa9, 0x94, 0xc9,
223  0xcb, 0x6e, 0xae, 0xf4, 0x5a, 0xb9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55,
224  0xef, 0x6a, 0x97, 0xd5, 0x5b, 0x56, 0x7f, 0x2a, 0x17, 0x95, 0x5f, 0xac,
225  0x70, 0xac, 0xa8, 0xae, 0xf8, 0xb0, 0x46, 0xb8, 0xe6, 0xe2, 0x57, 0x4e,
226  0x5f, 0xd5, 0x7c, 0xf5, 0x79, 0x6d, 0xda, 0xda, 0xde, 0x4a, 0xb7, 0xca,
227  0xed, 0xeb, 0x48, 0xeb, 0xa4, 0xeb, 0x6e, 0xac, 0xf7, 0x59, 0xbf, 0xaf,
228  0x4a, 0xbd, 0x6a, 0x41, 0xd5, 0xd0, 0x86, 0xf0, 0x0d, 0xad, 0x1b, 0xf1,
229  0x8d, 0xe5, 0x1b, 0x5f, 0x6d, 0x4a, 0xde, 0x74, 0xa1, 0x7a, 0x6a, 0xf5,
230  0x8e, 0xcd, 0xb4, 0xcd, 0xca, 0xcd, 0x03, 0x35, 0x61, 0x35, 0xed, 0x5b,
231  0xcc, 0xb6, 0xac, 0xdb, 0xf2, 0xa1, 0x36, 0xa3, 0xf6, 0x7a, 0x9d, 0x7f,
232  0x5d, 0xcb, 0x56, 0xfd, 0xad, 0xab, 0xb7, 0xbe, 0xd9, 0x26, 0xda, 0xd6,
233  0xbf, 0xdd, 0x77, 0x7b, 0xf3, 0x0e, 0x83, 0x1d, 0x15, 0x3b, 0xde, 0xef,
234  0x94, 0xec, 0xbc, 0xb5, 0x2b, 0x78, 0x57, 0x6b, 0xbd, 0x45, 0x7d, 0xf5,
235  0x6e, 0xd2, 0xee, 0x82, 0xdd, 0x8f, 0x1a, 0x62, 0x1b, 0xba, 0xbf, 0xe6,
236  0x7e, 0xdd, 0xb8, 0x47, 0x77, 0x4f, 0xc5, 0x9e, 0x8f, 0x7b, 0xa5, 0x7b,
237  0x07, 0xf6, 0x45, 0xef, 0xeb, 0x6a, 0x74, 0x6f, 0x6c, 0xdc, 0xaf, 0xbf,
238  0xbf, 0xb2, 0x09, 0x6d, 0x52, 0x36, 0x8d, 0x1e, 0x48, 0x3a, 0x70, 0xe5,
239  0x9b, 0x80, 0x6f, 0xda, 0x9b, 0xed, 0x9a, 0x77, 0xb5, 0x70, 0x5a, 0x2a,
240  0x0e, 0xc2, 0x41, 0xe5, 0xc1, 0x27, 0xdf, 0xa6, 0x7c, 0x7b, 0xe3, 0x50,
241  0xe8, 0xa1, 0xce, 0xc3, 0xdc, 0xc3, 0xcd, 0xdf, 0x99, 0x7f, 0xb7, 0xf5,
242  0x08, 0xeb, 0x48, 0x79, 0x2b, 0xd2, 0x3a, 0xbf, 0x75, 0xac, 0x2d, 0xa3,
243  0x6d, 0xa0, 0x3d, 0xa1, 0xbd, 0xef, 0xe8, 0x8c, 0xa3, 0x9d, 0x1d, 0x5e,
244  0x1d, 0x47, 0xbe, 0xb7, 0xff, 0x7e, 0xef, 0x31, 0xe3, 0x63, 0x75, 0xc7,
245  0x35, 0x8f, 0x57, 0x9e, 0xa0, 0x9d, 0x28, 0x3d, 0xf1, 0xf9, 0xe4, 0x82,
246  0x93, 0xe3, 0xa7, 0x64, 0xa7, 0x9e, 0x9d, 0x4e, 0x3f, 0x3d, 0xd4, 0x99,
247  0xdc, 0x79, 0xf7, 0x4c, 0xfc, 0x99, 0x6b, 0x5d, 0x51, 0x5d, 0xbd, 0x67,
248  0x43, 0xcf, 0x9e, 0x3f, 0x17, 0x74, 0xee, 0x4c, 0xb7, 0x5f, 0xf7, 0xc9,
249  0xf3, 0xde, 0xe7, 0x8f, 0x5d, 0xf0, 0xbc, 0x70, 0xf4, 0x22, 0xf7, 0x62,
250  0xdb, 0x25, 0xb7, 0x4b, 0xad, 0x3d, 0xae, 0x3d, 0x47, 0x7e, 0x70, 0xfd,
251  0xe1, 0x48, 0xaf, 0x5b, 0x6f, 0xeb, 0x65, 0xf7, 0xcb, 0xed, 0x57, 0x3c,
252  0xae, 0x74, 0xf4, 0x4d, 0xeb, 0x3b, 0xd1, 0xef, 0xd3, 0x7f, 0xfa, 0x6a,
253  0xc0, 0xd5, 0x73, 0xd7, 0xf8, 0xd7, 0x2e, 0x5d, 0x9f, 0x79, 0xbd, 0xef,
254  0xc6, 0xec, 0x1b, 0xb7, 0x6e, 0x26, 0xdd, 0x1c, 0xb8, 0x25, 0xba, 0xf5,
255  0xf8, 0x76, 0xf6, 0xed, 0x17, 0x77, 0x0a, 0xee, 0x4c, 0xdc, 0x5d, 0x7a,
256  0x8f, 0x78, 0xaf, 0xfc, 0xbe, 0xda, 0xfd, 0xea, 0x07, 0xfa, 0x0f, 0xea,
257  0x7f, 0xb4, 0xfe, 0xb1, 0x65, 0xc0, 0x6d, 0xe0, 0xf8, 0x60, 0xc0, 0x60,
258  0xcf, 0xc3, 0x59, 0x0f, 0xef, 0x0e, 0x09, 0x87, 0x9e, 0xfe, 0x94, 0xff,
259  0xd3, 0x87, 0xe1, 0xd2, 0x47, 0xcc, 0x47, 0xd5, 0x23, 0x46, 0x23, 0x8d,
260  0x8f, 0x9d, 0x1f, 0x1f, 0x1b, 0x0d, 0x1a, 0xbd, 0xf2, 0x64, 0xce, 0x93,
261  0xe1, 0xa7, 0xb2, 0xa7, 0x13, 0xcf, 0xca, 0x7e, 0x56, 0xff, 0x79, 0xeb,
262  0x73, 0xab, 0xe7, 0xdf, 0xfd, 0xe2, 0xfb, 0x4b, 0xcf, 0x58, 0xfc, 0xd8,
263  0xf0, 0x0b, 0xf9, 0x8b, 0xcf, 0xbf, 0xae, 0x79, 0xa9, 0xf3, 0x72, 0xef,
264  0xab, 0xa9, 0xaf, 0x3a, 0xc7, 0x23, 0xc7, 0x1f, 0xbc, 0xce, 0x79, 0x3d,
265  0xf1, 0xa6, 0xfc, 0xad, 0xce, 0xdb, 0x7d, 0xef, 0xb8, 0xef, 0xba, 0xdf,
266  0xc7, 0xbd, 0x1f, 0x99, 0x28, 0xfc, 0x40, 0xfe, 0x50, 0xf3, 0xd1, 0xfa,
267  0x63, 0xc7, 0xa7, 0xd0, 0x4f, 0xf7, 0x3e, 0xe7, 0x7c, 0xfe, 0xfc, 0x2f,
268  0xf7, 0x84, 0xf3, 0xfb, 0x80, 0x39, 0x25, 0x11, 0x00, 0x00, 0x00, 0x09,
269  0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
270  0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d,
271  0x45, 0x07, 0xdc, 0x0b, 0x0e, 0x0e, 0x25, 0x16, 0x28, 0x9e, 0x78, 0x6a,
272  0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8,
273  0xff, 0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59, 0xe7,
274  0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
275 };
276 
278 
279 static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
280 {
281  HRESULT hr;
282  IStream *stream;
283  GUID format;
284  LONG refcount;
287 
288  *decoder = NULL;
289 
290  stream = SHCreateMemStream (image_data, image_size);
291  ok(stream != NULL, "SHCreateMemStream error\n");
292 
293  hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, decoder);
294  if (hr == S_OK)
295  {
296  hr = IWICBitmapDecoder_GetContainerFormat(*decoder, &format);
297  ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
298  ok(IsEqualGUID(&format, &GUID_ContainerFormatPng),
299  "wrong container format %s\n", wine_dbgstr_guid(&format));
300 
301  zero.QuadPart = 0;
302  IStream_Seek (stream, zero, STREAM_SEEK_CUR, &pos);
303  ok(pos.QuadPart < image_size, "seek beyond the end of stream: %x%08x >= %x\n",
304  (UINT)(pos.QuadPart >> 32), (UINT)pos.QuadPart, image_size);
305 
306  refcount = IStream_Release(stream);
307  ok(refcount > 0, "expected stream refcount > 0\n");
308  }
309  else
310  IStream_Release(stream);
311 
312  return hr;
313 }
314 
316 {
317  static const WCHAR tstW[] = {'t','s','t',0};
319  HANDLE handle;
320  DWORD count;
321 
323  GetTempFileNameW(path, tstW, 0, filename);
324 
326  if (handle == INVALID_HANDLE_VALUE) return NULL;
327 
329  CloseHandle( handle );
330 
331  ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
333  return ret;
334 }
335 
336 static void test_color_contexts(void)
337 {
338  HRESULT hr;
339  IWICBitmapDecoder *decoder;
340  IWICBitmapFrameDecode *frame;
344  WCHAR *tmpfile;
345  BYTE *buffer;
346  BOOL ret;
347 
349  ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
350  if (hr != S_OK) return;
351 
352  /* global color context */
353  hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, NULL);
354  ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
355 
356  count = 0xdeadbeef;
357  hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count);
358  ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
359  ok(count == 0xdeadbeef, "unexpected count %u\n", count);
360 
361  /* frame color context */
362  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
363  ok(hr == S_OK, "GetFrame error %#x\n", hr);
364 
365  hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, NULL);
366  ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
367 
368  count = 0xdeadbeef;
369  hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count);
370  ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
371  ok(!count, "unexpected count %u\n", count);
372 
373  IWICBitmapFrameDecode_Release(frame);
374  IWICBitmapDecoder_Release(decoder);
375 
377  ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
378  if (hr != S_OK) return;
379 
380  /* global color context */
381  count = 0xdeadbeef;
382  hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count);
383  ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
384  ok(count == 0xdeadbeef, "unexpected count %u\n", count);
385 
386  /* frame color context */
387  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
388  ok(hr == S_OK, "GetFrame error %#x\n", hr);
389 
390  count = 0xdeadbeef;
391  hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count);
392  ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
393  ok(count == 1, "unexpected count %u\n", count);
394 
395  hr = IWICImagingFactory_CreateColorContext(factory, NULL);
396  ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
397 
398  hr = IWICImagingFactory_CreateColorContext(factory, &context);
399  ok(hr == S_OK, "CreateColorContext error %#x\n", hr);
400 
401  hr = IWICColorContext_GetType(context, NULL);
402  ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
403 
404  type = 0xdeadbeef;
405  hr = IWICColorContext_GetType(context, &type);
406  ok(hr == S_OK, "GetType error %#x\n", hr);
407  ok(type == WICColorContextUninitialized, "unexpected type %u\n", type);
408 
409  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL);
410  ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
411 
412  size = 0;
413  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
414  ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
415  ok(!size, "unexpected size %u\n", size);
416 
417  hr = IWICColorContext_GetExifColorSpace(context, NULL);
418  ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
419 
420  colorspace = 0xdeadbeef;
421  hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
422  ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
423  ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
424 
425  hr = IWICColorContext_InitializeFromExifColorSpace(context, 0);
426  ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
427 
428  hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
429  ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
430 
431  hr = IWICColorContext_InitializeFromExifColorSpace(context, 2);
432  ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
433 
434  colorspace = 0xdeadbeef;
435  hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
436  ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
437  ok(colorspace == 2, "unexpected color space %u\n", colorspace);
438 
439  size = 0;
440  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
441  ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
442  ok(!size, "unexpected size %u\n", size);
443 
444  type = 0xdeadbeef;
445  hr = IWICColorContext_GetType(context, &type);
446  ok(hr == S_OK, "GetType error %#x\n", hr);
447  ok(type == WICColorContextExifColorSpace, "unexpected type %u\n", type);
448 
449  hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count);
450  ok(hr == WINCODEC_ERR_WRONGSTATE, "GetColorContexts error %#x\n", hr);
451 
452  IWICColorContext_Release(context);
453  IWICBitmapFrameDecode_Release(frame);
454 
455  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
456  ok(hr == S_OK, "GetFrame error %#x\n", hr);
457 
458  hr = IWICImagingFactory_CreateColorContext(factory, &context);
459  ok(hr == S_OK, "CreateColorContext error %#x\n", hr);
460 
461  count = 1;
462  hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count);
463  ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
464 
465  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL);
466  ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
467 
468  size = 0;
469  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
470  ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
471  ok(size, "unexpected size %u\n", size);
472 
474  hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
475  ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
476 
479 
480  type = 0xdeadbeef;
481  hr = IWICColorContext_GetType(context, &type);
482  ok(hr == S_OK, "GetType error %#x\n", hr);
483  ok(type == WICColorContextProfile, "unexpected type %u\n", type);
484 
485  colorspace = 0xdeadbeef;
486  hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
487  ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
488  ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
489 
490  hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
491  ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr);
492 
493  if (tmpfile)
494  {
495  hr = IWICColorContext_InitializeFromFilename(context, NULL);
496  ok(hr == E_INVALIDARG, "InitializeFromFilename error %#x\n", hr);
497 
498  hr = IWICColorContext_InitializeFromFilename(context, tmpfile);
499  ok(hr == S_OK, "InitializeFromFilename error %#x\n", hr);
500 
502  ok(ret, "DeleteFileW failed %u\n", GetLastError());
503 
504  type = 0xdeadbeef;
505  hr = IWICColorContext_GetType(context, &type);
506  ok(hr == S_OK, "GetType error %#x\n", hr);
507  ok(type == WICColorContextProfile, "unexpected type %u\n", type);
508 
509  colorspace = 0xdeadbeef;
510  hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
511  ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
512  ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
513 
514  hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
515  ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr);
516 
517  size = 0;
518  hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
519  ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
520  ok(size, "unexpected size %u\n", size);
521 
523  hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
524  ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
525 
528  }
529  IWICColorContext_Release(context);
530  IWICBitmapFrameDecode_Release(frame);
531  IWICBitmapDecoder_Release(decoder);
532 }
533 
534 /* 1 bpp 1x1 pixel PNG image with PLTE and tRNS chunks */
535 static const char png_PLTE_tRNS[] = {
536  0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
537  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,
538  0x00,0x00,0x00,0x06,'P','L','T','E',0x01,0x02,0x03,0x04,0x05,0x06,0x95,0x53,0x6f,0x48,
539  0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a,
540  0x00,0x00,0x00,0x0a,'I','D','A','T',0x18,0xd3,0x63,0x68,0x00,0x00,0x00,0x82,0x00,0x81,0xa7,0x01,0xba,0x10,
541  0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
542 };
543 
544 /* grayscale 16 bpp 1x1 pixel PNG image with tRNS chunk */
545 static const char png_gray_tRNS[] = {
546  0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
547  0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x6a,0xee,0x47,0x16,
548  0x00,0x00,0x00,0x02,'t','R','N','S',0x00,0x00,0x76,0x93,0xcd,0x38,
549  0x00,0x00,0x00,0x0b,'I','D','A','T',0x78,0x9c,0x63,0x60,0x60,0x00,0x00,0x00,0x03,0x00,0x01,0xb8,0xad,0x3a,0x63,
550  0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
551 };
552 
553 static void test_png_palette(void)
554 {
555  HRESULT hr;
556  IWICBitmapDecoder *decoder;
557  IWICBitmapFrameDecode *frame;
559  GUID format;
560  UINT count, ret;
561  WICColor color[256];
562  char *buf;
563 
564  hr = create_decoder(png_PLTE_tRNS, sizeof(png_PLTE_tRNS), &decoder);
565  ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
566  if (hr != S_OK) return;
567 
568  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
569  ok(hr == S_OK, "GetFrame error %#x\n", hr);
570 
571  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
572  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
573  ok(IsEqualGUID(&format, &GUID_WICPixelFormat1bppIndexed),
574  "got wrong format %s\n", wine_dbgstr_guid(&format));
575 
576  hr = IWICImagingFactory_CreatePalette(factory, &palette);
577  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
578  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
579  ok(hr == S_OK, "CopyPalette error %#x\n", hr);
580 
581  hr = IWICPalette_GetColorCount(palette, &count);
582  ok(hr == S_OK, "GetColorCount error %#x\n", hr);
583  ok(count == 2, "expected 2, got %u\n", count);
584 
585  hr = IWICPalette_GetColors(palette, 256, color, &ret);
586  ok(hr == S_OK, "GetColors error %#x\n", hr);
587  ok(ret == count, "expected %u, got %u\n", count, ret);
588  ok(color[0] == 0xff010203, "expected 0xff010203, got %#x\n", color[0]);
589  ok(color[1] == 0x00040506, "expected 0x00040506, got %#x\n", color[1]);
590 
591  IWICPalette_Release(palette);
592  IWICBitmapFrameDecode_Release(frame);
593  IWICBitmapDecoder_Release(decoder);
594 
595  hr = create_decoder(png_gray_tRNS, sizeof(png_gray_tRNS), &decoder);
596  ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
597  if (hr != S_OK) return;
598 
599  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
600  ok(hr == S_OK, "GetFrame error %#x\n", hr);
601 
602  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
603  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
604  ok(IsEqualGUID(&format, &GUID_WICPixelFormat64bppRGBA),
605  "got wrong format %s\n", wine_dbgstr_guid(&format));
606 
607  hr = IWICImagingFactory_CreatePalette(factory, &palette);
608  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
609  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
610  ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "CopyPalette error %#x\n", hr);
611 
612  IWICPalette_Release(palette);
613  IWICBitmapFrameDecode_Release(frame);
614  IWICBitmapDecoder_Release(decoder);
615 
616  /* test 8 bpp grayscale PNG image with tRNS chunk */
617  buf = HeapAlloc(GetProcessHeap(), 0, sizeof(png_gray_tRNS));
619  buf[24] = 8; /* override bit depth */
620 
621  hr = create_decoder(buf, sizeof(png_gray_tRNS), &decoder);
622  ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
623  if (hr != S_OK) return;
624 
625  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
626  ok(hr == S_OK, "GetFrame error %#x\n", hr);
627 
628  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
629  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
630  ok(IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed),
631  "got wrong format %s\n", wine_dbgstr_guid(&format));
632 
633  hr = IWICImagingFactory_CreatePalette(factory, &palette);
634  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
635  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
636  ok(hr == S_OK, "CopyPalette error %#x\n", hr);
637 
638  hr = IWICPalette_GetColorCount(palette, &count);
639  ok(hr == S_OK, "GetColorCount error %#x\n", hr);
640  ok(count == 256, "expected 256, got %u\n", count);
641 
642  hr = IWICPalette_GetColors(palette, 256, color, &ret);
643  ok(hr == S_OK, "GetColors error %#x\n", hr);
644  ok(ret == count, "expected %u, got %u\n", count, ret);
645  ok(color[0] == 0x00000000, "expected 0x00000000, got %#x\n", color[0]);
646  ok(color[1] == 0xff010101, "expected 0xff010101, got %#x\n", color[1]);
647 
648  HeapFree(GetProcessHeap(), 0, buf);
649  IWICPalette_Release(palette);
650  IWICBitmapFrameDecode_Release(frame);
651  IWICBitmapDecoder_Release(decoder);
652 }
653 
654 /* RGB 24 bpp 1x1 pixel PNG image */
655 static const char png_1x1_data[] = {
656  0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
657  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,
658  0x00,0x00,0x03,0x00,'P','L','T','E',
659  0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,
660  0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10,
661  0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18,
662  0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,
663  0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28,
664  0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30,
665  0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
666  0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
667  0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,
668  0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,
669  0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,
670  0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60,
671  0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,
672  0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70,
673  0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78,
674  0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,
675  0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,
676  0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10,
677  0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18,
678  0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,
679  0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28,
680  0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30,
681  0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
682  0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
683  0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,
684  0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,
685  0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,
686  0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60,
687  0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,
688  0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70,
689  0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78,
690  0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,
691  0x76,0xb6,0x24,0x31,
692  0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a,
693  0x00,0x00,0x00,0x0c,'I','D','A','T',0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,0xe7,
694  0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
695 };
696 
697 #define PNG_COLOR_TYPE_GRAY 0
698 #define PNG_COLOR_TYPE_RGB 2
699 #define PNG_COLOR_TYPE_PALETTE 3
700 #define PNG_COLOR_TYPE_GRAY_ALPHA 4
701 #define PNG_COLOR_TYPE_RGB_ALPHA 6
702 
703 static BOOL is_valid_png_type_depth(int color_type, int bit_depth, BOOL plte)
704 {
705  switch (color_type)
706  {
707  case PNG_COLOR_TYPE_GRAY:
708  return bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8 || bit_depth == 16;
709 
710  case PNG_COLOR_TYPE_RGB:
711  return bit_depth == 8 || bit_depth == 16;
712 
714  return (bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8) && plte;
715 
717  return bit_depth == 8 || bit_depth == 16;
718 
720  return bit_depth == 8 || bit_depth == 16;
721 
722  default:
723  ok(0, "unknown PNG type %d, depth %d\n", color_type, bit_depth);
724  return FALSE;
725  }
726 }
727 
728 static void test_color_formats(void)
729 {
730  static const struct
731  {
732  char bit_depth, color_type;
733  const GUID *format;
734  const GUID *format_PLTE;
735  const GUID *format_PLTE_tRNS;
736  BOOL todo;
737  BOOL todo_load;
738  } td[] =
739  {
740  /* 2 - PNG_COLOR_TYPE_RGB */
741  { 1, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
742  { 2, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
743  { 4, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
744  { 8, PNG_COLOR_TYPE_RGB,
745  &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR },
746  /* libpng refuses to load our test image complaining about extra compressed data,
747  * but libpng is still able to load the image with other combination of type/depth
748  * making RGB 16 bpp case special for some reason. Therefore todo = TRUE.
749  */
750  { 16, PNG_COLOR_TYPE_RGB,
751  &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, TRUE, TRUE },
752  { 24, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
753  { 32, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
754  /* 0 - PNG_COLOR_TYPE_GRAY */
755  { 1, PNG_COLOR_TYPE_GRAY,
756  &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormat1bppIndexed },
757  { 2, PNG_COLOR_TYPE_GRAY,
758  &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppIndexed },
759  { 4, PNG_COLOR_TYPE_GRAY,
760  &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppIndexed },
761  { 8, PNG_COLOR_TYPE_GRAY,
762  &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppIndexed },
763  { 16, PNG_COLOR_TYPE_GRAY,
764  &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat64bppRGBA },
765  { 24, PNG_COLOR_TYPE_GRAY, NULL, NULL, NULL },
766  { 32, PNG_COLOR_TYPE_GRAY, NULL, NULL, NULL },
767  /* 3 - PNG_COLOR_TYPE_PALETTE */
769  &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed },
771  &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed },
773  &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed },
775  &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed },
779  };
780  char buf[sizeof(png_1x1_data)];
781  HRESULT hr;
782  IWICBitmapDecoder *decoder;
783  IWICBitmapFrameDecode *frame;
784  GUID format;
785  int i, PLTE_off = 0, tRNS_off = 0;
786 
787  memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
788  for (i = 0; i < sizeof(png_1x1_data) - 4; i++)
789  {
790  if (!memcmp(buf + i, "tRNS", 4))
791  tRNS_off = i;
792  else if (!memcmp(buf + i, "PLTE", 4))
793  PLTE_off = i;
794  }
795 
796  ok(PLTE_off && tRNS_off, "PLTE offset %d, tRNS offset %d\n", PLTE_off, tRNS_off);
797  if (!PLTE_off || !tRNS_off) return;
798 
799  /* In order to test the image data with and without PLTE and tRNS chunks
800  * it's been decided to simply sero out the chunk id for testing puposes,
801  * and under Windows such images get loaded just fine. But unfortunately
802  * libpng refuses to load such images complaining about unknown chunk type.
803  * A workaround for this libpng limitation is to mark the "disabled" chunks
804  * with tEXt id.
805  */
806 
807  for (i = 0; i < ARRAY_SIZE(td); i++)
808  {
809  /* with the tRNS and PLTE chunks */
810  memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
811  buf[24] = td[i].bit_depth;
812  buf[25] = td[i].color_type;
813 
814  hr = create_decoder(buf, sizeof(buf), &decoder);
815  if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE))
816  ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
817  else
818 todo_wine_if(td[i].todo_load)
819  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);
820  if (hr != S_OK) goto next_1;
821 
822  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
823  ok(hr == S_OK, "GetFrame error %#x\n", hr);
824 
825  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
826  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
827 todo_wine_if(td[i].todo)
828  ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS),
829  "PLTE+tRNS: expected %s, got %s (type %d, bpp %d)\n",
830  wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
831 
832  IWICBitmapFrameDecode_Release(frame);
833  IWICBitmapDecoder_Release(decoder);
834 
835 next_1:
836  /* without the tRNS chunk */
837  memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
838  buf[24] = td[i].bit_depth;
839  buf[25] = td[i].color_type;
840  memcpy(buf + tRNS_off, "tEXt", 4);
841 
842  hr = create_decoder(buf, sizeof(buf), &decoder);
843  if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE))
844  ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
845  else
846 todo_wine_if(td[i].todo_load)
847  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);
848  if (hr != S_OK) goto next_2;
849 
850  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
851  ok(hr == S_OK, "GetFrame error %#x\n", hr);
852 
853  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
854  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
855  ok(IsEqualGUID(&format, td[i].format_PLTE),
856  "PLTE: expected %s, got %s (type %d, bpp %d)\n",
857  wine_dbgstr_guid(td[i].format_PLTE), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
858 
859  IWICBitmapFrameDecode_Release(frame);
860  IWICBitmapDecoder_Release(decoder);
861 
862 next_2:
863  /* without the tRNS and PLTE chunks */
864  memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
865  buf[24] = td[i].bit_depth;
866  buf[25] = td[i].color_type;
867  memcpy(buf + PLTE_off, "tEXt", 4);
868  memcpy(buf + tRNS_off, "tEXt", 4);
869 
870  hr = create_decoder(buf, sizeof(buf), &decoder);
871  if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE))
872  ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
873  else
874 todo_wine_if(td[i].todo_load)
875  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);
876  if (hr != S_OK) goto next_3;
877 
878  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
879  ok(hr == S_OK, "GetFrame error %#x\n", hr);
880 
881  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
882  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
883  ok(IsEqualGUID(&format, td[i].format),
884  "expected %s, got %s (type %d, bpp %d)\n",
885  wine_dbgstr_guid(td[i].format), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
886 
887  IWICBitmapFrameDecode_Release(frame);
888  IWICBitmapDecoder_Release(decoder);
889 
890 next_3:
891  /* without the PLTE chunk */
892  memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
893  buf[24] = td[i].bit_depth;
894  buf[25] = td[i].color_type;
895  memcpy(buf + PLTE_off, "tEXt", 4);
896 
897  hr = create_decoder(buf, sizeof(buf), &decoder);
898  if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE))
899  ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
900  else
901 todo_wine_if(td[i].todo_load)
902  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);
903  if (hr != S_OK) continue;
904 
905  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
906  ok(hr == S_OK, "GetFrame error %#x\n", hr);
907 
908  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
909  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
910 todo_wine_if(td[i].todo)
911  ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS),
912  "tRNS: expected %s, got %s (type %d, bpp %d)\n",
913  wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
914 
915  IWICBitmapFrameDecode_Release(frame);
916  IWICBitmapDecoder_Release(decoder);
917  }
918 }
919 #undef PNG_COLOR_TYPE_GRAY
920 #undef PNG_COLOR_TYPE_RGB
921 #undef PNG_COLOR_TYPE_PALETTE
922 #undef PNG_COLOR_TYPE_GRAY_ALPHA
923 #undef PNG_COLOR_TYPE_RGB_ALPHA
924 
925 START_TEST(pngformat)
926 {
927  HRESULT hr;
928 
930  hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
931  &IID_IWICImagingFactory, (void **)&factory);
932  ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
933  if (FAILED(hr)) return;
934 
938 
939  IWICImagingFactory_Release(factory);
940  CoUninitialize();
941 }
static BOOL is_valid_png_type_depth(int color_type, int bit_depth, BOOL plte)
Definition: pngformat.c:703
#define PNG_COLOR_TYPE_RGB_ALPHA
Definition: pngformat.c:701
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
static const char png_no_color_profile[]
Definition: pngformat.c:31
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
Definition: sock.c:82
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
HRESULT hr
Definition: shlfolder.c:183
Definition: http.c:6587
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define PNG_COLOR_TYPE_GRAY
Definition: pngformat.c:697
BOOL todo
Definition: filedlg.c:313
static void test_png_palette(void)
Definition: pngformat.c:553
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
const char * wine_dbgstr_guid(const GUID *guid)
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLuint buffer
Definition: glext.h:5915
#define WINCODEC_ERR_NOTINITIALIZED
Definition: winerror.h:3277
const char * filename
Definition: ioapi.h:135
#define lstrlenW
Definition: compat.h:415
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
WICColorContextType
Definition: wincodec.idl:118
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
Definition: main.c:440
GLuint color
Definition: glext.h:6243
#define GENERIC_WRITE
Definition: nt_native.h:90
#define WINCODEC_ERR_UNKNOWNIMAGEFORMAT
Definition: winerror.h:3275
#define PNG_COLOR_TYPE_RGB
Definition: pngformat.c:698
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
#define E_INVALIDARG
Definition: ddrawi.h:101
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3284
smooth NULL
Definition: ftsmooth.c:416
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: pngformat.c:279
static IWICImagingFactory * factory
Definition: pngformat.c:277
START_TEST(pngformat)
Definition: pngformat.c:925
static const char png_color_profile[]
Definition: pngformat.c:45
_Check_return_ _CRTIMP FILE *__cdecl tmpfile(void)
Definition: file.c:3912
#define todo_wine_if(is_todo)
Definition: test.h:155
GLsizeiptr size
Definition: glext.h:5919
static const char png_1x1_data[]
Definition: pngformat.c:655
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static const char png_PLTE_tRNS[]
Definition: pngformat.c:535
#define MAX_PATH
Definition: compat.h:26
IStream *WINAPI SHCreateMemStream(const BYTE *lpbData, UINT dwDataLen)
Definition: regstream.c:652
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
static double zero
Definition: j0_y0.c:96
Definition: parse.h:22
static WCHAR * save_profile(BYTE *buffer, UINT size)
Definition: pngformat.c:315
GLuint GLuint stream
Definition: glext.h:7522
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
#define WINCODEC_ERR_UNSUPPORTEDOPERATION
Definition: winerror.h:3300
static HPALETTE palette
Definition: clipboard.c:1345
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3273
#define S_OK
Definition: intsafe.h:59
#define CREATE_ALWAYS
Definition: disk.h:72
#define lstrcpyW
Definition: compat.h:414
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ARRAY_SIZE(a)
Definition: main.h:24
J_COLOR_SPACE colorspace
Definition: jpeglib.h:989
#define ok(value,...)
Definition: atltest.h:57
Definition: services.c:325
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define CreateFileW
Definition: compat.h:408
static void test_color_contexts(void)
Definition: pngformat.c:336
#define PNG_COLOR_TYPE_GRAY_ALPHA
Definition: pngformat.c:700
static const char png_gray_tRNS[]
Definition: pngformat.c:545
#define PNG_COLOR_TYPE_PALETTE
Definition: pngformat.c:699
static void test_color_formats(void)
Definition: pngformat.c:728
UINT32 WICColor
Definition: wincodec.idl:250
#define HeapFree(x, y, z)
Definition: compat.h:402
static GLint image_size(GLint width, GLint height, GLenum format, GLenum type)
Definition: mipmap.c:4856