Module: wine Branch: master Commit: 682ea785df053b0ec41e18b3f2b275b5b6362b7a URL: http://source.winehq.org/git/wine.git/?a=commit;h=682ea785df053b0ec41e18b3f2...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Jul 19 00:21:33 2013 +0400
windowscodecs: Implement Initialize() and GetSize() for bitmap clipper.
---
dlls/windowscodecs/clipper.c | 60 +++++++++++++++++++++++++++++++++--- dlls/windowscodecs/tests/bitmap.c | 41 +++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 5 deletions(-)
diff --git a/dlls/windowscodecs/clipper.c b/dlls/windowscodecs/clipper.c index cbbb255..f6d5e02 100644 --- a/dlls/windowscodecs/clipper.c +++ b/dlls/windowscodecs/clipper.c @@ -34,6 +34,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); typedef struct BitmapClipper { IWICBitmapClipper IWICBitmapClipper_iface; LONG ref; + IWICBitmapSource *source; + WICRect rect; + CRITICAL_SECTION lock; /* must be held when initialized */ } BitmapClipper;
static inline BitmapClipper *impl_from_IWICBitmapClipper(IWICBitmapClipper *iface) @@ -84,6 +87,9 @@ static ULONG WINAPI BitmapClipper_Release(IWICBitmapClipper *iface)
if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + if (This->source) IWICBitmapSource_Release(This->source); HeapFree(GetProcessHeap(), 0, This); }
@@ -91,10 +97,22 @@ static ULONG WINAPI BitmapClipper_Release(IWICBitmapClipper *iface) }
static HRESULT WINAPI BitmapClipper_GetSize(IWICBitmapClipper *iface, - UINT *puiWidth, UINT *puiHeight) + UINT *width, UINT *height) { - FIXME("(%p,%p,%p): stub\n", iface, puiWidth, puiHeight); - return E_NOTIMPL; + BitmapClipper *This = impl_from_IWICBitmapClipper(iface); + + TRACE("(%p,%p,%p)\n", iface, width, height); + + if (!width || !height) + return E_INVALIDARG; + + if (!This->source) + return WINCODEC_ERR_WRONGSTATE; + + *width = This->rect.Width; + *height = This->rect.Height; + + return S_OK; }
static HRESULT WINAPI BitmapClipper_GetPixelFormat(IWICBitmapClipper *iface, @@ -128,8 +146,37 @@ static HRESULT WINAPI BitmapClipper_CopyPixels(IWICBitmapClipper *iface, static HRESULT WINAPI BitmapClipper_Initialize(IWICBitmapClipper *iface, IWICBitmapSource *source, const WICRect *rc) { - FIXME("(%p,%p,%p): stub\n", iface, source, rc); - return E_NOTIMPL; + BitmapClipper *This = impl_from_IWICBitmapClipper(iface); + UINT width, height; + HRESULT hr = S_OK; + + TRACE("(%p,%p,%p)\n", iface, source, rc); + + EnterCriticalSection(&This->lock); + + if (This->source) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto end; + } + + hr = IWICBitmapSource_GetSize(source, &width, &height); + if (FAILED(hr)) goto end; + + if ((rc->X + rc->Width > width) || (rc->Y + rc->Height > height)) + { + hr = E_INVALIDARG; + goto end; + } + + This->rect = *rc; + This->source = source; + IWICBitmapSource_AddRef(This->source); + +end: + LeaveCriticalSection(&This->lock); + + return hr; }
static const IWICBitmapClipperVtbl BitmapClipper_Vtbl = { @@ -153,6 +200,9 @@ HRESULT BitmapClipper_Create(IWICBitmapClipper **clipper)
This->IWICBitmapClipper_iface.lpVtbl = &BitmapClipper_Vtbl; This->ref = 1; + This->source = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BitmapClipper.lock");
*clipper = &This->IWICBitmapClipper_iface;
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c index 5b78bf9..0437c7d 100644 --- a/dlls/windowscodecs/tests/bitmap.c +++ b/dlls/windowscodecs/tests/bitmap.c @@ -769,6 +769,46 @@ todo_wine DeleteObject(hpal); }
+static void test_clipper(void) +{ + IWICBitmapClipper *clipper; + UINT height, width; + IWICBitmap *bitmap; + WICRect rect; + HRESULT hr; + + hr = IWICImagingFactory_CreateBitmap(factory, 10, 10, &GUID_WICPixelFormat24bppBGR, + WICBitmapCacheOnLoad, &bitmap); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IWICImagingFactory_CreateBitmapClipper(factory, &clipper); + ok(hr == S_OK, "got 0x%08x\n", hr); + + rect.X = rect.Y = 0; + rect.Width = rect.Height = 11; + hr = IWICBitmapClipper_Initialize(clipper, (IWICBitmapSource*)bitmap, &rect); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + rect.X = rect.Y = 5; + rect.Width = rect.Height = 6; + hr = IWICBitmapClipper_Initialize(clipper, (IWICBitmapSource*)bitmap, &rect); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + rect.X = rect.Y = 5; + rect.Width = rect.Height = 5; + hr = IWICBitmapClipper_Initialize(clipper, (IWICBitmapSource*)bitmap, &rect); + ok(hr == S_OK, "got 0x%08x\n", hr); + + width = height = 0; + hr = IWICBitmapClipper_GetSize(clipper, &width, &height); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(width == 5, "got %d\n", width); + ok(height == 5, "got %d\n", height); + + IWICBitmapClipper_Release(clipper); + IWICBitmap_Release(bitmap); +} + START_TEST(bitmap) { HRESULT hr; @@ -784,6 +824,7 @@ START_TEST(bitmap) test_CreateBitmapFromMemory(); test_CreateBitmapFromHICON(); test_CreateBitmapFromHBITMAP(); + test_clipper();
IWICImagingFactory_Release(factory);