Dmitry Timoshkov : windowscodecs: Create Graphic Control Extension metadata block for a GIF frame.

Alexandre Julliard julliard at winehq.org
Thu Sep 13 14:39:22 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Thu Sep 13 10:27:03 2012 +0900

windowscodecs: Create Graphic Control Extension metadata block for a GIF frame.

---

 dlls/windowscodecs/gifformat.c      |   70 +++++++++++++++++++++++++++++++++-
 dlls/windowscodecs/tests/metadata.c |    2 -
 2 files changed, 67 insertions(+), 5 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index 62bdc6f..4414f36 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -646,14 +646,30 @@ static HRESULT WINAPI GifFrameDecode_Block_GetContainerFormat(IWICMetadataBlockR
     return S_OK;
 }
 
+static const void *get_GCE_data(GifFrameDecode *This)
+{
+    int i;
+
+    for (i = 0; i < This->frame->ExtensionBlockCount; i++)
+    {
+        if (This->frame->ExtensionBlocks[i].Function == GRAPHICS_EXT_FUNC_CODE &&
+            This->frame->ExtensionBlocks[i].ByteCount == 4)
+            return This->frame->ExtensionBlocks[i].Bytes;
+    }
+    return NULL;
+}
+
 static HRESULT WINAPI GifFrameDecode_Block_GetCount(IWICMetadataBlockReader *iface,
     UINT *count)
 {
+    GifFrameDecode *This = frame_from_IWICMetadataBlockReader(iface);
+
     TRACE("%p,%p\n", iface, count);
 
     if (!count) return E_INVALIDARG;
 
     *count = 1;
+    if (get_GCE_data(This)) *count += 1;
     return S_OK;
 }
 
@@ -705,16 +721,64 @@ static HRESULT create_IMD_metadata_reader(GifFrameDecode *This, IWICMetadataRead
     return S_OK;
 }
 
+static HRESULT create_GCE_metadata_reader(const void *GCE_data, IWICMetadataReader **reader)
+{
+    HRESULT hr;
+    IWICMetadataReader *metadata_reader;
+    IWICPersistStream *persist;
+    IStream *stream;
+
+    /* FIXME: Use IWICComponentFactory_CreateMetadataReader once it's implemented */
+
+    hr = CoCreateInstance(&CLSID_WICGCEMetadataReader, NULL, CLSCTX_INPROC_SERVER,
+                          &IID_IWICMetadataReader, (void **)&metadata_reader);
+    if (FAILED(hr)) return hr;
+
+    hr = IWICMetadataReader_QueryInterface(metadata_reader, &IID_IWICPersistStream, (void **)&persist);
+    if (FAILED(hr))
+    {
+        IWICMetadataReader_Release(metadata_reader);
+        return hr;
+    }
+
+    stream = create_stream(GCE_data, 4);
+    IWICPersistStream_LoadEx(persist, stream, NULL, WICPersistOptionsDefault);
+    IStream_Release(stream);
+
+    IWICPersistStream_Release(persist);
+
+    *reader = metadata_reader;
+    return S_OK;
+}
+
 static HRESULT WINAPI GifFrameDecode_Block_GetReaderByIndex(IWICMetadataBlockReader *iface,
     UINT index, IWICMetadataReader **reader)
 {
     GifFrameDecode *This = frame_from_IWICMetadataBlockReader(iface);
+    UINT block_count = 1;
+    const void *GCE_data;
 
     TRACE("(%p,%u,%p)\n", iface, index, reader);
 
-    if (!reader || index != 0) return E_INVALIDARG;
-
-    return create_IMD_metadata_reader(This, reader);
+    GCE_data = get_GCE_data(This);
+    if (GCE_data) block_count++;
+    /* FIXME: add support for Application Extension metadata block
+    APE_data = get_APE_data(This);
+    if (APE_data) block_count++;
+    */
+    if (!reader || index >= block_count) return E_INVALIDARG;
+
+    if (index == 0)
+        return create_IMD_metadata_reader(This, reader);
+
+    if (index == 1 && GCE_data)
+        return create_GCE_metadata_reader(GCE_data, reader);
+
+    /* FIXME: add support for Application Extension metadata block
+    if (APE_data)
+        return create_APE_metadata_reader(APE_data, reader);
+    */
+    return E_INVALIDARG;
 }
 
 static HRESULT WINAPI GifFrameDecode_Block_GetEnumerator(IWICMetadataBlockReader *iface,
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 39c5144..11db5cb 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -1206,7 +1206,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 == 2, "expected 2, got %u\n", count);
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 0, &reader);
@@ -1228,7 +1227,6 @@ todo_wine
         }
 
         hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 1, &reader);
-todo_wine
         ok(hr == S_OK, "GetReaderByIndex error %#x\n", hr);
 
         if (SUCCEEDED(hr))




More information about the wine-cvs mailing list