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

190 lines
5.9 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Test for CreateDIBPatternBrush
* PROGRAMMERS: Timo Kreuzer
*/
#include "precomp.h"
#include "init.h"
/* New color use parameter. See support.microsoft.com/kb/kbview/108497 */
#define DIB_PAL_INDICES 2
void Test_CreateDIBPatternBrush()
{
}
void Test_CreateDIBPatternBrushPt()
{
struct
{
BITMAPINFOHEADER bmiHeader;
WORD wColors[4];
BYTE ajBuffer[16];
} PackedDIB =
{
{sizeof(BITMAPINFOHEADER), 4, -4, 1, 8, BI_RGB, 0, 1, 1, 4, 0},
{0, 1, 2, 7},
{0,1,2,3, 1,2,3,0, 2,3,0,1, 3,0,1,2},
};
HBRUSH hbr, hbrOld;
HPALETTE hpalOld;
LOGBRUSH logbrush;
SetLastError(0);
ok_hdl(CreateDIBPatternBrushPt(NULL, 0), NULL);
ok_hdl(CreateDIBPatternBrushPt(NULL, DIB_PAL_COLORS), NULL);
ok_hdl(CreateDIBPatternBrushPt(NULL, 2), NULL);
ok_hdl(CreateDIBPatternBrushPt(NULL, 3), NULL);
ok_err(0);
hbr = CreateDIBPatternBrushPt(&PackedDIB, 0);
ok(hbr != 0, "Expected success\n");
DeleteObject(hbr);
hbr = CreateDIBPatternBrushPt(&PackedDIB, 2);
ok(hbr != 0, "Expected success\n");
DeleteObject(hbr);
SetLastError(0);
hbr = CreateDIBPatternBrushPt(&PackedDIB, 3);
ok(hbr == 0, "Expected failure\n");
ok_err(ERROR_INVALID_PARAMETER);
SetLastError(0);
hbr = CreateDIBPatternBrushPt(&PackedDIB, 10);
ok(hbr == 0, "Expected failure\n");
ok_err(ERROR_INVALID_PARAMETER);
/* Create a DIB brush with palette indices */
hbr = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_COLORS);
ok(hbr != 0, "CreateDIBPatternBrushPt failed, skipping tests.\n");
if (!hbr) return;
/* Check the logbrush */
ok(GetObject(hbr, sizeof(logbrush), &logbrush), "GetObject() failed\n");
ok_int(logbrush.lbStyle, BS_DIBPATTERN);
ok_hex(logbrush.lbColor, 0);
ok(logbrush.lbHatch == (ULONG_PTR)&PackedDIB,
"invalid lbHatch. Got %p, expected %p\n", (PVOID)logbrush.lbHatch, &PackedDIB);
/* Select the brush into the dc */
hbrOld = SelectObject(ghdcDIB32, hbr);
/* Copy it on the dib section */
ok_long(PatBlt(ghdcDIB32, 0, 0, 4, 4, PATCOPY), 1);
ok_long((*gpDIB32)[0][0], 0x000000); // 0
ok_long((*gpDIB32)[0][1], 0x800000); // 1
ok_long((*gpDIB32)[0][2], 0x008000); // 2
ok_long((*gpDIB32)[0][3], 0xc0c0c0); // 7
/* Select a logical palette into the DC */
hpalOld = SelectPalette(ghdcDIB32, ghpal, FALSE);
ok(hpalOld != 0, "Expected success, error %ld\n", GetLastError());
/* Copy it on the dib section */
ok_long(PatBlt(ghdcDIB32, 0, 0, 4, 4, PATCOPY), 1);
ok_long((*gpDIB32)[0][0], 0x102030); // 0
ok_long((*gpDIB32)[0][1], 0x203040); // 1
ok_long((*gpDIB32)[0][2], 0x304050); // 2
ok_long((*gpDIB32)[0][3], 0x8090a0); // 7
/* Select back old palette and destroy the DIB data */
SelectPalette(ghdcDIB32, hpalOld, FALSE);
memset(gpDIB32, 0x77, sizeof(*gpDIB32));
/* Copy it on the dib section */
ok_long(PatBlt(ghdcDIB32, 0, 0, 4, 4, PATCOPY), 1);
ok_long((*gpDIB32)[0][0], 0x000000); // 0
ok_long((*gpDIB32)[0][1], 0x800000); // 1
ok_long((*gpDIB32)[0][2], 0x008000); // 2
ok_long((*gpDIB32)[0][3], 0xc0c0c0); // 7
SelectObject(ghdcDIB32, hbrOld);
DeleteObject(hbr);
/* Set some different values */
PackedDIB.ajBuffer[0] = 3;
PackedDIB.ajBuffer[1] = 2;
PackedDIB.ajBuffer[2] = 1;
PackedDIB.ajBuffer[3] = 0;
/* Create a DIB brush with DIB_PAL_INDICES */
hbr = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_INDICES);
ok(hbr != 0, "CreateSolidBrush failed, skipping tests.\n");
if (!hbr) return;
/* Check the logbrush */
ok(GetObject(hbr, sizeof(logbrush), &logbrush), "GetObject() failed\n");
ok_int(logbrush.lbStyle, BS_DIBPATTERN);
ok_hex(logbrush.lbColor, 0);
ok(logbrush.lbHatch == (ULONG_PTR)&PackedDIB,
"invalid lbHatch. Got %p, expected %p\n", (PVOID)logbrush.lbHatch, &PackedDIB);
/* Select the brush into the dc */
hbrOld = SelectObject(ghdcDIB32, hbr);
ok(hbrOld != 0, "CreateSolidBrush failed, skipping tests.\n");
/* Copy it on a dib section */
memset(gpDIB32, 0x77, sizeof(*gpDIB32));
ok_long(PatBlt(ghdcDIB32, 0, 0, 4, 4, PATCOPY), 1);
ok_long((*gpDIB32)[0][0], 0x77777777);
ok_long((*gpDIB32)[0][1], 0x77777777);
ok_long((*gpDIB32)[0][2], 0x77777777);
ok_long((*gpDIB32)[0][3], 0x77777777);
/* Select a logical palette into the DC */
hpalOld = SelectPalette(ghdcDIB32, ghpal, FALSE);
ok(hpalOld != 0, "Expected success, error %ld\n", GetLastError());
/* Copy it on a dib section */
ok_long(PatBlt(ghdcDIB32, 0, 0, 4, 4, PATCOPY), 1);
ok_long((*gpDIB32)[0][0], 0x77777777);
ok_long((*gpDIB32)[0][1], 0x77777777);
ok_long((*gpDIB32)[0][2], 0x77777777);
ok_long((*gpDIB32)[0][3], 0x77777777);
SelectPalette(ghdcDIB32, hpalOld, FALSE);
SelectObject(ghdcDIB32, hbrOld);
DeleteObject(hbr);
}
void Test_CreateDIBPatternBrushPt_RLE8()
{
struct
{
BITMAPINFOHEADER bmiHeader;
WORD wColors[4];
BYTE ajBuffer[20];
} PackedDIB =
{
{sizeof(BITMAPINFOHEADER), 4, 4, 1, 8, BI_RLE8, 20, 1, 1, 4, 0},
{0, 1, 2, 7},
{4,0, 0,2,0,1,0,2,3,1, 2,1, 2,2, 1,3,1,0,1,2, },
};
HBRUSH hbr;
HDC hdc = CreateCompatibleDC(0);
HBITMAP hbmp = CreateDIBitmap(hdc, &PackedDIB.bmiHeader, CBM_INIT, &PackedDIB.ajBuffer, (PVOID)&PackedDIB, DIB_PAL_COLORS);
ok(hbmp != 0, "CreateDIBitmap failed, skipping tests.\n");
/* Create a DIB brush with palette indices */
hbr = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_COLORS);
ok(hbr == 0, "CreateDIBPatternBrushPt should fail.\n");
}
START_TEST(CreateDIBPatternBrush)
{
InitStuff();
Test_CreateDIBPatternBrush();
Test_CreateDIBPatternBrushPt();
//Test_CreateDIBPatternBrushPt_RLE8(); broken
}