[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