reactos/modules/rostests/apitests/gdi32/SetDIBitsToDevice.c
2017-12-02 22:14:47 +01:00

697 lines
24 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Test for SetDIBitsToDevice
* PROGRAMMERS: Timo Kreuzer
*/
#include "precomp.h"
#include "init.h"
static void
Test_SetDIBitsToDevice_Params()
{
UCHAR ajBmiBuffer[sizeof(BITMAPINFO) + 4];
PBITMAPINFO pbmi = (PBITMAPINFO)ajBmiBuffer;
ULONG aulBits[16];
INT ret;
/* Setup the bitmap info */
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = 2;
pbmi->bmiHeader.biHeight = -4;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
/* Test a normal operation */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Test hdc == NULL */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(NULL,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 0);
ok_err(ERROR_INVALID_HANDLE);
/* Test truncated hdc */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice((HDC)((ULONG_PTR)ghdcDIB32 & 0xFFFF),
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 0);
ok_err(ERROR_INVALID_HANDLE);
/* Test invalid ColorUse */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
7);
ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* test unaligned buffer */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
(BYTE*)aulBits + 1, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* test unaligned and huge scanline buffer */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
20000000, // cScanLines,
(BYTE*)aulBits + 1, // lpvBits,
pbmi,
DIB_RGB_COLORS);
todo_ros ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* test unaligned illegal buffer */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
(BYTE*)0x7fffffff, // lpvBits,
pbmi,
DIB_RGB_COLORS);
todo_ros ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* Test negative XDest */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
-100, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Test huge XDest */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
LONG_MAX, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Test XSrc outside of the DIB */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
100, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Test YSrc outside of the DIB */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
100, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Test uStartScan outside of the DIB */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
100, // uStartScan,
5, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 5);
ok_err(0xdeadc0de);
/* Test cScanLines larger than the DIB */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
7, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
todo_ros ok_dec(ret, 7);
ok_err(0xdeadc0de);
/* Test large cScanlines */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2000, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
todo_ros ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* Test uStartScan and cScanLines larger than the DIB */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
100, // uStartScan,
7, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 7);
ok_err(0xdeadc0de);
/* Test lpvBits == NULL */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
NULL, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* Test pbmi == NULL */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
NULL,
DIB_RGB_COLORS);
ok_dec(ret, 0);
ok_err(0xdeadc0de);
/* Test huge positive DIB height, result is limited to dwHeight */
pbmi->bmiHeader.biHeight = 10000;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
1, // YDest,
2, // dwWidth,
3, // dwHeight,
0, // XSrc,
1, // YSrc,
0, // uStartScan,
7, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 4);
ok_err(0xdeadc0de);
/* Test huge negative DIB height */
pbmi->bmiHeader.biHeight = -10000;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
7, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 7);
ok_err(0xdeadc0de);
/* Test what happens when we cause an integer overflow */
pbmi->bmiHeader.biHeight = LONG_MIN;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_err(0xdeadc0de);
/* Now also test a huge value of uStartScan */
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
abs(pbmi->bmiHeader.biHeight) - 3, // uStartScan,
9, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 3);
ok_err(0xdeadc0de);
/* Now also test a huge value of uStartScan */
pbmi->bmiHeader.biHeight = LONG_MIN + 1;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
abs(pbmi->bmiHeader.biHeight) - 3, // uStartScan,
9, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 5);
ok_err(0xdeadc0de);
/* Now also test a huge value of uStartScan */
pbmi->bmiHeader.biHeight = LONG_MIN + 7;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
abs(pbmi->bmiHeader.biHeight) - 3, // uStartScan,
32, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 17);
ok_err(0xdeadc0de);
/* Test invalid bitmap info header */
pbmi->bmiHeader.biSize = 0;
SetLastError(0xdeadc0de);
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 0);
ok_err(0xdeadc0de);
}
static void
Test_SetDIBitsToDevice()
{
UCHAR ajBmiBuffer[sizeof(BITMAPINFO) + 4];
PBITMAPINFO pbmi = (PBITMAPINFO)ajBmiBuffer;
ULONG aulBits[16];
INT ret;
/* Setup the bitmap info */
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = 2;
pbmi->bmiHeader.biHeight = -2;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
/* Set pixels */
aulBits[0] = 0x11000000;
aulBits[1] = 0x00000011;
aulBits[2] = 0xFF000000;
aulBits[3] = 0x000000FF;
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_hex((*gpDIB32)[0][0], 0x11000000);
ok_hex((*gpDIB32)[0][1], 0x00000011);
ok_hex((*gpDIB32)[0][2], 0x00000000);
ok_hex((*gpDIB32)[0][3], 0x00000000);
ok_hex((*gpDIB32)[1][0], 0xFF000000);
ok_hex((*gpDIB32)[1][1], 0x000000FF);
ok_hex((*gpDIB32)[1][2], 0x00000000);
ok_hex((*gpDIB32)[1][3], 0x00000000);
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
1, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_hex((*gpDIB32)[0][0], 0x00000000);
ok_hex((*gpDIB32)[0][1], 0x00000000);
ok_hex((*gpDIB32)[0][2], 0x00000000);
ok_hex((*gpDIB32)[0][3], 0x00000000);
ok_hex((*gpDIB32)[1][0], 0x11000000);
ok_hex((*gpDIB32)[1][1], 0x00000011);
ok_hex((*gpDIB32)[1][2], 0x00000000);
ok_hex((*gpDIB32)[1][3], 0x00000000);
ok_hex((*gpDIB32)[2][0], 0xFF000000);
ok_hex((*gpDIB32)[2][1], 0x000000FF);
ok_hex((*gpDIB32)[2][2], 0x00000000);
ok_hex((*gpDIB32)[2][3], 0x00000000);
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
1, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 1);
todo_ros ok_hex((*gpDIB32)[0][0], 0x00000000);
todo_ros ok_hex((*gpDIB32)[0][1], 0x00000000);
ok_hex((*gpDIB32)[0][2], 0x00000000);
ok_hex((*gpDIB32)[0][3], 0x00000000);
todo_ros ok_hex((*gpDIB32)[1][0], 0x11000000);
todo_ros ok_hex((*gpDIB32)[1][1], 0x00000011);
ok_hex((*gpDIB32)[1][2], 0x00000000);
ok_hex((*gpDIB32)[1][3], 0x00000000);
#if 0
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
1, // uStartScan,
1, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 1);
todo_ros ok_hex(pulDIB32Bits[0], 0x11000000);
todo_ros ok_hex(pulDIB32Bits[1], 0x00000011);
ok_hex(pulDIB32Bits[2], 0x00000000);
ok_hex(pulDIB32Bits[3], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[4], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[5], 0x00000000);
ok_hex(pulDIB32Bits[6], 0x00000000);
ok_hex(pulDIB32Bits[7], 0x00000000);
/*****************/
/* Use bottom-up bitmap */
pbmi->bmiHeader.biHeight = 2;
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_hex(pulDIB32Bits[0], 0xFF000000);
ok_hex(pulDIB32Bits[1], 0x000000FF);
ok_hex(pulDIB32Bits[2], 0x00000000);
ok_hex(pulDIB32Bits[3], 0x00000000);
ok_hex(pulDIB32Bits[4], 0x11000000);
ok_hex(pulDIB32Bits[5], 0x00000011);
ok_hex(pulDIB32Bits[6], 0x00000000);
ok_hex(pulDIB32Bits[7], 0x00000000);
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
1, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
2, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 2);
ok_hex(pulDIB32Bits[0], 0x00000000);
ok_hex(pulDIB32Bits[1], 0x00000000);
ok_hex(pulDIB32Bits[2], 0x00000000);
ok_hex(pulDIB32Bits[3], 0x00000000);
ok_hex(pulDIB32Bits[4], 0xFF000000);
ok_hex(pulDIB32Bits[5], 0x000000FF);
ok_hex(pulDIB32Bits[6], 0x00000000);
ok_hex(pulDIB32Bits[7], 0x00000000);
ok_hex(pulDIB32Bits[8], 0x11000000);
ok_hex(pulDIB32Bits[9], 0x00000011);
ok_hex(pulDIB32Bits[10], 0x00000000);
ok_hex(pulDIB32Bits[11], 0x00000000);
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
0, // uStartScan,
1, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 1);
todo_ros ok_hex(pulDIB32Bits[0], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[1], 0x00000000);
ok_hex(pulDIB32Bits[2], 0x00000000);
ok_hex(pulDIB32Bits[3], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[4], 0x11000000);
todo_ros ok_hex(pulDIB32Bits[5], 0x00000011);
ok_hex(pulDIB32Bits[6], 0x00000000);
ok_hex(pulDIB32Bits[7], 0x00000000);
memset(gpDIB32, 0, sizeof(*gpDIB32));
ret = SetDIBitsToDevice(ghdcDIB32,
0, // XDest,
0, // YDest,
2, // dwWidth,
2, // dwHeight,
0, // XSrc,
0, // YSrc,
1, // uStartScan,
1, // cScanLines,
aulBits, // lpvBits,
pbmi,
DIB_RGB_COLORS);
ok_dec(ret, 1);
todo_ros ok_hex(pulDIB32Bits[0], 0x11000000);
todo_ros ok_hex(pulDIB32Bits[1], 0x00000011);
ok_hex(pulDIB32Bits[2], 0x00000000);
ok_hex(pulDIB32Bits[3], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[4], 0x00000000);
todo_ros ok_hex(pulDIB32Bits[5], 0x00000000);
ok_hex(pulDIB32Bits[6], 0x00000000);
ok_hex(pulDIB32Bits[7], 0x00000000);
#endif
}
START_TEST(SetDIBitsToDevice)
{
InitStuff();
Test_SetDIBitsToDevice_Params();
Test_SetDIBitsToDevice();
}