| /* |
| * Copyright 2009 Vincent Povirk for CodeWeavers |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include "config.h" |
| |
| #include <stdarg.h> |
| |
| #define COBJMACROS |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "winreg.h" |
| #include "wingdi.h" |
| #include "objbase.h" |
| #include "wincodec.h" |
| |
| #include "wincodecs_private.h" |
| |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); |
| |
| typedef struct BmpEncoder { |
| const IWICBitmapEncoderVtbl *lpVtbl; |
| LONG ref; |
| } BmpEncoder; |
| |
| static HRESULT WINAPI BmpEncoder_QueryInterface(IWICBitmapEncoder *iface, REFIID iid, |
| void **ppv) |
| { |
| BmpEncoder *This = (BmpEncoder*)iface; |
| TRACE("(%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; |
| } |
| else |
| { |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI BmpEncoder_AddRef(IWICBitmapEncoder *iface) |
| { |
| BmpEncoder *This = (BmpEncoder*)iface; |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) refcount=%u\n", iface, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI BmpEncoder_Release(IWICBitmapEncoder *iface) |
| { |
| BmpEncoder *This = (BmpEncoder*)iface; |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) refcount=%u\n", iface, ref); |
| |
| if (ref == 0) |
| { |
| HeapFree(GetProcessHeap(), 0, This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_Initialize(IWICBitmapEncoder *iface, |
| IStream *pIStream, WICBitmapEncoderCacheOption cacheOption) |
| { |
| FIXME("(%p,%p,%u): stub\n", iface, pIStream, cacheOption); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_GetContainerFormat(IWICBitmapEncoder *iface, |
| GUID *pguidContainerFormat) |
| { |
| FIXME("(%p,%s): stub\n", iface, debugstr_guid(pguidContainerFormat)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_GetEncoderInfo(IWICBitmapEncoder *iface, |
| IWICBitmapEncoderInfo **ppIEncoderInfo) |
| { |
| FIXME("(%p,%p): stub\n", iface, ppIEncoderInfo); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_SetColorContexts(IWICBitmapEncoder *iface, |
| UINT cCount, IWICColorContext **ppIColorContext) |
| { |
| FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_SetPalette(IWICBitmapEncoder *iface, IWICPalette *pIPalette) |
| { |
| TRACE("(%p,%p)\n", iface, pIPalette); |
| return WINCODEC_ERR_UNSUPPORTEDOPERATION; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_SetThumbnail(IWICBitmapEncoder *iface, IWICBitmapSource *pIThumbnail) |
| { |
| TRACE("(%p,%p)\n", iface, pIThumbnail); |
| return WINCODEC_ERR_UNSUPPORTEDOPERATION; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmapSource *pIPreview) |
| { |
| TRACE("(%p,%p)\n", iface, pIPreview); |
| return WINCODEC_ERR_UNSUPPORTEDOPERATION; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_CreateNewFrame(IWICBitmapEncoder *iface, |
| IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions) |
| { |
| FIXME("(%p,%p,%p): stub\n", iface, ppIFrameEncode, ppIEncoderOptions); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_Commit(IWICBitmapEncoder *iface) |
| { |
| FIXME("(%p): stub\n", iface); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BmpEncoder_GetMetadataQueryWriter(IWICBitmapEncoder *iface, |
| IWICMetadataQueryWriter **ppIMetadataQueryWriter) |
| { |
| FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryWriter); |
| return E_NOTIMPL; |
| } |
| |
| static const IWICBitmapEncoderVtbl BmpEncoder_Vtbl = { |
| BmpEncoder_QueryInterface, |
| BmpEncoder_AddRef, |
| BmpEncoder_Release, |
| BmpEncoder_Initialize, |
| BmpEncoder_GetContainerFormat, |
| BmpEncoder_GetEncoderInfo, |
| BmpEncoder_SetColorContexts, |
| BmpEncoder_SetPalette, |
| BmpEncoder_SetThumbnail, |
| BmpEncoder_SetPreview, |
| BmpEncoder_CreateNewFrame, |
| BmpEncoder_Commit, |
| BmpEncoder_GetMetadataQueryWriter |
| }; |
| |
| HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) |
| { |
| BmpEncoder *This; |
| HRESULT ret; |
| |
| TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); |
| |
| *ppv = NULL; |
| |
| if (pUnkOuter) return CLASS_E_NOAGGREGATION; |
| |
| This = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpEncoder)); |
| if (!This) return E_OUTOFMEMORY; |
| |
| This->lpVtbl = &BmpEncoder_Vtbl; |
| This->ref = 1; |
| |
| ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); |
| IUnknown_Release((IUnknown*)This); |
| |
| return ret; |
| } |