From fd31112ab0a0528fd9be99e0afd49dd98f523d2f Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 28 May 2012 18:41:27 +0900 Subject: [PATCH] windowscodecs: Add support for preferred vendor guid in CreateDecoderFromStream. --- dlls/windowscodecs/imgfactory.c | 43 ++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index a2e8e7f7f1d..c9b27164ee2 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -122,11 +122,11 @@ 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; + IWICBitmapDecoder *decoder = NULL, *preferred_decoder = NULL; + GUID vendor; HRESULT res=S_OK; ULONG num_fetched; BOOL matches; @@ -134,13 +134,10 @@ static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream( 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) + while (!preferred_decoder) { res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched); @@ -154,19 +151,36 @@ static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream( if (SUCCEEDED(res) && matches) { - res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder); + IWICBitmapDecoder *new_decoder; + + res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &new_decoder); /* FIXME: should use QueryCapability to choose a decoder */ if (SUCCEEDED(res)) { - res = IWICBitmapDecoder_Initialize(decoder, pIStream, metadataOptions); + res = IWICBitmapDecoder_Initialize(new_decoder, pIStream, metadataOptions); - if (FAILED(res)) + if (SUCCEEDED(res)) { - IWICBitmapDecoder_Release(decoder); - decoder = NULL; + 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); } } @@ -181,6 +195,13 @@ static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream( IEnumUnknown_Release(enumdecoders); + if (preferred_decoder) + { + *ppIDecoder = preferred_decoder; + if (decoder) IWICBitmapDecoder_Release(decoder); + return S_OK; + } + if (decoder) { *ppIDecoder = decoder;