Ziqing Hui : windowscodecs: Add stub implementation for IWICDdsDecoder.

Alexandre Julliard julliard at winehq.org
Tue Apr 28 16:32:21 CDT 2020


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

Author: Ziqing Hui <zhui at codeweavers.com>
Date:   Tue Apr 28 10:55:04 2020 +0800

windowscodecs: Add stub implementation for IWICDdsDecoder.

Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/windowscodecs/ddsformat.c | 60 ++++++++++++++++++++++++++++++++++++++----
 include/wincodec.idl           | 45 +++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+), 5 deletions(-)

diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c
index 212eedc7a2..cf8fadbce5 100644
--- a/dlls/windowscodecs/ddsformat.c
+++ b/dlls/windowscodecs/ddsformat.c
@@ -86,6 +86,7 @@ typedef struct {
 
 typedef struct DdsDecoder {
     IWICBitmapDecoder IWICBitmapDecoder_iface;
+    IWICDdsDecoder IWICDdsDecoder_iface;
     LONG ref;
     BOOL initialized;
     IStream *stream;
@@ -110,6 +111,11 @@ static inline DdsDecoder *impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
     return CONTAINING_RECORD(iface, DdsDecoder, IWICBitmapDecoder_iface);
 }
 
+static inline DdsDecoder *impl_from_IWICDdsDecoder(IWICDdsDecoder *iface)
+{
+    return CONTAINING_RECORD(iface, DdsDecoder, IWICDdsDecoder_iface);
+}
+
 static inline DdsFrameDecode *impl_from_IWICBitmapFrameDecode(IWICBitmapFrameDecode *iface)
 {
     return CONTAINING_RECORD(iface, DdsFrameDecode, IWICBitmapFrameDecode_iface);
@@ -259,12 +265,11 @@ static HRESULT WINAPI DdsDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID
     if (!ppv) return E_INVALIDARG;
 
     if (IsEqualIID(&IID_IUnknown, iid) ||
-        IsEqualIID(&IID_IWICBitmapDecoder, iid))
-    {
+        IsEqualIID(&IID_IWICBitmapDecoder, iid)) {
         *ppv = &This->IWICBitmapDecoder_iface;
-    }
-    else
-    {
+    } else if (IsEqualIID(&IID_IWICDdsDecoder, iid)) {
+        *ppv = &This->IWICDdsDecoder_iface;
+    } else {
         *ppv = NULL;
         return E_NOINTERFACE;
     }
@@ -498,6 +503,50 @@ static const IWICBitmapDecoderVtbl DdsDecoder_Vtbl = {
         DdsDecoder_GetFrame
 };
 
+static HRESULT WINAPI DdsDecoder_Dds_QueryInterface(IWICDdsDecoder *iface,
+                                                    REFIID iid, void **ppv)
+{
+    DdsDecoder *This = impl_from_IWICDdsDecoder(iface);
+    return DdsDecoder_QueryInterface(&This->IWICBitmapDecoder_iface, iid, ppv);
+}
+
+static ULONG WINAPI DdsDecoder_Dds_AddRef(IWICDdsDecoder *iface)
+{
+    DdsDecoder *This = impl_from_IWICDdsDecoder(iface);
+    return DdsDecoder_AddRef(&This->IWICBitmapDecoder_iface);
+}
+
+static ULONG WINAPI DdsDecoder_Dds_Release(IWICDdsDecoder *iface)
+{
+    DdsDecoder *This = impl_from_IWICDdsDecoder(iface);
+    return DdsDecoder_Release(&This->IWICBitmapDecoder_iface);
+}
+
+static HRESULT WINAPI DdsDecoder_Dds_GetParameters(IWICDdsDecoder *iface,
+                                                   WICDdsParameters *parameters)
+{
+    TRACE("(%p,%p): Stub.\n", iface, parameters);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsDecoder_Dds_GetFrame(IWICDdsDecoder *iface,
+                                              UINT arrayIndex, UINT mipLevel, UINT sliceIndex,
+                                              IWICBitmapFrameDecode **bitmapFrame)
+{
+    TRACE("(%p,%u,%u,%u,%p): Stub.\n", iface, arrayIndex, mipLevel, sliceIndex, bitmapFrame);
+
+    return E_NOTIMPL;
+}
+
+static const IWICDdsDecoderVtbl DdsDecoder_Dds_Vtbl = {
+    DdsDecoder_Dds_QueryInterface,
+    DdsDecoder_Dds_AddRef,
+    DdsDecoder_Dds_Release,
+    DdsDecoder_Dds_GetParameters,
+    DdsDecoder_Dds_GetFrame
+};
+
 HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv)
 {
     DdsDecoder *This;
@@ -511,6 +560,7 @@ HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv)
     if (!This) return E_OUTOFMEMORY;
 
     This->IWICBitmapDecoder_iface.lpVtbl = &DdsDecoder_Vtbl;
+    This->IWICDdsDecoder_iface.lpVtbl = &DdsDecoder_Dds_Vtbl;
     This->ref = 1;
     This->initialized = FALSE;
     This->stream = NULL;
diff --git a/include/wincodec.idl b/include/wincodec.idl
index b26e055394..e5fdc15c64 100644
--- a/include/wincodec.idl
+++ b/include/wincodec.idl
@@ -19,6 +19,7 @@
 import "wtypes.idl";
 import "propidl.idl";
 import "ocidl.idl";
+import "dxgiformat.idl";
 
 cpp_quote ("#include \"dcommon.h\"")
 
@@ -195,6 +196,23 @@ typedef enum WICSectionAccessLevel {
     WICSectionAccessLevel_FORCE_DWORD = CODEC_FORCE_DWORD
 } WICSectionAccessLevel;
 
+typedef enum WICDdsDimension {
+    WICDdsTexture1D = 0x00000000,
+    WICDdsTexture2D = 0x00000001,
+    WICDdsTexture3D = 0x00000002,
+    WICDdsTextureCube = 0x00000003,
+    WICDDSTEXTURE_FORCE_DWORD = CODEC_FORCE_DWORD
+} WICDdsDimension;
+
+typedef enum WICDdsAlphaMode {
+    WICDdsAlphaModeUnknown = 0x00000000,
+    WICDdsAlphaModeStraight = 0x00000001,
+    WICDdsAlphaModePremultiplied = 0x00000002,
+    WICDdsAlphaModeOpaque = 0x00000003,
+    WICDdsAlphaModeCustom = 0x00000004,
+    WICDDSALPHAMODE_FORCE_DWORD = CODEC_FORCE_DWORD
+} WICDdsAlphaMode;
+
 typedef GUID WICPixelFormatGUID;
 typedef REFGUID REFWICPixelFormatGUID;
 
@@ -342,6 +360,17 @@ typedef struct WICImageParameters
     UINT32 PixelHeight;
 } WICImageParameters;
 
+typedef struct WICDdsParameters {
+    UINT Width;
+    UINT Height;
+    UINT Depth;
+    UINT MipLevels;
+    UINT ArraySize;
+    DXGI_FORMAT DxgiFormat;
+    WICDdsDimension Dimension;
+    WICDdsAlphaMode AlphaMode;
+} WICDdsParameters;
+
 typedef UINT32 WICColor;
 
 interface ID2D1Device;
@@ -1144,6 +1173,22 @@ interface IWICEnumMetadataItem : IUnknown
         [out] IWICEnumMetadataItem **ppIEnumMetadataItem);
 }
 
+[
+    object,
+    uuid(409cd537-8532-40cb-9774-e2feb2df4e9c)
+]
+interface IWICDdsDecoder : IUnknown
+{
+    HRESULT GetParameters(
+        [out] WICDdsParameters *parameters);
+
+    HRESULT GetFrame(
+        [in] UINT arrayIndex,
+        [in] UINT mipLevel,
+        [in] UINT sliceIndex,
+        [out, retval] IWICBitmapFrameDecode **bitmapFrame);
+};
+
 cpp_quote("HRESULT WINAPI WICConvertBitmapSource(REFWICPixelFormatGUID dstFormat, IWICBitmapSource *pISrc, IWICBitmapSource **ppIDst);")
 cpp_quote("HRESULT WINAPI WICCreateBitmapFromSection(UINT width, UINT height, REFWICPixelFormatGUID format, HANDLE section, UINT stride, UINT offset, IWICBitmap **bitmap);")
 cpp_quote("HRESULT WINAPI WICCreateBitmapFromSectionEx(UINT width, UINT height, REFWICPixelFormatGUID format, HANDLE section, UINT stride, UINT offset, WICSectionAccessLevel access, IWICBitmap **bitmap);")




More information about the wine-cvs mailing list