Author: tkreuzer Date: Mon Aug 3 04:27:08 2009 New Revision: 42357
URL: http://svn.reactos.org/svn/reactos?rev=42357&view=rev Log: More gdi xlate tests.
Modified: trunk/rostests/regtests/gdi/xlate.c
Modified: trunk/rostests/regtests/gdi/xlate.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/regtests/gdi/xlate.c?rev=4... ============================================================================== --- trunk/rostests/regtests/gdi/xlate.c [iso-8859-1] (original) +++ trunk/rostests/regtests/gdi/xlate.c [iso-8859-1] Mon Aug 3 04:27:08 2009 @@ -2,6 +2,21 @@ #include <stdio.h> #include <windows.h> #include <wine/test.h> + +enum +{ + BMF_1BPP = 0, + BMF_4BPP = 1, + BMF_8BPP = 2, + BMF_16BPP_555 = 3, + BMF_16BPP_565 = 4, + BMF_24BPP_RGB = 5, + BMF_24BPP_BGR = 6, + BMF_32BPP_RGB = 7, + BMF_32BPP_BGR = 8 +}; + +ULONG bpp[] = {1, 4, 8, 15, 16, 24, 24, 32, 32};
static BYTE ajBits1[] = {0xAA, 0xAA, 0xAA, 0xAA, 0,0,0,0}; static BYTE ajBits8[] = {0x00, 0xFF, 0x80, 0xCC, 0,0,0,0}; @@ -14,7 +29,7 @@ static HBITMAP hbmp24bpp_a, hbmp24bpp_b; static HBITMAP hbmp32bpp_a, hbmp32bpp_b; static HDC hdcSrc, hdcDst; -static ULONG dstbpp; +static ULONG iDcFormat;
ULONG GetRealColorDepth() @@ -39,28 +54,45 @@ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(hdc, hbmp, 0, 1, NULL, pbmi, DIB_RGB_COLORS);
+ /* Call again to fill in the bitfields */ + 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; + DeleteObject(hbmp); + + switch (ulColorDepth) + { + case 1: + return BMF_1BPP; + case 4: + return BMF_4BPP; + case 8: + return BMF_8BPP; + case 16: + /* Check the red mask */ + if (bmi.aulMasks[0] == 0x7c00) + return BMF_16BPP_555; + else + return BMF_16BPP_565; + case 24: + return BMF_4BPP; + case 32: + if (bmi.bmiHeader.biCompression == BI_BITFIELDS && + bmi.aulMasks[0] == 0xff) + return BMF_32BPP_RGB; + else + return BMF_32BPP_BGR; }
/* Cleanup and return */ - DeleteObject(hbmp); - return ulColorDepth; + return BMF_32BPP_RGB; }
static ULONG -GetClosestColor(ULONG bpp, COLORREF crColor) +iXlateFromRGB(ULONG iFormat, COLORREF crColor) { ULONG ulRed, ulGreen, ulBlue;
@@ -68,38 +100,109 @@ ulGreen = GetGValue(crColor); ulBlue = GetBValue(crColor);
- switch (bpp) - { - case 1: + switch (iFormat) + { + case BMF_1BPP: return crColor ? 0xffffff : 0; - case 8: - case 15: - ulRed &= 0xF8; - ulGreen &= 0xF8; - ulBlue &= 0xF8; - printf("ulRed = %lx\n", ulRed); + + case BMF_4BPP: + case BMF_8BPP: + case BMF_16BPP_555: + ulRed = (ulRed & 0xF8) >> 3; + ulGreen = (ulGreen & 0xF8) >> 3; + ulBlue = (ulBlue & 0xF8) >> 3; + return ulRed << 10 | ulGreen << 5 | ulBlue; + + case BMF_16BPP_565: + ulRed = (ulRed & 0xF8) >> 3; + ulGreen = (ulGreen & 0xFC) >> 2; + ulBlue = (ulBlue & 0xF8) >> 3; + return ulRed << 11 | ulGreen << 5 | ulBlue; + + case BMF_24BPP_RGB: + case BMF_32BPP_RGB: + return crColor; + + case BMF_24BPP_BGR: + case BMF_32BPP_BGR: + return RGB(ulBlue, ulGreen, ulRed); + } + return 0; +} + +static +COLORREF +iXlateToRGB(ULONG iFormat, ULONG ulColor) +{ + ULONG ulRed, ulGreen, ulBlue; + + switch (iFormat) + { + case BMF_1BPP: + return ulColor ? 0xffffff : 0; + + case BMF_4BPP: + case BMF_8BPP: + case BMF_16BPP_555: + ulRed = (ulColor & 0x7C00) >> 7; ulRed |= ulRed >> 5; + ulGreen = (ulColor & 0x3E0) >> 2; 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 = (ulColor & 0x1F) << 3; ulBlue |= ulBlue >> 5; return RGB(ulRed, ulGreen, ulBlue);
- case 24: - case 32: - return crColor; + case BMF_16BPP_565: + ulRed = (ulColor & 0xF800) >> 8; + ulRed |= ulRed >> 5; + ulGreen = (ulColor & 0x7E0) >> 3; + ulGreen |= ulGreen >> 6; + ulBlue = (ulColor & 0x1F) << 3; + ulBlue |= ulBlue >> 5; + return RGB(ulRed, ulGreen, ulBlue); + + case BMF_24BPP_RGB: + case BMF_32BPP_RGB: + return ulColor; + + case BMF_24BPP_BGR: + case BMF_32BPP_BGR: + ulRed = GetRValue(ulColor); + ulGreen = GetGValue(ulColor); + ulBlue = GetBValue(ulColor); + return RGB(ulBlue, ulGreen, ulRed); } return 0; }
+static +ULONG +GetClosestColor(ULONG iFormat, COLORREF crColor) +{ + return iXlateToRGB(iFormat, iXlateFromRGB(iFormat, crColor)); +} + +ULONG +GetDIBPixel(ULONG iFormat, PVOID pvBits, ULONG x) +{ + switch (iFormat) + { + case BMF_1BPP: + // + case BMF_16BPP_555: + case BMF_16BPP_565: + return *(WORD*)((PCHAR)pvBits + x * sizeof(WORD)); + + case BMF_24BPP_RGB: + case BMF_24BPP_BGR: + return (*(DWORD*)((PCHAR)pvBits + x * 3)) & 0xffffff; + + case BMF_32BPP_RGB: + case BMF_32BPP_BGR: + return *(DWORD*)((PCHAR)pvBits + x * sizeof(DWORD)); + } + return 0; +}
static void @@ -108,7 +211,7 @@ hdcSrc = CreateCompatibleDC(0); hdcDst = CreateCompatibleDC(0);
- dstbpp = GetRealColorDepth(); + iDcFormat = GetRealColorDepth();
hbmp1bpp_a = CreateBitmap(4, 2, 1, 1, ajBits1); ok(hbmp1bpp_a != 0, "CreateBitmap failed\n"); @@ -144,12 +247,12 @@ }
void -Test_SrcMono1(UINT cBits, HBITMAP hbmpDst) -{ - ULONG c, expected; +Test_SrcMono1(ULONG iBmpFormat, HBITMAP hbmpDst, PVOID pvBits) +{ + COLORREF c, expected; + ULONG cBits = bpp[iBmpFormat]; HBRUSH hbr; RECT rect; - ULONG dstbpp = GetDeviceCaps(hdcDst, BITSPIXEL); struct { BITMAPINFOHEADER bmiHeader; @@ -167,40 +270,76 @@ 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 */ + ok(BitBlt(hdcDst, 0, 0, 2, 2, hdcSrc, 0, 0, SRCCOPY), "(%ld): BitBlt failed", iBmpFormat); + + /* Test background color */ c = GetPixel(hdcDst, 0, 0); - ok(c == RGB(255, 255, 255), "%dbpp: wrong color, expected 0, got %lx\n", cBits, c); + expected = 0xffffff; + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + /* Test foreground color */ c = GetPixel(hdcDst, 1, 0); - ok(c == RGB(0, 0, 0), "%dbpp: wrong color, expected ffffff, got %lx\n", cBits, c); + expected = 0x000000; + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + if (pvBits) + { + c = GetDIBPixel(iBmpFormat, pvBits, 0); + expected = iXlateFromRGB(iBmpFormat, GetBkColor(hdcSrc)); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + c = GetDIBPixel(iBmpFormat, pvBits, 1); + expected = iXlateFromRGB(iBmpFormat, GetTextColor(hdcSrc)); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + }
/* Set different dc fore and back colors */ SetTextColor(hdcSrc, 0xf00f0f); SetBkColor(hdcSrc, 0xf0ff0f); - SetTextColor(hdcDst, 0xffFFff); - SetBkColor(hdcDst, 0x000000); + SetTextColor(hdcDst, 0xefFee5); + SetBkColor(hdcDst, 0x100121);
/* 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); + ok(c == 0xffffff, "(%ld): wrong color, expected 0, got %lx\n", iBmpFormat, c); c = GetPixel(hdcDst, 1, 0); - ok(c == RGB(0, 0, 0), "%dbpp: wrong color, expected ffffff, got %lx\n", cBits, c); + ok(c == 0x000000, "(%ld): wrong color, expected ffffff, got %lx\n", iBmpFormat, 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 */ + ok(BitBlt(hdcDst, 0, 0, 2, 2, hdcSrc, 0, 0, SRCCOPY), "(%ld): BitBlt failed", iBmpFormat); + + /* Test background color */ 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); + if (pvBits) + expected = GetClosestColor(iBmpFormat, GetBkColor(hdcDst)); + else + expected = cBits >= bpp[iDcFormat] ? GetClosestColor(iDcFormat, GetBkColor(hdcDst)) : 0xffffff; + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + /* Test foreground color */ 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); + if (pvBits) + expected = GetClosestColor(iBmpFormat, GetTextColor(hdcDst)); + else + expected = cBits >= bpp[iDcFormat] ? GetClosestColor(iDcFormat, GetTextColor(hdcDst)) : 0; + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + if (pvBits) + { + c = GetDIBPixel(iBmpFormat, pvBits, 0); + expected = iXlateFromRGB(iBmpFormat, GetBkColor(hdcDst)); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + c = GetDIBPixel(iBmpFormat, pvBits, 1); + expected = iXlateFromRGB(iBmpFormat, GetTextColor(hdcDst)); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + } + +/* Hatch brush ****************************************************************/
/* Set dc fore and back colors */ SetTextColor(hdcDst, 0x102030); - SetBkColor(hdcDst, 0xeeccee); + SetBkColor(hdcDst, 0xeeccdd); SetBkMode(hdcDst, OPAQUE);
/* Create a hatch brush */ @@ -213,17 +352,36 @@
/* 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); + expected = cBits >= bpp[iDcFormat] ? 0x123456 : 0; + if (pvBits) + expected = GetClosestColor(iBmpFormat, 0x123456); + else + expected = GetClosestColor(iDcFormat, expected); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, 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); + expected = cBits >= bpp[iDcFormat] ? GetBkColor(hdcDst) : 0xffffff; + if (pvBits) + expected = GetClosestColor(iBmpFormat, GetBkColor(hdcDst)); + else + expected = GetClosestColor(iDcFormat, expected); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + if (pvBits) + { + c = GetDIBPixel(iBmpFormat, pvBits, 0); + expected = iXlateFromRGB(iBmpFormat, 0x123456); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + c = GetDIBPixel(iBmpFormat, pvBits, 1); + expected = iXlateFromRGB(iBmpFormat, GetBkColor(hdcDst)); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + }
DeleteObject(hbr); + +/* DIB brush ******************************************************************/
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = 8; @@ -246,36 +404,121 @@ 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); - + /* Test color 1 of the dib brush */ + c = GetPixel(hdcDst, 0, 0); + expected = cBits >= bpp[iDcFormat] ? bmi.bmiColors[1] : 0; + if (pvBits) + expected = GetClosestColor(iBmpFormat, bmi.bmiColors[1]); + else + expected = GetClosestColor(iDcFormat, expected); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + /* Test color 0 of the dib brush */ 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); + expected = cBits >= bpp[iDcFormat] ? bmi.bmiColors[0] : 0xffffff; + if (pvBits) + expected = GetClosestColor(iBmpFormat, bmi.bmiColors[0]); + else + expected = GetClosestColor(iDcFormat, expected); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + if (pvBits) + { + c = GetDIBPixel(iBmpFormat, pvBits, 0); + expected = iXlateFromRGB(iBmpFormat, bmi.bmiColors[1]); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + + c = GetDIBPixel(iBmpFormat, pvBits, 1); + expected = iXlateFromRGB(iBmpFormat, bmi.bmiColors[0]); + ok(c == expected, "(%ld): wrong color, expected %lx, got %lx\n", iBmpFormat, expected, c); + }
DeleteObject(hbr);
- -} - +}
void Test_SrcMono() { + HBITMAP hbmp; + struct + { + BITMAPINFOHEADER bmiHeader; + ULONG bmiColors[3]; + } bmi; + PVOID pvBits; + ULONG c, expected; + + SelectObject(hdcSrc, hbmp1bpp_a); + + Test_SrcMono1(BMF_1BPP, hbmp1bpp_b, 0); + Test_SrcMono1(BMF_8BPP, hbmp8bpp_b, 0); + Test_SrcMono1(BMF_16BPP_565, hbmp16bpp_b, 0); + Test_SrcMono1(BMF_24BPP_RGB, hbmp24bpp_b, 0); + Test_SrcMono1(BMF_32BPP_RGB, hbmp32bpp_b, 0); + + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = 2; + bmi.bmiHeader.biHeight = -2; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 16; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biSizeImage = 0; + bmi.bmiHeader.biXPelsPerMeter = 1; + bmi.bmiHeader.biYPelsPerMeter = 1; + bmi.bmiHeader.biClrUsed = 0; + bmi.bmiHeader.biClrImportant = 0; + hbmp = CreateDIBSection(hdcDst, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &pvBits, NULL, 0); + ok(hbmp != 0, "CreateDIBSection failed\n"); + memset(pvBits, 0x55555555, 8 * 8 * 2); + + SelectObject(hdcDst, hbmp); + + c = GetPixel(hdcDst, 0, 0); + expected = iXlateToRGB(BMF_16BPP_555, 0x5555); + ok(c == expected, "expected %lx, got %lx\n", expected, c); + + expected = 0x123456; + SetPixel(hdcDst, 0, 0, expected); + expected = iXlateFromRGB(BMF_16BPP_555, expected); + c = *(volatile WORD*)pvBits; + ok(c == expected, "expected %lx, got %lx\n", expected, c); + + Test_SrcMono1(BMF_16BPP_555, hbmp, pvBits);
- 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); - - -} + DeleteObject(hbmp); + + /* Create a 565 DIB section */ + bmi.bmiHeader.biCompression = BI_BITFIELDS; + bmi.bmiHeader.biClrUsed = 3; + bmi.bmiHeader.biClrImportant = 3; + bmi.bmiColors[0] = 0xF800; + bmi.bmiColors[1] = 0x7E0; + bmi.bmiColors[2] = 0x1F; + hbmp = CreateDIBSection(hdcDst, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &pvBits, NULL, 0); + ok(hbmp != 0, "CreateDIBSection failed\n"); + SelectObject(hdcDst, hbmp); + + Test_SrcMono1(BMF_16BPP_565, hbmp, pvBits); + + DeleteObject(hbmp); + + /* Create a 32 bpp DIB section */ + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biClrUsed = 0; + bmi.bmiHeader.biClrImportant = 0; + hbmp = CreateDIBSection(hdcDst, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &pvBits, NULL, 0); + ok(hbmp != 0, "CreateDIBSection failed\n"); + SelectObject(hdcDst, hbmp); + + Test_SrcMono1(BMF_32BPP_BGR, hbmp, pvBits); + + DeleteObject(hbmp); + +} +
START_TEST(xlate) { @@ -283,3 +526,6 @@
Test_SrcMono(); } + +// trunk: 41 failures +