Nikolay Sivov : windowscodecs: Implement Initialize() and GetSize() for bitmap clipper.
Alexandre Julliard
julliard at winehq.org
Fri Jul 19 13:19:41 CDT 2013
Module: wine
Branch: master
Commit: 682ea785df053b0ec41e18b3f2b275b5b6362b7a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=682ea785df053b0ec41e18b3f2b275b5b6362b7a
Author: Nikolay Sivov <nsivov at 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);
More information about the wine-cvs
mailing list