[PATCH] Added tests for StretchBlt
Joel Holdsworth
joel at airwebreathe.org.uk
Wed Jul 15 16:16:31 CDT 2009
---
dlls/gdi32/tests/bitmap.c | 214 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 214 insertions(+), 0 deletions(-)
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 257a4c7..bd74198 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -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,210 @@ static void test_BitBlt()
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()
+{
+ 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);
+
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCCOPY, 0xFEDCBA98, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCPAINT, 0xFFFFFFFF, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCAND, 0x88888888, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCINVERT, 0x77777777, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, SRCERASE, 0x76543210, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, NOTSRCCOPY, 0x01234567, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, NOTSRCERASE, 0x00000000, __LINE__);
+ check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, MERGECOPY, 0x00581210, __LINE__);
+ todo_wine check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, MERGEPAINT, 0x89ABCDEF, __LINE__);
+ check_StretchBlt_pixel(hdcDst, hdcSrc, dstBuffer, srcBuffer, PATCOPY, 0x00785634, __LINE__);
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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;
+ todo_wine 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 */
@@ -2472,6 +2685,7 @@ START_TEST(bitmap)
test_select_object();
test_CreateBitmap();
test_BitBlt();
+ test_StretchBlt();
test_GdiAlphaBlend();
test_bitmapinfoheadersize();
test_get16dibits();
--
1.6.0.4
--=-/FZXv/996UTTr0lblL1p--
More information about the wine-patches
mailing list