[WINDOWSCODECS_WINETEST] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / modules / rostests / winetests / windowscodecs / info.c
1 /*
2 * Copyright 2009 Vincent Povirk for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #include <stdio.h>
20 #include <stdarg.h>
21 #include <math.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "objbase.h"
27 #include "wincodec.h"
28 #include "wincodecsdk.h"
29 #include "wine/test.h"
30
31 #include "initguid.h"
32 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
33
34 static HRESULT get_component_info(const GUID *clsid, IWICComponentInfo **result)
35 {
36 IWICImagingFactory *factory;
37 HRESULT hr;
38
39 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
40 &IID_IWICImagingFactory, (void**)&factory);
41 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
42 if (FAILED(hr)) return hr;
43
44 hr = IWICImagingFactory_CreateComponentInfo(factory, clsid, result);
45
46 IWICImagingFactory_Release(factory);
47
48 return hr;
49 }
50
51 static BOOL is_pixelformat(GUID *format)
52 {
53 IWICComponentInfo *info;
54 HRESULT hr;
55 WICComponentType componenttype;
56
57 hr = get_component_info(format, &info);
58 if (FAILED(hr))
59 return FALSE;
60
61 hr = IWICComponentInfo_GetComponentType(info, &componenttype);
62
63 IWICComponentInfo_Release(info);
64
65 return SUCCEEDED(hr) && componenttype == WICPixelFormat;
66 }
67
68 static void test_decoder_info(void)
69 {
70 struct decoder_info_test
71 {
72 const CLSID *clsid;
73 const char *mimetype;
74 const char *extensions;
75 unsigned int todo;
76 } decoder_info_tests[] =
77 {
78 {
79 &CLSID_WICBmpDecoder,
80 "image/bmp",
81 ".bmp,.dib,.rle"
82 },
83 {
84 &CLSID_WICGifDecoder,
85 "image/gif",
86 ".gif"
87 },
88 {
89 &CLSID_WICIcoDecoder,
90 "image/ico,image/x-icon",
91 ".ico,.icon",
92 1
93 },
94 {
95 &CLSID_WICJpegDecoder,
96 "image/jpeg,image/jpe,image/jpg",
97 ".jpeg,.jpe,.jpg,.jfif,.exif",
98 1
99 },
100 {
101 &CLSID_WICPngDecoder,
102 "image/png",
103 ".png"
104 },
105 {
106 &CLSID_WICTiffDecoder,
107 "image/tiff,image/tif",
108 ".tiff,.tif",
109 1
110 },
111 };
112 IWICBitmapDecoderInfo *decoder_info, *decoder_info2;
113 IWICComponentInfo *info;
114 HRESULT hr;
115 ULONG len;
116 WCHAR value[256];
117 CLSID clsid;
118 GUID pixelformats[32];
119 UINT num_formats, count;
120 int i, j;
121
122 for (i = 0; i < sizeof(decoder_info_tests)/sizeof(decoder_info_tests[0]); i++)
123 {
124 struct decoder_info_test *test = &decoder_info_tests[i];
125 IWICBitmapDecoder *decoder, *decoder2;
126 WCHAR extensionsW[64];
127 WCHAR mimetypeW[64];
128
129 hr = CoCreateInstance(test->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IWICBitmapDecoder, (void **)&decoder);
130 ok(SUCCEEDED(hr), "Failed to create decoder, hr %#x.\n", hr);
131
132 decoder_info = NULL;
133 hr = IWICBitmapDecoder_GetDecoderInfo(decoder, &decoder_info);
134 ok(hr == S_OK || broken(IsEqualCLSID(&CLSID_WICBmpDecoder, test->clsid) && FAILED(hr)) /* Fails on Windows */,
135 "%u: failed to get decoder info, hr %#x.\n", i, hr);
136
137 if (hr == S_OK)
138 {
139 decoder_info2 = NULL;
140 hr = IWICBitmapDecoder_GetDecoderInfo(decoder, &decoder_info2);
141 ok(hr == S_OK, "Failed to get decoder info, hr %#x.\n", hr);
142 todo_wine
143 ok(decoder_info == decoder_info2, "Unexpected decoder info instance.\n");
144
145 hr = IWICBitmapDecoderInfo_QueryInterface(decoder_info, &IID_IWICBitmapDecoder, (void **)&decoder2);
146 ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
147
148 IWICBitmapDecoderInfo_Release(decoder_info);
149 IWICBitmapDecoderInfo_Release(decoder_info2);
150 }
151 IWICBitmapDecoder_Release(decoder);
152
153 MultiByteToWideChar(CP_ACP, 0, test->mimetype, -1, mimetypeW, sizeof(mimetypeW)/sizeof(mimetypeW[0]));
154 MultiByteToWideChar(CP_ACP, 0, test->extensions, -1, extensionsW, sizeof(extensionsW)/sizeof(extensionsW[0]));
155
156 hr = get_component_info(test->clsid, &info);
157 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
158
159 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void **)&decoder_info);
160 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
161
162 hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, NULL);
163 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
164
165 hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, &clsid);
166 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
167 ok(IsEqualGUID(test->clsid, &clsid), "GetCLSID returned wrong result\n");
168
169 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, NULL);
170 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
171
172 len = 0;
173 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, NULL, &len);
174 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
175 todo_wine_if(test->todo)
176 ok(len == lstrlenW(mimetypeW) + 1, "GetMimeType returned wrong len %i\n", len);
177
178 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, NULL);
179 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr);
180
181 len = 0;
182 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, &len);
183 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
184 todo_wine_if(test->todo)
185 ok(len == lstrlenW(mimetypeW) + 1, "GetMimeType returned wrong len %i\n", len);
186
187 value[0] = 0;
188 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, &len);
189 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
190 todo_wine_if(test->todo) {
191 ok(lstrcmpW(value, mimetypeW) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value));
192 ok(len == lstrlenW(mimetypeW) + 1, "GetMimeType returned wrong len %i\n", len);
193 }
194 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, value, &len);
195 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetMimeType failed, hr=%x\n", hr);
196 todo_wine_if(test->todo)
197 ok(len == lstrlenW(mimetypeW) + 1, "GetMimeType returned wrong len %i\n", len);
198
199 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 256, value, &len);
200 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr);
201 todo_wine_if(test->todo) {
202 ok(lstrcmpW(value, mimetypeW) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value));
203 ok(len == lstrlenW(mimetypeW) + 1, "GetMimeType returned wrong len %i\n", len);
204 }
205 num_formats = 0xdeadbeef;
206 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, &num_formats);
207 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
208 ok((num_formats <= 21 && num_formats >= 1) ||
209 broken(IsEqualCLSID(test->clsid, &CLSID_WICIcoDecoder) && num_formats == 0) /* WinXP */,
210 "%u: got %d formats\n", i, num_formats);
211
212 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, NULL);
213 ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr);
214
215 count = 0xdeadbeef;
216 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, pixelformats, &count);
217 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
218 ok(count == 0, "got %d formats\n", count);
219
220 count = 0xdeadbeef;
221 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 1, pixelformats, &count);
222 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
223 ok((count == 1) || broken(IsEqualCLSID(test->clsid, &CLSID_WICIcoDecoder) && count == 0) /* WinXP */,
224 "%u: got %d formats\n", i, num_formats);
225 ok(is_pixelformat(&pixelformats[0]), "got invalid pixel format\n");
226
227 count = 0xdeadbeef;
228 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, &count);
229 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
230 ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats);
231 for (j = 0; j < num_formats; j++)
232 ok(is_pixelformat(&pixelformats[j]), "got invalid pixel format\n");
233
234 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, NULL);
235 ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr);
236
237 count = 0xdeadbeef;
238 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, sizeof(pixelformats)/sizeof(pixelformats[0]),
239 pixelformats, &count);
240 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
241 ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats);
242
243 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, NULL);
244 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
245
246 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, NULL, &len);
247 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
248 todo_wine_if(test->todo && !IsEqualCLSID(test->clsid, &CLSID_WICTiffDecoder))
249 ok(len == lstrlenW(extensionsW) + 1, "%u: GetFileExtensions returned wrong len %i\n", i, len);
250
251 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, NULL);
252 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr);
253
254 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, &len);
255 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
256 todo_wine_if(test->todo && !IsEqualCLSID(test->clsid, &CLSID_WICTiffDecoder))
257 ok(len == lstrlenW(extensionsW) + 1, "GetFileExtensions returned wrong len %i\n", len);
258
259 value[0] = 0;
260 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, &len);
261 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
262 todo_wine_if(test->todo)
263 ok(lstrcmpW(value, extensionsW) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value));
264 todo_wine_if(test->todo && !IsEqualCLSID(test->clsid, &CLSID_WICTiffDecoder))
265 ok(len == lstrlenW(extensionsW) + 1, "GetFileExtensions returned wrong len %i\n", len);
266
267 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, value, &len);
268 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetFileExtensions failed, hr=%x\n", hr);
269 todo_wine_if(test->todo && !IsEqualCLSID(test->clsid, &CLSID_WICTiffDecoder))
270 ok(len == lstrlenW(extensionsW) + 1, "GetFileExtensions returned wrong len %i\n", len);
271
272 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 256, value, &len);
273 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr);
274 todo_wine_if(test->todo)
275 ok(lstrcmpW(value, extensionsW) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value));
276 todo_wine_if(test->todo && !IsEqualCLSID(test->clsid, &CLSID_WICTiffDecoder))
277 ok(len == lstrlenW(extensionsW) + 1, "GetFileExtensions returned wrong len %i\n", len);
278
279 IWICBitmapDecoderInfo_Release(decoder_info);
280 IWICComponentInfo_Release(info);
281 }
282 }
283
284 static void test_pixelformat_info(void)
285 {
286 IWICComponentInfo *info;
287 IWICPixelFormatInfo *pixelformat_info;
288 IWICPixelFormatInfo2 *pixelformat_info2;
289 HRESULT hr;
290 ULONG len, known_len;
291 WCHAR value[256];
292 GUID guid;
293 WICComponentType componenttype;
294 WICPixelFormatNumericRepresentation numericrepresentation;
295 DWORD signing;
296 UINT uiresult;
297 BYTE abbuffer[256];
298 BOOL supportstransparency;
299
300 hr = get_component_info(&GUID_WICPixelFormat32bppBGRA, &info);
301 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
302
303 if (FAILED(hr))
304 return;
305
306 hr = IWICComponentInfo_GetAuthor(info, 0, NULL, 0);
307 ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr);
308
309 len = 0xdeadbeef;
310 hr = IWICComponentInfo_GetAuthor(info, 0, NULL, &len);
311 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
312 ok(len < 255 && len > 0, "invalid length 0x%x\n", len);
313 known_len = len;
314
315 memset(value, 0xaa, 256 * sizeof(WCHAR));
316 hr = IWICComponentInfo_GetAuthor(info, len-1, value, NULL);
317 ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr);
318 ok(value[0] == 0xaaaa, "string modified\n");
319
320 len = 0xdeadbeef;
321 memset(value, 0xaa, 256 * sizeof(WCHAR));
322 hr = IWICComponentInfo_GetAuthor(info, known_len-1, value, &len);
323 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetAuthor failed, hr=%x\n", hr);
324 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
325 ok(value[known_len-1] == 0xaaaa, "string modified past given length\n");
326 ok(value[0] == 0xaaaa, "string modified\n");
327
328 len = 0xdeadbeef;
329 memset(value, 0xaa, 256 * sizeof(WCHAR));
330 hr = IWICComponentInfo_GetAuthor(info, known_len, value, &len);
331 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
332 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
333 ok(value[known_len-1] == 0, "string not terminated at expected length\n");
334 ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n");
335
336 len = 0xdeadbeef;
337 memset(value, 0xaa, 256 * sizeof(WCHAR));
338 hr = IWICComponentInfo_GetAuthor(info, known_len+1, value, &len);
339 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr);
340 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len);
341 ok(value[known_len] == 0xaaaa, "string modified past end\n");
342 ok(value[known_len-1] == 0, "string not terminated at expected length\n");
343 ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n");
344
345 hr = IWICComponentInfo_GetCLSID(info, NULL);
346 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
347
348 memset(&guid, 0xaa, sizeof(guid));
349 hr = IWICComponentInfo_GetCLSID(info, &guid);
350 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
351 ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected CLSID %s\n", wine_dbgstr_guid(&guid));
352
353 hr = IWICComponentInfo_GetComponentType(info, NULL);
354 ok(hr == E_INVALIDARG, "GetComponentType failed, hr=%x\n", hr);
355
356 hr = IWICComponentInfo_GetComponentType(info, &componenttype);
357 ok(hr == S_OK, "GetComponentType failed, hr=%x\n", hr);
358 ok(componenttype == WICPixelFormat, "unexpected component type 0x%x\n", componenttype);
359
360 len = 0xdeadbeef;
361 hr = IWICComponentInfo_GetFriendlyName(info, 0, NULL, &len);
362 ok(hr == S_OK, "GetFriendlyName failed, hr=%x\n", hr);
363 ok(len < 255 && len > 0, "invalid length 0x%x\n", len);
364
365 hr = IWICComponentInfo_GetSigningStatus(info, NULL);
366 ok(hr == E_INVALIDARG, "GetSigningStatus failed, hr=%x\n", hr);
367
368 hr = IWICComponentInfo_GetSigningStatus(info, &signing);
369 ok(hr == S_OK, "GetSigningStatus failed, hr=%x\n", hr);
370 ok(signing == WICComponentSigned, "unexpected signing status 0x%x\n", signing);
371
372 len = 0xdeadbeef;
373 hr = IWICComponentInfo_GetSpecVersion(info, 0, NULL, &len);
374 ok(hr == S_OK, "GetSpecVersion failed, hr=%x\n", hr);
375 ok(len == 0, "invalid length 0x%x\n", len); /* spec version does not apply to pixel formats */
376
377 memset(&guid, 0xaa, sizeof(guid));
378 hr = IWICComponentInfo_GetVendorGUID(info, &guid);
379 ok(hr == S_OK, "GetVendorGUID failed, hr=%x\n", hr);
380 ok(IsEqualGUID(&guid, &GUID_VendorMicrosoft) ||
381 broken(IsEqualGUID(&guid, &GUID_NULL)) /* XP */, "unexpected GUID %s\n", wine_dbgstr_guid(&guid));
382
383 len = 0xdeadbeef;
384 hr = IWICComponentInfo_GetVersion(info, 0, NULL, &len);
385 ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
386 ok(len == 0, "invalid length 0x%x\n", len); /* version does not apply to pixel formats */
387
388 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo, (void**)&pixelformat_info);
389 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
390
391 if (SUCCEEDED(hr))
392 {
393 hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, NULL);
394 ok(hr == E_INVALIDARG, "GetBitsPerPixel failed, hr=%x\n", hr);
395
396 hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, &uiresult);
397 ok(hr == S_OK, "GetBitsPerPixel failed, hr=%x\n", hr);
398 ok(uiresult == 32, "unexpected bpp %i\n", uiresult);
399
400 hr = IWICPixelFormatInfo_GetChannelCount(pixelformat_info, &uiresult);
401 ok(hr == S_OK, "GetChannelCount failed, hr=%x\n", hr);
402 ok(uiresult == 4, "unexpected channel count %i\n", uiresult);
403
404 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, NULL);
405 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
406
407 uiresult = 0xdeadbeef;
408 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, &uiresult);
409 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
410 ok(uiresult == 4, "unexpected length %i\n", uiresult);
411
412 memset(abbuffer, 0xaa, sizeof(abbuffer));
413 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, known_len, abbuffer, NULL);
414 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
415 ok(abbuffer[0] == 0xaa, "buffer modified\n");
416
417 uiresult = 0xdeadbeef;
418 memset(abbuffer, 0xaa, sizeof(abbuffer));
419 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 3, abbuffer, &uiresult);
420 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr);
421 ok(abbuffer[0] == 0xaa, "buffer modified\n");
422 ok(uiresult == 4, "unexpected length %i\n", uiresult);
423
424 memset(abbuffer, 0xaa, sizeof(abbuffer));
425 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 4, abbuffer, &uiresult);
426 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
427 ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer));
428 ok(uiresult == 4, "unexpected length %i\n", uiresult);
429
430 memset(abbuffer, 0xaa, sizeof(abbuffer));
431 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 5, abbuffer, &uiresult);
432 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr);
433 ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer));
434 ok(abbuffer[4] == 0xaa, "buffer modified past actual length\n");
435 ok(uiresult == 4, "unexpected length %i\n", uiresult);
436
437 memset(&guid, 0xaa, sizeof(guid));
438 hr = IWICPixelFormatInfo_GetFormatGUID(pixelformat_info, &guid);
439 ok(hr == S_OK, "GetFormatGUID failed, hr=%x\n", hr);
440 ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected GUID %s\n", wine_dbgstr_guid(&guid));
441
442 IWICPixelFormatInfo_Release(pixelformat_info);
443 }
444
445 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo2, (void**)&pixelformat_info2);
446
447 if (FAILED(hr))
448 win_skip("IWICPixelFormatInfo2 not supported\n");
449 else
450 {
451 hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, NULL);
452 ok(hr == E_INVALIDARG, "GetNumericRepresentation failed, hr=%x\n", hr);
453
454 numericrepresentation = 0xdeadbeef;
455 hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, &numericrepresentation);
456 ok(hr == S_OK, "GetNumericRepresentation failed, hr=%x\n", hr);
457 ok(numericrepresentation == WICPixelFormatNumericRepresentationUnsignedInteger, "unexpected numeric representation %i\n", numericrepresentation);
458
459 hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, NULL);
460 ok(hr == E_INVALIDARG, "SupportsTransparency failed, hr=%x\n", hr);
461
462 supportstransparency = 0xdeadbeef;
463 hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, &supportstransparency);
464 ok(hr == S_OK, "SupportsTransparency failed, hr=%x\n", hr);
465 ok(supportstransparency == 1, "unexpected value %i\n", supportstransparency);
466
467 IWICPixelFormatInfo2_Release(pixelformat_info2);
468 }
469
470 IWICComponentInfo_Release(info);
471 }
472
473 static void test_reader_info(void)
474 {
475 IWICImagingFactory *factory;
476 IWICComponentInfo *info;
477 IWICMetadataReaderInfo *reader_info;
478 HRESULT hr;
479 CLSID clsid;
480 GUID container_formats[10];
481 UINT count, size;
482 WICMetadataPattern *patterns;
483
484 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
485 &IID_IWICImagingFactory, (void**)&factory);
486 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
487 if (FAILED(hr)) return;
488
489 hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICUnknownMetadataReader, &info);
490 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
491
492 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info);
493 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
494
495 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL);
496 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
497
498 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid);
499 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
500 ok(IsEqualGUID(&CLSID_WICUnknownMetadataReader, &clsid), "GetCLSID returned wrong result\n");
501
502 hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid);
503 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
504 ok(IsEqualGUID(&GUID_MetadataFormatUnknown, &clsid), "GetMetadataFormat returned wrong result\n");
505
506 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL);
507 ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr);
508
509 count = 0xdeadbeef;
510 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count);
511 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
512 ok(count == 0, "unexpected count %d\n", count);
513
514 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
515 0, NULL, NULL, NULL);
516 ok(hr == E_INVALIDARG, "GetPatterns failed, hr=%x\n", hr);
517
518 count = size = 0xdeadbeef;
519 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
520 0, NULL, &count, &size);
521 ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */,
522 "GetPatterns failed, hr=%x\n", hr);
523 ok(count == 0xdeadbeef, "unexpected count %d\n", count);
524 ok(size == 0xdeadbeef, "unexpected size %d\n", size);
525
526 IWICMetadataReaderInfo_Release(reader_info);
527
528 IWICComponentInfo_Release(info);
529
530 hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICXMPStructMetadataReader, &info);
531 todo_wine
532 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
533
534 if (FAILED(hr))
535 {
536 IWICImagingFactory_Release(factory);
537 return;
538 }
539
540 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info);
541 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
542
543 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL);
544 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr);
545
546 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid);
547 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr);
548 ok(IsEqualGUID(&CLSID_WICXMPStructMetadataReader, &clsid), "GetCLSID returned wrong result\n");
549
550 hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid);
551 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
552 ok(IsEqualGUID(&GUID_MetadataFormatXMPStruct, &clsid), "GetMetadataFormat returned wrong result\n");
553
554 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL);
555 ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr);
556
557 count = 0xdeadbeef;
558 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count);
559 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
560 ok(count >= 2, "unexpected count %d\n", count);
561
562 count = 0xdeadbeef;
563 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 1, container_formats, &count);
564 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
565 ok(count == 1, "unexpected count %d\n", count);
566
567 count = 0xdeadbeef;
568 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 10, container_formats, &count);
569 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr);
570 ok(count == min(count, 10), "unexpected count %d\n", count);
571
572 count = size = 0xdeadbeef;
573 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng,
574 0, NULL, &count, &size);
575 ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */,
576 "GetPatterns failed, hr=%x\n", hr);
577 ok(count == 0xdeadbeef, "unexpected count %d\n", count);
578 ok(size == 0xdeadbeef, "unexpected size %d\n", size);
579
580 count = size = 0xdeadbeef;
581 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
582 0, NULL, &count, &size);
583 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
584 ok(count == 1, "unexpected count %d\n", count);
585 ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size);
586
587 if (hr == S_OK)
588 {
589 patterns = HeapAlloc(GetProcessHeap(), 0, size);
590
591 count = size = 0xdeadbeef;
592 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
593 size-1, patterns, &count, &size);
594 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
595 ok(count == 1, "unexpected count %d\n", count);
596 ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size);
597
598 count = size = 0xdeadbeef;
599 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP,
600 size, patterns, &count, &size);
601 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr);
602 ok(count == 1, "unexpected count %d\n", count);
603 ok(size == sizeof(WICMetadataPattern) + patterns->Length * 2, "unexpected size %d\n", size);
604
605 HeapFree(GetProcessHeap(), 0, patterns);
606 }
607
608 IWICMetadataReaderInfo_Release(reader_info);
609
610 IWICComponentInfo_Release(info);
611
612 IWICImagingFactory_Release(factory);
613 }
614
615 START_TEST(info)
616 {
617 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
618
619 test_decoder_info();
620 test_reader_info();
621 test_pixelformat_info();
622
623 CoUninitialize();
624 }