mirror of
https://github.com/reactos/reactos.git
synced 2025-04-05 13:11:22 +00:00
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:
parent
478b2c3e4e
commit
b779385488
5 changed files with 327 additions and 0 deletions
|
@ -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>
|
||||
|
|
7
rostests/regtests/directory.rbuild
Normal file
7
rostests/regtests/directory.rbuild
Normal 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>
|
15
rostests/regtests/gdi/gdi_regtest.rbuild
Normal file
15
rostests/regtests/gdi/gdi_regtest.rbuild
Normal 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>
|
17
rostests/regtests/gdi/testlist.c
Normal file
17
rostests/regtests/gdi/testlist.c
Normal 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 }
|
||||
};
|
||||
|
285
rostests/regtests/gdi/xlate.c
Normal file
285
rostests/regtests/gdi/xlate.c
Normal 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();
|
||||
}
|
Loading…
Reference in a new issue