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 
277 static IWICImagingFactory *factory;
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;
285     ULARGE_INTEGER pos;
286     LARGE_INTEGER zero;
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 
310     return hr;
311 }
312 
313 static WCHAR *save_profile( BYTE *buffer, UINT size )
314 {
315     static const WCHAR tstW[] = {'t','s','t',0};
316     WCHAR path[MAX_PATH], filename[MAX_PATH], *ret;
317     HANDLE handle;
318     DWORD count;
319 
320     GetTempPathW(MAX_PATH, path);
321     GetTempFileNameW(path, tstW, 0, filename);
322 
323     handle = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
324     if (handle == INVALID_HANDLE_VALUE) return NULL;
325 
326     WriteFile(handle, buffer, size, &count, NULL);
327     CloseHandle( handle );
328 
329     ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
330     lstrcpyW(ret, filename);
331     return ret;
332 }
333 
334 static void test_color_contexts(void)
335 {
336     HRESULT hr;
337     IWICBitmapDecoder *decoder;
338     IWICBitmapFrameDecode *frame;
339     IWICColorContext *context;
340     WICColorContextType type;
341     UINT count, colorspace, size;
342     WCHAR *tmpfile;
343     BYTE *buffer;
344     BOOL ret;
345 
346     hr = create_decoder(png_no_color_profile, sizeof(png_no_color_profile), &decoder);
347     ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
348     if (hr != S_OK) return;
349 
350     /* global color context */
351     hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, NULL);
352     ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
353 
354     count = 0xdeadbeef;
355     hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count);
356     ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
357     ok(count == 0xdeadbeef, "unexpected count %u\n", count);
358 
359     /* frame color context */
360     hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
361     ok(hr == S_OK, "GetFrame error %#x\n", hr);
362 
363     hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, NULL);
364     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
365 
366     count = 0xdeadbeef;
367     hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count);
368     ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
369     ok(!count, "unexpected count %u\n", count);
370 
371     IWICBitmapFrameDecode_Release(frame);
372     IWICBitmapDecoder_Release(decoder);
373 
374     hr = create_decoder(png_color_profile, sizeof(png_color_profile), &decoder);
375     ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
376     if (hr != S_OK) return;
377 
378     /* global color context */
379     count = 0xdeadbeef;
380     hr = IWICBitmapDecoder_GetColorContexts(decoder, 0, NULL, &count);
381     ok(hr == WINCODEC_ERR_UNSUPPORTEDOPERATION, "GetColorContexts error %#x\n", hr);
382     ok(count == 0xdeadbeef, "unexpected count %u\n", count);
383 
384     /* frame color context */
385     hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
386     ok(hr == S_OK, "GetFrame error %#x\n", hr);
387 
388     count = 0xdeadbeef;
389     hr = IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count);
390     ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
391     ok(count == 1, "unexpected count %u\n", count);
392 
393     hr = IWICImagingFactory_CreateColorContext(factory, NULL);
394     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
395 
396     hr = IWICImagingFactory_CreateColorContext(factory, &context);
397     ok(hr == S_OK, "CreateColorContext error %#x\n", hr);
398 
399     hr = IWICColorContext_GetType(context, NULL);
400     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
401 
402     type = 0xdeadbeef;
403     hr = IWICColorContext_GetType(context, &type);
404     ok(hr == S_OK, "GetType error %#x\n", hr);
405     ok(type == WICColorContextUninitialized, "unexpected type %u\n", type);
406 
407     hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL);
408     ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
409 
410     size = 0;
411     hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
412     ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
413     ok(!size, "unexpected size %u\n", size);
414 
415     hr = IWICColorContext_GetExifColorSpace(context, NULL);
416     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
417 
418     colorspace = 0xdeadbeef;
419     hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
420     ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
421     ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
422 
423     hr = IWICColorContext_InitializeFromExifColorSpace(context, 0);
424     ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
425 
426     hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
427     ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
428 
429     hr = IWICColorContext_InitializeFromExifColorSpace(context, 2);
430     ok(hr == S_OK, "InitializeFromExifColorSpace error %#x\n", hr);
431 
432     colorspace = 0xdeadbeef;
433     hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
434     ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
435     ok(colorspace == 2, "unexpected color space %u\n", colorspace);
436 
437     size = 0;
438     hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
439     ok(hr == WINCODEC_ERR_NOTINITIALIZED, "GetProfileBytes error %#x\n", hr);
440     ok(!size, "unexpected size %u\n", size);
441 
442     type = 0xdeadbeef;
443     hr = IWICColorContext_GetType(context, &type);
444     ok(hr == S_OK, "GetType error %#x\n", hr);
445     ok(type == WICColorContextExifColorSpace, "unexpected type %u\n", type);
446 
447     hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count);
448     ok(hr == WINCODEC_ERR_WRONGSTATE, "GetColorContexts error %#x\n", hr);
449 
450     IWICColorContext_Release(context);
451     IWICBitmapFrameDecode_Release(frame);
452 
453     hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
454     ok(hr == S_OK, "GetFrame error %#x\n", hr);
455 
456     hr = IWICImagingFactory_CreateColorContext(factory, &context);
457     ok(hr == S_OK, "CreateColorContext error %#x\n", hr);
458 
459     count = 1;
460     hr = IWICBitmapFrameDecode_GetColorContexts(frame, count, &context, &count);
461     ok(hr == S_OK, "GetColorContexts error %#x\n", hr);
462 
463     hr = IWICColorContext_GetProfileBytes(context, 0, NULL, NULL);
464     ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
465 
466     size = 0;
467     hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
468     ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
469     ok(size, "unexpected size %u\n", size);
470 
471     buffer = HeapAlloc(GetProcessHeap(), 0, size);
472     hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
473     ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
474 
475     tmpfile = save_profile( buffer, size );
476     HeapFree(GetProcessHeap(), 0, buffer);
477 
478     type = 0xdeadbeef;
479     hr = IWICColorContext_GetType(context, &type);
480     ok(hr == S_OK, "GetType error %#x\n", hr);
481     ok(type == WICColorContextProfile, "unexpected type %u\n", type);
482 
483     colorspace = 0xdeadbeef;
484     hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
485     ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
486     ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
487 
488     hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
489     ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr);
490 
491     if (tmpfile)
492     {
493         hr = IWICColorContext_InitializeFromFilename(context, NULL);
494         ok(hr == E_INVALIDARG, "InitializeFromFilename error %#x\n", hr);
495 
496         hr = IWICColorContext_InitializeFromFilename(context, tmpfile);
497         ok(hr == S_OK, "InitializeFromFilename error %#x\n", hr);
498 
499         ret = DeleteFileW(tmpfile);
500         ok(ret, "DeleteFileW failed %u\n", GetLastError());
501 
502         type = 0xdeadbeef;
503         hr = IWICColorContext_GetType(context, &type);
504         ok(hr == S_OK, "GetType error %#x\n", hr);
505         ok(type == WICColorContextProfile, "unexpected type %u\n", type);
506 
507         colorspace = 0xdeadbeef;
508         hr = IWICColorContext_GetExifColorSpace(context, &colorspace);
509         ok(hr == S_OK, "GetExifColorSpace error %#x\n", hr);
510         ok(colorspace == 0xffffffff, "unexpected color space %u\n", colorspace);
511 
512         hr = IWICColorContext_InitializeFromExifColorSpace(context, 1);
513         ok(hr == WINCODEC_ERR_WRONGSTATE, "InitializeFromExifColorSpace error %#x\n", hr);
514 
515         size = 0;
516         hr = IWICColorContext_GetProfileBytes(context, 0, NULL, &size);
517         ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
518         ok(size, "unexpected size %u\n", size);
519 
520         buffer = HeapAlloc(GetProcessHeap(), 0, size);
521         hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
522         ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
523 
524         HeapFree(GetProcessHeap(), 0, buffer);
525         HeapFree(GetProcessHeap(), 0, tmpfile);
526     }
527     IWICColorContext_Release(context);
528     IWICBitmapFrameDecode_Release(frame);
529     IWICBitmapDecoder_Release(decoder);
530 }
531 
532 /* 1 bpp 1x1 pixel PNG image with PLTE and tRNS chunks */
533 static const char png_PLTE_tRNS[] = {
534   0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
535   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,
536   0x00,0x00,0x00,0x06,'P','L','T','E',0x01,0x02,0x03,0x04,0x05,0x06,0x95,0x53,0x6f,0x48,
537   0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a,
538   0x00,0x00,0x00,0x0a,'I','D','A','T',0x18,0xd3,0x63,0x68,0x00,0x00,0x00,0x82,0x00,0x81,0xa7,0x01,0xba,0x10,
539   0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
540 };
541 
542 static void test_png_palette(void)
543 {
544     HRESULT hr;
545     IWICBitmapDecoder *decoder;
546     IWICBitmapFrameDecode *frame;
547     IWICPalette *palette;
548     GUID format;
549     UINT count, ret;
550     WICColor color[256];
551 
552     hr = create_decoder(png_PLTE_tRNS, sizeof(png_PLTE_tRNS), &decoder);
553     ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
554     if (hr != S_OK) return;
555 
556     hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
557     ok(hr == S_OK, "GetFrame error %#x\n", hr);
558 
559     hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
560     ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
561     ok(IsEqualGUID(&format, &GUID_WICPixelFormat1bppIndexed),
562        "got wrong format %s\n", wine_dbgstr_guid(&format));
563 
564     hr = IWICImagingFactory_CreatePalette(factory, &palette);
565     ok(hr == S_OK, "CreatePalette error %#x\n", hr);
566     hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
567     ok(hr == S_OK, "CopyPalette error %#x\n", hr);
568 
569     hr = IWICPalette_GetColorCount(palette, &count);
570     ok(hr == S_OK, "GetColorCount error %#x\n", hr);
571     ok(count == 2, "expected 2, got %u\n", count);
572 
573     hr = IWICPalette_GetColors(palette, 256, color, &ret);
574     ok(hr == S_OK, "GetColors error %#x\n", hr);
575     ok(ret == count, "expected %u, got %u\n", count, ret);
576     ok(color[0] == 0xff010203, "expected 0xff010203, got %#x\n", color[0]);
577     ok(color[1] == 0x00040506, "expected 0x00040506, got %#x\n", color[1]);
578 
579     IWICPalette_Release(palette);
580     IWICBitmapFrameDecode_Release(frame);
581     IWICBitmapDecoder_Release(decoder);
582 }
583 
584 /* RGB 24 bpp 1x1 pixel PNG image */
585 static const char png_1x1_data[] = {
586   0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
587   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,
588   0x00,0x00,0x03,0x00,'P','L','T','E',
589   0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,
590   0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10,
591   0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18,
592   0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,
593   0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28,
594   0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30,
595   0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
596   0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
597   0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,
598   0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,
599   0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,
600   0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60,
601   0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,
602   0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70,
603   0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78,
604   0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,
605   0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,
606   0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x10,0x10,0x10,
607   0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x13,0x14,0x14,0x14,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x17,0x18,0x18,0x18,
608   0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x20,0x20,0x20,
609   0x21,0x21,0x21,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,0x26,0x26,0x26,0x27,0x27,0x27,0x28,0x28,0x28,
610   0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x30,
611   0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
612   0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
613   0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,0x46,0x46,0x47,0x47,0x47,0x48,0x48,0x48,
614   0x49,0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,0x4f,0x4f,0x4f,0x50,0x50,0x50,
615   0x51,0x51,0x51,0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,0x57,0x58,0x58,0x58,
616   0x59,0x59,0x59,0x5a,0x5a,0x5a,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d,0x5e,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,0x60,
617   0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,0x63,0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,
618   0x69,0x69,0x69,0x6a,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x70,
619   0x71,0x71,0x71,0x72,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x74,0x75,0x75,0x75,0x76,0x76,0x76,0x77,0x77,0x77,0x78,0x78,0x78,
620   0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7b,0x7c,0x7c,0x7c,0x7d,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,
621   0x76,0xb6,0x24,0x31,
622   0x00,0x00,0x00,0x02,'t','R','N','S',0xff,0x00,0xe5,0xb7,0x30,0x4a,
623   0x00,0x00,0x00,0x0c,'I','D','A','T',0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,0xe7,
624   0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
625 };
626 
627 static BOOL is_valid_png_type_depth(int color_type, int bit_depth, BOOL plte)
628 {
629     switch (color_type)
630     {
631     case 0: /* Grayscale */
632         return bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8 || bit_depth == 16;
633 
634     case 2: /* True Color */
635         return bit_depth == 8 || bit_depth == 16;
636 
637     case 3: /* Indexed Color */
638         return (bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8) && plte;
639 
640     case 4: /* Grayscale with alpha */
641         return bit_depth == 8 || bit_depth == 16;
642 
643     case 6: /* True Color with alpha */
644         return bit_depth == 8 || bit_depth == 16;
645 
646     default:
647         ok(0, "unknown PNG type %d, depth %d\n", color_type, bit_depth);
648         return FALSE;
649     }
650 }
651 
652 static void test_color_formats(void)
653 {
654     static const struct
655     {
656         char bit_depth, color_type;
657         const GUID *format;
658         const GUID *format_PLTE;
659         const GUID *format_PLTE_tRNS;
660         BOOL todo;
661         BOOL todo_load;
662     } td[] =
663     {
664         /* 2 - PNG_COLOR_TYPE_RGB */
665         { 1, 2, NULL, NULL, NULL },
666         { 2, 2, NULL, NULL, NULL },
667         { 4, 2, NULL, NULL, NULL },
668         { 8, 2, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR },
669         /* libpng refuses to load our test image complaining about extra compressed data,
670          * but libpng is still able to load the image with other combination of type/depth
671          * making RGB 16 bpp case special for some reason. Therefore todo = TRUE.
672          */
673         { 16, 2, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB, TRUE, TRUE },
674         { 24, 2, NULL, NULL, NULL },
675         { 32, 2, NULL, NULL, NULL },
676         /* 0 - PNG_COLOR_TYPE_GRAY */
677         { 1, 0, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormat1bppIndexed },
678         { 2, 0, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppIndexed },
679         { 4, 0, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppIndexed },
680         { 8, 0, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppIndexed },
681         { 16, 0, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat64bppRGBA },
682         { 24, 0, NULL, NULL, NULL },
683         { 32, 0, NULL, NULL, NULL },
684         /* 3 - PNG_COLOR_TYPE_PALETTE */
685         { 1, 3, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed },
686         { 2, 3, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed },
687         { 4, 3, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed },
688         { 8, 3, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed },
689         { 16, 3, NULL, NULL, NULL },
690         { 24, 3,  NULL, NULL, NULL },
691         { 32, 3,  NULL, NULL, NULL },
692     };
693     char buf[sizeof(png_1x1_data)];
694     HRESULT hr;
695     IWICBitmapDecoder *decoder;
696     IWICBitmapFrameDecode *frame;
697     GUID format;
698     int i, PLTE_off = 0, tRNS_off = 0;
699 
700     memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
701     for (i = 0; i < sizeof(png_1x1_data) - 4; i++)
702     {
703         if (!memcmp(buf + i, "tRNS", 4))
704             tRNS_off = i;
705         else if (!memcmp(buf + i, "PLTE", 4))
706             PLTE_off = i;
707     }
708 
709     ok(PLTE_off && tRNS_off, "PLTE offset %d, tRNS offset %d\n", PLTE_off, tRNS_off);
710     if (!PLTE_off || !tRNS_off) return;
711 
712     /* In order to test the image data with and without PLTE and tRNS chunks
713      * it's been decided to simply sero out the chunk id for testing puposes,
714      * and under Windows such images get loaded just fine. But unfortunately
715      * libpng refuses to load such images complaining about unknown chunk type.
716      * A workaround for this libpng limitation is to mark the "disabled" chunks
717      * with tEXt id.
718      */
719 
720     for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
721     {
722         /* with the tRNS and PLTE chunks */
723         memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
724         buf[24] = td[i].bit_depth;
725         buf[25] = td[i].color_type;
726 
727         hr = create_decoder(buf, sizeof(buf), &decoder);
728         if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE))
729             ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
730         else
731 todo_wine_if(td[i].todo_load)
732             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);
733         if (hr != S_OK) goto next_1;
734 
735         hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
736         ok(hr == S_OK, "GetFrame error %#x\n", hr);
737 
738         hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
739         ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
740 todo_wine_if(td[i].todo)
741         ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS),
742            "PLTE+tRNS: expected %s, got %s (type %d, bpp %d)\n",
743             wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
744 
745         IWICBitmapFrameDecode_Release(frame);
746         IWICBitmapDecoder_Release(decoder);
747 
748 next_1:
749         /* without the tRNS chunk */
750         memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
751         buf[24] = td[i].bit_depth;
752         buf[25] = td[i].color_type;
753         memcpy(buf + tRNS_off, "tEXt", 4);
754 
755         hr = create_decoder(buf, sizeof(buf), &decoder);
756         if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, TRUE))
757             ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
758         else
759 todo_wine_if(td[i].todo_load)
760             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);
761         if (hr != S_OK) goto next_2;
762 
763         hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
764         ok(hr == S_OK, "GetFrame error %#x\n", hr);
765 
766         hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
767         ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
768         ok(IsEqualGUID(&format, td[i].format_PLTE),
769            "PLTE: expected %s, got %s (type %d, bpp %d)\n",
770             wine_dbgstr_guid(td[i].format_PLTE), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
771 
772         IWICBitmapFrameDecode_Release(frame);
773         IWICBitmapDecoder_Release(decoder);
774 
775 next_2:
776         /* without the tRNS and PLTE chunks */
777         memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
778         buf[24] = td[i].bit_depth;
779         buf[25] = td[i].color_type;
780         memcpy(buf + PLTE_off, "tEXt", 4);
781         memcpy(buf + tRNS_off, "tEXt", 4);
782 
783         hr = create_decoder(buf, sizeof(buf), &decoder);
784         if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE))
785             ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
786         else
787 todo_wine_if(td[i].todo_load)
788             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);
789         if (hr != S_OK) goto next_3;
790 
791         hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
792         ok(hr == S_OK, "GetFrame error %#x\n", hr);
793 
794         hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
795         ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
796         ok(IsEqualGUID(&format, td[i].format),
797            "expected %s, got %s (type %d, bpp %d)\n",
798             wine_dbgstr_guid(td[i].format), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
799 
800         IWICBitmapFrameDecode_Release(frame);
801         IWICBitmapDecoder_Release(decoder);
802 
803 next_3:
804         /* without the PLTE chunk */
805         memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
806         buf[24] = td[i].bit_depth;
807         buf[25] = td[i].color_type;
808         memcpy(buf + PLTE_off, "tEXt", 4);
809 
810         hr = create_decoder(buf, sizeof(buf), &decoder);
811         if (!is_valid_png_type_depth(td[i].color_type, td[i].bit_depth, FALSE))
812             ok(hr == WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "%d: wrong error %#x\n", i, hr);
813         else
814 todo_wine_if(td[i].todo_load)
815             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);
816         if (hr != S_OK) continue;
817 
818         hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
819         ok(hr == S_OK, "GetFrame error %#x\n", hr);
820 
821         hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
822         ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
823 todo_wine_if(td[i].todo)
824         ok(IsEqualGUID(&format, td[i].format_PLTE_tRNS),
825            "tRNS: expected %s, got %s (type %d, bpp %d)\n",
826             wine_dbgstr_guid(td[i].format_PLTE_tRNS), wine_dbgstr_guid(&format), td[i].color_type, td[i].bit_depth);
827 
828         IWICBitmapFrameDecode_Release(frame);
829         IWICBitmapDecoder_Release(decoder);
830     }
831 }
832 
833 START_TEST(pngformat)
834 {
835     HRESULT hr;
836 
837     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
838     hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
839                           &IID_IWICImagingFactory, (void **)&factory);
840     ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
841     if (FAILED(hr)) return;
842 
843     test_color_contexts();
844     test_png_palette();
845     test_color_formats();
846 
847     IWICImagingFactory_Release(factory);
848     CoUninitialize();
849 }
850