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     else
310         IStream_Release(stream);
311 
312     return hr;
313 }
314 
315 static WCHAR *save_profile( BYTE *buffer, UINT size )
316 {
317     static const WCHAR tstW[] = {'t','s','t',0};
318     WCHAR path[MAX_PATH], filename[MAX_PATH], *ret;
319     HANDLE handle;
320     DWORD count;
321 
322     GetTempPathW(MAX_PATH, path);
323     GetTempFileNameW(path, tstW, 0, filename);
324 
325     handle = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
326     if (handle == INVALID_HANDLE_VALUE) return NULL;
327 
328     WriteFile(handle, buffer, size, &count, NULL);
329     CloseHandle( handle );
330 
331     ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR));
332     lstrcpyW(ret, filename);
333     return ret;
334 }
335 
336 static void test_color_contexts(void)
337 {
338     HRESULT hr;
339     IWICBitmapDecoder *decoder;
340     IWICBitmapFrameDecode *frame;
341     IWICColorContext *context;
342     WICColorContextType type;
343     UINT count, colorspace, size;
344     WCHAR *tmpfile;
345     BYTE *buffer;
346     BOOL ret;
347 
348     hr = create_decoder(png_no_color_profile, sizeof(png_no_color_profile), &decoder);
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 
376     hr = create_decoder(png_color_profile, sizeof(png_color_profile), &decoder);
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 
473     buffer = HeapAlloc(GetProcessHeap(), 0, size);
474     hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
475     ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
476 
477     tmpfile = save_profile( buffer, size );
478     HeapFree(GetProcessHeap(), 0, buffer);
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 
501         ret = DeleteFileW(tmpfile);
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 
522         buffer = HeapAlloc(GetProcessHeap(), 0, size);
523         hr = IWICColorContext_GetProfileBytes(context, size, buffer, &size);
524         ok(hr == S_OK, "GetProfileBytes error %#x\n", hr);
525 
526         HeapFree(GetProcessHeap(), 0, buffer);
527         HeapFree(GetProcessHeap(), 0, tmpfile);
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;
558     IWICPalette *palette;
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));
618     memcpy(buf, png_gray_tRNS, 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 
713     case PNG_COLOR_TYPE_PALETTE:
714         return (bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8) && plte;
715 
716     case PNG_COLOR_TYPE_GRAY_ALPHA:
717         return bit_depth == 8 || bit_depth == 16;
718 
719     case PNG_COLOR_TYPE_RGB_ALPHA:
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 */
768         { 1, PNG_COLOR_TYPE_PALETTE,
769           &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed },
770         { 2, PNG_COLOR_TYPE_PALETTE,
771           &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed },
772         { 4, PNG_COLOR_TYPE_PALETTE,
773           &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed },
774         { 8, PNG_COLOR_TYPE_PALETTE,
775           &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed },
776         { 16, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
777         { 24, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
778         { 32, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
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 
929     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
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 
935     test_color_contexts();
936     test_png_palette();
937     test_color_formats();
938 
939     IWICImagingFactory_Release(factory);
940     CoUninitialize();
941 }
942