[PATCH 1/6] windowscodecs: Add IWICMetadataBlockWriter stub interface.

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


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/windowscodecs/encoder.c           | 120 ++++++++++++++++++++++++-
 dlls/windowscodecs/libjpeg.c           |   2 +-
 dlls/windowscodecs/libpng.c            |   2 +-
 dlls/windowscodecs/libtiff.c           |   2 +-
 dlls/windowscodecs/wincodecs_private.h |   1 +
 5 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/dlls/windowscodecs/encoder.c b/dlls/windowscodecs/encoder.c
index 8e05048d1df..e72ceb0735c 100644
--- a/dlls/windowscodecs/encoder.c
+++ b/dlls/windowscodecs/encoder.c
@@ -58,6 +58,7 @@ typedef struct CommonEncoder {
 
 typedef struct CommonEncoderFrame {
     IWICBitmapFrameEncode IWICBitmapFrameEncode_iface;
+    IWICMetadataBlockWriter IWICMetadataBlockWriter_iface;
     LONG ref;
     CommonEncoder *parent;
     struct encoder_frame encoder_frame;
@@ -77,10 +78,15 @@ static inline CommonEncoderFrame *impl_from_IWICBitmapFrameEncode(IWICBitmapFram
     return CONTAINING_RECORD(iface, CommonEncoderFrame, IWICBitmapFrameEncode_iface);
 }
 
+static inline CommonEncoderFrame *impl_from_IWICMetadataBlockWriter(IWICMetadataBlockWriter *iface)
+{
+    return CONTAINING_RECORD(iface, CommonEncoderFrame, IWICMetadataBlockWriter_iface);
+}
+
 static HRESULT WINAPI CommonEncoderFrame_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid,
     void **ppv)
 {
-    CommonEncoderFrame *This = impl_from_IWICBitmapFrameEncode(iface);
+    CommonEncoderFrame *object = impl_from_IWICBitmapFrameEncode(iface);
     TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
 
     if (!ppv) return E_INVALIDARG;
@@ -88,7 +94,12 @@ static HRESULT WINAPI CommonEncoderFrame_QueryInterface(IWICBitmapFrameEncode *i
     if (IsEqualIID(&IID_IUnknown, iid) ||
         IsEqualIID(&IID_IWICBitmapFrameEncode, iid))
     {
-        *ppv = &This->IWICBitmapFrameEncode_iface;
+        *ppv = &object->IWICBitmapFrameEncode_iface;
+    }
+    else if (object->parent->encoder_info.flags & ENCODER_FLAGS_SUPPORTS_METADATA
+            && IsEqualIID(&IID_IWICMetadataBlockWriter, iid))
+    {
+        *ppv = &object->IWICMetadataBlockWriter_iface;
     }
     else
     {
@@ -628,6 +639,110 @@ static HRESULT WINAPI CommonEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBit
     return WINCODEC_ERR_UNSUPPORTEDOPERATION;
 }
 
+static HRESULT WINAPI CommonEncoderFrame_Block_QueryInterface(IWICMetadataBlockWriter *iface, REFIID iid, void **ppv)
+{
+    CommonEncoderFrame *encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_QueryInterface(&encoder->IWICBitmapFrameEncode_iface, iid, ppv);
+}
+
+static ULONG WINAPI CommonEncoderFrame_Block_AddRef(IWICMetadataBlockWriter *iface)
+{
+    CommonEncoderFrame *encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_AddRef(&encoder->IWICBitmapFrameEncode_iface);
+}
+
+static ULONG WINAPI CommonEncoderFrame_Block_Release(IWICMetadataBlockWriter *iface)
+{
+    CommonEncoderFrame *encoder = impl_from_IWICMetadataBlockWriter(iface);
+
+    return IWICBitmapFrameEncode_Release(&encoder->IWICBitmapFrameEncode_iface);
+}
+
+static HRESULT WINAPI CommonEncoderFrame_Block_GetContainerFormat(IWICMetadataBlockWriter *iface, GUID *container_format)
+{
+    FIXME("iface %p, container_format %p stub.\n", iface, container_format);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI CommonEncoderFrame_Block_GetCount(IWICMetadataBlockWriter *iface, UINT *count)
+{
+    FIXME("iface %p, count %p stub.\n", iface, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI CommonEncoderFrame_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 CommonEncoderFrame_Block_GetEnumerator(IWICMetadataBlockWriter *iface, IEnumUnknown **enum_metadata)
+{
+    FIXME("iface %p, ppIEnumMetadata %p stub.\n", iface, enum_metadata);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI CommonEncoderFrame_Block_InitializeFromBlockReader(IWICMetadataBlockWriter *iface,
+        IWICMetadataBlockReader *metadata_block_reader)
+{
+    FIXME("iface %p, metadata_block_reader %p stub.\n", iface, metadata_block_reader);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI CommonEncoderFrame_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 CommonEncoderFrame_Block_AddWriter(IWICMetadataBlockWriter *iface, IWICMetadataWriter *metadata_writer)
+{
+    FIXME("iface %p, metadata_writer %p.\n", iface, metadata_writer);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI CommonEncoderFrame_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 CommonEncoderFrame_Block_RemoveWriterByIndex(IWICMetadataBlockWriter *iface, UINT index)
+{
+    FIXME("iface %p, index %u.\n", iface, index);
+
+    return E_NOTIMPL;
+}
+
+static const IWICMetadataBlockWriterVtbl CommonEncoderFrame_BlockVtbl =
+{
+    CommonEncoderFrame_Block_QueryInterface,
+    CommonEncoderFrame_Block_AddRef,
+    CommonEncoderFrame_Block_Release,
+    CommonEncoderFrame_Block_GetContainerFormat,
+    CommonEncoderFrame_Block_GetCount,
+    CommonEncoderFrame_Block_GetReaderByIndex,
+    CommonEncoderFrame_Block_GetEnumerator,
+    CommonEncoderFrame_Block_InitializeFromBlockReader,
+    CommonEncoderFrame_Block_GetWriterByIndex,
+    CommonEncoderFrame_Block_AddWriter,
+    CommonEncoderFrame_Block_SetWriterByIndex,
+    CommonEncoderFrame_Block_RemoveWriterByIndex,
+};
+
 static HRESULT WINAPI CommonEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
     IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
 {
@@ -661,6 +776,7 @@ static HRESULT WINAPI CommonEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
     }
 
     result->IWICBitmapFrameEncode_iface.lpVtbl = &CommonEncoderFrame_Vtbl;
+    result->IWICMetadataBlockWriter_iface.lpVtbl = &CommonEncoderFrame_BlockVtbl;
     result->ref = 1;
     result->parent = This;
 
diff --git a/dlls/windowscodecs/libjpeg.c b/dlls/windowscodecs/libjpeg.c
index 84e4df5e007..96a9b79f358 100644
--- a/dlls/windowscodecs/libjpeg.c
+++ b/dlls/windowscodecs/libjpeg.c
@@ -746,7 +746,7 @@ HRESULT CDECL jpeg_encoder_create(struct encoder_info *info, struct encoder **re
     This->cinfo_initialized = FALSE;
     *result = &This->encoder;
 
-    info->flags = 0;
+    info->flags = ENCODER_FLAGS_SUPPORTS_METADATA;
     info->container_format = GUID_ContainerFormatJpeg;
     info->clsid = CLSID_WICJpegEncoder;
     info->encoder_options[0] = ENCODER_OPTION_IMAGE_QUALITY;
diff --git a/dlls/windowscodecs/libpng.c b/dlls/windowscodecs/libpng.c
index a5068c20349..0571f5a2aad 100644
--- a/dlls/windowscodecs/libpng.c
+++ b/dlls/windowscodecs/libpng.c
@@ -997,7 +997,7 @@ HRESULT CDECL png_encoder_create(struct encoder_info *info, struct encoder **res
     This->data = NULL;
     *result = &This->encoder;
 
-    info->flags = 0;
+    info->flags = ENCODER_FLAGS_SUPPORTS_METADATA;
     info->container_format = GUID_ContainerFormatPng;
     info->clsid = CLSID_WICPngEncoder;
     info->encoder_options[0] = ENCODER_OPTION_INTERLACE;
diff --git a/dlls/windowscodecs/libtiff.c b/dlls/windowscodecs/libtiff.c
index 6f5cfc53c62..25d8c1c6081 100644
--- a/dlls/windowscodecs/libtiff.c
+++ b/dlls/windowscodecs/libtiff.c
@@ -1414,7 +1414,7 @@ HRESULT CDECL tiff_encoder_create(struct encoder_info *info, struct encoder **re
     This->tiff = NULL;
     This->num_frames = 0;
 
-    info->flags = ENCODER_FLAGS_MULTI_FRAME;
+    info->flags = ENCODER_FLAGS_MULTI_FRAME | ENCODER_FLAGS_SUPPORTS_METADATA;
     info->container_format = GUID_ContainerFormatTiff;
     info->clsid = CLSID_WICTiffEncoder;
     info->encoder_options[0] = ENCODER_OPTION_COMPRESSION_METHOD;
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h
index 85d057cc278..997bdee3446 100644
--- a/dlls/windowscodecs/wincodecs_private.h
+++ b/dlls/windowscodecs/wincodecs_private.h
@@ -355,6 +355,7 @@ enum encoder_option
 
 #define ENCODER_FLAGS_MULTI_FRAME 0x1
 #define ENCODER_FLAGS_ICNS_SIZE 0x2
+#define ENCODER_FLAGS_SUPPORTS_METADATA 0x4
 
 struct encoder_info
 {
-- 
2.29.2




More information about the wine-devel mailing list