Module: wine Branch: master Commit: dbdf1ef8b64fc9705665b5e141c42e627764d6aa URL: http://source.winehq.org/git/wine.git/?a=commit;h=dbdf1ef8b64fc9705665b5e141...
Author: Vincent Povirk vincent@codeweavers.com Date: Tue Apr 27 11:40:25 2010 -0500
windowscodecs: Implement IWICBitmapFlipRotator_Initialize.
---
dlls/windowscodecs/fliprotate.c | 48 +++++++++++++++++++++++++++++++++++++- 1 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/fliprotate.c b/dlls/windowscodecs/fliprotate.c index 19a00de..6db7fea 100644 --- a/dlls/windowscodecs/fliprotate.c +++ b/dlls/windowscodecs/fliprotate.c @@ -36,6 +36,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); typedef struct FlipRotator { const IWICBitmapFlipRotatorVtbl *lpVtbl; LONG ref; + IWICBitmapSource *source; + int flip_x; + int flip_y; + int swap_xy; CRITICAL_SECTION lock; /* must be held when initialized */ } FlipRotator;
@@ -84,6 +88,7 @@ static ULONG WINAPI FlipRotator_Release(IWICBitmapFlipRotator *iface) { This->lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->lock); + if (This->source) IWICBitmapSource_Release(This->source); HeapFree(GetProcessHeap(), 0, This); }
@@ -132,9 +137,44 @@ static HRESULT WINAPI FlipRotator_CopyPixels(IWICBitmapFlipRotator *iface, static HRESULT WINAPI FlipRotator_Initialize(IWICBitmapFlipRotator *iface, IWICBitmapSource *pISource, WICBitmapTransformOptions options) { - FIXME("(%p,%p,%u): stub\n", iface, pISource, options); + FlipRotator *This = (FlipRotator*)iface; + HRESULT hr=S_OK;
- return E_NOTIMPL; + TRACE("(%p,%p,%u)\n", iface, pISource, options); + + EnterCriticalSection(&This->lock); + + if (This->source) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto end; + } + + if (options&WICBitmapTransformRotate90) + { + This->swap_xy = 1; + This->flip_x = !This->flip_x; + } + + if (options&WICBitmapTransformRotate180) + { + This->flip_x = !This->flip_x; + This->flip_y = !This->flip_y; + } + + if (options&WICBitmapTransformFlipHorizontal) + This->flip_x = !This->flip_x; + + if (options&WICBitmapTransformFlipVertical) + This->flip_y = !This->flip_y; + + IWICBitmapSource_AddRef(pISource); + This->source = pISource; + +end: + LeaveCriticalSection(&This->lock); + + return hr; }
static const IWICBitmapFlipRotatorVtbl FlipRotator_Vtbl = { @@ -158,6 +198,10 @@ HRESULT FlipRotator_Create(IWICBitmapFlipRotator **fliprotator)
This->lpVtbl = &FlipRotator_Vtbl; This->ref = 1; + This->source = NULL; + This->flip_x = 0; + This->flip_y = 0; + This->swap_xy = 0; InitializeCriticalSection(&This->lock); This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FlipRotator.lock");