windowscodecs: Implement CopyPixels() for clipper.

This commit is contained in:
Nikolay Sivov 2013-07-22 09:19:26 +04:00 committed by Alexandre Julliard
parent cbf51069e4
commit 98be36698c
2 changed files with 167 additions and 2 deletions

View File

@ -165,8 +165,32 @@ static HRESULT WINAPI BitmapClipper_CopyPalette(IWICBitmapClipper *iface,
static HRESULT WINAPI BitmapClipper_CopyPixels(IWICBitmapClipper *iface,
const WICRect *rc, UINT stride, UINT buffer_size, BYTE *buffer)
{
FIXME("(%p,%p,%u,%u,%p): stub\n", iface, rc, stride, buffer_size, buffer);
return E_NOTIMPL;
BitmapClipper *This = impl_from_IWICBitmapClipper(iface);
WICRect rect;
TRACE("(%p,%p,%u,%u,%p)\n", iface, rc, stride, buffer_size, buffer);
if (!This->source)
return WINCODEC_ERR_WRONGSTATE;
if (rc)
{
rect = *rc;
/* transform to source coordinates */
rect.X += This->rect.X;
rect.Y += This->rect.Y;
if ((rect.X + rect.Width > This->rect.X + This->rect.Width) ||
(rect.Y + rect.Height > This->rect.Y + This->rect.Height))
return E_INVALIDARG;
rc = ▭
}
else
rc = &This->rect;
return IWICBitmapSource_CopyPixels(This->source, rc, stride, buffer_size, buffer);
}
static HRESULT WINAPI BitmapClipper_Initialize(IWICBitmapClipper *iface,

View File

@ -23,6 +23,7 @@
#include <math.h>
#define COBJMACROS
#define CONST_VTABLE
#include "windef.h"
#include "objbase.h"
@ -43,6 +44,80 @@ static const char *debugstr_guid(const GUID *guid)
return buf;
}
static HRESULT WINAPI bitmapsource_QueryInterface(IWICBitmapSource *iface, REFIID iid, void **ppv)
{
if (IsEqualIID(&IID_IUnknown, iid) ||
IsEqualIID(&IID_IWICBitmapSource, iid))
{
*ppv = iface;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
static ULONG WINAPI bitmapsource_AddRef(IWICBitmapSource *iface)
{
return 2;
}
static ULONG WINAPI bitmapsource_Release(IWICBitmapSource *iface)
{
return 1;
}
static HRESULT WINAPI bitmapsource_GetSize(IWICBitmapSource *iface, UINT *width, UINT *height)
{
*width = *height = 10;
return S_OK;
}
static HRESULT WINAPI bitmapsource_GetPixelFormat(IWICBitmapSource *iface,
WICPixelFormatGUID *format)
{
return E_NOTIMPL;
}
static HRESULT WINAPI bitmapsource_GetResolution(IWICBitmapSource *iface,
double *dpiX, double *dpiY)
{
return E_NOTIMPL;
}
static HRESULT WINAPI bitmapsource_CopyPalette(IWICBitmapSource *iface,
IWICPalette *palette)
{
return E_NOTIMPL;
}
static WICRect g_rect;
static BOOL called_CopyPixels;
static HRESULT WINAPI bitmapsource_CopyPixels(IWICBitmapSource *iface,
const WICRect *rc, UINT stride, UINT buffer_size, BYTE *buffer)
{
if (rc) g_rect = *rc;
called_CopyPixels = TRUE;
return S_OK;
}
static const IWICBitmapSourceVtbl sourcevtbl = {
bitmapsource_QueryInterface,
bitmapsource_AddRef,
bitmapsource_Release,
bitmapsource_GetSize,
bitmapsource_GetPixelFormat,
bitmapsource_GetResolution,
bitmapsource_CopyPalette,
bitmapsource_CopyPixels
};
static IWICBitmapSource bitmapsource = { &sourcevtbl };
static HBITMAP create_dib(int width, int height, int bpp, LOGPALETTE *pal, const void *data)
{
char bmibuf[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 255];
@ -774,6 +849,7 @@ static void test_clipper(void)
IWICBitmapClipper *clipper;
UINT height, width;
IWICBitmap *bitmap;
BYTE buffer[500];
WICRect rect;
HRESULT hr;
@ -807,6 +883,71 @@ static void test_clipper(void)
IWICBitmapClipper_Release(clipper);
IWICBitmap_Release(bitmap);
/* CopyPixels */
hr = IWICImagingFactory_CreateBitmapClipper(factory, &clipper);
ok(hr == S_OK, "got 0x%08x\n", hr);
rect.X = rect.Y = 5;
rect.Width = rect.Height = 5;
hr = IWICBitmapClipper_Initialize(clipper, &bitmapsource, &rect);
ok(hr == S_OK, "got 0x%08x\n", hr);
rect.X = rect.Y = 0;
rect.Width = rect.Height = 2;
/* passed rectangle is relative to clipper rectangle, underlying source gets intersected
rectangle */
memset(&g_rect, 0, sizeof(g_rect));
called_CopyPixels = FALSE;
hr = IWICBitmapClipper_CopyPixels(clipper, &rect, 0, sizeof(buffer), buffer);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(called_CopyPixels, "CopyPixels not called\n");
ok(g_rect.X == 5 && g_rect.Y == 5 && g_rect.Width == 2 && g_rect.Height == 2,
"got wrong rectangle (%d,%d)-(%d,%d)\n", g_rect.X, g_rect.Y, g_rect.Width, g_rect.Height);
/* whole clipping rectangle */
memset(&g_rect, 0, sizeof(g_rect));
called_CopyPixels = FALSE;
rect.X = rect.Y = 0;
rect.Width = rect.Height = 5;
hr = IWICBitmapClipper_CopyPixels(clipper, &rect, 0, sizeof(buffer), buffer);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(called_CopyPixels, "CopyPixels not called\n");
ok(g_rect.X == 5 && g_rect.Y == 5 && g_rect.Width == 5 && g_rect.Height == 5,
"got wrong rectangle (%d,%d)-(%d,%d)\n", g_rect.X, g_rect.Y, g_rect.Width, g_rect.Height);
/* larger than clipping rectangle */
memset(&g_rect, 0, sizeof(g_rect));
called_CopyPixels = FALSE;
rect.X = rect.Y = 0;
rect.Width = rect.Height = 20;
hr = IWICBitmapClipper_CopyPixels(clipper, &rect, 0, sizeof(buffer), buffer);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
ok(!called_CopyPixels, "CopyPixels called\n");
rect.X = rect.Y = 5;
rect.Width = rect.Height = 5;
hr = IWICBitmapClipper_CopyPixels(clipper, &rect, 0, sizeof(buffer), buffer);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
ok(!called_CopyPixels, "CopyPixels called\n");
/* null rectangle */
memset(&g_rect, 0, sizeof(g_rect));
called_CopyPixels = FALSE;
hr = IWICBitmapClipper_CopyPixels(clipper, NULL, 0, sizeof(buffer), buffer);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(called_CopyPixels, "CopyPixels not called\n");
ok(g_rect.X == 5 && g_rect.Y == 5 && g_rect.Width == 5 && g_rect.Height == 5,
"got wrong rectangle (%d,%d)-(%d,%d)\n", g_rect.X, g_rect.Y, g_rect.Width, g_rect.Height);
IWICBitmapClipper_Release(clipper);
}
START_TEST(bitmap)