Module: wine Branch: master Commit: d42946ea4392307004cd0f5d0ca5ff2ffae7d84e URL: https://source.winehq.org/git/wine.git/?a=commit;h=d42946ea4392307004cd0f5d0...
Author: Ziqing Hui zhui@codeweavers.com Date: Tue Apr 28 10:55:04 2020 +0800
windowscodecs: Add stub implementation for IWICDdsDecoder.
Signed-off-by: Ziqing Hui zhui@codeweavers.com Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);")