gdi32: Added tests for StretchBlt.

This commit is contained in:
Joel Holdsworth 2009-07-15 22:16:31 +01:00 committed by Alexandre Julliard
parent 4ee851452b
commit fb0b7381d0
1 changed files with 215 additions and 0 deletions

View File

@ -2252,6 +2252,15 @@ static void test_get16dibits(void)
ReleaseDC(NULL, screen_dc);
}
static BOOL compare_buffers_no_alpha(UINT32 *a, UINT32 *b, int length)
{
int i;
for(i = 0; i < length; i++)
if((a[i] & 0x00FFFFFF) != (b[i] & 0x00FFFFFF))
return FALSE;
return TRUE;
}
static void check_BitBlt_pixel(HDC hdcDst, HDC hdcSrc, UINT32 *dstBuffer, UINT32 *srcBuffer,
DWORD dwRop, UINT32 expected, int line)
{
@ -2330,6 +2339,211 @@ static void test_BitBlt(void)
DeleteDC(hdcScreen);
}
static void check_StretchBlt_pixel(HDC hdcDst, HDC hdcSrc, UINT32 *dstBuffer, UINT32 *srcBuffer,
DWORD dwRop, UINT32 expected, int line)
{
*srcBuffer = 0xFEDCBA98;
*dstBuffer = 0x89ABCDEF;
StretchBlt(hdcDst, 0, 0, 2, 1, hdcSrc, 0, 0, 1, 1, dwRop);
ok(expected == *dstBuffer,
"StretchBlt with dwRop %06X. Expected 0x%08X, got 0x%08X from line %d\n",
dwRop, expected, *dstBuffer, line);
}
static void check_StretchBlt_stretch(HDC hdcDst, HDC hdcSrc, UINT32 *dstBuffer, UINT32 *srcBuffer,
int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,
int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
UINT32 expected[4], UINT32 legacy_expected[4], int line)
{
memset(dstBuffer, 0, 16);
StretchBlt(hdcDst, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
ok(memcmp(dstBuffer, expected, 16) == 0 ||
broken(compare_buffers_no_alpha(dstBuffer, legacy_expected, 4)),
"StretchBlt expected { %08X, %08X, %08X, %08X } got { %08X, %08X, %08X, %08X } "
"stretching { %d, %d, %d, %d } to { %d, %d, %d, %d } from line %d\n",
expected[0], expected[1], expected[2], expected[3],
dstBuffer[0], dstBuffer[1], dstBuffer[2], dstBuffer[3],
nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc,
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, line);
}
static void test_StretchBlt(void)
{
HBITMAP bmpDst, bmpSrc;
HBITMAP oldDst, oldSrc;
HDC hdcScreen, hdcDst, hdcSrc;
UINT32 *dstBuffer, *srcBuffer;
HBRUSH hBrush, hOldBrush;
BITMAPINFO biDst, biSrc;
UINT32 expected[4], legacy_expected[4];
memset(&biDst, 0, sizeof(BITMAPINFO));
biDst.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
biDst.bmiHeader.biWidth = 2;
biDst.bmiHeader.biHeight = -2;
biDst.bmiHeader.biPlanes = 1;
biDst.bmiHeader.biBitCount = 32;
biDst.bmiHeader.biCompression = BI_RGB;
memcpy(&biSrc, &biDst, sizeof(BITMAPINFO));
hdcScreen = CreateCompatibleDC(0);
hdcDst = CreateCompatibleDC(hdcScreen);
hdcSrc = CreateCompatibleDC(hdcDst);
/* Pixel Tests */
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
NULL, 0);
oldDst = SelectObject(hdcDst, bmpDst);
bmpSrc = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&srcBuffer,
NULL, 0);
oldSrc = SelectObject(hdcSrc, bmpSrc);
hBrush = CreateSolidBrush(0x012345678);
hOldBrush = SelectObject(hdcDst, hBrush);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCCOPY, 0xFEDCBA98, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCPAINT, 0xFFFFFFFF, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCAND, 0x88888888, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCINVERT, 0x77777777, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCERASE, 0x76543210, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, NOTSRCCOPY, 0x01234567, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, NOTSRCERASE, 0x00000000, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, MERGECOPY, 0x00581210, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, MERGEPAINT, 0x89ABCDEF, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, PATCOPY, 0x00785634, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, PATPAINT, 0x89FBDFFF, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, PATINVERT, 0x89D39BDB, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, DSTINVERT, 0x76543210, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, BLACKNESS, 0x00000000, __LINE__);
check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, WHITENESS, 0xFFFFFFFF, __LINE__);
SelectObject(hdcDst, hOldBrush);
DeleteObject(hBrush);
/* Top-down to top-down tests */
srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
srcBuffer[2] = 0xFEDCBA98, srcBuffer[3] = 0x76543210;
expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
expected[2] = 0x00000000, expected[3] = 0x00000000;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 1, 1, expected, expected, __LINE__);
expected[0] = 0xCAFED00D, expected[1] = 0xCAFED00D;
expected[2] = 0xCAFED00D, expected[3] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 1, 1, expected, expected, __LINE__);
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
expected[2] = 0x00000000, expected[3] = 0x00000000;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 1, 1, 0, 0, 2, 2, expected, expected, __LINE__);
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
1, 1, -2, -2, 0, 0, 2, 2, expected, expected, __LINE__);
/* This result seems broken. One might expect the following result:
* 0xCAFED00D 0xFEEDFACE
* 0xFEDCBA98 0x76543210
*/
expected[0] = 0xCAFED00D, expected[1] = 0x00000000;
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
legacy_expected[0] = 0xCAFED00D, legacy_expected[1] = 0x00000000;
legacy_expected[2] = 0x00000000, legacy_expected[3] = 0x00000000;
todo_wine check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
1, 1, -2, -2, 1, 1, -2, -2, expected,
legacy_expected, __LINE__);
expected[0] = 0x00000000, expected[1] = 0x00000000;
expected[2] = 0x00000000, expected[3] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
1, 1, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
SelectObject(hdcDst, oldDst);
DeleteObject(bmpDst);
/* Top-down to bottom-up tests */
biDst.bmiHeader.biHeight = 2;
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
NULL, 0);
oldDst = SelectObject(hdcDst, bmpDst);
expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
expected[2] = 0xCAFED00D, expected[3] = 0xFEEDFACE;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
SelectObject(hdcSrc, oldSrc);
DeleteObject(bmpSrc);
/* Bottom-up to bottom-up tests */
biSrc.bmiHeader.biHeight = 2;
bmpSrc = CreateDIBSection(hdcScreen, &biSrc, DIB_RGB_COLORS, (void**)&srcBuffer,
NULL, 0);
srcBuffer[0] = 0xCAFED00D, srcBuffer[1] = 0xFEEDFACE;
srcBuffer[2] = 0xFEDCBA98, srcBuffer[3] = 0x76543210;
oldSrc = SelectObject(hdcSrc, bmpSrc);
expected[0] = 0xCAFED00D, expected[1] = 0xFEEDFACE;
expected[2] = 0xFEDCBA98, expected[3] = 0x76543210;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
expected[0] = 0x76543210, expected[1] = 0xFEDCBA98;
expected[2] = 0xFEEDFACE, expected[3] = 0xCAFED00D;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
SelectObject(hdcDst, oldDst);
DeleteObject(bmpDst);
/* Bottom-up to top-down tests */
biDst.bmiHeader.biHeight = -2;
bmpDst = CreateDIBSection(hdcScreen, &biDst, DIB_RGB_COLORS, (void**)&dstBuffer,
NULL, 0);
oldDst = SelectObject(hdcDst, bmpDst);
expected[0] = 0xFEDCBA98, expected[1] = 0x76543210;
expected[2] = 0xCAFED00D, expected[3] = 0xFEEDFACE;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 0, 0, 2, 2, expected, expected, __LINE__);
expected[0] = 0xFEEDFACE, expected[1] = 0xCAFED00D;
expected[2] = 0x76543210, expected[3] = 0xFEDCBA98;
check_StretchBlt_stretch(hdcDst, hdcSrc, dstBuffer, srcBuffer,
0, 0, 2, 2, 1, 1, -2, -2, expected, expected, __LINE__);
/* Tidy up */
SelectObject(hdcSrc, oldSrc);
DeleteObject(bmpSrc);
DeleteDC(hdcSrc);
SelectObject(hdcDst, oldDst);
DeleteObject(bmpDst);
DeleteDC(hdcDst);
DeleteDC(hdcScreen);
}
static void test_GdiAlphaBlend(void)
{
/* test out-of-bound parameters for GdiAlphaBlend */
@ -2476,6 +2690,7 @@ START_TEST(bitmap)
test_select_object();
test_CreateBitmap();
test_BitBlt();
test_StretchBlt();
test_GdiAlphaBlend();
test_bitmapinfoheadersize();
test_get16dibits();