[PATCH 2/6] windowscodecs: Add IWICMetadataBlockWriter stub interface for Gif encoder.

Paul Gofman pgofman at codeweavers.com
Wed Jan 27 11:33:47 CST 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/windowscodecs/gifformat.c | 128 +++++++++++++++++++++++++++++++--
 1 file changed, 124 insertions(+), 4 deletions(-)

diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c
index 8ebba7b5a88..c807a7ee7db 100644
--- a/dlls/windowscodecs/gifformat.c
+++ b/dlls/windowscodecs/gifformat.c
@@ -1473,6 +1473,7 @@ static inline GifEncoder *impl_from_IWICBitmapEncoder(IWICBitmapEncoder *iface)
 typedef struct GifFrameEncode
 {
     IWICBitmapFrameEncode IWICBitmapFrameEncode_iface;
+    IWICMetadataBlockWriter IWICMetadataBlockWriter_iface;
     LONG ref;
     GifEncoder *encoder;
     BOOL initialized, interlace, committed;
@@ -1488,8 +1489,15 @@ static inline GifFrameEncode *impl_from_IWICBitmapFrameEncode(IWICBitmapFrameEnc
     return CONTAINING_RECORD(iface, GifFrameEncode, IWICBitmapFrameEncode_iface);
 }
 
+static inline GifFrameEncode *impl_from_IWICMetadataBlockWriter(IWICMetadataBlockWriter *iface)
+{
+    return CONTAINING_RECORD(iface, GifFrameEncode, IWICMetadataBlockWriter_iface);
+}
+
 static HRESULT WINAPI GifFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid, void **ppv)
 {
+    GifFrameEncode *encoder = impl_from_IWICBitmapFrameEncode(iface);
+
     TRACE("%p,%s,%p\n", iface, debugstr_guid(iid), ppv);
 
     if (!ppv) return E_INVALIDARG;
@@ -1497,13 +1505,20 @@ static HRESULT WINAPI GifFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface
     if (IsEqualIID(&IID_IUnknown, iid) ||
         IsEqualIID(&IID_IWICBitmapFrameEncode, iid))
     {
-        IWICBitmapFrameEncode_AddRef(iface);
         *ppv = iface;
-        return S_OK;
+    }
+    else if (IsEqualIID(&IID_IWICMetadataBlockWriter, iid))
+    {
+        *ppv = &encoder->IWICMetadataBlockWriter_iface;
+    }
+    else
+    {
+        *ppv = NULL;
+        return E_NOINTERFACE;
     }
 
-    *ppv = NULL;
-    return E_NOINTERFACE;
+    IUnknown_AddRef((IUnknown *)*ppv);
+    return S_OK;
 }
 
 static ULONG WINAPI GifFrameEncode_AddRef(IWICBitmapFrameEncode *iface)
@@ -2259,6 +2274,109 @@ static HRESULT WINAPI GifEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmap
     return WINCODEC_ERR_UNSUPPORTEDOPERATION;
 }
 
+static HRESULT WINAPI GifEncoderFrame_Block_QueryInterface(IWICMetadataBlockWriter *iface, REFIID iid, void **ppv)
+{
+    GifFrameEncode *frame_encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_QueryInterface(&frame_encoder->IWICBitmapFrameEncode_iface, iid, ppv);
+}
+
+static ULONG WINAPI GifEncoderFrame_Block_AddRef(IWICMetadataBlockWriter *iface)
+{
+    GifFrameEncode *frame_encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_AddRef(&frame_encoder->IWICBitmapFrameEncode_iface);
+}
+
+static ULONG WINAPI GifEncoderFrame_Block_Release(IWICMetadataBlockWriter *iface)
+{
+    GifFrameEncode *frame_encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_Release(&frame_encoder->IWICBitmapFrameEncode_iface);
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_GetContainerFormat(IWICMetadataBlockWriter *iface, GUID *container_format)
+{
+    FIXME("iface %p, container_format %p stub.\n", iface, container_format);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_GetCount(IWICMetadataBlockWriter *iface, UINT *count)
+{
+    FIXME("iface %p, count %p stub.\n", iface, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_GetReaderByIndex(IWICMetadataBlockWriter *iface,
+        UINT index, IWICMetadataReader **metadata_reader)
+{
+    FIXME("iface %p, index %d, metadata_reader %p stub.\n", iface, index, metadata_reader);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_GetEnumerator(IWICMetadataBlockWriter *iface, IEnumUnknown **enum_metadata)
+{
+    FIXME("iface %p, enum_metadata %p stub.\n", iface, enum_metadata);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_InitializeFromBlockReader(IWICMetadataBlockWriter *iface,
+        IWICMetadataBlockReader *block_reader)
+{
+    FIXME("iface %p, block_reader %p stub.\n", iface, block_reader);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_GetWriterByIndex(IWICMetadataBlockWriter *iface, UINT index,
+        IWICMetadataWriter **metadata_writer)
+{
+    FIXME("iface %p, index %u, metadata_writer %p stub.\n", iface, index, metadata_writer);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_AddWriter(IWICMetadataBlockWriter *iface, IWICMetadataWriter *metadata_writer)
+{
+    FIXME("iface %p, metadata_writer %p stub.\n", iface, metadata_writer);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_SetWriterByIndex(IWICMetadataBlockWriter *iface, UINT index,
+        IWICMetadataWriter *metadata_writer)
+{
+    FIXME("iface %p, index %u, metadata_writer %p stub.\n", iface, index, metadata_writer);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GifEncoderFrame_Block_RemoveWriterByIndex(IWICMetadataBlockWriter *iface, UINT index)
+{
+    FIXME("iface %p, index %u stub.\n", iface, index);
+
+    return E_NOTIMPL;
+}
+
+static const IWICMetadataBlockWriterVtbl GifFrameEncode_BlockVtbl = {
+    GifEncoderFrame_Block_QueryInterface,
+    GifEncoderFrame_Block_AddRef,
+    GifEncoderFrame_Block_Release,
+    GifEncoderFrame_Block_GetContainerFormat,
+    GifEncoderFrame_Block_GetCount,
+    GifEncoderFrame_Block_GetReaderByIndex,
+    GifEncoderFrame_Block_GetEnumerator,
+    GifEncoderFrame_Block_InitializeFromBlockReader,
+    GifEncoderFrame_Block_GetWriterByIndex,
+    GifEncoderFrame_Block_AddWriter,
+    GifEncoderFrame_Block_SetWriterByIndex,
+    GifEncoderFrame_Block_RemoveWriterByIndex,
+};
+
 static HRESULT WINAPI GifEncoder_CreateNewFrame(IWICBitmapEncoder *iface, IWICBitmapFrameEncode **frame, IPropertyBag2 **options)
 {
     GifEncoder *This = impl_from_IWICBitmapEncoder(iface);
@@ -2278,6 +2396,8 @@ static HRESULT WINAPI GifEncoder_CreateNewFrame(IWICBitmapEncoder *iface, IWICBi
             This->n_frames++;
 
             ret->IWICBitmapFrameEncode_iface.lpVtbl = &GifFrameEncode_Vtbl;
+            ret->IWICMetadataBlockWriter_iface.lpVtbl = &GifFrameEncode_BlockVtbl;
+
             ret->ref = 1;
             ret->encoder = This;
             ret->initialized = FALSE;
-- 
2.29.2




More information about the wine-devel mailing list