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 "precomp.h" 20 21 #include <initguid.h> 22 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); 23 24 static HRESULT get_component_info(const GUID *clsid, IWICComponentInfo **result) 25 { 26 IWICImagingFactory *factory; 27 HRESULT hr; 28 29 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, 30 &IID_IWICImagingFactory, (void**)&factory); 31 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr); 32 if (FAILED(hr)) return hr; 33 34 hr = IWICImagingFactory_CreateComponentInfo(factory, clsid, result); 35 36 IWICImagingFactory_Release(factory); 37 38 return hr; 39 } 40 41 static BOOL is_pixelformat(GUID *format) 42 { 43 IWICComponentInfo *info; 44 HRESULT hr; 45 WICComponentType componenttype; 46 47 hr = get_component_info(format, &info); 48 if (FAILED(hr)) 49 return FALSE; 50 51 hr = IWICComponentInfo_GetComponentType(info, &componenttype); 52 53 IWICComponentInfo_Release(info); 54 55 return SUCCEEDED(hr) && componenttype == WICPixelFormat; 56 } 57 58 static void test_decoder_info(void) 59 { 60 IWICComponentInfo *info; 61 IWICBitmapDecoderInfo *decoder_info; 62 HRESULT hr; 63 ULONG len; 64 WCHAR value[256]; 65 const WCHAR expected_mimetype[] = {'i','m','a','g','e','/','b','m','p',0}; 66 const WCHAR expected_extensions[] = {'.','b','m','p',',','.','d','i','b',',','.','r','l','e',0}; 67 CLSID clsid; 68 GUID pixelformats[20]; 69 UINT num_formats, count; 70 int i; 71 72 hr = get_component_info(&CLSID_WICBmpDecoder, &info); 73 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr); 74 75 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void**)&decoder_info); 76 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); 77 78 hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, NULL); 79 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr); 80 81 hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, &clsid); 82 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr); 83 ok(IsEqualGUID(&CLSID_WICBmpDecoder, &clsid), "GetCLSID returned wrong result\n"); 84 85 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, NULL); 86 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); 87 88 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, NULL, &len); 89 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); 90 ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); 91 92 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, NULL); 93 ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); 94 95 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, &len); 96 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); 97 ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); 98 99 value[0] = 0; 100 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, &len); 101 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); 102 ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); 103 ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); 104 105 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, value, &len); 106 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetMimeType failed, hr=%x\n", hr); 107 ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); 108 109 hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 256, value, &len); 110 ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); 111 ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); 112 ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); 113 114 num_formats = 0xdeadbeef; 115 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, &num_formats); 116 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); 117 ok(num_formats < 20 && num_formats > 1, "got %d formats\n", num_formats); 118 119 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, NULL); 120 ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr); 121 122 count = 0xdeadbeef; 123 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, pixelformats, &count); 124 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); 125 ok(count == 0, "got %d formats\n", count); 126 127 count = 0xdeadbeef; 128 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 1, pixelformats, &count); 129 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); 130 ok(count == 1, "got %d formats\n", count); 131 ok(is_pixelformat(&pixelformats[0]), "got invalid pixel format\n"); 132 133 count = 0xdeadbeef; 134 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, &count); 135 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); 136 ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); 137 for (i=0; i<num_formats; i++) 138 ok(is_pixelformat(&pixelformats[i]), "got invalid pixel format\n"); 139 140 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, NULL); 141 ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr); 142 143 count = 0xdeadbeef; 144 hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 20, pixelformats, &count); 145 ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); 146 ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); 147 148 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, NULL); 149 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); 150 151 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, NULL, &len); 152 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); 153 ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); 154 155 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, NULL); 156 ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); 157 158 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, &len); 159 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); 160 ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); 161 162 value[0] = 0; 163 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, &len); 164 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); 165 ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); 166 ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); 167 168 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, value, &len); 169 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetFileExtensions failed, hr=%x\n", hr); 170 ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); 171 172 hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 256, value, &len); 173 ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); 174 ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); 175 ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); 176 177 IWICBitmapDecoderInfo_Release(decoder_info); 178 179 IWICComponentInfo_Release(info); 180 } 181 182 static void test_pixelformat_info(void) 183 { 184 IWICComponentInfo *info; 185 IWICPixelFormatInfo *pixelformat_info; 186 IWICPixelFormatInfo2 *pixelformat_info2; 187 HRESULT hr; 188 ULONG len, known_len; 189 WCHAR value[256]; 190 GUID guid; 191 WICComponentType componenttype; 192 WICPixelFormatNumericRepresentation numericrepresentation; 193 DWORD signing; 194 UINT uiresult; 195 BYTE abbuffer[256]; 196 BOOL supportstransparency; 197 198 hr = get_component_info(&GUID_WICPixelFormat32bppBGRA, &info); 199 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr); 200 201 if (FAILED(hr)) 202 return; 203 204 hr = IWICComponentInfo_GetAuthor(info, 0, NULL, 0); 205 ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr); 206 207 len = 0xdeadbeef; 208 hr = IWICComponentInfo_GetAuthor(info, 0, NULL, &len); 209 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr); 210 ok(len < 255 && len > 0, "invalid length 0x%x\n", len); 211 known_len = len; 212 213 memset(value, 0xaa, 256 * sizeof(WCHAR)); 214 hr = IWICComponentInfo_GetAuthor(info, len-1, value, NULL); 215 ok(hr == E_INVALIDARG, "GetAuthor failed, hr=%x\n", hr); 216 ok(value[0] == 0xaaaa, "string modified\n"); 217 218 len = 0xdeadbeef; 219 memset(value, 0xaa, 256 * sizeof(WCHAR)); 220 hr = IWICComponentInfo_GetAuthor(info, known_len-1, value, &len); 221 ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetAuthor failed, hr=%x\n", hr); 222 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len); 223 ok(value[known_len-1] == 0xaaaa, "string modified past given length\n"); 224 ok(value[0] == 0xaaaa, "string modified\n"); 225 226 len = 0xdeadbeef; 227 memset(value, 0xaa, 256 * sizeof(WCHAR)); 228 hr = IWICComponentInfo_GetAuthor(info, known_len, value, &len); 229 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr); 230 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len); 231 ok(value[known_len-1] == 0, "string not terminated at expected length\n"); 232 ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n"); 233 234 len = 0xdeadbeef; 235 memset(value, 0xaa, 256 * sizeof(WCHAR)); 236 hr = IWICComponentInfo_GetAuthor(info, known_len+1, value, &len); 237 ok(hr == S_OK, "GetAuthor failed, hr=%x\n", hr); 238 ok(len == known_len, "got length of 0x%x, expected 0x%x\n", len, known_len); 239 ok(value[known_len] == 0xaaaa, "string modified past end\n"); 240 ok(value[known_len-1] == 0, "string not terminated at expected length\n"); 241 ok(value[known_len-2] != 0xaaaa, "string not modified at given length\n"); 242 243 hr = IWICComponentInfo_GetCLSID(info, NULL); 244 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr); 245 246 memset(&guid, 0xaa, sizeof(guid)); 247 hr = IWICComponentInfo_GetCLSID(info, &guid); 248 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr); 249 ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected CLSID %s\n", wine_dbgstr_guid(&guid)); 250 251 hr = IWICComponentInfo_GetComponentType(info, NULL); 252 ok(hr == E_INVALIDARG, "GetComponentType failed, hr=%x\n", hr); 253 254 hr = IWICComponentInfo_GetComponentType(info, &componenttype); 255 ok(hr == S_OK, "GetComponentType failed, hr=%x\n", hr); 256 ok(componenttype == WICPixelFormat, "unexpected component type 0x%x\n", componenttype); 257 258 len = 0xdeadbeef; 259 hr = IWICComponentInfo_GetFriendlyName(info, 0, NULL, &len); 260 ok(hr == S_OK, "GetFriendlyName failed, hr=%x\n", hr); 261 ok(len < 255 && len > 0, "invalid length 0x%x\n", len); 262 263 hr = IWICComponentInfo_GetSigningStatus(info, NULL); 264 ok(hr == E_INVALIDARG, "GetSigningStatus failed, hr=%x\n", hr); 265 266 hr = IWICComponentInfo_GetSigningStatus(info, &signing); 267 ok(hr == S_OK, "GetSigningStatus failed, hr=%x\n", hr); 268 ok(signing == WICComponentSigned, "unexpected signing status 0x%x\n", signing); 269 270 len = 0xdeadbeef; 271 hr = IWICComponentInfo_GetSpecVersion(info, 0, NULL, &len); 272 ok(hr == S_OK, "GetSpecVersion failed, hr=%x\n", hr); 273 ok(len == 0, "invalid length 0x%x\n", len); /* spec version does not apply to pixel formats */ 274 275 memset(&guid, 0xaa, sizeof(guid)); 276 hr = IWICComponentInfo_GetVendorGUID(info, &guid); 277 ok(hr == S_OK, "GetVendorGUID failed, hr=%x\n", hr); 278 ok(IsEqualGUID(&guid, &GUID_VendorMicrosoft) || 279 broken(IsEqualGUID(&guid, &GUID_NULL)) /* XP */, "unexpected GUID %s\n", wine_dbgstr_guid(&guid)); 280 281 len = 0xdeadbeef; 282 hr = IWICComponentInfo_GetVersion(info, 0, NULL, &len); 283 ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr); 284 ok(len == 0, "invalid length 0x%x\n", len); /* version does not apply to pixel formats */ 285 286 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo, (void**)&pixelformat_info); 287 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); 288 289 if (SUCCEEDED(hr)) 290 { 291 hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, NULL); 292 ok(hr == E_INVALIDARG, "GetBitsPerPixel failed, hr=%x\n", hr); 293 294 hr = IWICPixelFormatInfo_GetBitsPerPixel(pixelformat_info, &uiresult); 295 ok(hr == S_OK, "GetBitsPerPixel failed, hr=%x\n", hr); 296 ok(uiresult == 32, "unexpected bpp %i\n", uiresult); 297 298 hr = IWICPixelFormatInfo_GetChannelCount(pixelformat_info, &uiresult); 299 ok(hr == S_OK, "GetChannelCount failed, hr=%x\n", hr); 300 ok(uiresult == 4, "unexpected channel count %i\n", uiresult); 301 302 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, NULL); 303 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr); 304 305 uiresult = 0xdeadbeef; 306 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 0, NULL, &uiresult); 307 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr); 308 ok(uiresult == 4, "unexpected length %i\n", uiresult); 309 310 memset(abbuffer, 0xaa, sizeof(abbuffer)); 311 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, known_len, abbuffer, NULL); 312 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr); 313 ok(abbuffer[0] == 0xaa, "buffer modified\n"); 314 315 uiresult = 0xdeadbeef; 316 memset(abbuffer, 0xaa, sizeof(abbuffer)); 317 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 3, abbuffer, &uiresult); 318 ok(hr == E_INVALIDARG, "GetChannelMask failed, hr=%x\n", hr); 319 ok(abbuffer[0] == 0xaa, "buffer modified\n"); 320 ok(uiresult == 4, "unexpected length %i\n", uiresult); 321 322 memset(abbuffer, 0xaa, sizeof(abbuffer)); 323 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 4, abbuffer, &uiresult); 324 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr); 325 ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer)); 326 ok(uiresult == 4, "unexpected length %i\n", uiresult); 327 328 memset(abbuffer, 0xaa, sizeof(abbuffer)); 329 hr = IWICPixelFormatInfo_GetChannelMask(pixelformat_info, 0, 5, abbuffer, &uiresult); 330 ok(hr == S_OK, "GetChannelMask failed, hr=%x\n", hr); 331 ok(*((ULONG*)abbuffer) == 0xff, "unexpected mask 0x%x\n", *((ULONG*)abbuffer)); 332 ok(abbuffer[4] == 0xaa, "buffer modified past actual length\n"); 333 ok(uiresult == 4, "unexpected length %i\n", uiresult); 334 335 memset(&guid, 0xaa, sizeof(guid)); 336 hr = IWICPixelFormatInfo_GetFormatGUID(pixelformat_info, &guid); 337 ok(hr == S_OK, "GetFormatGUID failed, hr=%x\n", hr); 338 ok(IsEqualGUID(&guid, &GUID_WICPixelFormat32bppBGRA), "unexpected GUID %s\n", wine_dbgstr_guid(&guid)); 339 340 IWICPixelFormatInfo_Release(pixelformat_info); 341 } 342 343 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo2, (void**)&pixelformat_info2); 344 345 if (FAILED(hr)) 346 win_skip("IWICPixelFormatInfo2 not supported\n"); 347 else 348 { 349 hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, NULL); 350 ok(hr == E_INVALIDARG, "GetNumericRepresentation failed, hr=%x\n", hr); 351 352 numericrepresentation = 0xdeadbeef; 353 hr = IWICPixelFormatInfo2_GetNumericRepresentation(pixelformat_info2, &numericrepresentation); 354 ok(hr == S_OK, "GetNumericRepresentation failed, hr=%x\n", hr); 355 ok(numericrepresentation == WICPixelFormatNumericRepresentationUnsignedInteger, "unexpected numeric representation %i\n", numericrepresentation); 356 357 hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, NULL); 358 ok(hr == E_INVALIDARG, "SupportsTransparency failed, hr=%x\n", hr); 359 360 supportstransparency = 0xdeadbeef; 361 hr = IWICPixelFormatInfo2_SupportsTransparency(pixelformat_info2, &supportstransparency); 362 ok(hr == S_OK, "SupportsTransparency failed, hr=%x\n", hr); 363 ok(supportstransparency == 1, "unexpected value %i\n", supportstransparency); 364 365 IWICPixelFormatInfo2_Release(pixelformat_info2); 366 } 367 368 IWICComponentInfo_Release(info); 369 } 370 371 static void test_reader_info(void) 372 { 373 IWICImagingFactory *factory; 374 IWICComponentInfo *info; 375 IWICMetadataReaderInfo *reader_info; 376 HRESULT hr; 377 CLSID clsid; 378 GUID container_formats[10]; 379 UINT count, size; 380 WICMetadataPattern *patterns; 381 382 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, 383 &IID_IWICImagingFactory, (void**)&factory); 384 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr); 385 if (FAILED(hr)) return; 386 387 hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICUnknownMetadataReader, &info); 388 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr); 389 390 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info); 391 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); 392 393 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL); 394 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr); 395 396 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid); 397 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr); 398 ok(IsEqualGUID(&CLSID_WICUnknownMetadataReader, &clsid), "GetCLSID returned wrong result\n"); 399 400 hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid); 401 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr); 402 ok(IsEqualGUID(&GUID_MetadataFormatUnknown, &clsid), "GetMetadataFormat returned wrong result\n"); 403 404 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL); 405 ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr); 406 407 count = 0xdeadbeef; 408 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count); 409 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr); 410 ok(count == 0, "unexpected count %d\n", count); 411 412 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng, 413 0, NULL, NULL, NULL); 414 ok(hr == E_INVALIDARG, "GetPatterns failed, hr=%x\n", hr); 415 416 count = size = 0xdeadbeef; 417 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng, 418 0, NULL, &count, &size); 419 ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */, 420 "GetPatterns failed, hr=%x\n", hr); 421 ok(count == 0xdeadbeef, "unexpected count %d\n", count); 422 ok(size == 0xdeadbeef, "unexpected size %d\n", size); 423 424 IWICMetadataReaderInfo_Release(reader_info); 425 426 IWICComponentInfo_Release(info); 427 428 hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICXMPStructMetadataReader, &info); 429 todo_wine 430 ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr); 431 432 if (FAILED(hr)) 433 { 434 IWICImagingFactory_Release(factory); 435 return; 436 } 437 438 hr = IWICComponentInfo_QueryInterface(info, &IID_IWICMetadataReaderInfo, (void**)&reader_info); 439 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); 440 441 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, NULL); 442 ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr); 443 444 hr = IWICMetadataReaderInfo_GetCLSID(reader_info, &clsid); 445 ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr); 446 ok(IsEqualGUID(&CLSID_WICXMPStructMetadataReader, &clsid), "GetCLSID returned wrong result\n"); 447 448 hr = IWICMetadataReaderInfo_GetMetadataFormat(reader_info, &clsid); 449 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr); 450 ok(IsEqualGUID(&GUID_MetadataFormatXMPStruct, &clsid), "GetMetadataFormat returned wrong result\n"); 451 452 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, NULL); 453 ok(hr == E_INVALIDARG, "GetContainerFormats failed, hr=%x\n", hr); 454 455 count = 0xdeadbeef; 456 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 0, NULL, &count); 457 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr); 458 ok(count >= 2, "unexpected count %d\n", count); 459 460 count = 0xdeadbeef; 461 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 1, container_formats, &count); 462 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr); 463 ok(count == 1, "unexpected count %d\n", count); 464 465 count = 0xdeadbeef; 466 hr = IWICMetadataReaderInfo_GetContainerFormats(reader_info, 10, container_formats, &count); 467 ok(hr == S_OK, "GetContainerFormats failed, hr=%x\n", hr); 468 ok(count == min(count, 10), "unexpected count %d\n", count); 469 470 count = size = 0xdeadbeef; 471 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_ContainerFormatPng, 472 0, NULL, &count, &size); 473 ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND || broken(hr == S_OK) /* Windows XP */, 474 "GetPatterns failed, hr=%x\n", hr); 475 ok(count == 0xdeadbeef, "unexpected count %d\n", count); 476 ok(size == 0xdeadbeef, "unexpected size %d\n", size); 477 478 count = size = 0xdeadbeef; 479 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP, 480 0, NULL, &count, &size); 481 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr); 482 ok(count == 1, "unexpected count %d\n", count); 483 ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size); 484 485 if (hr == S_OK) 486 { 487 patterns = HeapAlloc(GetProcessHeap(), 0, size); 488 489 count = size = 0xdeadbeef; 490 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP, 491 size-1, patterns, &count, &size); 492 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr); 493 ok(count == 1, "unexpected count %d\n", count); 494 ok(size > sizeof(WICMetadataPattern), "unexpected size %d\n", size); 495 496 count = size = 0xdeadbeef; 497 hr = IWICMetadataReaderInfo_GetPatterns(reader_info, &GUID_MetadataFormatXMP, 498 size, patterns, &count, &size); 499 ok(hr == S_OK, "GetPatterns failed, hr=%x\n", hr); 500 ok(count == 1, "unexpected count %d\n", count); 501 ok(size == sizeof(WICMetadataPattern) + patterns->Length * 2, "unexpected size %d\n", size); 502 503 HeapFree(GetProcessHeap(), 0, patterns); 504 } 505 506 IWICMetadataReaderInfo_Release(reader_info); 507 508 IWICComponentInfo_Release(info); 509 510 IWICImagingFactory_Release(factory); 511 } 512 513 START_TEST(info) 514 { 515 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 516 517 test_decoder_info(); 518 test_reader_info(); 519 test_pixelformat_info(); 520 521 CoUninitialize(); 522 } 523