Dmitry Timoshkov : windowscodecs: Create global metadata readers from GIF decoder data.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 14:04:29 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Sep 18 13:00:33 2012 +0900

windowscodecs: Create global metadata readers from GIF decoder data.

---

 dlls/windowscodecs/gifformat.c      |   38 +++++++++++++++++++++++++++++-----
 dlls/windowscodecs/tests/metadata.c |    4 ---
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index 7b88735..4adcf17 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -1285,15 +1285,18 @@ static HRESULT WINAPI GifDecoder_Block_GetContainerFormat(IWICMetadataBlockReade
 static HRESULT WINAPI GifDecoder_Block_GetCount(IWICMetadataBlockReader *iface,
     UINT *count)
 {
+    GifDecoder *This = impl_from_IWICMetadataBlockReader(iface);
+
     TRACE("%p,%p\n", iface, count);
 
     if (!count) return E_INVALIDARG;
 
-    *count = 1;
+    *count = This->gif->Extensions.ExtensionBlockCount + 1;
     return S_OK;
 }
 
-static HRESULT create_LSD_metadata_reader(GifDecoder *This, IWICMetadataReader **reader)
+static HRESULT create_metadata_reader(const void *data, int data_size,
+                                      const CLSID *clsid, IWICMetadataReader **reader)
 {
     HRESULT hr;
     IWICMetadataReader *metadata_reader;
@@ -1302,7 +1305,7 @@ static HRESULT create_LSD_metadata_reader(GifDecoder *This, IWICMetadataReader *
 
     /* FIXME: Use IWICComponentFactory_CreateMetadataReader once it's implemented */
 
-    hr = CoCreateInstance(&CLSID_WICLSDMetadataReader, NULL, CLSCTX_INPROC_SERVER,
+    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
                           &IID_IWICMetadataReader, (void **)&metadata_reader);
     if (FAILED(hr)) return hr;
 
@@ -1313,7 +1316,7 @@ static HRESULT create_LSD_metadata_reader(GifDecoder *This, IWICMetadataReader *
         return hr;
     }
 
-    stream = create_stream(This->LSD_data, sizeof(This->LSD_data));
+    stream = create_stream(data, data_size);
     IWICPersistStream_LoadEx(persist, stream, NULL, WICPersistOptionsDefault);
     IStream_Release(stream);
 
@@ -1327,12 +1330,35 @@ static HRESULT WINAPI GifDecoder_Block_GetReaderByIndex(IWICMetadataBlockReader
     UINT index, IWICMetadataReader **reader)
 {
     GifDecoder *This = impl_from_IWICMetadataBlockReader(iface);
+    int i;
 
     TRACE("(%p,%u,%p)\n", iface, index, reader);
 
-    if (!reader || index != 0) return E_INVALIDARG;
+    if (!reader) return E_INVALIDARG;
+
+    if (index == 0)
+        return create_metadata_reader(&This->LSD_data, sizeof(This->LSD_data),
+                                      &CLSID_WICLSDMetadataReader, reader);
+
+    for (i = 0; i < This->gif->Extensions.ExtensionBlockCount; i++)
+    {
+        const CLSID *clsid;
+
+        if (index != i + 1) continue;
+
+        if (This->gif->Extensions.ExtensionBlocks[i].Function == APPLICATION_EXT_FUNC_CODE)
+            clsid = &CLSID_WICAPEMetadataReader;
+        else if (This->gif->Extensions.ExtensionBlocks[i].Function == COMMENT_EXT_FUNC_CODE)
+            clsid = &CLSID_WICGifCommentMetadataReader;
+        else
+            clsid = &CLSID_WICUnknownMetadataReader;
 
-    return create_LSD_metadata_reader(This, reader);
+        return create_metadata_reader(This->gif->Extensions.ExtensionBlocks[i].Bytes,
+                                      This->gif->Extensions.ExtensionBlocks[i].ByteCount,
+                                      clsid, reader);
+    }
+
+    return E_INVALIDARG;
 }
 
 static HRESULT WINAPI GifDecoder_Block_GetEnumerator(IWICMetadataBlockReader *iface,
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index ed02e2f..343b873 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -1204,7 +1204,6 @@ static void test_metadata_gif(void)
 
         hr = IWICMetadataBlockReader_GetCount(blockreader, &count);
         ok(hr == S_OK, "GetCount error %#x\n", hr);
-todo_wine
         ok(count == 4, "expected 4, got %u\n", count);
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 0, &reader);
@@ -1226,7 +1225,6 @@ todo_wine
         }
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 1, &reader);
-todo_wine
         ok(hr == S_OK, "GetReaderByIndex error %#x\n", hr);
 
         if (SUCCEEDED(hr))
@@ -1245,7 +1243,6 @@ todo_wine
         }
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 2, &reader);
-todo_wine
         ok(hr == S_OK, "GetReaderByIndex error %#x\n", hr);
 
         if (SUCCEEDED(hr))
@@ -1264,7 +1261,6 @@ todo_wine
         }
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 3, &reader);
-todo_wine
         ok(hr == S_OK, "GetReaderByIndex error %#x\n", hr);
 
         if (SUCCEEDED(hr))




More information about the wine-cvs mailing list