windowscodecs: Add stub implementation for DDS encoder.
Signed-off-by: Ziqing Hui <zhui@codeweavers.com> Signed-off-by: Esme Povirk <esme@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0edd90daaf
commit
8ee4c1e21c
|
@ -58,6 +58,7 @@ static const classinfo wic_classes[] = {
|
||||||
{&CLSID_WICTiffEncoder, TiffEncoder_CreateInstance},
|
{&CLSID_WICTiffEncoder, TiffEncoder_CreateInstance},
|
||||||
{&CLSID_WICIcnsEncoder, IcnsEncoder_CreateInstance},
|
{&CLSID_WICIcnsEncoder, IcnsEncoder_CreateInstance},
|
||||||
{&CLSID_WICDdsDecoder, DdsDecoder_CreateInstance},
|
{&CLSID_WICDdsDecoder, DdsDecoder_CreateInstance},
|
||||||
|
{&CLSID_WICDdsEncoder, DdsEncoder_CreateInstance},
|
||||||
{&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance},
|
{&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance},
|
||||||
{&CLSID_WineTgaDecoder, TgaDecoder_CreateInstance},
|
{&CLSID_WineTgaDecoder, TgaDecoder_CreateInstance},
|
||||||
{&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance},
|
{&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance},
|
||||||
|
|
|
@ -159,6 +159,16 @@ typedef struct DdsFrameDecode {
|
||||||
dds_frame_info info;
|
dds_frame_info info;
|
||||||
} DdsFrameDecode;
|
} DdsFrameDecode;
|
||||||
|
|
||||||
|
typedef struct DdsEncoder {
|
||||||
|
IWICBitmapEncoder IWICBitmapEncoder_iface;
|
||||||
|
LONG ref;
|
||||||
|
CRITICAL_SECTION lock;
|
||||||
|
IStream *stream;
|
||||||
|
UINT frame_count;
|
||||||
|
BOOL uncommitted_frame;
|
||||||
|
BOOL committed;
|
||||||
|
} DdsEncoder;
|
||||||
|
|
||||||
static struct dds_format {
|
static struct dds_format {
|
||||||
DDS_PIXELFORMAT pixel_format;
|
DDS_PIXELFORMAT pixel_format;
|
||||||
const GUID *wic_format;
|
const GUID *wic_format;
|
||||||
|
@ -683,6 +693,11 @@ static inline DdsFrameDecode *impl_from_IWICDdsFrameDecode(IWICDdsFrameDecode *i
|
||||||
return CONTAINING_RECORD(iface, DdsFrameDecode, IWICDdsFrameDecode_iface);
|
return CONTAINING_RECORD(iface, DdsFrameDecode, IWICDdsFrameDecode_iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline DdsEncoder *impl_from_IWICBitmapEncoder(IWICBitmapEncoder *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, DdsEncoder, IWICBitmapEncoder_iface);
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI DdsFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
|
static HRESULT WINAPI DdsFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid,
|
||||||
void **ppv)
|
void **ppv)
|
||||||
{
|
{
|
||||||
|
@ -1493,3 +1508,184 @@ HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_QueryInterface(IWICBitmapEncoder *iface, REFIID iid,
|
||||||
|
void **ppv)
|
||||||
|
{
|
||||||
|
DdsEncoder *This = impl_from_IWICBitmapEncoder(iface);
|
||||||
|
FIXME("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
|
||||||
|
|
||||||
|
if (!ppv) return E_INVALIDARG;
|
||||||
|
|
||||||
|
if (IsEqualIID(&IID_IUnknown, iid) ||
|
||||||
|
IsEqualIID(&IID_IWICBitmapEncoder, iid)) {
|
||||||
|
*ppv = &This->IWICBitmapEncoder_iface;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*ppv = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI DdsEncoder_AddRef(IWICBitmapEncoder *iface)
|
||||||
|
{
|
||||||
|
DdsEncoder *This = impl_from_IWICBitmapEncoder(iface);
|
||||||
|
ULONG ref = InterlockedIncrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) refcount=%u\n", iface, ref);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI DdsEncoder_Release(IWICBitmapEncoder *iface)
|
||||||
|
{
|
||||||
|
DdsEncoder *This = impl_from_IWICBitmapEncoder(iface);
|
||||||
|
ULONG ref = InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
TRACE("(%p) refcount=%u\n", iface, ref);
|
||||||
|
|
||||||
|
if (ref == 0) {
|
||||||
|
This->lock.DebugInfo->Spare[0] = 0;
|
||||||
|
DeleteCriticalSection(&This->lock);
|
||||||
|
if (This->stream) IStream_Release(This->stream);
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_Initialize(IWICBitmapEncoder *iface,
|
||||||
|
IStream *pIStream, WICBitmapEncoderCacheOption cacheOption)
|
||||||
|
{
|
||||||
|
FIXME("(%p,%p,%u): stub\n", iface, pIStream, cacheOption);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_GetContainerFormat(IWICBitmapEncoder *iface, GUID *format)
|
||||||
|
{
|
||||||
|
TRACE("(%p,%p)\n", iface, format);
|
||||||
|
|
||||||
|
if (!format)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
memcpy(format, &GUID_ContainerFormatDds, sizeof(*format));
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_GetEncoderInfo(IWICBitmapEncoder *iface, IWICBitmapEncoderInfo **info)
|
||||||
|
{
|
||||||
|
IWICComponentInfo *comp_info;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("%p,%p\n", iface, info);
|
||||||
|
|
||||||
|
if (!info) return E_INVALIDARG;
|
||||||
|
|
||||||
|
hr = CreateComponentInfo(&CLSID_WICDdsEncoder, &comp_info);
|
||||||
|
if (hr == S_OK) {
|
||||||
|
hr = IWICComponentInfo_QueryInterface(comp_info, &IID_IWICBitmapEncoderInfo, (void **)info);
|
||||||
|
IWICComponentInfo_Release(comp_info);
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_SetColorContexts(IWICBitmapEncoder *iface,
|
||||||
|
UINT cCount, IWICColorContext **ppIColorContext)
|
||||||
|
{
|
||||||
|
FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_SetPalette(IWICBitmapEncoder *iface, IWICPalette *palette)
|
||||||
|
{
|
||||||
|
DdsEncoder *This = impl_from_IWICBitmapEncoder(iface);
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p,%p)\n", iface, palette);
|
||||||
|
|
||||||
|
EnterCriticalSection(&This->lock);
|
||||||
|
|
||||||
|
hr = This->stream ? WINCODEC_ERR_UNSUPPORTEDOPERATION : WINCODEC_ERR_NOTINITIALIZED;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&This->lock);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_SetThumbnail(IWICBitmapEncoder *iface, IWICBitmapSource *pIThumbnail)
|
||||||
|
{
|
||||||
|
TRACE("(%p,%p)\n", iface, pIThumbnail);
|
||||||
|
return WINCODEC_ERR_UNSUPPORTEDOPERATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmapSource *pIPreview)
|
||||||
|
{
|
||||||
|
TRACE("(%p,%p)\n", iface, pIPreview);
|
||||||
|
return WINCODEC_ERR_UNSUPPORTEDOPERATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
|
||||||
|
IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
|
||||||
|
{
|
||||||
|
FIXME("(%p,%p,%p): stub\n", iface, ppIFrameEncode, ppIEncoderOptions);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_Commit(IWICBitmapEncoder *iface)
|
||||||
|
{
|
||||||
|
FIXME("(%p): stub\n", iface);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI DdsEncoder_GetMetadataQueryWriter(IWICBitmapEncoder *iface,
|
||||||
|
IWICMetadataQueryWriter **ppIMetadataQueryWriter)
|
||||||
|
{
|
||||||
|
FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryWriter);
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IWICBitmapEncoderVtbl DdsEncoder_Vtbl = {
|
||||||
|
DdsEncoder_QueryInterface,
|
||||||
|
DdsEncoder_AddRef,
|
||||||
|
DdsEncoder_Release,
|
||||||
|
DdsEncoder_Initialize,
|
||||||
|
DdsEncoder_GetContainerFormat,
|
||||||
|
DdsEncoder_GetEncoderInfo,
|
||||||
|
DdsEncoder_SetColorContexts,
|
||||||
|
DdsEncoder_SetPalette,
|
||||||
|
DdsEncoder_SetThumbnail,
|
||||||
|
DdsEncoder_SetPreview,
|
||||||
|
DdsEncoder_CreateNewFrame,
|
||||||
|
DdsEncoder_Commit,
|
||||||
|
DdsEncoder_GetMetadataQueryWriter
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT DdsEncoder_CreateInstance( REFIID iid, void **ppv)
|
||||||
|
{
|
||||||
|
DdsEncoder *This;
|
||||||
|
HRESULT ret;
|
||||||
|
|
||||||
|
TRACE("(%s,%p)\n", debugstr_guid(iid), ppv);
|
||||||
|
|
||||||
|
*ppv = NULL;
|
||||||
|
|
||||||
|
This = HeapAlloc(GetProcessHeap(), 0, sizeof(DdsEncoder));
|
||||||
|
if (!This) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
This->IWICBitmapEncoder_iface.lpVtbl = &DdsEncoder_Vtbl;
|
||||||
|
This->ref = 1;
|
||||||
|
This->stream = NULL;
|
||||||
|
This->frame_count = 0;
|
||||||
|
This->uncommitted_frame = FALSE;
|
||||||
|
This->committed = FALSE;
|
||||||
|
InitializeCriticalSection(&This->lock);
|
||||||
|
This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DdsEncoder.lock");
|
||||||
|
|
||||||
|
ret = IWICBitmapEncoder_QueryInterface(&This->IWICBitmapEncoder_iface, iid, ppv);
|
||||||
|
IWICBitmapEncoder_Release(&This->IWICBitmapEncoder_iface);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -153,6 +153,7 @@ extern HRESULT TiffEncoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDE
|
||||||
extern HRESULT IcnsEncoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
extern HRESULT IcnsEncoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT TgaDecoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
extern HRESULT TgaDecoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
extern HRESULT DdsDecoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
||||||
|
extern HRESULT DdsEncoder_CreateInstance(REFIID iid, void** ppv) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight,
|
extern HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight,
|
||||||
UINT stride, UINT datasize, void *view, UINT offset,
|
UINT stride, UINT datasize, void *view, UINT offset,
|
||||||
|
|
|
@ -132,6 +132,13 @@ coclass WICIcnsEncoder { interface IWICBitmapEncoder; }
|
||||||
]
|
]
|
||||||
coclass WICDdsDecoder { interface IWICBitmapDecoder; }
|
coclass WICDdsDecoder { interface IWICBitmapDecoder; }
|
||||||
|
|
||||||
|
[
|
||||||
|
helpstring("WIC DDS Encoder"),
|
||||||
|
threading(both),
|
||||||
|
uuid(a61dde94-66ce-4ac1-881b-71680588895e)
|
||||||
|
]
|
||||||
|
coclass WICDdsEncoder { interface IWICBitmapEncoder; }
|
||||||
|
|
||||||
[
|
[
|
||||||
helpstring("WIC Default Format Converter"),
|
helpstring("WIC Default Format Converter"),
|
||||||
threading(both),
|
threading(both),
|
||||||
|
|
Loading…
Reference in New Issue