static void test_decoder_info(void) { IWICComponentInfo *info; IWICBitmapDecoderInfo *decoder_info; HRESULT hr; ULONG len; WCHAR value[256]; const WCHAR expected_mimetype[] = {'i','m','a','g','e','/','b','m','p',0}; const WCHAR expected_extensions[] = {'.','b','m','p',',','.','d','i','b',',','.','r','l','e',0}; CLSID clsid; GUID pixelformats[20]; UINT num_formats, count; int i; hr = get_component_info(&CLSID_WICBmpDecoder, &info); ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr); hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void**)&decoder_info); ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, NULL); ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetCLSID(decoder_info, &clsid); ok(hr == S_OK, "GetCLSID failed, hr=%x\n", hr); ok(IsEqualGUID(&CLSID_WICBmpDecoder, &clsid), "GetCLSID returned wrong result\n"); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, NULL); ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, NULL, &len); ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, NULL); ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 0, NULL, &len); ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); value[0] = 0; hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, len, value, &len); ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 1, value, &len); ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetMimeType failed, hr=%x\n", hr); ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetMimeTypes(decoder_info, 256, value, &len); ok(hr == S_OK, "GetMimeType failed, hr=%x\n", hr); ok(lstrcmpW(value, expected_mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); ok(len == lstrlenW(expected_mimetype)+1, "GetMimeType returned wrong len %i\n", len); num_formats = 0xdeadbeef; hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, &num_formats); ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); ok(num_formats < 20 && num_formats > 1, "got %d formats\n", num_formats); hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, NULL, NULL); ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr); count = 0xdeadbeef; hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 0, pixelformats, &count); ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); ok(count == 0, "got %d formats\n", count); count = 0xdeadbeef; hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 1, pixelformats, &count); ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); ok(count == 1, "got %d formats\n", count); ok(is_pixelformat(&pixelformats[0]), "got invalid pixel format\n"); count = 0xdeadbeef; hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, &count); ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); for (i=0; i<num_formats; i++) ok(is_pixelformat(&pixelformats[i]), "got invalid pixel format\n"); hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, num_formats, pixelformats, NULL); ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr); count = 0xdeadbeef; hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info, 20, pixelformats, &count); ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr); ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, NULL); ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, NULL, &len); ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, NULL); ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%x\n", hr); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 0, NULL, &len); ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); value[0] = 0; hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, len, value, &len); ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 1, value, &len); ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetFileExtensions failed, hr=%x\n", hr); ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); hr = IWICBitmapDecoderInfo_GetFileExtensions(decoder_info, 256, value, &len); ok(hr == S_OK, "GetFileExtensions failed, hr=%x\n", hr); ok(lstrcmpW(value, expected_extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); ok(len == lstrlenW(expected_extensions)+1, "GetFileExtensions returned wrong len %i\n", len); IWICBitmapDecoderInfo_Release(decoder_info); IWICComponentInfo_Release(info); }
static HRESULT WINAPI ComponentFactory_CreateDecoder(IWICComponentFactory *iface, REFGUID guidContainerFormat, const GUID *pguidVendor, IWICBitmapDecoder **ppIDecoder) { IEnumUnknown *enumdecoders; IUnknown *unkdecoderinfo; IWICBitmapDecoderInfo *decoderinfo; IWICBitmapDecoder *decoder = NULL, *preferred_decoder = NULL; GUID vendor; HRESULT res; ULONG num_fetched; TRACE("(%p,%s,%s,%p)\n", iface, debugstr_guid(guidContainerFormat), debugstr_guid(pguidVendor), ppIDecoder); if (!guidContainerFormat || !ppIDecoder) return E_INVALIDARG; res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders); if (FAILED(res)) return res; while (!preferred_decoder) { res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched); if (res != S_OK) break; res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void **)&decoderinfo); if (SUCCEEDED(res)) { GUID container_guid; res = IWICBitmapDecoderInfo_GetContainerFormat(decoderinfo, &container_guid); if (SUCCEEDED(res) && IsEqualIID(&container_guid, guidContainerFormat)) { IWICBitmapDecoder *new_decoder; res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &new_decoder); if (SUCCEEDED(res)) { if (pguidVendor) { res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor); if (SUCCEEDED(res) && IsEqualIID(&vendor, pguidVendor)) { preferred_decoder = new_decoder; new_decoder = NULL; } } if (new_decoder && !decoder) { decoder = new_decoder; new_decoder = NULL; } if (new_decoder) IWICBitmapDecoder_Release(new_decoder); } } IWICBitmapDecoderInfo_Release(decoderinfo); } IUnknown_Release(unkdecoderinfo); } IEnumUnknown_Release(enumdecoders); if (preferred_decoder) { *ppIDecoder = preferred_decoder; if (decoder) IWICBitmapDecoder_Release(decoder); return S_OK; } if (decoder) { *ppIDecoder = decoder; return S_OK; } *ppIDecoder = NULL; return WINCODEC_ERR_COMPONENTNOTFOUND; }
static void test_componentinfo(void) { IWICImagingFactory *factory; IWICComponentInfo *info; IWICBitmapDecoderInfo *decoderinfo; IWICBitmapDecoder *decoder; HRESULT hr; WICBitmapPattern *patterns; UINT pattern_count, pattern_size; WICComponentType type; GUID guidresult; HGLOBAL hbmpdata; char *bmpdata; IStream *bmpstream; BOOL boolresult; hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, &IID_IWICImagingFactory, (void**)&factory); ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr); if (SUCCEEDED(hr)) { hr = IWICImagingFactory_CreateComponentInfo(factory, &CLSID_WICBmpDecoder, &info); ok(SUCCEEDED(hr), "CreateComponentInfo failed, hr=%x\n", hr); if (SUCCEEDED(hr)) { hr = IWICComponentInfo_GetComponentType(info, &type); ok(SUCCEEDED(hr), "GetComponentType failed, hr=%x\n", hr); ok(type == WICDecoder, "got %i, expected WICDecoder\n", type); hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo); ok(SUCCEEDED(hr), "QueryInterface failed, hr=%x\n", hr); if (SUCCEEDED(hr)) { pattern_count = 0; pattern_size = 0; hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, 0, NULL, &pattern_count, &pattern_size); ok(SUCCEEDED(hr), "GetPatterns failed, hr=%x\n", hr); ok(pattern_count != 0, "pattern count is 0\n"); ok(pattern_size > pattern_count * sizeof(WICBitmapPattern), "size=%i, count=%i\n", pattern_size, pattern_count); patterns = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pattern_size); hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, pattern_size, patterns, &pattern_count, &pattern_size); ok(SUCCEEDED(hr), "GetPatterns failed, hr=%x\n", hr); ok(pattern_count != 0, "pattern count is 0\n"); ok(pattern_size > pattern_count * sizeof(WICBitmapPattern), "size=%i, count=%i\n", pattern_size, pattern_count); ok(patterns[0].Length != 0, "pattern length is 0\n"); ok(patterns[0].Pattern != NULL, "pattern is NULL\n"); ok(patterns[0].Mask != NULL, "mask is NULL\n"); pattern_size -= 1; hr = IWICBitmapDecoderInfo_GetPatterns(decoderinfo, pattern_size, patterns, &pattern_count, &pattern_size); ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetPatterns returned %x, expected WINCODEC_ERR_INSUFFICIENTBUFFER\n", hr); HeapFree(GetProcessHeap(), 0, patterns); hr = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder); ok(SUCCEEDED(hr), "CreateInstance failed, hr=%x\n", hr); if (SUCCEEDED(hr)) { hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult); ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr); ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n"); IWICBitmapDecoder_Release(decoder); } hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_rle4)); ok(hbmpdata != 0, "GlobalAlloc failed\n"); if (hbmpdata) { bmpdata = GlobalLock(hbmpdata); memcpy(bmpdata, testbmp_rle4, sizeof(testbmp_rle4)); GlobalUnlock(hbmpdata); hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream); ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr); if (SUCCEEDED(hr)) { boolresult = 0; hr = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, bmpstream, &boolresult); ok(SUCCEEDED(hr), "MatchesPattern failed, hr=%x\n", hr); ok(boolresult, "pattern not matched\n"); IStream_Release(bmpstream); } GlobalFree(hbmpdata); } IWICBitmapDecoderInfo_Release(decoderinfo); } IWICComponentInfo_Release(info); } IWICImagingFactory_Release(factory); } }
static IWICBitmapDecoder *find_decoder(IStream *pIStream, const GUID *pguidVendor, WICDecodeOptions metadataOptions) { IEnumUnknown *enumdecoders; IUnknown *unkdecoderinfo; IWICBitmapDecoderInfo *decoderinfo; IWICBitmapDecoder *decoder = NULL; GUID vendor; HRESULT res; ULONG num_fetched; BOOL matches; res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders); if (FAILED(res)) return NULL; while (!decoder) { res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched); if (res == S_OK) { res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo); if (SUCCEEDED(res)) { if (pguidVendor) { res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor); if (FAILED(res) || !IsEqualIID(&vendor, pguidVendor)) { IWICBitmapDecoderInfo_Release(decoderinfo); IUnknown_Release(unkdecoderinfo); continue; } } res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches); if (SUCCEEDED(res) && matches) { res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder); /* FIXME: should use QueryCapability to choose a decoder */ if (SUCCEEDED(res)) { res = IWICBitmapDecoder_Initialize(decoder, pIStream, metadataOptions); if (FAILED(res)) { IWICBitmapDecoder_Release(decoder); decoder = NULL; } } } IWICBitmapDecoderInfo_Release(decoderinfo); } IUnknown_Release(unkdecoderinfo); } else break; } IEnumUnknown_Release(enumdecoders); return decoder; }
static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream( IWICImagingFactory *iface, IStream *pIStream, const GUID *pguidVendor, WICDecodeOptions metadataOptions, IWICBitmapDecoder **ppIDecoder) { static int fixme=0; IEnumUnknown *enumdecoders; IUnknown *unkdecoderinfo; IWICBitmapDecoderInfo *decoderinfo; IWICBitmapDecoder *decoder=NULL; HRESULT res=S_OK; ULONG num_fetched; BOOL matches; TRACE("(%p,%p,%s,%u,%p)\n", iface, pIStream, debugstr_guid(pguidVendor), metadataOptions, ppIDecoder); if (pguidVendor && !fixme++) FIXME("ignoring vendor GUID\n"); res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders); if (FAILED(res)) return res; while (!decoder) { res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched); if (res == S_OK) { res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo); if (SUCCEEDED(res)) { res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches); if (SUCCEEDED(res) && matches) { res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder); /* FIXME: should use QueryCapability to choose a decoder */ if (SUCCEEDED(res)) { res = IWICBitmapDecoder_Initialize(decoder, pIStream, metadataOptions); if (FAILED(res)) { IWICBitmapDecoder_Release(decoder); decoder = NULL; } } } IWICBitmapDecoderInfo_Release(decoderinfo); } IUnknown_Release(unkdecoderinfo); } else break; } IEnumUnknown_Release(enumdecoders); if (decoder) { *ppIDecoder = decoder; return S_OK; } else { if (WARN_ON(wincodecs)) { LARGE_INTEGER seek; BYTE data[4]; ULONG bytesread; WARN("failed to load from a stream\n"); seek.QuadPart = 0; res = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); if (SUCCEEDED(res)) res = IStream_Read(pIStream, data, 4, &bytesread); if (SUCCEEDED(res)) WARN("first %i bytes of stream=%x %x %x %x\n", bytesread, data[0], data[1], data[2], data[3]); } *ppIDecoder = NULL; return WINCODEC_ERR_COMPONENTNOTFOUND; } }