Ziqing Hui : windowscodecs: Add stub for DdsFrameEncode.
Alexandre Julliard
julliard at winehq.org
Mon Apr 26 15:51:32 CDT 2021
Module: wine
Branch: master
Commit: 0737c3c2159fc59850966d4238bac4ff0ba3e449
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0737c3c2159fc59850966d4238bac4ff0ba3e449
Author: Ziqing Hui <zhui at codeweavers.com>
Date: Sat Apr 24 14:07:14 2021 +0800
windowscodecs: Add stub for DdsFrameEncode.
Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/ddsformat.c | 234 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 231 insertions(+), 3 deletions(-)
diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c
index 873d4f1bb1f..ef6571842dd 100644
--- a/dlls/windowscodecs/ddsformat.c
+++ b/dlls/windowscodecs/ddsformat.c
@@ -169,6 +169,18 @@ typedef struct DdsEncoder {
BOOL committed;
} DdsEncoder;
+typedef struct DdsFrameEncode {
+ IWICBitmapFrameEncode IWICBitmapFrameEncode_iface;
+ LONG ref;
+ DdsEncoder *parent;
+ BOOL initialized;
+ BOOL frame_created;
+ UINT width;
+ UINT height;
+ double dpi_x;
+ double dpi_y;
+} DdsFrameEncode;
+
static struct dds_format {
DDS_PIXELFORMAT pixel_format;
const GUID *wic_format;
@@ -698,6 +710,11 @@ static inline DdsEncoder *impl_from_IWICBitmapEncoder(IWICBitmapEncoder *iface)
return CONTAINING_RECORD(iface, DdsEncoder, IWICBitmapEncoder_iface);
}
+static inline DdsFrameEncode *impl_from_IWICBitmapFrameEncode(IWICBitmapFrameEncode *iface)
+{
+ return CONTAINING_RECORD(iface, DdsFrameEncode, IWICBitmapFrameEncode_iface);
+}
+
static HRESULT WINAPI DdsFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
void **ppv)
{
@@ -1482,6 +1499,185 @@ static const IWICWineDecoderVtbl DdsDecoder_Wine_Vtbl = {
DdsDecoder_Wine_Initialize
};
+static HRESULT WINAPI DdsFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid, void **ppv)
+{
+ DdsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface);
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) ||
+ IsEqualIID(&IID_IWICBitmapFrameEncode, iid))
+ {
+ *ppv = &This->IWICBitmapFrameEncode_iface;
+ }
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI DdsFrameEncode_AddRef(IWICBitmapFrameEncode *iface)
+{
+ DdsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI DdsFrameEncode_Release(IWICBitmapFrameEncode *iface)
+{
+ DdsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ IWICBitmapEncoder_Release(&This->parent->IWICBitmapEncoder_iface);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI DdsFrameEncode_Initialize(IWICBitmapFrameEncode *iface,
+ IPropertyBag2 *encoderOptions)
+{
+ FIXME("(%p,%p): stub\n", iface, encoderOptions);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetSize(IWICBitmapFrameEncode *iface,
+ UINT width, UINT height)
+{
+ DdsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface);
+ HRESULT hr;
+
+ TRACE("(%p,%u,%u)\n", iface, width, height);
+
+ EnterCriticalSection(&This->parent->lock);
+
+ if (!This->initialized || This->frame_created)
+ {
+ hr = WINCODEC_ERR_WRONGSTATE;
+ }
+ else
+ {
+ This->width = width;
+ This->height = height;
+ hr = S_OK;
+ }
+
+ LeaveCriticalSection(&This->parent->lock);
+
+ return hr;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetResolution(IWICBitmapFrameEncode *iface,
+ double dpiX, double dpiY)
+{
+ DdsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface);
+ HRESULT hr;
+
+ TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY);
+
+ EnterCriticalSection(&This->parent->lock);
+
+ if (!This->initialized || This->frame_created)
+ {
+ hr = WINCODEC_ERR_WRONGSTATE;
+ }
+ else
+ {
+ This->dpi_x = dpiX;
+ This->dpi_y = dpiY;
+ hr = S_OK;
+ }
+
+ LeaveCriticalSection(&This->parent->lock);
+
+ return hr;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface,
+ WICPixelFormatGUID *pixelFormat)
+{
+ FIXME("(%p,%s): stub\n", iface, debugstr_guid(pixelFormat));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetColorContexts(IWICBitmapFrameEncode *iface,
+ UINT count, IWICColorContext **colorContext)
+{
+ FIXME("(%p,%u,%p): stub\n", iface, count, colorContext);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetPalette(IWICBitmapFrameEncode *iface,
+ IWICPalette *palette)
+{
+ FIXME("(%p,%p): stub\n", iface, palette);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_SetThumbnail(IWICBitmapFrameEncode *iface,
+ IWICBitmapSource *thumbnail)
+{
+ TRACE("(%p,%p)\n", iface, thumbnail);
+ return WINCODEC_ERR_UNSUPPORTEDOPERATION;
+}
+
+static HRESULT WINAPI DdsFrameEncode_WritePixels(IWICBitmapFrameEncode *iface,
+ UINT lineCount, UINT stride, UINT bufferSize, BYTE *pixels)
+{
+ FIXME("(%p,%u,%u,%u,%p): stub\n", iface, lineCount, stride, bufferSize, pixels);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_WriteSource(IWICBitmapFrameEncode *iface,
+ IWICBitmapSource *bitmapSource, WICRect *rc)
+{
+ FIXME("(%p,%p,%s): stub\n", iface, bitmapSource, debug_wic_rect(rc));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_Commit(IWICBitmapFrameEncode *iface)
+{
+ FIXME("(%p): stub\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DdsFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface,
+ IWICMetadataQueryWriter **metadataQueryWriter)
+{
+ FIXME("(%p,%p): stub\n", iface, metadataQueryWriter);
+ return E_NOTIMPL;
+}
+
+static const IWICBitmapFrameEncodeVtbl DdsFrameEncode_Vtbl = {
+ DdsFrameEncode_QueryInterface,
+ DdsFrameEncode_AddRef,
+ DdsFrameEncode_Release,
+ DdsFrameEncode_Initialize,
+ DdsFrameEncode_SetSize,
+ DdsFrameEncode_SetResolution,
+ DdsFrameEncode_SetPixelFormat,
+ DdsFrameEncode_SetColorContexts,
+ DdsFrameEncode_SetPalette,
+ DdsFrameEncode_SetThumbnail,
+ DdsFrameEncode_WritePixels,
+ DdsFrameEncode_WriteSource,
+ DdsFrameEncode_Commit,
+ DdsFrameEncode_GetMetadataQueryWriter
+};
+
HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv)
{
DdsDecoder *This;
@@ -1628,10 +1824,42 @@ static HRESULT WINAPI DdsEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmap
}
static HRESULT WINAPI DdsEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
- IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
+ IWICBitmapFrameEncode **frameEncode, IPropertyBag2 **encoderOptions)
{
- FIXME("(%p,%p,%p): stub\n", iface, ppIFrameEncode, ppIEncoderOptions);
- return E_NOTIMPL;
+ DdsEncoder *This = impl_from_IWICBitmapEncoder(iface);
+ DdsFrameEncode *result;
+ HRESULT hr;
+
+ TRACE("(%p,%p,%p)\n", iface, frameEncode, encoderOptions);
+
+ EnterCriticalSection(&This->lock);
+
+ if (!This->stream)
+ {
+ hr = WINCODEC_ERR_WRONGSTATE;
+ goto end;
+ }
+
+ result = HeapAlloc(GetProcessHeap(), 0, sizeof(*result));
+ if (!result)
+ {
+ hr = E_OUTOFMEMORY;
+ goto end;
+ }
+
+ result->IWICBitmapFrameEncode_iface.lpVtbl = &DdsFrameEncode_Vtbl;
+ result->ref = 1;
+ result->parent = This;
+ result->initialized = FALSE;
+ result->frame_created = FALSE;
+ IWICBitmapEncoder_AddRef(iface);
+
+ *frameEncode = &result->IWICBitmapFrameEncode_iface;
+ hr = S_OK;
+
+end:
+ LeaveCriticalSection(&This->lock);
+ return hr;
}
static HRESULT WINAPI DdsEncoder_Commit(IWICBitmapEncoder *iface)
More information about the wine-cvs
mailing list