Module: wine Branch: master Commit: fd31112ab0a0528fd9be99e0afd49dd98f523d2f URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd31112ab0a0528fd9be99e0af...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Mon May 28 18:41:27 2012 +0900
windowscodecs: Add support for preferred vendor guid in CreateDecoderFromStream.
---
dlls/windowscodecs/imgfactory.c | 43 +++++++++++++++++++++++++++++---------- 1 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index a2e8e7f..c9b2716 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;