From: Gregor Schneider Date: Mon, 17 Nov 2008 15:05:02 +0000 (+0000) Subject: - Add new directory for some dib related test restructuring, including two new tests: X-Git-Tag: backups/the-real-msvc@60644^2~147 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=4aa4129e6fea80d244408cdc083975b73398cfbf - Add new directory for some dib related test restructuring, including two new tests: - bltrop test for well known BitBlt ROPs, highlighted bugs were processed in r37268, r37269, r37372 - vbltest for testing several blit and blend functions, highlighted bugs fixed in r37139, r37168 and some overlay issues still tbd svn path=/trunk/; revision=37407 --- diff --git a/rostests/dibtests/bltrop/bltrop.c b/rostests/dibtests/bltrop/bltrop.c new file mode 100644 index 00000000000..0357beebd85 --- /dev/null +++ b/rostests/dibtests/bltrop/bltrop.c @@ -0,0 +1,163 @@ +/* + * Shows the 15 well known BitBlt raster operations + * using src, dest, pattern, a background brush and color. + * + * Created by Gregor Schneider , November 2008 +*/ + +#include +#include + +HINSTANCE hInst; +TCHAR szWindowClass[] = _T("testclass"); + +static LRESULT CALLBACK +WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static HBITMAP hBmpTest; + + switch (message) + { + case WM_CREATE: + { + hBmpTest = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); + break; + } + + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc, hdcMem; + BITMAP bitmap; + HBRUSH brush, brush2; + + hdc = BeginPaint(hWnd, &ps); + hdcMem = CreateCompatibleDC(hdc); + + GetObject(hBmpTest, sizeof(BITMAP), &bitmap); + + /* fill destination with brush */ + brush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0)); + SelectObject(hdc, brush); + PatBlt(hdc, 0, 0, 4*bitmap.bmWidth, 4*bitmap.bmHeight, PATCOPY); + /* set up a second brush */ + brush2 = CreateHatchBrush(HS_VERTICAL, RGB(127,127,127)); + + /* first select brush, then set bk color */ + SelectObject(hdc, brush2); + SetBkColor(hdc, RGB(0, 255, 0)); + + /* 15 blt op's */ + SelectObject(hdcMem, hBmpTest); + BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); + BitBlt(hdc, 100, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, DSTINVERT); + BitBlt(hdc, 200, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, MERGECOPY); + BitBlt(hdc, 300, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, MERGEPAINT); + + BitBlt(hdc, 0, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, NOTSRCCOPY); + BitBlt(hdc, 100, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, NOTSRCERASE); + BitBlt(hdc, 200, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATCOPY); + BitBlt(hdc, 300, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATINVERT); + + BitBlt(hdc, 0, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATPAINT); + BitBlt(hdc, 100, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCAND); + BitBlt(hdc, 200, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCERASE); + BitBlt(hdc, 300, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCINVERT); + + BitBlt(hdc, 0, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, BLACKNESS); + BitBlt(hdc, 100, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCPAINT); + BitBlt(hdc, 200, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, WHITENESS); + + DeleteDC(hdcMem); + EndPaint(hWnd, &ps); + break; + } + + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + + +static ATOM +MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = NULL; + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = NULL; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = NULL; + + return RegisterClassEx(&wcex); +} + + +static BOOL +InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd; + + hInst = hInstance; + + hWnd = CreateWindowEx(0, + szWindowClass, + _T("BitBlt raster operation test"), + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + 440, + 440, + NULL, + NULL, + hInstance, + NULL); + + if (!hWnd) + { + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + + +int WINAPI +_tWinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPTSTR lpCmdLine, + int nCmdShow) +{ + MSG msg; + + MyRegisterClass(hInstance); + + if (!InitInstance(hInstance, nCmdShow)) + { + return FALSE; + } + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return (int)msg.wParam; +} diff --git a/rostests/dibtests/bltrop/bltrop.rbuild b/rostests/dibtests/bltrop/bltrop.rbuild new file mode 100644 index 00000000000..9d1fd252be2 --- /dev/null +++ b/rostests/dibtests/bltrop/bltrop.rbuild @@ -0,0 +1,9 @@ + + + . + kernel32 + gdi32 + user32 + bltrop.c + bltrop.rc + \ No newline at end of file diff --git a/rostests/dibtests/bltrop/bltrop.rc b/rostests/dibtests/bltrop/bltrop.rc new file mode 100644 index 00000000000..deb50ccf35c --- /dev/null +++ b/rostests/dibtests/bltrop/bltrop.rc @@ -0,0 +1 @@ +100 BITMAP "mars.bmp" diff --git a/rostests/dibtests/bltrop/mars.bmp b/rostests/dibtests/bltrop/mars.bmp new file mode 100644 index 00000000000..84a937c7ceb Binary files /dev/null and b/rostests/dibtests/bltrop/mars.bmp differ diff --git a/rostests/dibtests/directory.rbuild b/rostests/dibtests/directory.rbuild new file mode 100644 index 00000000000..0fc7099c450 --- /dev/null +++ b/rostests/dibtests/directory.rbuild @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/rostests/dibtests/vbltest/test_inv01.bmp b/rostests/dibtests/vbltest/test_inv01.bmp new file mode 100644 index 00000000000..5858d285cf7 Binary files /dev/null and b/rostests/dibtests/vbltest/test_inv01.bmp differ diff --git a/rostests/dibtests/vbltest/test_inv04.bmp b/rostests/dibtests/vbltest/test_inv04.bmp new file mode 100644 index 00000000000..9d5b3592938 Binary files /dev/null and b/rostests/dibtests/vbltest/test_inv04.bmp differ diff --git a/rostests/dibtests/vbltest/test_inv08.bmp b/rostests/dibtests/vbltest/test_inv08.bmp new file mode 100644 index 00000000000..75a19196e3f Binary files /dev/null and b/rostests/dibtests/vbltest/test_inv08.bmp differ diff --git a/rostests/dibtests/vbltest/test_inv24.bmp b/rostests/dibtests/vbltest/test_inv24.bmp new file mode 100644 index 00000000000..77988e01475 Binary files /dev/null and b/rostests/dibtests/vbltest/test_inv24.bmp differ diff --git a/rostests/dibtests/vbltest/vbltest.c b/rostests/dibtests/vbltest/vbltest.c new file mode 100644 index 00000000000..c56885e03ba --- /dev/null +++ b/rostests/dibtests/vbltest/vbltest.c @@ -0,0 +1,178 @@ +/* + * Tests various blit and blend operations with different src + * bit depths and scaling where possbile. + * + * Created by Gregor Schneider , November 2008 +*/ + +#include +#include + +#define CURRENT_BMPS 4 +#define SCALE 1.5 +#define OFFSET 5 + +HINSTANCE hInst; +TCHAR szWindowClass[] = _T("testclass"); + +static LRESULT CALLBACK +WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static HBITMAP hbmList[CURRENT_BMPS]; + + switch (message) + { + case WM_CREATE: + { + hbmList[0] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); + hbmList[1] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(400), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); + hbmList[2] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(800), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); + hbmList[3] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(2400), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); + break; + } + + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc, hdcMem; + BITMAP bitmap; + BLENDFUNCTION bfunc; + int x = 0, y = 0, i; + + hdc = BeginPaint(hWnd, &ps); + hdcMem = CreateCompatibleDC(hdc); + + bfunc.AlphaFormat = AC_SRC_ALPHA; + bfunc.BlendFlags = 0; + bfunc.BlendOp = AC_SRC_OVER; + bfunc.SourceConstantAlpha = 128; + + for(i = 0; i < CURRENT_BMPS; i++) + { + y = 0; + SelectObject(hdcMem, hbmList[i]); + GetObject(hbmList[i], sizeof(BITMAP), &bitmap); + + /* bit blt */ + BitBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); + y += bitmap.bmHeight + OFFSET; + + /* stretch blt, org size */ + StretchBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); + y += bitmap.bmHeight + OFFSET; + + /* stretch blt, scaled */ + StretchBlt(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); + y += bitmap.bmHeight*SCALE + OFFSET; + + /* transparent blt, transparency: grey */ + TransparentBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, 128*256*256+128*256+128); + y += bitmap.bmHeight + OFFSET; + + /* transparent blt, transparency: grey, scaled */ + TransparentBlt(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, 128*256*256+128*256+128); + y += bitmap.bmHeight*SCALE + OFFSET; + + /* alpha blend, org size */ + AlphaBlend(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, bfunc); + y += bitmap.bmHeight + OFFSET; + + /* alpha blend, scaled */ + AlphaBlend(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, bfunc); + + x += bitmap.bmWidth*SCALE + OFFSET; + } + + DeleteDC(hdcMem); + EndPaint(hWnd, &ps); + break; + } + + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + + +static ATOM +MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = NULL; + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = NULL; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = NULL; + + return RegisterClassEx(&wcex); +} + + +static BOOL +InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd; + + hInst = hInstance; + + hWnd = CreateWindowEx(0, + szWindowClass, + _T("Various blit and blend operations"), + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + 640, + 640, + NULL, + NULL, + hInstance, + NULL); + + if (!hWnd) + { + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + + +int WINAPI +_tWinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPTSTR lpCmdLine, + int nCmdShow) +{ + MSG msg; + + MyRegisterClass(hInstance); + + if (!InitInstance(hInstance, nCmdShow)) + { + return FALSE; + } + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return (int)msg.wParam; +} diff --git a/rostests/dibtests/vbltest/vbltest.rbuild b/rostests/dibtests/vbltest/vbltest.rbuild new file mode 100644 index 00000000000..4478b9712a2 --- /dev/null +++ b/rostests/dibtests/vbltest/vbltest.rbuild @@ -0,0 +1,10 @@ + + + . + kernel32 + gdi32 + user32 + msimg32 + vbltest.c + vbltest.rc + \ No newline at end of file diff --git a/rostests/dibtests/vbltest/vbltest.rc b/rostests/dibtests/vbltest/vbltest.rc new file mode 100644 index 00000000000..a0da3010326 --- /dev/null +++ b/rostests/dibtests/vbltest/vbltest.rc @@ -0,0 +1,4 @@ +100 BITMAP "test_inv01.bmp" +400 BITMAP "test_inv04.bmp" +800 BITMAP "test_inv08.bmp" +2400 BITMAP "test_inv24.bmp"