Piotr Caban : windowscodecs: Make it possible to use MetadataReaders when COM was not initialized.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 5 09:53:24 CST 2015


Module: wine
Branch: master
Commit: f623042fb951ee662ac6b081b7585b889c9a555b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f623042fb951ee662ac6b081b7585b889c9a555b

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Mar  5 12:13:00 2015 +0100

windowscodecs: Make it possible to use MetadataReaders when COM was not initialized.

---

 dlls/windowscodecs/clsfactory.c        |  2 +-
 dlls/windowscodecs/gifformat.c         | 31 +++++++++++++++----------------
 dlls/windowscodecs/tiffformat.c        |  3 +--
 dlls/windowscodecs/wincodecs_private.h |  1 +
 4 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c
index 71f1ce6..614a5d1 100644
--- a/dlls/windowscodecs/clsfactory.c
+++ b/dlls/windowscodecs/clsfactory.c
@@ -41,7 +41,7 @@ extern HRESULT WINAPI WIC_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC
 
 typedef struct {
     REFCLSID classid;
-    HRESULT (*constructor)(REFIID,void**);
+    class_constructor constructor;
 } classinfo;
 
 static const classinfo wic_classes[] = {
diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index 861920b..7fccb5e 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -545,7 +545,8 @@ static IStream *create_stream(const void *data, int data_size)
 }
 
 static HRESULT create_metadata_reader(const void *data, int data_size,
-                                      const CLSID *clsid, IWICMetadataReader **reader)
+                                      class_constructor constructor,
+                                      IWICMetadataReader **reader)
 {
     HRESULT hr;
     IWICMetadataReader *metadata_reader;
@@ -554,8 +555,7 @@ static HRESULT create_metadata_reader(const void *data, int data_size,
 
     /* FIXME: Use IWICComponentFactory_CreateMetadataReader once it's implemented */
 
-    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
-                          &IID_IWICMetadataReader, (void **)&metadata_reader);
+    hr = constructor(&IID_IWICMetadataReader, (void**)&metadata_reader);
     if (FAILED(hr)) return hr;
 
     hr = IWICMetadataReader_QueryInterface(metadata_reader, &IID_IWICPersistStream, (void **)&persist);
@@ -900,8 +900,7 @@ static HRESULT create_IMD_metadata_reader(GifFrameDecode *This, IWICMetadataRead
 
     /* FIXME: Use IWICComponentFactory_CreateMetadataReader once it's implemented */
 
-    hr = CoCreateInstance(&CLSID_WICIMDMetadataReader, NULL, CLSCTX_INPROC_SERVER,
-                          &IID_IWICMetadataReader, (void **)&metadata_reader);
+    hr = IMDReader_CreateInstance(&IID_IWICMetadataReader, (void **)&metadata_reader);
     if (FAILED(hr)) return hr;
 
     hr = IWICMetadataReader_QueryInterface(metadata_reader, &IID_IWICPersistStream, (void **)&persist);
@@ -957,7 +956,7 @@ static HRESULT WINAPI GifFrameDecode_Block_GetReaderByIndex(IWICMetadataBlockRea
 
     for (i = 0; i < This->frame->Extensions.ExtensionBlockCount; i++)
     {
-        const CLSID *clsid;
+        class_constructor constructor;
         const void *data;
         int data_size;
 
@@ -971,24 +970,24 @@ static HRESULT WINAPI GifFrameDecode_Block_GetReaderByIndex(IWICMetadataBlockRea
         }
         else if (This->frame->Extensions.ExtensionBlocks[i].Function == COMMENT_EXT_FUNC_CODE)
         {
-            clsid = &CLSID_WICGifCommentMetadataReader;
+            constructor = GifCommentReader_CreateInstance;
             data = This->frame->Extensions.ExtensionBlocks[i].Bytes;
             data_size = This->frame->Extensions.ExtensionBlocks[i].ByteCount;
         }
         else
         {
-            clsid = &CLSID_WICUnknownMetadataReader;
+            constructor = UnknownMetadataReader_CreateInstance;
             data = This->frame->Extensions.ExtensionBlocks[i].Bytes;
             data_size = This->frame->Extensions.ExtensionBlocks[i].ByteCount;
         }
-        return create_metadata_reader(data, data_size, clsid, reader);
+        return create_metadata_reader(data, data_size, constructor, reader);
     }
 
     if (gce_index == -1) return E_INVALIDARG;
 
     return create_metadata_reader(This->frame->Extensions.ExtensionBlocks[gce_index].Bytes + 3,
                                   This->frame->Extensions.ExtensionBlocks[gce_index].ByteCount - 4,
-                                  &CLSID_WICGCEMetadataReader, reader);
+                                  GCEReader_CreateInstance, reader);
 }
 
 static HRESULT WINAPI GifFrameDecode_Block_GetEnumerator(IWICMetadataBlockReader *iface,
@@ -1376,24 +1375,24 @@ static HRESULT WINAPI GifDecoder_Block_GetReaderByIndex(IWICMetadataBlockReader
 
     if (index == 0)
         return create_metadata_reader(This->LSD_data, sizeof(This->LSD_data),
-                                      &CLSID_WICLSDMetadataReader, reader);
+                                      LSDReader_CreateInstance, reader);
 
     for (i = 0; i < This->gif->Extensions.ExtensionBlockCount; i++)
     {
-        const CLSID *clsid;
+        class_constructor constructor;
 
         if (index != i + 1) continue;
 
         if (This->gif->Extensions.ExtensionBlocks[i].Function == APPLICATION_EXT_FUNC_CODE)
-            clsid = &CLSID_WICAPEMetadataReader;
+            constructor = APEReader_CreateInstance;
         else if (This->gif->Extensions.ExtensionBlocks[i].Function == COMMENT_EXT_FUNC_CODE)
-            clsid = &CLSID_WICGifCommentMetadataReader;
+            constructor = GifCommentReader_CreateInstance;
         else
-            clsid = &CLSID_WICUnknownMetadataReader;
+            constructor = UnknownMetadataReader_CreateInstance;
 
         return create_metadata_reader(This->gif->Extensions.ExtensionBlocks[i].Bytes,
                                       This->gif->Extensions.ExtensionBlocks[i].ByteCount,
-                                      clsid, reader);
+                                      constructor, reader);
     }
 
     return E_INVALIDARG;
diff --git a/dlls/windowscodecs/tiffformat.c b/dlls/windowscodecs/tiffformat.c
index 74a73bc..7f987de 100644
--- a/dlls/windowscodecs/tiffformat.c
+++ b/dlls/windowscodecs/tiffformat.c
@@ -1223,8 +1223,7 @@ static HRESULT create_metadata_reader(TiffFrameDecode *This, IWICMetadataReader
 
     /* FIXME: Use IWICComponentFactory_CreateMetadataReader once it's implemented */
 
-    hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER,
-                          &IID_IWICMetadataReader, (void **)&metadata_reader);
+    hr = IfdMetadataReader_CreateInstance(&IID_IWICMetadataReader, (void **)&metadata_reader);
     if (FAILED(hr)) return hr;
 
     hr = IWICMetadataReader_QueryInterface(metadata_reader, &IID_IWICPersistStream, (void **)&persist);
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h
index fbbc34f..f6ac785 100644
--- a/dlls/windowscodecs/wincodecs_private.h
+++ b/dlls/windowscodecs/wincodecs_private.h
@@ -67,6 +67,7 @@ DECLARE_INTERFACE_(IMILUnknown2,IUnknown)
 };
 #undef INTERFACE
 
+typedef HRESULT(*class_constructor)(REFIID,void**);
 extern HRESULT FormatConverter_CreateInstance(REFIID riid, void** ppv) DECLSPEC_HIDDEN;
 extern HRESULT ComponentFactory_CreateInstance(REFIID riid, void** ppv) DECLSPEC_HIDDEN;
 extern HRESULT BmpDecoder_CreateInstance(REFIID riid, void** ppv) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list