From a454e03dd65c589a74d64f5b0eb836ce8f14b946 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 27 Apr 2010 11:12:34 -0500 Subject: [PATCH 5/8] windowscodecs: Add a stub implementation of IWICBitmapFlipRotator. --- dlls/windowscodecs/Makefile.in | 1 + dlls/windowscodecs/fliprotate.c | 167 ++++++++++++++++++++++++++++++++ dlls/windowscodecs/imgfactory.c | 4 +- dlls/windowscodecs/wincodecs_private.h | 1 + 4 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 dlls/windowscodecs/fliprotate.c diff --git a/dlls/windowscodecs/Makefile.in b/dlls/windowscodecs/Makefile.in index 7fda611..d344084 100644 --- a/dlls/windowscodecs/Makefile.in +++ b/dlls/windowscodecs/Makefile.in @@ -12,6 +12,7 @@ C_SRCS = \ bmpencode.c \ clsfactory.c \ converter.c \ + fliprotate.c \ gifformat.c \ icoformat.c \ imgfactory.c \ diff --git a/dlls/windowscodecs/fliprotate.c b/dlls/windowscodecs/fliprotate.c new file mode 100644 index 0000000..19a00de --- /dev/null +++ b/dlls/windowscodecs/fliprotate.c @@ -0,0 +1,167 @@ +/* + * Copyright 2010 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 + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "wincodec.h" + +#include "wincodecs_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); + +typedef struct FlipRotator { + const IWICBitmapFlipRotatorVtbl *lpVtbl; + LONG ref; + CRITICAL_SECTION lock; /* must be held when initialized */ +} FlipRotator; + +static HRESULT WINAPI FlipRotator_QueryInterface(IWICBitmapFlipRotator *iface, REFIID iid, + void **ppv) +{ + FlipRotator *This = (FlipRotator*)iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || + IsEqualIID(&IID_IWICBitmapSource, iid) || + IsEqualIID(&IID_IWICBitmapFlipRotator, iid)) + { + *ppv = This; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI FlipRotator_AddRef(IWICBitmapFlipRotator *iface) +{ + FlipRotator *This = (FlipRotator*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI FlipRotator_Release(IWICBitmapFlipRotator *iface) +{ + FlipRotator *This = (FlipRotator*)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); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI FlipRotator_GetSize(IWICBitmapFlipRotator *iface, + UINT *puiWidth, UINT *puiHeight) +{ + FIXME("(%p,%p,%p): stub\n", iface, puiWidth, puiHeight); + + return E_NOTIMPL; +} + +static HRESULT WINAPI FlipRotator_GetPixelFormat(IWICBitmapFlipRotator *iface, + WICPixelFormatGUID *pPixelFormat) +{ + FIXME("(%p,%p): stub\n", iface, pPixelFormat); + + return E_NOTIMPL; +} + +static HRESULT WINAPI FlipRotator_GetResolution(IWICBitmapFlipRotator *iface, + double *pDpiX, double *pDpiY) +{ + FIXME("(%p,%p,%p): stub\n", iface, pDpiX, pDpiY); + + return E_NOTIMPL; +} + +static HRESULT WINAPI FlipRotator_CopyPalette(IWICBitmapFlipRotator *iface, + IWICPalette *pIPalette) +{ + FIXME("(%p,%p): stub\n", iface, pIPalette); + return E_NOTIMPL; +} + +static HRESULT WINAPI FlipRotator_CopyPixels(IWICBitmapFlipRotator *iface, + const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) +{ + FIXME("(%p,%p,%u,%u,%p): stub\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + + return E_NOTIMPL; +} + +static HRESULT WINAPI FlipRotator_Initialize(IWICBitmapFlipRotator *iface, + IWICBitmapSource *pISource, WICBitmapTransformOptions options) +{ + FIXME("(%p,%p,%u): stub\n", iface, pISource, options); + + return E_NOTIMPL; +} + +static const IWICBitmapFlipRotatorVtbl FlipRotator_Vtbl = { + FlipRotator_QueryInterface, + FlipRotator_AddRef, + FlipRotator_Release, + FlipRotator_GetSize, + FlipRotator_GetPixelFormat, + FlipRotator_GetResolution, + FlipRotator_CopyPalette, + FlipRotator_CopyPixels, + FlipRotator_Initialize +}; + +HRESULT FlipRotator_Create(IWICBitmapFlipRotator **fliprotator) +{ + FlipRotator *This; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(FlipRotator)); + if (!This) return E_OUTOFMEMORY; + + This->lpVtbl = &FlipRotator_Vtbl; + This->ref = 1; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FlipRotator.lock"); + + *fliprotator = (IWICBitmapFlipRotator*)This; + + return S_OK; +} diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 3f51493..5c81b98 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -267,8 +267,8 @@ static HRESULT WINAPI ImagingFactory_CreateBitmapClipper(IWICImagingFactory *ifa static HRESULT WINAPI ImagingFactory_CreateBitmapFlipRotator(IWICImagingFactory *iface, IWICBitmapFlipRotator **ppIBitmapFlipRotator) { - FIXME("(%p,%p): stub\n", iface, ppIBitmapFlipRotator); - return E_NOTIMPL; + TRACE("(%p,%p)\n", iface, ppIBitmapFlipRotator); + return FlipRotator_Create(ppIBitmapFlipRotator); } static HRESULT WINAPI ImagingFactory_CreateStream(IWICImagingFactory *iface, diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 0e72793..059d8e7 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -30,6 +30,7 @@ extern HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); +extern HRESULT FlipRotator_Create(IWICBitmapFlipRotator **fliprotator); extern HRESULT PaletteImpl_Create(IWICPalette **palette); extern HRESULT StreamImpl_Create(IWICStream **stream); -- 1.6.3.3