From: Gregor Schneider Date: Mon, 17 Nov 2008 17:28:14 +0000 (+0000) Subject: - Restructure dib related tests, 2nd try. X-Git-Tag: backups/the-real-msvc@60644^2~144 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=ce7603048ea1b49b869c813f33481a50f3a86b06 - Restructure dib related tests, 2nd try. - Change build files accordingly svn path=/trunk/; revision=37412 --- diff --git a/rostests/dibtests/bitblt/bitblt.c b/rostests/dibtests/bitblt/bitblt.c new file mode 100644 index 00000000000..2a2c3dda85b --- /dev/null +++ b/rostests/dibtests/bitblt/bitblt.c @@ -0,0 +1,139 @@ + +/* + * Windows 2000 Graphics API Black Book + * (BitBlt Bitmap Rendering Demo) + * + * Created by Damon Chandler + * Updates can be downloaded at: + * + * Please do not hesistate to e-mail me at dmc27@ee.cornell.edu + * if you have any questions about this code. + */ + + +#include +#include + +HINSTANCE HInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam); + + +int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, + LPTSTR lpCmdLine, int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + + HInst = HInstance; + + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = HInstance; + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + /* wc.hbrBackground = reinterpret_cast(COLOR_BTNFACE + 1); */ + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszClassName = WndClassName; + + if (RegisterClass(&wc)) + { + HWND HWnd = + CreateWindow( + WndClassName, TEXT("BitBlt Bitmap Rendering Demo"), + WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | + WS_VISIBLE | WS_CLIPSIBLINGS, + 0, 0, 220, 230, + NULL, NULL, HInst, NULL + ); + + if (HWnd) + { + ShowWindow(HWnd, nCmdShow); + UpdateWindow(HWnd); + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} + +/* image related */ +BITMAP bmp; +LPCSTR filename = TEXT("lena.bmp"); +HDC HMemDC = NULL; +HBITMAP HOldBmp = NULL; + +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam) +{ + switch (Msg) + { + case WM_CREATE: + { + /* create a memory DC */ + HMemDC = CreateCompatibleDC(NULL); + if (HMemDC) + { + /* load a bitmap from file */ + HBITMAP HBmp = + /* static_cast */( + LoadImage(HInst, MAKEINTRESOURCE(1000), IMAGE_BITMAP, + 0, 0, 0) + ); + if (HBmp) + { + /* extract dimensions of the bitmap */ + GetObject(HBmp, sizeof(BITMAP), &bmp); + + /* associate the bitmap with the memory DC */ + /* HOldBmp = static_cast */ + (SelectObject(HMemDC, HBmp) + ); + } + } + } + case WM_PAINT: + { + PAINTSTRUCT ps; + const HDC Hdc = BeginPaint(HWnd, &ps); +#if 0 + try +#endif + { + + /* TODO: add palette support (see Chapter 9)... */ + + + BitBlt(Hdc, 20, 15, + bmp.bmWidth, bmp.bmHeight, + HMemDC, 0, 0, + SRCCOPY); + } +#if 0 + catch (...) +#endif + { + EndPaint(HWnd, &ps); + } + EndPaint(HWnd, &ps); + break; + } + case WM_DESTROY: + { + /* clean up */ + DeleteObject(SelectObject(HMemDC, HOldBmp)); + DeleteDC(HMemDC); + + PostQuitMessage(0); + return 0; + } + } + return DefWindowProc(HWnd, Msg, WParam, LParam); +} diff --git a/rostests/dibtests/bitblt/bitblt.rbuild b/rostests/dibtests/bitblt/bitblt.rbuild new file mode 100644 index 00000000000..b73af244acb --- /dev/null +++ b/rostests/dibtests/bitblt/bitblt.rbuild @@ -0,0 +1,9 @@ + + + . + kernel32 + user32 + gdi32 + bitblt.c + bitblt.rc + diff --git a/rostests/dibtests/bitblt/bitblt.rc b/rostests/dibtests/bitblt/bitblt.rc new file mode 100644 index 00000000000..25d17abdb36 --- /dev/null +++ b/rostests/dibtests/bitblt/bitblt.rc @@ -0,0 +1,2 @@ +1000 BITMAP MOVEABLE PURE "lena.bmp" + diff --git a/rostests/dibtests/bitblt/lena.bmp b/rostests/dibtests/bitblt/lena.bmp new file mode 100644 index 00000000000..e9916963852 Binary files /dev/null and b/rostests/dibtests/bitblt/lena.bmp differ diff --git a/rostests/dibtests/dibtest/dibtest.c b/rostests/dibtests/dibtest/dibtest.c new file mode 100644 index 00000000000..3db6168f0c2 --- /dev/null +++ b/rostests/dibtests/dibtest/dibtest.c @@ -0,0 +1,196 @@ +#include +#include +#include + +#define CELL_SIZE 10 + +static RGBQUAD Colors[] = +{ + { 0x00, 0x00, 0x00, 0x00 }, // black + { 0x00, 0x00, 0x80, 0x00 }, // red + { 0x00, 0x80, 0x00, 0x00 }, // green + { 0x00, 0x80, 0x80, 0x00 }, // brown + { 0x80, 0x00, 0x00, 0x00 }, // blue + { 0x80, 0x00, 0x80, 0x00 }, // magenta + { 0x80, 0x80, 0x00, 0x00 }, // cyan + { 0x80, 0x80, 0x80, 0x00 }, // dark gray + { 0xc0, 0xc0, 0xc0, 0x00 }, // light gray + { 0x00, 0x00, 0xFF, 0x00 }, // bright red + { 0x00, 0xFF, 0x00, 0x00 }, // bright green + { 0x00, 0xFF, 0xFF, 0x00 }, // bright yellow + { 0xFF, 0x00, 0x00, 0x00 }, // bright blue + { 0xFF, 0x00, 0xFF, 0x00 }, // bright magenta + { 0xFF, 0xFF, 0x00, 0x00 }, // bright cyan + { 0xFF, 0xFF, 0xFF, 0x00 } // bright white +}; + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + wc.lpszClassName = "DibTestClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + fprintf(stderr, "RegisterClass failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + hWnd = CreateWindow("DibTestClass", + "DIB Test", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + 25 * CELL_SIZE + 5, + 25 * CELL_SIZE + 20, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + fprintf(stderr, "CreateWindow failed (last error 0x%lX)\n", + GetLastError()); + return(1); + } + + ShowWindow(hWnd, nCmdShow); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; +} + +static void PaintCells(HDC WindowDC, WORD BitCount1, WORD BitCount2, + int XDest, int YDest) +{ + HBRUSH Brush; + RECT Rect; + UINT row, col; + BITMAPINFO *BitmapInfo; + HBITMAP DIB1, DIB2; + HDC DC1, DC2; + + BitmapInfo = malloc(sizeof(BITMAPINFO) + 15 * sizeof(RGBQUAD)); + BitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + BitmapInfo->bmiHeader.biWidth = 4 * CELL_SIZE + 9; + BitmapInfo->bmiHeader.biHeight = -(4 * CELL_SIZE + 9); // it's top down (since BI_RGB is used, the sign is operative of direction) + BitmapInfo->bmiHeader.biPlanes = 1; + BitmapInfo->bmiHeader.biBitCount = BitCount1; + BitmapInfo->bmiHeader.biCompression = BI_RGB; + BitmapInfo->bmiHeader.biSizeImage = 0; + BitmapInfo->bmiHeader.biXPelsPerMeter = 0; + BitmapInfo->bmiHeader.biYPelsPerMeter = 0; + BitmapInfo->bmiHeader.biClrUsed = 16; + BitmapInfo->bmiHeader.biClrImportant = 16; + for (col = 0; col < 16; col++) { + BitmapInfo->bmiColors[col] = Colors[col]; + } + DIB1 = CreateDIBSection(NULL, BitmapInfo, DIB_RGB_COLORS, NULL, NULL, 0); + DC1 = CreateCompatibleDC(NULL); + SelectObject(DC1, DIB1); + + BitmapInfo->bmiHeader.biBitCount = BitCount2; + DIB2 = CreateDIBSection(NULL, BitmapInfo, DIB_RGB_COLORS, NULL, NULL, 0); + DC2 = CreateCompatibleDC(NULL); + SelectObject(DC2, DIB2); + free(BitmapInfo); + + /* Now paint on the first bitmap */ + for (row = 0; row < 4; row++) + { + for (col = 0; col < 4; col++) + { + Brush = CreateSolidBrush(RGB(Colors[4 * row + col].rgbRed, + Colors[4 * row + col].rgbGreen, + Colors[4 * row + col].rgbBlue)); + Rect.left = CELL_SIZE * col + 5; + Rect.top = CELL_SIZE * row + 5; + Rect.right = Rect.left + CELL_SIZE; + Rect.bottom = Rect.top + CELL_SIZE; + FillRect(DC1, &Rect, Brush); + DeleteObject(Brush); + } + } + + /* Copy the first bitmap to the second */ + BitBlt(DC2, 4, 4, 4 * CELL_SIZE, 4 * CELL_SIZE, DC1, 5, 5, SRCCOPY); + + /* Show results on screen */ + BitBlt(WindowDC, XDest, YDest, 4 * CELL_SIZE, 4 * CELL_SIZE, DC2, 4, 4, SRCCOPY); +} + +LRESULT CALLBACK MainWndProc(HWND Wnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC WindowDC; + + switch(msg) + { + case WM_PAINT: + WindowDC = BeginPaint(Wnd, &ps); + + PaintCells(WindowDC, 4, 4, 0, 0); + PaintCells(WindowDC, 4, 8, 5 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 16, 10 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 24, 15 * CELL_SIZE, 0); + PaintCells(WindowDC, 4, 32, 20 * CELL_SIZE, 0); + + PaintCells(WindowDC, 8, 4, 0, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 8, 5 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 16, 10 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 24, 15 * CELL_SIZE, 5 * CELL_SIZE); + PaintCells(WindowDC, 8, 32, 20 * CELL_SIZE, 5 * CELL_SIZE); + + PaintCells(WindowDC, 16, 4, 0, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 8, 5 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 16, 10 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 24, 15 * CELL_SIZE, 10 * CELL_SIZE); + PaintCells(WindowDC, 16, 32, 20 * CELL_SIZE, 10 * CELL_SIZE); + + PaintCells(WindowDC, 24, 4, 0, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 8, 5 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 16, 10 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 24, 15 * CELL_SIZE, 15 * CELL_SIZE); + PaintCells(WindowDC, 24, 32, 20 * CELL_SIZE, 15 * CELL_SIZE); + + PaintCells(WindowDC, 32, 4, 0, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 8, 5 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 16, 10 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 24, 15 * CELL_SIZE, 20 * CELL_SIZE); + PaintCells(WindowDC, 32, 32, 20 * CELL_SIZE, 20 * CELL_SIZE); + + EndPaint(Wnd, &ps); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(Wnd, msg, wParam, lParam); + } + + return 0; +} diff --git a/rostests/dibtests/dibtest/dibtest.rbuild b/rostests/dibtests/dibtest/dibtest.rbuild new file mode 100644 index 00000000000..48653d8e47a --- /dev/null +++ b/rostests/dibtests/dibtest/dibtest.rbuild @@ -0,0 +1,7 @@ + + + kernel32 + user32 + gdi32 + dibtest.c + diff --git a/rostests/dibtests/directory.rbuild b/rostests/dibtests/directory.rbuild index 0fc7099c450..68d3ef88186 100644 --- a/rostests/dibtests/directory.rbuild +++ b/rostests/dibtests/directory.rbuild @@ -1,9 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/rostests/dibtests/icontest/icon.ico b/rostests/dibtests/icontest/icon.ico new file mode 100644 index 00000000000..746b9be45a0 Binary files /dev/null and b/rostests/dibtests/icontest/icon.ico differ diff --git a/rostests/dibtests/icontest/icontest.c b/rostests/dibtests/icontest/icontest.c new file mode 100644 index 00000000000..a5761bc3816 --- /dev/null +++ b/rostests/dibtests/icontest/icontest.c @@ -0,0 +1,208 @@ +#include +#include "resource.h" +#include +#include + +ULONG __cdecl DbgPrint(IN PCH Format, IN ...); + +const char titleDrwIco[] = "DrawIcon Output"; +const char titleMask[] = "Mask(AND image)"; +const char titleXor[] = "XOR(color image)"; +const char file[] = "Icon from file:"; +const char res[] = "Icon from Resorce:"; +const char cursor[] = "Current Cursor:"; +const char cursormask[] = "Cursor Mask Bitmap"; +const char cursorcolor[] = "Cursor Color Bitmap"; + +HFONT tf; +HINSTANCE hInst; + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); + +int WINAPI +WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpszCmdLine, + int nCmdShow) +{ + WNDCLASS wc; + MSG msg; + HWND hWnd; + + hInst = hInstance; + + #ifdef _GetCursorInfo + GetCursorInfo = (GETCURSORINFO)GetProcAddress(GetModuleHandleW(L"user32.dll"), "GetCursorInfo"); + #endif + + wc.lpszClassName = "IconTestClass"; + wc.lpfnWndProc = MainWndProc; + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + if (RegisterClass(&wc) == 0) + { + DbgPrint("RegisterClass failed (last error 0x%X)\n", GetLastError()); + return(1); + } + + hWnd = CreateWindow("IconTestClass", + "Icon Test", + WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, + CW_USEDEFAULT, + CW_USEDEFAULT, + 480, + 480, + NULL, + NULL, + hInstance, + NULL); + if (hWnd == NULL) + { + DbgPrint("CreateWindow failed (last error 0x%X)\n", GetLastError()); + return(1); + } + + tf = CreateFontA(14,0, 0, TA_BASELINE, FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE, "Timmons"); + + ShowWindow(hWnd, nCmdShow); + + SetTimer(hWnd, 1, 1000, NULL); + + while(GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HDC hDC; + HICON hIcon; + HGDIOBJ hOld; + HDC hMemDC; + CURSORINFO cursorinfo; + ICONINFO iconinfo; + BITMAP bmp; + RECT rc; + CHAR str[20]; + + switch(msg) + { + case WM_PAINT: + hDC = BeginPaint(hWnd, &ps); + SelectObject(hDC, tf); + SetBkMode(hDC, TRANSPARENT); + + TextOut(hDC, 160, 10, file, strlen(file)); + TextOut(hDC, 15, 85, titleDrwIco, strlen(titleDrwIco)); + TextOut(hDC, 160, 85, titleMask, strlen(titleMask)); + TextOut(hDC, 300, 85, titleXor, strlen(titleXor)); + + hIcon = LoadImage(NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE); + DrawIcon(hDC,50,50,hIcon); + + hMemDC = CreateCompatibleDC(hDC); + GetIconInfo(hIcon, &iconinfo); + DestroyIcon(hIcon); + + hOld = SelectObject(hMemDC, iconinfo.hbmMask); + BitBlt(hDC, 200, 50, 32, 32, hMemDC, 0, 0, SRCCOPY); + SelectObject(hMemDC, iconinfo.hbmColor); + BitBlt(hDC, 350, 50, 32, 32, hMemDC, 0, 0, SRCCOPY); + + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + + TextOut(hDC, 145, 150, res, strlen(res)); + TextOut(hDC, 15, 225, titleDrwIco, strlen(titleDrwIco)); + TextOut(hDC, 160, 225, titleMask, strlen(titleMask)); + TextOut(hDC, 300, 225, titleXor, strlen(titleXor)); + + hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); + DrawIcon(hDC,50,190,hIcon); + + GetIconInfo(hIcon, &iconinfo); + DestroyIcon(hIcon); + + SelectObject(hMemDC, iconinfo.hbmMask); + BitBlt(hDC, 200, 190, 32, 32, hMemDC, 0, 0, SRCCOPY); + SelectObject(hMemDC, iconinfo.hbmColor); + BitBlt(hDC, 350, 190, 32, 32, hMemDC, 0, 0, SRCCOPY); + + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + + cursorinfo.cbSize = sizeof(CURSORINFO); + if(GetCursorInfo(&cursorinfo)) + { + if(cursorinfo.hCursor && cursorinfo.flags) + { + TextOut(hDC, 160, 290, cursor, strlen(cursor)); + DrawIcon(hDC, 50, 330, cursorinfo.hCursor); + GetIconInfo(cursorinfo.hCursor, &iconinfo); + TextOut(hDC, 15, 365, titleDrwIco, strlen(titleDrwIco)); + + sprintf(str, "Hotspot: %ld; %ld", iconinfo.xHotspot, iconinfo.yHotspot); + TextOut(hDC, 15, 380, str, strlen(str)); + + if(iconinfo.hbmMask) + { + GetObjectW(iconinfo.hbmMask, sizeof(BITMAP), &bmp); + SelectObject(hMemDC, iconinfo.hbmMask); + BitBlt(hDC, 200, 330, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY); + DeleteObject(iconinfo.hbmMask); + TextOut(hDC, 160, 365 - 32 + bmp.bmHeight, cursormask, strlen(cursormask)); + + sprintf(str, "%dBPP", bmp.bmBitsPixel); + TextOut(hDC, 160, 380 - 32 + bmp.bmHeight, str, strlen(str)); + } + + if(iconinfo.hbmColor) + { + GetObjectW(iconinfo.hbmColor, sizeof(BITMAP), &bmp); + SelectObject(hMemDC, iconinfo.hbmColor); + BitBlt(hDC, 350, 330, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY); + DeleteObject(iconinfo.hbmColor); + TextOut(hDC, 300, 365 - 32 + bmp.bmHeight, cursorcolor, strlen(cursorcolor)); + + sprintf(str, "%dBPP", bmp.bmBitsPixel); + TextOut(hDC, 300, 380 - 32 + bmp.bmHeight, str, strlen(str)); + } + } + } + + SelectObject(hMemDC, hOld); + + DeleteObject(hMemDC); + EndPaint(hWnd, &ps); + break; + + case WM_TIMER: + rc.left = 0; + rc.top = 330; + rc.right = 480; + rc.bottom = 480; + InvalidateRect(hWnd, &rc, TRUE); + break; + + case WM_DESTROY: + PostQuitMessage(0); + break; + + default: + return DefWindowProc(hWnd, msg, wParam, lParam); + } + return 0; +} diff --git a/rostests/dibtests/icontest/icontest.rbuild b/rostests/dibtests/icontest/icontest.rbuild new file mode 100644 index 00000000000..37c01a5827b --- /dev/null +++ b/rostests/dibtests/icontest/icontest.rbuild @@ -0,0 +1,10 @@ + + + . + kernel32 + user32 + gdi32 + ntdll + icontest.c + icontest.rc + diff --git a/rostests/dibtests/icontest/icontest.rc b/rostests/dibtests/icontest/icontest.rc new file mode 100644 index 00000000000..68c787a9de3 --- /dev/null +++ b/rostests/dibtests/icontest/icontest.rc @@ -0,0 +1,4 @@ +#include +#include "resource.h" + +IDI_ICON ICON DISCARDABLE "icon.ico" diff --git a/rostests/dibtests/icontest/resource.h b/rostests/dibtests/icontest/resource.h new file mode 100644 index 00000000000..5d9eb75e1c4 --- /dev/null +++ b/rostests/dibtests/icontest/resource.h @@ -0,0 +1 @@ +#define IDI_ICON 101 diff --git a/rostests/dibtests/palbitblt/pal.c b/rostests/dibtests/palbitblt/pal.c new file mode 100644 index 00000000000..786eb301872 --- /dev/null +++ b/rostests/dibtests/palbitblt/pal.c @@ -0,0 +1,201 @@ +/* The idea of this test app is inspired from tutorial * + * found at http://www.theparticle.com/pgraph.html * + * * + * Developed by: Aleksey Bragin * + * Version: 1.0 */ + +#include +#include + +#define W_WIDTH 320 +#define W_HEIGHT 240 + +// special version of BITMAPINFO and LOGPALETTE for max of 256 palette entries +typedef struct +{ + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[256]; +} BITMAPINFO256; + +typedef struct { + WORD palVersion; + WORD palNumEntries; + PALETTEENTRY palPalEntry[256]; +} LOGPALETTE256; + +// The only global variable --- contents of the DIBitmap +BYTE* dibits; + +void GeneratePalette(RGBQUAD* p) +{ + int i; + for(i=0;i<256;i++) + { + p[i].rgbRed = i; + p[i].rgbGreen = i; + p[i].rgbBlue = i; + p[i].rgbReserved = 0; + } +} + +void DoBlt(HBITMAP hBM) +{ + HDC hDC,Context; + HWND ActiveWindow; + RECT dest; + HBITMAP dflBmp; + + if((ActiveWindow = GetActiveWindow()) == NULL) + return; + + hDC = GetDC(ActiveWindow); + GetClientRect(ActiveWindow,&dest); + + Context = CreateCompatibleDC(0); + dflBmp = SelectObject(Context, hBM); + BitBlt(hDC, 0, 0, dest.right, dest.bottom, Context, 0, 0, SRCCOPY); + SelectObject(Context, dflBmp); + DeleteDC(Context); + DeleteObject(dflBmp); + ReleaseDC(ActiveWindow, hDC); +} + +void UpdatePalette(HBITMAP hBM){ + int i,y; + static unsigned int c=0; + + for(i=0;i 512) + c = 0; + else + c++; // It's operation of incrementing of c variable, not reference of a cool OO language :-) + } + + DoBlt(hBM); +} + +void InitBitmap(HANDLE *hBM){ + HPALETTE PalHan; + HWND ActiveWindow; + HDC hDC; + RGBQUAD palette[256]; + int i; + BITMAPINFO256 bmInf; + LOGPALETTE256 palInf; + + ActiveWindow = GetActiveWindow(); + hDC = GetDC(ActiveWindow); + + bmInf.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmInf.bmiHeader.biWidth = W_WIDTH; + bmInf.bmiHeader.biHeight = -abs(W_HEIGHT); + bmInf.bmiHeader.biPlanes = 1; + bmInf.bmiHeader.biBitCount = 8; + bmInf.bmiHeader.biCompression = BI_RGB; + bmInf.bmiHeader.biSizeImage = 0; + bmInf.bmiHeader.biXPelsPerMeter = 0; + bmInf.bmiHeader.biYPelsPerMeter = 0; + bmInf.bmiHeader.biClrUsed = 256; + bmInf.bmiHeader.biClrImportant = 256; + + GeneratePalette(palette); + + for(i=0;i<256;i++) + bmInf.bmiColors[i] = palette[i]; + + palInf.palVersion = 0x300; + palInf.palNumEntries = 256; + for(i=0;i<256;i++){ + palInf.palPalEntry[i].peRed = palette[i].rgbRed; + palInf.palPalEntry[i].peGreen = palette[i].rgbGreen; + palInf.palPalEntry[i].peBlue = palette[i].rgbBlue; + palInf.palPalEntry[i].peFlags = PC_NOCOLLAPSE; + } + + // Create palette + PalHan = CreatePalette((LOGPALETTE*)&palInf); + + // Select it into hDC + SelectPalette(hDC,PalHan,FALSE); + + // Realize palette in hDC + RealizePalette(hDC); + + // Delete handle to palette + DeleteObject(PalHan); + + // Create dib section + *hBM = CreateDIBSection(hDC,(BITMAPINFO*)&bmInf, + DIB_RGB_COLORS,(void**)&dibits,0,0); + + // Release dc + ReleaseDC(ActiveWindow,hDC); +} + +LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam,LPARAM lParam) +{ + switch(msg){ + case WM_DESTROY: + PostQuitMessage(0); + return 0; + default: + return DefWindowProc(hWnd,msg,wParam,lParam); + } +} + + + +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,int nCmdShow) +{ + WNDCLASS WndClass; + HWND hWnd; + MSG msg; + char szName[] = "Palette BitBlt test"; + BOOL exit = FALSE; + HBITMAP hBM; + + // Create and register window class (not modified!!!!!!!!!!!1) + WndClass.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC; + WndClass.lpfnWndProc = WndProc; + WndClass.cbClsExtra = 0; + WndClass.cbWndExtra = 0; + WndClass.hbrBackground = NULL;//GetStockObject(BLACK_BRUSH); + WndClass.hIcon = NULL;//LoadIcon(hInstance,NULL); + WndClass.hCursor = NULL;//LoadCursor(NULL,IDC_ARROW); + WndClass.hInstance = hInstance; + WndClass.lpszClassName = szName; + WndClass.lpszMenuName = 0; + + RegisterClass(&WndClass); + + // Create and show window (change styles !!!!!!!!) + hWnd = CreateWindow(szName, "ReactOS palette bitblt test", + WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU, + CW_USEDEFAULT,CW_USEDEFAULT,W_WIDTH,W_HEIGHT, + 0,0,hInstance,0); + ShowWindow(hWnd,nCmdShow); + + // Prepare bitmap to be bitblt + InitBitmap(&hBM); + + // Main message loop + while (!exit) + { + UpdatePalette(hBM); + Sleep(200); + + if(PeekMessage(&msg,0,0,0,PM_NOREMOVE) == TRUE) + { + if (!GetMessage(&msg,0,0,0)) + exit = TRUE; + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; +} diff --git a/rostests/dibtests/palbitblt/palbitblt.rbuild b/rostests/dibtests/palbitblt/palbitblt.rbuild new file mode 100644 index 00000000000..8364b438788 --- /dev/null +++ b/rostests/dibtests/palbitblt/palbitblt.rbuild @@ -0,0 +1,7 @@ + + + kernel32 + user32 + gdi32 + pal.c + diff --git a/rostests/dibtests/patblt/Penguin.bmp b/rostests/dibtests/patblt/Penguin.bmp new file mode 100644 index 00000000000..ec4e1daaf93 Binary files /dev/null and b/rostests/dibtests/patblt/Penguin.bmp differ diff --git a/rostests/dibtests/patblt/patblt.cpp b/rostests/dibtests/patblt/patblt.cpp new file mode 100644 index 00000000000..86d4e7678fc --- /dev/null +++ b/rostests/dibtests/patblt/patblt.cpp @@ -0,0 +1,270 @@ + +// ------------------------------------------------------------------ +// Windows 2000 Graphics API Black Book +// Chapter 2 - Listing 2.1 (PatBlt Tracking Rect Demo) +// +// Created by Damon Chandler +// Updates can be downloaded at: +// +// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu +// if you have any questions about this code. +// ------------------------------------------------------------------ + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#include +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +HINSTANCE HInst; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam); + + +int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE, LPTSTR, + int nCmdShow) +{ + HInst = HInstance; + + WNDCLASS wc; + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.lpszClassName = WndClassName; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = HInstance; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = static_cast( + GetStockObject(BLACK_BRUSH) + ); + + if (RegisterClass(&wc)) + { + HWND HWnd = + CreateWindow(WndClassName, + TEXT("PatBlt Tracking Rect Demo"), + WS_OVERLAPPEDWINDOW | WS_CAPTION | + WS_VISIBLE | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, + NULL, NULL, HInst, NULL); + + if (HWnd) + { + ShowWindow(HWnd, nCmdShow); + UpdateWindow(HWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} +//------------------------------------------------------------------ + + +// image related +HDC HMemDC = NULL; +HBITMAP HOldBmp = NULL; +const char* filename = "PENGUIN.BMP"; +RECT RImage = {225, 110, 225, 110}; + +// tracking related +bool is_tracking = false; +HDC HScreenDC = NULL; +POINT PMouse = {0, 0}; +RECT RTrack = {0, 0, 0, 0}; +const int line_width = 5; + + +// utility function to map to/from window coordinates +void MapRect(IN HWND HWndFrom, IN HWND HWndTo, IN OUT RECT& RMap) +{ + MapWindowPoints( + HWndFrom, HWndTo, + reinterpret_cast(&RMap), 2 + ); +} +//------------------------------------------------------------------ + + +// utility function that uses the PatBlt function to +// render a tracking rectangle +void RenderTrackingRect(IN HDC HDestDC, IN const RECT& RRender) +{ + const int width = RRender.right - RRender.left; + const int height = RRender.bottom - RRender.top; + const DWORD dwROP3 = DSTINVERT; // experiment with others + + // render top bar + PatBlt(HDestDC, + RRender.left, RRender.top, + width, line_width, + dwROP3); + // render bottom bar + PatBlt(HDestDC, + RRender.left, RRender.bottom - line_width, + width, line_width, + dwROP3); + // render left bar + PatBlt(HDestDC, + RRender.left, RRender.top + line_width, + line_width, height - (2 * line_width), + dwROP3); + // render right bar + PatBlt(HDestDC, + RRender.right - line_width, RRender.top + line_width, + line_width, height - (2 * line_width), + dwROP3); + +} +//------------------------------------------------------------------ + + +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam) +{ + switch (Msg) + { + case WM_CREATE: + { + // create a memory DC + HMemDC = CreateCompatibleDC(NULL); + if (HMemDC) + { + // load the penguin bitmap + HBITMAP HBmp = static_cast( + LoadImage(HInst, filename, IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE | LR_DEFAULTSIZE) + ); + if (HBmp) + { + // get the bitmap's dimensions + BITMAP bmp; + if (GetObject(HBmp, sizeof(BITMAP), &bmp)) + { + RImage.right += bmp.bmWidth; + RImage.bottom += bmp.bmHeight; + + // realize the bitmap + HOldBmp = static_cast( + SelectObject(HMemDC, HBmp) + ); + } + else DeleteObject(HBmp); + } + } + break; + } + case WM_LBUTTONDOWN: + { + PMouse.x = LOWORD(LParam); + PMouse.y = HIWORD(LParam); + + RECT RClient; + if (PtInRect(&RImage, PMouse) && + GetClientRect(HWnd, &RClient)) + { + MapRect(HWnd, HWND_DESKTOP, RClient); + ClipCursor(&RClient); + + // grab a handle to the screen DC and clip + // all output to the client area of our window + HScreenDC = GetDC(NULL); + HRGN HClipRgn = CreateRectRgnIndirect(&RClient); + SelectClipRgn(HScreenDC, HClipRgn); + DeleteObject(HClipRgn); + + CopyRect(&RTrack, &RImage); + MapRect(HWnd, HWND_DESKTOP, RTrack); + + // render the first tracking rect + RenderTrackingRect(HScreenDC, RTrack); + is_tracking = true; + } + break; + } + case WM_MOUSEMOVE: + { + if (HScreenDC && is_tracking) + { + POINT PCurrent = {LOWORD(LParam), HIWORD(LParam)}; + const int dX = PCurrent.x - PMouse.x; + const int dY = PCurrent.y - PMouse.y; + + // erase the previous rectangle + RenderTrackingRect(HScreenDC, RTrack); + // update the postion + OffsetRect(&RTrack, dX, dY); + // render the new tracking rectangle + RenderTrackingRect(HScreenDC, RTrack); + + // update the mouse position + memcpy(&PMouse, &PCurrent, sizeof(POINT)); + } + break; + } + case WM_LBUTTONUP: + { + // clean up + if (is_tracking) + { + is_tracking = false; + SelectClipRgn(HScreenDC, NULL); + ReleaseDC(NULL, HScreenDC); + + InvalidateRect(HWnd, &RImage, true); + CopyRect(&RImage, &RTrack); + MapRect(HWND_DESKTOP, HWnd, RImage); + InvalidateRect(HWnd, &RImage, true); + + ClipCursor(NULL); + } + break; + } + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC Hdc = BeginPaint(HWnd, &ps); + try + { + // + // TODO: Add palette support... + // + + // render the penguin + BitBlt(Hdc, RImage.left, RImage.top, + RImage.right - RImage.left, + RImage.bottom - RImage.top, + HMemDC, 0, 0, + SRCCOPY); + } + catch (...) + { + EndPaint(HWnd, &ps); + } + EndPaint(HWnd, &ps); + break; + } + case WM_DESTROY: + { + // clean up + if (HOldBmp) + { + DeleteObject(SelectObject(HMemDC, HOldBmp)); + } + if (HMemDC) + { + DeleteDC(HMemDC); + } + PostQuitMessage(0); + return 0; + } + } + return DefWindowProc(HWnd, Msg, WParam, LParam); +} +//------------------------------------------------------------------ diff --git a/rostests/dibtests/patblt/patblt.rbuild b/rostests/dibtests/patblt/patblt.rbuild new file mode 100644 index 00000000000..339b2fceb6e --- /dev/null +++ b/rostests/dibtests/patblt/patblt.rbuild @@ -0,0 +1,7 @@ + + + kernel32 + user32 + gdi32 + patblt.cpp + diff --git a/rostests/dibtests/stretchblt/lena.bmp b/rostests/dibtests/stretchblt/lena.bmp new file mode 100644 index 00000000000..e9916963852 Binary files /dev/null and b/rostests/dibtests/stretchblt/lena.bmp differ diff --git a/rostests/dibtests/stretchblt/stretchblt.cpp b/rostests/dibtests/stretchblt/stretchblt.cpp new file mode 100644 index 00000000000..68b9b7a76bd --- /dev/null +++ b/rostests/dibtests/stretchblt/stretchblt.cpp @@ -0,0 +1,380 @@ + +// ------------------------------------------------------------------ +// Windows 2000 Graphics API Black Book +// Chapter 1 - Listing 1.5 (StretchBlt Zooming Demo) +// +// Created by Damon Chandler +// Updates can be downloaded at: +// +// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu +// if you have any questions about this code. +// ------------------------------------------------------------------ + +// Modified by Aleksey Bragin (aleksey at studiocerebral.com) +// to support non-uniform scaling, and output via sretchdibits +// (type something in the command line to invoke this mode, +// in future it will be source BPP) + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#include +#include +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +HWND HListBox = NULL; +HWND VListBox = NULL; +const int ID_LISTBOX = 101; +const int ID_LISTBOX2 = 102; +BOOL useDIBits=FALSE; // How to display the image - via StretchDIBits + +HINSTANCE HInst; +HINSTANCE HPrevInst; +TCHAR *cmdline; +const char* WndClassName = "GMainWnd"; +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam); + + +int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, + LPTSTR lpCmdLine, int nCmdShow) +{ + HInst = HInstance; + HPrevInst = HPrevInstance; + cmdline = lpCmdLine; + + WNDCLASS wc; + memset(&wc, 0, sizeof(WNDCLASS)); + + wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = MainWndProc; + wc.hInstance = HInstance; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = reinterpret_cast(COLOR_BTNFACE + 1); + wc.lpszClassName = WndClassName; + + if (RegisterClass(&wc)) + { + HWND HWnd = + CreateWindow(WndClassName, TEXT("StretchBlt NonUniform Zooming Demo"), + WS_OVERLAPPEDWINDOW | WS_CAPTION | + WS_VISIBLE | WS_CLIPSIBLINGS, + 0, 0, 675, 560, + NULL, NULL, HInst, NULL); + + if (HWnd) + { + HListBox = + CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", + LBS_NOTIFY | WS_CHILD | WS_VISIBLE, + 530, 5, 130, 150, HWnd, + reinterpret_cast(ID_LISTBOX), + HInst, NULL); + VListBox = + CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", + LBS_NOTIFY | WS_CHILD | WS_VISIBLE, + 530, 5+170, 130, 150, HWnd, + reinterpret_cast(ID_LISTBOX2), + HInst, NULL); + + if (HListBox && VListBox) + { +// horizontal zoom + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 25%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 50%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 75%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 100%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 125%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 150%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 200%")); + SNDMSG(HListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 300%")); +// vertical zoom + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 25%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 50%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 75%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 100%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 125%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 150%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 200%")); + SNDMSG(VListBox, LB_ADDSTRING, 0, + reinterpret_cast("Zoom 300%")); + + } + + ShowWindow(HWnd, nCmdShow); + UpdateWindow(HWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; +} +//------------------------------------------------------------------ + + +// image related +BITMAP bmp; +BITMAPINFO bmInfo; +char *bbits = NULL; // bitmap bits +const char* filename = "LENA.BMP"; +HDC HMemDC = NULL; +HBITMAP HOldBmp = NULL; + +// zooming related +float zoom_factor_h = 0.5; +float zoom_factor_v = 0.5; +RECT RDest = {5, 5, 0, 0}; +enum {ID_ZOOM25, ID_ZOOM50, ID_ZOOM75, ID_ZOOM100, + ID_ZOOM125, ID_ZOOM150, ID_ZOOM200, ID_ZOOM300}; + +LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, + LPARAM LParam) +{ + switch (Msg) + { + case WM_CREATE: + { + // check commandline + if (strlen(cmdline) != 0) + { + + useDIBits = TRUE; + } + else + useDIBits = FALSE; + + // create a memory DC + HMemDC = CreateCompatibleDC(NULL); + if (HMemDC) + { + // load a bitmap from file + HBITMAP HBmp = + static_cast( + LoadImage(HInst, filename, IMAGE_BITMAP, + 0, 0, LR_LOADFROMFILE) + ); + if (HBmp) + { + // extract dimensions of the bitmap + GetObject(HBmp, sizeof(BITMAP), &bmp); + + // fill the BITMAPINFO stucture for further use by StretchDIBits + bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmInfo.bmiHeader.biWidth = bmp.bmWidth; + bmInfo.bmiHeader.biHeight = bmp.bmHeight; + bmInfo.bmiHeader.biPlanes = 1;//bmp.bmPlanes; + bmInfo.bmiHeader.biBitCount = bmp.bmBitsPixel; + bmInfo.bmiHeader.biCompression = BI_RGB; + bmInfo.bmiHeader.biSizeImage = 0; + bmInfo.bmiHeader.biXPelsPerMeter = 0; + bmInfo.bmiHeader.biClrImportant = 0; + bmInfo.bmiHeader.biClrUsed = 0; + + // associate the bitmap with the memory DC + HOldBmp = static_cast( + SelectObject(HMemDC, HBmp) + ); + + if (useDIBits) + { + bbits = new char[bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8)]; + //GetDIBits(HMemDC, HBmp, 0, bmp.bmHeight, bbits, &bmInfo, DIB_RGB_COLORS); + + // Here goes a temp hack, since GetDIBits doesn't exist in ReactOS yet + FILE *f = fopen(filename, "rb"); + BITMAPFILEHEADER bmpHeader; + + fread(&bmpHeader, sizeof(BITMAPFILEHEADER), 1, f); + fread(&bmInfo, sizeof(BITMAPINFO), 1, f); + fseek(f, bmpHeader.bfOffBits, SEEK_SET); + fread(bbits, bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8), 1, f); + + fclose(f); + } + } + } + } + case WM_COMMAND: + { + if (WParam == MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) || + WParam == MAKEWPARAM(ID_LISTBOX2, LBN_SELCHANGE)) + { + switch (SNDMSG(HListBox, LB_GETCURSEL, 0, 0)) + { + case ID_ZOOM25: zoom_factor_h = 0.25; break; + case ID_ZOOM50: zoom_factor_h = 0.50; break; + case ID_ZOOM75: zoom_factor_h = 0.75; break; + case ID_ZOOM100: zoom_factor_h = 1.00; break; + case ID_ZOOM125: zoom_factor_h = 1.25; break; + case ID_ZOOM150: zoom_factor_h = 1.50; break; + case ID_ZOOM200: zoom_factor_h = 2.00; break; + case ID_ZOOM300: zoom_factor_h = 3.00; break; + } + + switch (SNDMSG(VListBox, LB_GETCURSEL, 0, 0)) + { + case ID_ZOOM25: zoom_factor_v = 0.25; break; + case ID_ZOOM50: zoom_factor_v = 0.50; break; + case ID_ZOOM75: zoom_factor_v = 0.75; break; + case ID_ZOOM100: zoom_factor_v = 1.00; break; + case ID_ZOOM125: zoom_factor_v = 1.25; break; + case ID_ZOOM150: zoom_factor_v = 1.50; break; + case ID_ZOOM200: zoom_factor_v = 2.00; break; + case ID_ZOOM300: zoom_factor_v = 3.00; break; + } + + // calculate the new width and height + const int new_width = + static_cast(zoom_factor_h * bmp.bmWidth); + const int new_height = + static_cast(zoom_factor_v * bmp.bmHeight); + + // is zooming in? + bool zoom_in = (new_width > RDest.right - RDest.left); + + // caculate the area that needs to be updated + RECT RUpdate = { + RDest.left, RDest.top, + RDest.left + max(new_width, RDest.right - RDest.left), + RDest.top + max(new_height, RDest.bottom - RDest.top) + }; + + // adjust the dimenstions of the + // destination rectangle + RDest.right = RDest.left + new_width; + RDest.bottom = RDest.top + new_height; + + // create an update region from the XOR combination + // of the update and destination rectangles + HRGN HUpdateRgn = CreateRectRgnIndirect(&RUpdate); + HRGN HDestRgn = CreateRectRgnIndirect(&RDest); + int result = + CombineRgn(HUpdateRgn, HUpdateRgn, HDestRgn, RGN_XOR); + + // incite a repaint + if (result != NULLREGION && result != ERROR) + { + InvalidateRgn(HWnd, HUpdateRgn, true); + RedrawWindow(HWnd, &RDest, NULL, RDW_NOERASE | RDW_INVALIDATE); + } + else if (result == NULLREGION) + { + InvalidateRect(HWnd, &RUpdate, zoom_in ? false : true); + } + + // clean up + DeleteObject(HUpdateRgn); + DeleteObject(HDestRgn); + } + break; + } + case WM_PAINT: + { + PAINTSTRUCT ps; + const HDC Hdc = BeginPaint(HWnd, &ps); +#if 0 + try +#endif + { + // + // TODO: add palette support (see Chapter 9)... + // + if (useDIBits) + { + if (RDest.right - RDest.left > 0) + { + if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0) + { + SetStretchBltMode(Hdc, COLORONCOLOR); + } + + // render the zoomed image + StretchDIBits(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + 0, 0, + bmp.bmWidth, bmp.bmHeight, + bbits, &bmInfo, + DIB_RGB_COLORS, + SRCCOPY); + } + } + else + { + if (RDest.right - RDest.left > 0) + { + + // use BitBlt when not zooming + if (zoom_factor_h == 1.0 && zoom_factor_v == 1.0) + { + BitBlt(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + HMemDC, 0, 0, + SRCCOPY); + } + else + { + if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0) + { + SetStretchBltMode(Hdc, COLORONCOLOR); + } + + // render the zoomed image + StretchBlt(Hdc, RDest.left, RDest.top, + RDest.right - RDest.left, + RDest.bottom - RDest.top, + HMemDC, 0, 0, + bmp.bmWidth, bmp.bmHeight, + SRCCOPY); + } + } + } + } +#if 0 + catch (...) +#endif + { + EndPaint(HWnd, &ps); + } + EndPaint(HWnd, &ps); + break; + } + case WM_DESTROY: + { + // clean up + DeleteObject(SelectObject(HMemDC, HOldBmp)); + DeleteDC(HMemDC); + + if (bbits) + delete[] bbits; + + PostQuitMessage(0); + return 0; + } + } + return DefWindowProc(HWnd, Msg, WParam, LParam); +} +//------------------------------------------------------------------ + + + diff --git a/rostests/dibtests/stretchblt/stretchblt.rbuild b/rostests/dibtests/stretchblt/stretchblt.rbuild new file mode 100644 index 00000000000..18031d10c5b --- /dev/null +++ b/rostests/dibtests/stretchblt/stretchblt.rbuild @@ -0,0 +1,7 @@ + + + kernel32 + user32 + gdi32 + stretchblt.cpp + diff --git a/rostests/directory.rbuild b/rostests/directory.rbuild index 4ac30a12cf2..bbd656ebcf4 100644 --- a/rostests/directory.rbuild +++ b/rostests/directory.rbuild @@ -4,6 +4,9 @@ + + + diff --git a/rostests/tests/directory.rbuild b/rostests/tests/directory.rbuild index 92bca8df9cf..70b35d2ee73 100644 --- a/rostests/tests/directory.rbuild +++ b/rostests/tests/directory.rbuild @@ -7,9 +7,6 @@ - - - @@ -25,9 +22,6 @@ - - - @@ -55,9 +49,6 @@ - - - @@ -115,9 +106,6 @@ - - - @@ -177,12 +165,6 @@ - - - - - - @@ -228,9 +210,6 @@ - - -