Add regtests/gdi

Tests for gdi, written in winetest style so it can be easily plugged into sysreg. Currently containing some xlate tests. More to come.

svn path=/trunk/; revision=42328
This commit is contained in:
Timo Kreuzer 2009-08-02 00:26:51 +00:00
parent 478b2c3e4e
commit b779385488
5 changed files with 327 additions and 0 deletions

View file

@ -10,6 +10,9 @@
<directory name="dxtest">
<xi:include href="dxtest/directory.rbuild" />
</directory>
<directory name="regtests">
<xi:include href="regtests/directory.rbuild" />
</directory>
<directory name="rosautotest">
<xi:include href="rosautotest/rosautotest.rbuild" />
</directory>

View file

@ -0,0 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
<group xmlns:xi="http://www.w3.org/2001/XInclude">
<directory name="gdi">
<xi:include href="gdi/gdi_regtest.rbuild" />
</directory>
</group>

View file

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
<group>
<module name="gdi_regtest" type="win32cui" installbase="bin" installname="gdi_regtest.exe">
<include base="gdi_regtest">.</include>
<library>wine</library>
<library>gdi32</library>
<library>user32</library>
<library>kernel32</library>
<library>ntdll</library>
<file>xlate.c</file>
<file>testlist.c</file>
</module>
</group>

View file

@ -0,0 +1,17 @@
/* Automatically generated file; DO NOT EDIT!! */
#define WIN32_LEAN_AND_MEAN
#define __ROS_LONG64__
#include <windows.h>
#define STANDALONE
#include "wine/test.h"
extern void func_xlate(void);
const struct test winetest_testlist[] =
{
{ "xlate", func_xlate },
{ 0, 0 }
};

View file

@ -0,0 +1,285 @@
#include <stdio.h>
#include <windows.h>
#include <wine/test.h>
static BYTE ajBits1[] = {0xAA, 0xAA, 0xAA, 0xAA, 0,0,0,0};
static BYTE ajBits8[] = {0x00, 0xFF, 0x80, 0xCC, 0,0,0,0};
static WORD ajBits16[] = {0x0000, 0xFFFF, 0x1000, 0x0C0C, 0,0,0,0};
static DWORD ajBits24[] = {0x0000, 0xFFFF, 0x1000, 0x0C0C, 0,0,0,0};
static DWORD ajBits32[] = {0x0000, 0xFFFF, 0x1000, 0x0C0C, 0,0,0,0};
static HBITMAP hbmp1bpp_a, hbmp1bpp_b;
static HBITMAP hbmp8bpp_a, hbmp8bpp_b;
static HBITMAP hbmp16bpp_a, hbmp16bpp_b;
static HBITMAP hbmp24bpp_a, hbmp24bpp_b;
static HBITMAP hbmp32bpp_a, hbmp32bpp_b;
static HDC hdcSrc, hdcDst;
static ULONG dstbpp;
ULONG
GetRealColorDepth()
{
HBITMAP hbmp;
HDC hdc;
struct
{
BITMAPINFOHEADER bmiHeader;
ULONG aulMasks[3];
} bmi;
PBITMAPINFO pbmi = (PBITMAPINFO)&bmi;
ULONG ulColorDepth;
/* Get the screen DC */
hdc = GetDC(NULL);
/* Create a compatible bitmap */
hbmp = CreateCompatibleBitmap(hdc, 1, 1);
/* Fill BITMAPINFOHEADER */
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hdc, hbmp, 0, 1, NULL, pbmi, DIB_RGB_COLORS);
/* Get the basic color depth */
ulColorDepth = bmi.bmiHeader.biBitCount;
/* Special case 16 bpp */
if (ulColorDepth == 16)
{
/* Call again to fill in the bitfields */
GetDIBits(hdc, hbmp, 0, 1, NULL, pbmi, DIB_RGB_COLORS);
/* Check the red mask */
if (bmi.aulMasks[0] == 0x7c00)
ulColorDepth = 15;
}
/* Cleanup and return */
DeleteObject(hbmp);
return ulColorDepth;
}
static
ULONG
GetClosestColor(ULONG bpp, COLORREF crColor)
{
ULONG ulRed, ulGreen, ulBlue;
ulRed = GetRValue(crColor);
ulGreen = GetGValue(crColor);
ulBlue = GetBValue(crColor);
switch (bpp)
{
case 1:
return crColor ? 0xffffff : 0;
case 8:
case 15:
ulRed &= 0xF8;
ulGreen &= 0xF8;
ulBlue &= 0xF8;
printf("ulRed = %lx\n", ulRed);
ulRed |= ulRed >> 5;
ulGreen |= ulGreen >> 5;
ulBlue |= ulBlue >> 5;
printf("ulRed = %lx\n", ulRed);
return RGB(ulRed, ulGreen, ulBlue);
case 16:
ulRed &= 0xF8;
ulGreen &= 0xFC;
ulBlue &= 0xF8;
ulRed |= ulRed >> 5;
ulGreen |= ulGreen >> 6;
ulBlue |= ulBlue >> 5;
return RGB(ulRed, ulGreen, ulBlue);
case 24:
case 32:
return crColor;
}
return 0;
}
static
void
Initialize()
{
hdcSrc = CreateCompatibleDC(0);
hdcDst = CreateCompatibleDC(0);
dstbpp = GetRealColorDepth();
hbmp1bpp_a = CreateBitmap(4, 2, 1, 1, ajBits1);
ok(hbmp1bpp_a != 0, "CreateBitmap failed\n");
hbmp1bpp_b = CreateBitmap(4, 2, 1, 1, ajBits1);
ok(hbmp1bpp_b != 0, "CreateBitmap failed\n");
hbmp8bpp_a = CreateBitmap(4, 2, 1, 8, ajBits8);
ok(hbmp8bpp_a != 0, "CreateBitmap failed\n");
hbmp8bpp_b = CreateBitmap(4, 2, 1, 8, ajBits8);
ok(hbmp8bpp_b != 0, "CreateBitmap failed\n");
hbmp16bpp_a = CreateBitmap(4, 2, 1, 16, ajBits16);
ok(hbmp16bpp_a != 0, "CreateBitmap failed\n");
hbmp16bpp_b = CreateBitmap(4, 2, 1, 16, ajBits16);
ok(hbmp16bpp_b != 0, "CreateBitmap failed\n");
hbmp24bpp_a = CreateBitmap(4, 2, 1, 24, ajBits24);
ok(hbmp24bpp_a != 0, "CreateBitmap failed\n");
hbmp24bpp_b = CreateBitmap(4, 2, 1, 24, ajBits24);
ok(hbmp24bpp_b != 0, "CreateBitmap failed\n");
hbmp32bpp_a = CreateBitmap(4, 2, 1, 32, ajBits32);
ok(hbmp32bpp_a != 0, "CreateBitmap failed\n");
hbmp32bpp_b = CreateBitmap(4, 2, 1, 32, ajBits32);
ok(hbmp32bpp_b != 0, "CreateBitmap failed\n");
}
void
Test_SrcMono1(UINT cBits, HBITMAP hbmpDst)
{
ULONG c, expected;
HBRUSH hbr;
RECT rect;
ULONG dstbpp = GetDeviceCaps(hdcDst, BITSPIXEL);
struct
{
BITMAPINFOHEADER bmiHeader;
ULONG bmiColors[2];
BYTE aj[32];
} bmi;
SelectObject(hdcSrc, hbmp1bpp_a);
SelectObject(hdcDst, hbmpDst);
/* Set default dc fore and back colors */
SetTextColor(hdcSrc, 0x000000);
SetBkColor(hdcSrc, 0xffffff);
SetTextColor(hdcDst, 0x000000);
SetBkColor(hdcDst, 0xffffff);
/* Do a bitblt operation */
ok(BitBlt(hdcDst, 0, 0, 2, 2, hdcSrc, 0, 0, SRCCOPY), "%dbpp: BitBlt failed", cBits);
/* Check resulting colors */
c = GetPixel(hdcDst, 0, 0);
ok(c == RGB(255, 255, 255), "%dbpp: wrong color, expected 0, got %lx\n", cBits, c);
c = GetPixel(hdcDst, 1, 0);
ok(c == RGB(0, 0, 0), "%dbpp: wrong color, expected ffffff, got %lx\n", cBits, c);
/* Set different dc fore and back colors */
SetTextColor(hdcSrc, 0xf00f0f);
SetBkColor(hdcSrc, 0xf0ff0f);
SetTextColor(hdcDst, 0xffFFff);
SetBkColor(hdcDst, 0x000000);
/* Make sure this alone didn't affect the resulting colors */
c = GetPixel(hdcDst, 0, 0);
ok(c == RGB(255, 255, 255), "%dbpp: wrong color, expected 0, got %lx\n", cBits, c);
c = GetPixel(hdcDst, 1, 0);
ok(c == RGB(0, 0, 0), "%dbpp: wrong color, expected ffffff, got %lx\n", cBits, c);
/* Repeat the bitblt operation */
ok(BitBlt(hdcDst, 0, 0, 2, 2, hdcSrc, 0, 0, SRCCOPY), "%dbpp: BitBlt failed", cBits);
/* Finally test effect of the fore / cack color on the operation */
c = GetPixel(hdcDst, 0, 0);
expected = cBits >= dstbpp ? GetBkColor(hdcDst) : 0xffffff;
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
c = GetPixel(hdcDst, 1, 0);
expected = cBits >= dstbpp ? GetTextColor(hdcDst) : 0;
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
/* Set dc fore and back colors */
SetTextColor(hdcDst, 0x102030);
SetBkColor(hdcDst, 0xeeccee);
SetBkMode(hdcDst, OPAQUE);
/* Create a hatch brush */
hbr = CreateHatchBrush(HS_DIAGCROSS, 0x123456);
/* Fill the destination bitmap */
rect.left = rect.top = 0;
rect.bottom = rect.right = 4;
ok(FillRect(hdcDst, &rect, hbr), "FillRect failed\n");
/* Test the fore color of the hatch brush */
c = GetPixel(hdcDst, 0, 0);
expected = cBits >= dstbpp ? 0x123456 : 0;
expected = GetClosestColor(dstbpp, expected);
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
/* Test the back color of the hatch brush */
c = GetPixel(hdcDst, 1, 0);
expected = cBits >= dstbpp ? GetBkColor(hdcDst) : 0xffffff;
expected = GetClosestColor(dstbpp, expected);
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
DeleteObject(hbr);
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 8;
bmi.bmiHeader.biHeight = 8;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 1;
bmi.bmiHeader.biYPelsPerMeter = 1;
bmi.bmiHeader.biClrUsed = 2;
bmi.bmiHeader.biClrImportant = 2;
bmi.bmiColors[0] = 0xeeeeee;
bmi.bmiColors[1] = 0x111111;
memset(bmi.aj, 0xaaaa, sizeof(bmi.aj));
hbr = CreateDIBPatternBrushPt(&bmi, DIB_RGB_COLORS);
ok(hbr != 0, "CreateDIBPatternBrushPt failed\n");
rect.left = rect.top = 0;
rect.bottom = rect.right = 4;
ok(FillRect(hdcDst, &rect, hbr),"FillRect failed\n");
/* Test the fore and back color of the dib brush */
c = GetPixel(hdcDst, 0, 1);
expected = cBits >= dstbpp ? bmi.bmiColors[1] : 0;
expected = GetClosestColor(dstbpp, expected);
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
c = GetPixel(hdcDst, 1, 0);
expected = cBits >= dstbpp ? bmi.bmiColors[0] : 0xffffff;
expected = GetClosestColor(dstbpp, expected);
ok(c == expected, "%dbpp: wrong color, expected %lx, got %lx\n", cBits, expected, c);
DeleteObject(hbr);
}
void
Test_SrcMono()
{
Test_SrcMono1(1, hbmp1bpp_b);
Test_SrcMono1(8, hbmp8bpp_b);
Test_SrcMono1(16, hbmp16bpp_b);
Test_SrcMono1(24, hbmp24bpp_b);
Test_SrcMono1(32, hbmp32bpp_b);
}
START_TEST(xlate)
{
Initialize();
Test_SrcMono();
}