From 4aa4129e6fea80d244408cdc083975b73398cfbf Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 17 Nov 2008 15:05:02 +0000 Subject: [PATCH] - 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 --- rostests/dibtests/bltrop/bltrop.c | 163 +++++++++++++++++++++ rostests/dibtests/bltrop/bltrop.rbuild | 9 ++ rostests/dibtests/bltrop/bltrop.rc | 1 + rostests/dibtests/bltrop/mars.bmp | Bin 0 -> 30054 bytes rostests/dibtests/directory.rbuild | 10 ++ rostests/dibtests/vbltest/test_inv01.bmp | Bin 0 -> 462 bytes rostests/dibtests/vbltest/test_inv04.bmp | Bin 0 -> 1518 bytes rostests/dibtests/vbltest/test_inv08.bmp | Bin 0 -> 3678 bytes rostests/dibtests/vbltest/test_inv24.bmp | Bin 0 -> 7654 bytes rostests/dibtests/vbltest/vbltest.c | 178 +++++++++++++++++++++++ rostests/dibtests/vbltest/vbltest.rbuild | 10 ++ rostests/dibtests/vbltest/vbltest.rc | 4 + 12 files changed, 375 insertions(+) create mode 100644 rostests/dibtests/bltrop/bltrop.c create mode 100644 rostests/dibtests/bltrop/bltrop.rbuild create mode 100644 rostests/dibtests/bltrop/bltrop.rc create mode 100644 rostests/dibtests/bltrop/mars.bmp create mode 100644 rostests/dibtests/directory.rbuild create mode 100644 rostests/dibtests/vbltest/test_inv01.bmp create mode 100644 rostests/dibtests/vbltest/test_inv04.bmp create mode 100644 rostests/dibtests/vbltest/test_inv08.bmp create mode 100644 rostests/dibtests/vbltest/test_inv24.bmp create mode 100644 rostests/dibtests/vbltest/vbltest.c create mode 100644 rostests/dibtests/vbltest/vbltest.rbuild create mode 100644 rostests/dibtests/vbltest/vbltest.rc 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 0000000000000000000000000000000000000000..84a937c7ceb3e364984c6775dc524935e74d5d37 GIT binary patch literal 30054 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

Hy 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 + + + + + + + + + diff --git a/rostests/dibtests/vbltest/test_inv01.bmp b/rostests/dibtests/vbltest/test_inv01.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5858d285cf70f2c32962984dfd8f78ad8669e3ef GIT binary patch literal 462 zcmZ?rJ;%rZ26jMF1Bi{Fn2`Y@F#$*kb3-r_SS5t`|NlP&5Cg#h^67f0etRe_52g8` xG&_`LCYSyI)CqJSGqq?E-2n_Lc98u*ni)znLTLsVT@R6Gu%{p#LCyl22LJ&47$X1x literal 0 HcmV?d00001 diff --git a/rostests/dibtests/vbltest/test_inv04.bmp b/rostests/dibtests/vbltest/test_inv04.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9d5b35929388625c3e7a5cf981cae6f88748e81c GIT binary patch literal 1518 zcmcK4F>1pw6b9he;7(m?g30cwbDT9xF=XoKA$0E%>dql09&!OsnX+gMfefZY_Z%Rh z7;*xiKqOUUS+=An1q%H^Hu$q-tS9ODrMd^6cXoYZZ7A9uc>MVX^ZrBK9{Cf1K`;RC z?7`x50hHZo&x85-3#PAAptEl{{v5&UQT7gHMq#_zviAs#h9j8ID1^4K@of}dZCs+^ z7NJzu79>c7`3NPAtr2XDxNLRNlE^VhuF<7yyHtr{g+i%n69rX^U3SQ1Qf0QVxl9y!kM(of+chEH&uJ$BYrpD0tUB4hS5;Q~RwqKF`DTLVoG{7vg+*A# S^_hiH6mb)K#JJr!KYsz6Uqwj( literal 0 HcmV?d00001 diff --git a/rostests/dibtests/vbltest/test_inv08.bmp b/rostests/dibtests/vbltest/test_inv08.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75a19196e3f688b786d8f2398eba9c26cd8049b9 GIT binary patch literal 3678 zcmbW3%WD%s9LK-AnI@Y@ZMscbES8GBcujjpZ7(j;g;q*mJ^-H)l8aHj_%_98eKE$80^8@gn z)pnL5=QsQn@f;QH3slt_u|ItP)BSTOjwack#c)E$w5FlRe$$_mMR$HiZ}KMN%^-!J zz6&snRagZ zZD1pG`hR79RnzZ0pMxyc?7$R`(5}#~)`^@UyA z0$g5V8^<39j*Wao<+2~Dw#l@wZyZ21B{2D&(X;gy;;>JE@=4Z| z+9#oU2AI?=|JhxPmv#?rWBk-F)@&;$Su>pAEZ{SeQVUO7WV|zsWx{IMk~j8OuC{va zj}btB$$64oUp5ORcLDl{pv^PH@m`cPl*AA&1x6U(IN#?S<7NEZz^tD$F!N*i%bo>z zMz|$p*%$UA*s1ef{Yo+$~ zhD=MS86yJC6pJ-wnnJCZ?sy{w0xg+_kQ1YX{#88g$kah@n5gX-hC;3w8|0Sh@-Iu4 zT{A0?7bddKkl*i#F(I!E;C-I|VIq-;=k<_@cw0}GB~N*)FFjL$?G3h8!+W7M z5)9VgB^}PHyXTydjt=|XD7lmE-gbvb(&}CBbFY>EA?^{M&-(9Ty9Qhs|M&mxFRMf@ AXaE2J literal 0 HcmV?d00001 diff --git a/rostests/dibtests/vbltest/test_inv24.bmp b/rostests/dibtests/vbltest/test_inv24.bmp new file mode 100644 index 0000000000000000000000000000000000000000..77988e01475e9b921b54d252f7a73776c3e5c202 GIT binary patch literal 7654 zcmeI0L2kn!5Jl;_%WkSl-FIC}IY9ThhHp{H*YGVW^%_1$u0cKwIJRX|Fayk@qcMrG zgI@j&WANAY_O7g5(0<_fbjOo=wf#T1{_;$R?Lae#H0fMgE3F3!PT})PH`pxG? zBrYyaG-fWXZ+YewXXny+XeGI(Y5Gk!(z!6#3A9>V<2XjHb4lBZT#;xkxca`o9vcbT zh%12Bnyc%&x3!Um0=PD4lDKF;O1k}XVLO85jxiKf7>Wc8Ne@F1mj=ls>9s_Y!9}WV zTA;O_j~k--v>g{^S)c`4i+Ud*nlIJmqFEW)0m>%rfhctcAo?LG literal 0 HcmV?d00001 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" -- 2.17.1