[2/3] windowscodecs: Add support for preferred vendor guid in CreateDecoderFromStream. Resend.
Dmitry Timoshkov
dmitry at baikal.ru
Mon May 28 04:41:27 CDT 2012
---
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 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;
--
1.7.10.1
More information about the wine-patches
mailing list