From ce7603048ea1b49b869c813f33481a50f3a86b06 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 17 Nov 2008 17:28:14 +0000 Subject: [PATCH] - Restructure dib related tests, 2nd try. - Change build files accordingly svn path=/trunk/; revision=37412 --- rostests/dibtests/bitblt/bitblt.c | 139 +++++++ rostests/dibtests/bitblt/bitblt.rbuild | 9 + rostests/dibtests/bitblt/bitblt.rc | 2 + rostests/dibtests/bitblt/lena.bmp | Bin 0 -> 89322 bytes rostests/dibtests/dibtest/dibtest.c | 196 +++++++++ rostests/dibtests/dibtest/dibtest.rbuild | 7 + rostests/dibtests/directory.rbuild | 21 + rostests/dibtests/icontest/icon.ico | Bin 0 -> 766 bytes rostests/dibtests/icontest/icontest.c | 208 ++++++++++ rostests/dibtests/icontest/icontest.rbuild | 10 + rostests/dibtests/icontest/icontest.rc | 4 + rostests/dibtests/icontest/resource.h | 1 + rostests/dibtests/palbitblt/pal.c | 201 +++++++++ rostests/dibtests/palbitblt/palbitblt.rbuild | 7 + rostests/dibtests/patblt/Penguin.bmp | Bin 0 -> 106226 bytes rostests/dibtests/patblt/patblt.cpp | 270 +++++++++++++ rostests/dibtests/patblt/patblt.rbuild | 7 + rostests/dibtests/stretchblt/lena.bmp | Bin 0 -> 89322 bytes rostests/dibtests/stretchblt/stretchblt.cpp | 380 ++++++++++++++++++ .../dibtests/stretchblt/stretchblt.rbuild | 7 + rostests/directory.rbuild | 3 + rostests/tests/directory.rbuild | 21 - 22 files changed, 1472 insertions(+), 21 deletions(-) create mode 100644 rostests/dibtests/bitblt/bitblt.c create mode 100644 rostests/dibtests/bitblt/bitblt.rbuild create mode 100644 rostests/dibtests/bitblt/bitblt.rc create mode 100644 rostests/dibtests/bitblt/lena.bmp create mode 100644 rostests/dibtests/dibtest/dibtest.c create mode 100644 rostests/dibtests/dibtest/dibtest.rbuild create mode 100644 rostests/dibtests/icontest/icon.ico create mode 100644 rostests/dibtests/icontest/icontest.c create mode 100644 rostests/dibtests/icontest/icontest.rbuild create mode 100644 rostests/dibtests/icontest/icontest.rc create mode 100644 rostests/dibtests/icontest/resource.h create mode 100644 rostests/dibtests/palbitblt/pal.c create mode 100644 rostests/dibtests/palbitblt/palbitblt.rbuild create mode 100644 rostests/dibtests/patblt/Penguin.bmp create mode 100644 rostests/dibtests/patblt/patblt.cpp create mode 100644 rostests/dibtests/patblt/patblt.rbuild create mode 100644 rostests/dibtests/stretchblt/lena.bmp create mode 100644 rostests/dibtests/stretchblt/stretchblt.cpp create mode 100644 rostests/dibtests/stretchblt/stretchblt.rbuild 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 0000000000000000000000000000000000000000..e9916963852a9748baf1b9ac6093fb3b9179dbbc GIT binary patch literal 89322 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..746b9be45a057fa2c0111e079955a733c655d4e5 GIT binary patch literal 766 zcmZ{iv2uej5JZ=d88S9APLcn%QsOz)*{@oMAe>gRuof_QZ+nnN<^C^zT3p{YL8!w!v!|~LxQ1AyP zTijSt@0`ov%z|(n$B7$5Nm|&@I?n!n=t?gHs2{FFmjV#mm7D@%+dF#z{2`)z1p*mF zX9mcQ&I}Ntc;Z&}iaTK{s9)D6RtM(^)l$45H^U!VIq~}xW61qF`~a6P;P?rgsLPF4 qB)GC@$f<%l@X{O=W0#7$593vx6@Xm20R?*ea{OajUp8X31aqG$e literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ec4e1daaf93a7a27636f529bba69807356f3aff6 GIT binary patch literal 106226 zcmb@vy|o@mwrz*!LQ6ED1P&Mg11J>)ijZIfY&bRm22g@R7yyX|K;;-E0X9IP19)rB zwRdEG2dAq0@;-ESR%B%S?zQ$$MCO<0|M)-uzyIrhyyD-R{QrN?|Nrm&|NqVZ|HrHU zE$3IS{-3$;#hiZq_?hFcA3u8h`uXFppFjWl`QytEjwCGbBl*9QLq3HmwpB>4 z$-&^K*(R8ycia1%zdD$0u$f=d4vl|Hf?6KTvFS9P{ER9E%uM=M(q3Bl8|`d)2eXrE z74Np>uOHu1w_Qx{x9-x&im_$VOUIK-j&wQ+x@(yf_+~9GlbPdHv7fdAl^7SxWES!n zM5lCh{1a$@{!E#f|8?sU&1uR;V8--CVu&&lDV)NCXaY$lEbvN7{K&C83Xnbm?HH_R z-EY507e%VjTFWpJ8}V{zQKAgb2IgsB_8>dN+Pe1M0dP*HgxDP6H=i+BF|#)9WvkQF zl!PK=E-=&`-rR>hy$_t=r&Jx)rjdy~dT#Gb96qH-i?z*SUp%7jXgoSC1AgUFcm}Y` z7^pfl#KEir7%F~_&|-2Ju4Sf?s+|BAfH|jFg=P6p(pzFC50s7)Ov#mgwQbJL3=FEE zYO(?+fsX3buWItY^xEb_?9C}=w$nQap z68s4g4Emfc++z349o(?wYRY!5@<^fRMuKCFVN%-9tsCSA?7Q^EMlcQ}1tWL}2`zZ+ zc&_d`+BR#Olsvr*z_cdbw11I+#@oJk)A*EM)O(4|{~;cNksdi9uA0gOlOw&7LuPQ| z%-Ae51!Pa#Yzv+#%rSMps@ctiIyo4a=bb(|Q!Cj2`UTQxJh^j>kLMC9U=M@3{9ss* z$1_|{fhKxRnJXVbEQfBwO0$$%Eu88|N{cF}GykUd403zi(`1f(X_@1G*>ujWYvOtJ zZPqdu_NP0I0sJ^EGYea0*d!Jn5%pFfQH&Nq(ZMex9N>Yi*k=IARH0kf2FWah&a1Ub zvgChFT`-~rC{?^F&!&5RCA1p(s(#L6@HGab)&o`QlmYi9ihY}QC_|2>PtHRD=1DOp zJmA#>U@)RcVyBM;gy)7mlJT;LQb7B$K(6~(?17d>gglAldyaUUw!v#8 zgHCF_LZ<_RmS4A>OOBg1Z|MiUf3Op@P%Ih8L;8iw%)FBy%^0L__Ez~K){(5JG`*RT z{-*-4IS09*!jZeV1?0D*jTFwFTiwEgXe&Nz_Ew;c&+xYT^bW4!K{dX3j{!h3apcj? zDNwxxDg?5Mt^m!6F`zs^TEK+yzcf0~ZeJP?gilj;iX|xFJU=%8!G67a^*)tN4E8v9 z41S8~hMz-zC~~yFon2IjEMx=unM1X(hN##VV6?&cKgcxY&+%0(7rX)Z+->3j7N}BQ z)SLLUmxl_cKy%6!=#t~B#QOU5_3IPG$ehIIA5Wj;R)_ud$I}cr130~dW#$V2&Ryw6 zfG8rFkYg<~Vu293i+q$4;H5P!1o$Z&1$$v>Q{XMY=(_FW>D#G^=1T~9KrMzuJ7OQh zuHGN~)cdIZAf0?>ayuM{fx=QJcc=Qdi87Kij6N0NFE(%n+60qCSmY}{P4uMADXulJ zN4_RL2a;;}h5gf~Z|`z^`26m}r>CdSPn@6Lefm6X_-rER7W3hdrQiHmdpm;|jg@5pn3ZuT)t#46BiXBb;q*4a3r?2lme0}SKv z=d|$d)7N)TpWi(_luvaJcq4mAe3>>aY=iHfLNB=z@}j9fOh~aN*1yTB*T8?}48`N`4T&Y`tQTj^FIp5P!I4%`&6HTLtU!R_U{OQ9t zj=hoGL~re0`4o_5! z>V7LtwW_{$-gT!=2r5iBGl3d_odZ-5VCP&BJV#ds1pC6@yGdh0126(r&=_;{vZ{&p zAN)k9x+|hpM4SSFx~MzaELa@O@*q*$r(c2p3kT}HM-a{N1FQbl#8cq^sg@sW|EXHe z@KpDAZ{r|j4<3OK0lok5A<@Q~x>~qmKl%U_szrGMxCvcSVU?9&`d*^wtFv;LJwKE&-| z(x+cvo*)6-QomLGAFto1sgwyt=;HO;ar5tzsLL<#up~KQq4`7rvHVY9kLnlo#r}SI zvjm!`GGl${Wwa6a(1Oej2u8VwABp)l>@NzOZ{|FN0N+;VtpJ(fyWovX4& zW@HB|#U9BH%MfugkF3GFdf)S11g6D43uO+YGZgLyXOI~EP9|D~slOF~CCR^MqJ;rI zHshe)jbz4l9kq4?e|S*ykTX0;!~hS(5*L#(gaHd}twJzP?@1>l{KUZmA*;#_`oj1G zD6TWVe9Btm(-{8)e6*Zn%B(xXo1V8+L{4$NRb+^x!SRu!+r!F~$g)pet{lnM3$ zTO)4?R(e{3N2XlFNl)d}pey!{rYfG2ur+522s!>~X6Pi(w1GTjI(ZjeqiQHOKt`-$ zJbqmU6!JkjkiVA=hY*k;c(@)*G?xKXQV=3xRA#e6 zweASM{rH7sVV{F=Oc~jbS9HaGgS!EH_?}5dGa}QNXw~@SYtW5A{1!c_8Y^DJ_2d(ydAn_>sbK2l@-lK;n!6H5iNZXE3hAB9Tse z>;!X*O$f`dJo)_er0)+6KF0uTv3o7#CiXdlE(9GlTWH7C&X$otmJJI~l~YV}7hE_B zx#?Q>uJO?I82_Mquy?m-#I&ui-x3)noKQ zp($Y`seKxZ!J;`UaAXd^sN7xS7qta`)qT_$z5n&oBk`Tq{zUlh^xeslwoVWLAL$a9 zJ2K>3d65HQM+qdsq+vRom;;4SaS4fU8vOq2tGC&SWBo1C)$Azry5VRcBL3lqt}uIP zv%OX9LD5n1=GNMLpVO~e{}s)~)EDn03Uf#Rp_yYUrf}PzxwMPS<<9AIdEej7hNJuj zel{Q3T^4&tp!Q3b*4^_V!J1Ws473A3uXF9;Bfi02fF|ZIa8y~d&5ZUkdY?n=-P0ZH zNvDtzK$ie(?bFa5du1vsBcL=|Nnt;QcE+s%NX|&D!dmRn30-MdP_gQS@#YvSp~Mk7 z5jZ91vM^ldV&684%CL|TjvhA$)K{&UAZcC~Fx@kTq4_hZ!|5jA&>W}7Yf^@*DbOKJ zNp~hvCYPA~cX9kVFaYm`KYPrdi~tt<;|q=!9TF5j@_kEZ3yko&dsP3y)QhPzk_s63 zV2^EA<30b1`~Q`HKSTTmeXan3KM4mywV0F5v&$(cG-u%&T4O^y3n^d1ND1Anf!c2U+`@Pc+ zDFwtBbx+PrbLQ1s$<*2x`|eH}#3kC#qQCZ^ou5y6!lV-!?cccgW;i1~q>6HP;u(Cz zevENRP@S%Mr*Lh);#&Kk$tM3NHb3D1^^3h7@z(uAjk^C>g52*V6)KTbZudDC`*y4j z&B(Cxp@k9OPyqo&vJr%mn#)C93~Gl5=H#TzoC^}Dh}K|cdchM{BDlqJ6BOv-__sWn z+s=6U`h{lR&a40<^eNoQ(qO0Hbnx8gl7!QY0gI`J0nH)q%Vk%62T85GnjAze-#S%i*1p5Dts&V_Rl*ryDy6ybdC9{7`B zf>W{MY$MF8hr*?Is;BGB!YOYp!UB645(8(B6-xn==u3jdUQ3WAV%CRo{1f&|0)4^Q z{{?=0Kd3Lv*z=Vn?`NI?pTPr%rvCX^8^GL61bhCW+>u)TVe|dxsxMO|%RABj)DdPZ zMCUoEBQj=wx|gIv+Xz7NUZP1!twLXs9tEnsMckQN+P@B)?d1ihz@+3s7sxXa_5NU= zp_=Y?jaULFiA=}=LsK!H9%*pPq@+}KNIN^nP&<+Q5*__s?2}W*lK?i#;NZd!%|4f) zn^=$a9!C;SU-F+%PYL}Ve1B?TDQ8hF1MDcqz$N}sxg*}p>y8D}EENp#1RnUsKJpsu z3$l1e?;(hEC@sLAO!#q_QSsf*nJ3_7dOahBy>v_+7SiDo;d;Krt>{}lncS_=TkK2R zlbYSZ)K%qH)t!O81fe=w$frPhNm$dt6zMc;-9&%gA%FGsbU%;V$L`{YLs$tVweT@L(4p{iHD{zbd z!CoHl2!|)R*Z{3UB;T%KfFuwL@fL+blk=E54FG$(IDkcW0L~>Uo-1TJ2O%LB$0>+h zibZ^&nDRM`S&k&)Y_BA5@;Lf zV#Z_sHrQH9!8YlaF604KSn&fSIk!eEW4=9l3tAUcC(GR)0cp&@gaW-B|1E^o{yY?T z`{CW&x9{G+XT`q}K#YGvzitQ)xEUEtFNp|qg@L+x@unVJu@lv?a5@1aa%a%+A=1%;Tid_UrlfGe7zi;^A4HQIA=q2E-cSj=|6!76#2QVwi>?{YqPNS9(?VBCrT#S}}$7EXb!f@TBl?CI+J z+hES{c*aTHp%k{X6Pd0%D$GN0O|gV~nYGPA8Xy6cCU%XN9Bv7`=j`-7J-vSW{`K3p zo|6Fh*D(g!`-{!5U8$RQ3=AWg6$n#6_0LLs@`LoP0Oc*_lr7IY+Erf=<=+K)E`n?S zjo#m|CqI_A|BwY%0ff+gIw)abfZAUkAiI<~V2luxNedPC$QtEK4rXRaD_}dFGV+>f&IJ{fG+hYU=2}+$>3x{DlMG;VGN=DB3O~b=_w|7JLu6syUfaCq?3x z1K#fBRCl!masN^JcgA{2lgR5T@1I`3dHe1UjwDI~&hOvP%U(fum40Uj*inOOLeEOz z1awTH;u>&4nV_u-pIDCzvgXEvx~HbVd#^y}%+)<-TtLW?riSK9f&3>%F}8lZY?s9^XF+V!)*H z#z&0kN~}hXVIYU|uW3RtRTO)PT~=8|ozRVOk90wRBC~Pr{616 zuITLBU=0AZ)T(1$oSm(~gYssu@s=1f-y{HD`#-ARIA9{UF7xXCd8LO}fZXlL_Wn7t z&;R}V8r=tJ|2Hqz=KnXF+3IW>56p)FBx2vlhy*gdK~l63VkPU{U)j<*#T0jn z75*?rsD>yh#t|Ftv#287rlwOEW{>UkjH=D9#?!uOYE7FB2{XZg{A$OXP8ps}(3b=} z(D+?qF#sgg?^^$aglzP>%bN|pyx+yqSNwR&_v8D@_i)~_5-%Gsy1pg!?fjJrjw11FihbQ<$f=@*0|I0w1 zhW-wFwC2CuSDbF=d_O-EM0L*ST7V;2k(LLOM#^PIGz>^Yj*=c#_vDWrUzxEDZZwJg zjTX~IL{DF#OS`_Er1o4Xj$$H5+u(5eaX2Akr_*#>thUtd67j_pFTEZ7WnN7A}nK49spZ>b4yQgI46 zDNM-p%j`NfC%BJxg#2#pa~Ff}!TaM4@=<-adb;rQ6)pn3vHSynTs~(1fbmi={u?O2 zapj@J4f}`u=NJFjiUYzzMnFh`$(%VWWx)oXJ(_M6AyLYKVNLENtcWh|f!sGub<+>p zd?=y;U<+zNf;|~ws(__+&v=MNH6a&KIwJ-qaZ}zkr$aJRDoCR;Ccd#on`vel({+zOH_3K9)ZL|F`GBc>Oy%x12+lsd{exTkOy7{fnJmR;Xe% zzTG8F;4j!H4WYhrM<`?Su>|5F@Z#a!3*CBsa1s*qtcMiQ4BXWE+&zx~>c54#Ix1#% z2Lm_+X%c95vCqJ`JMgppw_`|o%Q&5#AS2ndL{tYNjY|iH2g88sIxyn`aP~a4%O0Qh zpXEMLUhvNQJjQx@{g{VAZUGG)AOGe0dDdfr>#FZ+o@;6zUYy*AL|gu?i()@|kJ2CD zYx+=~NbN{`;2&~WhP#tczPTK*gGa5m)gx%++on!_E>HQrby*Sb9{g%2h7AWc6XF_l z8EuPAM-HjLw;g8Gk@S``IyTIS^nH!SePVAMF#f*qkL70zi0Du3v+X1HID6jZsu>{h z`SZ=}-(mT8cpubml^*o|kyE$kZpmBSTQd65h^E>g>z4-@I&>m0IFPU4BH5PFO}0P* zTSZLC0Y3Tb2rjg4=mw!X6@aShOF}}h0r1!w3xUh(bW{$qI(@Sx8IP@%0Xu$*fqf}> z1{3%>W{#P%S{^k}zXy2sbgTW%Z@^#FyX4aV_!B-};`WzZfj>5%psyhtvaiekx7gfZ zdQ5`-KPviv)bwB9GYyYExjEPu|<; zt8TuM3idrJ7v{M+=QX$70&m1R-V~xJ(9I7*!k}6=XrJ&Z@Q8;PTkHZ-%)n-`$1rSq zGMi&GkXt=UIFK&(;|pdY)51mo87HHfV|kFvw7K~S>+)0ZKFvZg#=O_Zi@kRK5JIo7 z<%bh|55~^~iG0m|-sFE5vwx}nh0tT_5w8c(uZv*6yYw%_2v<3po(4B_|C@Y&TiT6G zF$UKPku$&#_Nx;hcMgPALFc?t6#%Rdca=XNf#2SBDL-qulMjlEU%(jHvL|mxZFVxZ z*a4DJg$;cy=BPU6Q=p?wU$n5pNam@?t)cbNfie40=n#SjIm)EQ|F*Mhpf_9`zFGTU?>t;wIQ|>GKebN6#%?~s8$W+BKEXx=CvniN2!KCwv_Q*D z$st7HzZH1EUf3e;M~P!0x|4I=8sNLZ2RwR;F$0HE+Ya&C=_u*L8^%faHgu%?a&Z$( zXVX(r8>4NT@@b*GuTLDauYW`(8u!5o3Nz?W zd%KRHY7KsqlZ5+v)S_8{1VRuJ$ef#RM;S@pD4#Md+;O&WD|Sd!q!F+`O>wL2yjWtJ z5V}YY14Me#0UpO+$T=JBV;&6dqWTT@4g+Fk{{yrC0`y%YoRz{qWB+eZpXQ_YF-jNq zH{}-oOO-)-fd~GE2oYK2sQwu)6(QpAyQ&3#5jET^gu(#!@kd>Y4@jvP>9oxZa`6Dp zMdbjtT?=8Obo;$=VlYmFh1>x%HD`Lrlo>hTbT_?p`Zv6JrG-l@zmWU0!@wNueRq3E zU<}B200o|C9|ByD^$vb7Abe1{Iq{pRJ~hsMeo_ASL4-9a%>O6Q`~EYpom>E`Ub#fi z3btp(sugW!^6#1n;pTga|+-0~T+ff)*e|cZVNW z0T`KM3RsNS_06#hCUqdU7=?R_mfI#dEtUxm%_?-z(%U${ zHXpse;d;P)F>mh{;Jxy{+1q)zzAj$Oe}ol_2u<7-4O?nZ-V`IQ*zs z=RDE`p+W0;j!_{RR_v?XTiEbW2f-@^^jL&WLO7+u-s*D00&8+)i5yauy`+G>G{4O< zwk=GK>D}`GAeHKh;z5-P!~GkDs1lKS~IA|It2w zQGRaoZG{J77YRt;FS#=|#B8xw??-7OoobJXTe_-0NCfhhKLv6bsU?5UNu;oXt~87E z(bx21&fq#i*JkYFJM>-)M4JQ20CQB+>UHzR1h%8yS~v+8cG%qQz$S-FhT$=kBHg_# z@D9KkDsOO*)~?*v_ZkLX5T9 zTD@>TZiyilLS&Q`?K<-6^mPjXDbOVcNQVTzk2dcA+^RI^Tn1pnCyqnUJaFd~eGI_r zA3?x?VR;#F5W*n)a##_C9Cz%u*|Xrx7+SI|OfB2&jH>hw6&GN|vH65`b?u&g!dVBe z&ClF%_M#5_d_pF_(lyl2CD5bw-Q3jx;Pt=!{QvbD&z&C|=O?e(T8w*%V*Pv0jRP2^ z{EF-w53M2fG2`Jr(Dp2%C`T7gNZ(r~WPlpKVl5{q-{S~3Z&WU*wZrx6DHe=j#sRp_ z-T_<|dpo7sl-%w}B!}~1QZFZe#?x8UkWAsFU|ZgH0Nw_p@hZK6t^*``F&-a7aAQwIK^-g9jLf&IGt$vK1=%g+KYukZEkP2T44 z$zI4n;P>0Z+($^N$E*_ro<2T({D_#Co+xI{ooXj92>`gdUY3mU z2f2$MWy9VwnyX<4gMy@TgZljFBKc}Ov0f5zMb+n*QvnHsagKxK=HxEg@40n>Hbb>Q z=3-M682gkqDd0H&VnxdMIZ~yOW2c<6?J(=E=yEymCqa-8#+-YYIm9ouU~nGoDHeYjXAr6T^?k5$M+|P zy9&3mQ`I1Zl3MxZGNM%IsX}=UPz2gJ$SmYW0BBwd)C>$}WDYh~ES7C#h&XK?ij1Ku z#tdnCPonlIZH5Y&OKCy=jGRfyZ>QtDoEq3Wk>rn9o&ldre!+t=Xv9~4@77*oso-tI z$L=2K9ACdKQUVvy+iiO|w0Y0y3aMz_rTgEU5SkA>hXZPpZj-;t7Q^37H zIx3c<@u16*0%&~BCU%awtUITpLxK)FIVFcY$gF`}fe3sw-cQ3t>CX<2*t@=8V=w{W zK|S$Z(}sS5{~x#Z{tm2#u(tf)+x#tm`|qvkzrKIxcS8-)5B8mKG@b;qlNJbNcp2=)OV#z1wCFptMS z6r1T}JYIG%K%PT%C(#@-z2zly@t~0a?=d{cLN1a~IBWJHMD6^9dx-(_4v#LMNFN^` z>}R2$$Um$9yJ}wG+^}gf=Ud+082p#8Kh4;fr@uab&2NZ+HdC#znBh(}>Ehj6cSKPp zfEf+*kC&obIgsy&TZKy*EZZG>(sB6(ULey{CW#H;K*c$xi=|E>w-;M(u@c3u0oB4C z_6#ON%0yBi8qC0QK&EY{InJ~rw{T^G#uK;ivpa2oJG))(hXmdV6$tgm=4<(rj*sV~ zEdJBl`)G%Ud-tuq8@3k-ntJJ0^2~mY{hb%j+IjI-0zDS@oo4|)=~5dYOABPW0!mIL zcnJ{+UQU#JMVtg-{9rGf=7TGV+$z#o0y9A!49bti5<*yjTide57D9WRW*ukIjhjD1 zEibv;79h7lz63SjyQ>M2Mie0C9k)2|ZVwN*br1Id{+*wYECamUUuorsdC{>a-`$SD zKR#W0UwjwQXQ=(d<#X(Pi@W=RXRUt{zqOO6IDfu>onWN?4D4&?H&NCj5yU+rD;q|= z1n;_gBzWKfjN(@~SLo%0hyuSFua*P66u~LjOR9wFqhH2AZxSJc_$!Bk-L`z4OoZ{FnKgAAI1 z*n@c67x1`el@s@z$MkR5Ki=-uP2;nW`?fy~O!_N77|sJ+jA3|;_J zh-`8gAZpEB02n+-BYG}tsK-Z$pAU0^6PPC_br;|a0|<#|M4ihNj@PjLqPv4>CS7-s zj?;dZBJR$LHxo=Eg+b8-Q{K350Ul;>3$PK$B^=l=PxJ8l!f#|p5P;dIFlYXl*I=Jt zp$M~`wTqRi^~r`GQs&r;s#T$&MlL@y5*(Be}sM8|Lc4HL{xqx{08cMO!u)u z@A=huE;7jhyVxJ?_fnVc*bD~J!ivit=cTC^`;^zh18||0E3^YG zd~YXa0EQt20fSgzHt50(tJ6jN&W>lmlM|+yW)iX_hys5PnZaGBc4bPDmSjKQVup3a z*dJ;UNkjdbGE~H43O^w{OQ+V-n^YpMSPr3OF-}(cM^cH@?zRmrU=UfB36Nd z!RW4mI)pGE)E7=jGw@gocmib6%~{)Efyv}n{Fmp2)+s&1en&;!vcUu+)crHsV-FsX z&b$~E27d~7`s8y^y%e8(Rlf%RVL4aTSJ$!g>U|639Gf3c|F1W%{}ssx`@+w+IoR+? z{QvPD^gTek7k~TT)%&#u0lSO8%VuN&{qbqP2Z5r`r$LekB{Q=7;{L}vGepqW6wwB) zBEnTzfLalcV+Q8nRG+=rLxN&}=`KiA++tQqgMbA5B?rn4>M$d-Zh|WCAZ7OTJ+awl zTi2$BZS8I#v{-T&|7<^q_kj94Iqo_zs;_c4zk4_VTkB|?U(4_78|LfpV+`2L$(NX7 z?K%E<^{+RtAi*D)+Z=qE!9T;}yE6;&V!79U_us|-@9zKn$)2L>p6>Y?OdyZy`+<ta^8tSl3Jj_{3_xpv76{FU3goNw z8FE|TlBVF3#0B_rm%6k-M>%Xc)mJZXx7t2s=(nm&N3ENRwjg*l-H_WhQSO#3pJ;sS z9}XgAxE$<>gwX7X_z>5(ceAwfDLw|@KgW?ows?bmbp4giUIrlZ1bx8*1{nPX{uqFK zjq`V_PftP*43cjS~8-7)Fz0@02z=T;AJZ86Ts2SsBf9emD65@wiC^?6hK&7ZGh z^8>kOum=d>#}Yt=asP1ve2?`71}MOR{fYoCf6x8Hj>zukk3<;-9*q44P*9g~=?~S9 zzt7#q%F+(OpQ#BOp_0zSu#1O{=%O! zI{sPR%_V;=3V&Y)@LY#CINtrK&BxjU|0tpGLx?}#CZ}sZ+&?RT{$h90ykS}job!X; z;~@PP%ZaH^Kmo1P?^Sw8V3)}k`>gLjI)|mXq#n%%=18p)#M+~3o~Hnxi2}1oRux1G zN8;2?Isj<5vG9}`;7tgyJXpXoa?tf`*8ql{=s&P8uI&_NJZZXansOVwNSb}*Q zr!!(A!ffwAe&vv+k>;TErf=|{m7daz#`~@gHvi$k-~TH%{||r%dlfHm;CYkA3=seS z`Ci})|8Fn$tN=z1{^tSvb0giO^t$;2|JoUC0PttI8N-lpFQ0#$Al9k&^D;orB|=1w z-crzHj#wjHZi)RkW`t!XvZGk?y;ZdQXkvA`&8EzlaST3bB0E@LAZcMDJ_Eq2{xHC< z+g--Mz*KHV%dx{tVrFqZrtWk)!A_x^CI{{^i&lwB2t10OG$!4gV*`TpZu+vs&!Os< z0mS)FukrU_9}>9CQ~efrRS^=f!5Y=q_eT^5&A&^$ggv`;*qJf-rP%Pm55N`pzQ$SqyO!T=pPGGK;IZXp!2R-u{SpPG zw}ZuA9}mj_KDT0a2r@f}d=D;rJIo=|bB38JvMB47V?>tA%A&V87ycWf+5l8-ZV9I! zy&UaFr>9mBO(q&Pnkv94kl6}t5N$1>9V(O}78o`pC*$lnEmOeWTavzP#4b)kqMp|PQL)mI2{Ysz+paOHtHPQ*^r;5FY8rTIgMlwAEbCvb)YSoJRF zh7;rj=30BOuihue=Xd~5gipA~{_Y?Gpi&U-tUzJq-e=kkU9tcVE^hBa4h!PW`G!6dJAKmCq1})4u8OP z;JzpLJ>J8=ycIym;DJd|(X}o5mC<;*=fK(U@o&bR$#ZDjBAS`GnZ2xZGJhme_(|M8 zpc|2yk9 zGhov8dl)>bZzk+vJZT{k=ozrt?#$WGXGcVfFw{?SCXHySIxd!0#1vSZl)k7O5hGTVZ-PD&<`jvZtxl(> zspKpkqr0*8+oLEhTFs<8bEe1w(}^>EbRdTk0BLP|R3*kg z=fYe?$0XF{Prkpu&tLX_s;!OKa~OLmc`ZK>kRRY{o^#7$1pGvNUGm+RcBAXOqrEI> z7Ci|kQT!CII9-~+LqHebnO02Y_o;Ya-ne{X@v zsJ>?Zh3CAW{-F1{=H1JZDA$t(KIEfWsvFnylo$IwMa zQFL`(@hKD#y^OQ+iYNi2*jLcaU%Sn3q0x0QE(Vrgwceco!4Q~1t9aO>PQjg@!F6po z?71pt7}+BlAWwphSW^t@mM`$aTuVkHQ?Z;-^$CL_ma6q6A~8|FMR^q9h|khI=_*(SB9k^I(5$!e8IM6DSJyU_YEP z!t8#ssJGXYRPW!jdSQARw_$yyS#!7f5lwx;ku~D0o?R#^zEMiBN1;*2C3{LOVczmR>Xb>OVb1>RD_6=pBW7gfIoAmLH78# zL?Cy__4_RKY28E8OZir`Bl!2yM*-EqM3dV+W5j zT4=A{Q+TR$Mx*^=ui3{6$^a4s{6u_{dFegAznP5#V)pqhCj7{%TR7rp@xScuVQ~wP zrv6+u(QUpz_}xT*(-W_MKFA67izgZReXh09t2>i5QSkO*H5Y5u}?7Q z?{M?RX5NAyAOwC;KX|L|{{o<*6UgEY5+CqjcT_(fdG~kK`<|-zLj>Ue`W+*q&42gi zLGOKz1RK&vu!n;jTxRbH2ajl=_8?s?;fyAs1b|JVB3?n?%NH|?QBtsJP!b5UBxr+^ zDYP_VgC)Vi8$7P}aNvPYgo8b+J8VYzl)AV0Kbbx3h?d2hkw`U-O{clWKzkMrWwJdc z%5&nzK)?^=`@8F;b2Q*L{@3#Ji6s&e0`_Fb1#NU+k5zuPpSZ8W4+?1Ja)Mo%C}il8 zzqHs@{?musZ?-S+pWFQWu{GWT3-<2W8BplaZ%7}dw?Cc2pC54cGecki>4zh-yX7On z2zNwjBKp@$#4U=T^6W6bnG}A!oSd84n35^B+q$XZ@Aq)$54})^Lzo5rG~Qb{7f5^! z(y{F&lchU;oZEEH@!u88ytq-r{^RKr>dxJq?*~Zpjvg;)(O2ppF~?SSd${imysDs)I_=x?^uTC9B_@ z3#9693mIy1c+^*sKoZi~ahD;d=5h015^I7K2GhD6mumNjN5OxDzd(0Xy+xq-|J1eg{_N(~kJ6oH< z$8)kxi_z#_0ni?Mk~Ce)!4qY~!uYeS0?#~|Au=t}UEoDbRR}Tx>0sGJF))AOp-O?I z?qFOt*tnVADxzt2kPvJjZ1CR(%YdjmO{w>7c2IxB-nz6PT?Y8!K?b}?UoA9%ok?9Y zts2a$%mX}viimhaOV!W0NAlzQ*(B8fjA2MlfJEk(il4=v8c*~W&0M872ul_Iv@W53 zwsmiDzW&`4v0h2hb66t4U_2(>AafuG_*j?{FabY2NS84cOaq(Gtdi#G&gjQ7AaV@A z2V<3~l3n!*Dyv?LtI`jmMHg4CxbH9zJPYumMHNV97uftXl1DhWd12mj8+%o~ zT}?vAU`ZBrT@c=8bfyLa%Ff(nu_yKt!bKfIh!+5RjeIf}?_`3#K|mhEXanZ;4g7B- ze9quqReZO*Jwnsyn=?P7NSv?g|EK=`^&eg13IB880b3(O7CADjR5bk=oi-}&$JST9+5cLRHV+58hjmTSO& z2$-QTnsk$~`WZ2ShvRJUDTtN3g1GRm_y7;j3Xla=ISwjr z11(IK1gL(rvHo6{e_q}y1q|ww9KDwjzRmLOdsdS!5Q+7OF7S~Ofl>7vf6sFN zx}1-0Xb&hBh3xMk!Jbz+jQNG8W*^N&Edv=Fx&(To_b)p8=z-Xe+QW(nrH^q%UHAuY z+70g@!~q`F*X!>Z?>xeh>=n?F_@V{UYJ4SF;44bRm-2Y%LM6u20>Syp_c!b=2ArIze)_@yT)=l21L4(I2W&6%k*(xhF@MXST9P2MEA}z(PF(Dl0o>KL z;}@FgG7lzDmKFzfF@ z8obk`2iti=h{Oc-Jz-gXf=|d=2cP)_p*auU>QK_$id)I00!=Y6?%fq}FXt>m2YaX~ zLde(hz_!QGg)XGXcDj90vST1;@9GX@TekmFz!0yjbt1Gj1E9JC9#7AuGyR&E^}Gc+ zrWPfSD3S>F(QFcT;7!+Lc8OH&N8NGxFn}*G;PUxZ9-2KXJ%umo?y=_bz!aNrpts-b z;M>bD{JYzH^*(#L{2~ViNuotP*r$)aGjw~L0|Oqg@5)|5jG!a#bF5s<0ldfp0Z~9K zFGNwtOZ&$$S36r+yPb-QJ>`?8wOdo9y=*V{yTgEKQ=8YqH?SFA*NWSbJ%a1b@#y_z zrVA$}-klm}G`q)Pzyx~D*J*au=fZF7Kf8Nu_<#7wBmA0r&HiYkkQa5e6x$pg@am3% z9!vb^*jM*|duQwR9IyIKTOKEo%b^8*6nlS~qv{t+=Z^>mhMVA4WYwpJ%EfOKr9>%^ z!wKNgCbL?*2vJ;*g(wN|+;-P?+5((de=%(iMez5wNz1hm7RX@I4(ARyGfE>~HV4-B z?$sTED)CCEAH0RR^uCr`rPd7icG1RZ29pKS;!R|Si z0EAWUn^b3w7fsF=Z_nGh4>tdHQM4Qo@efoDhFVF)?5ish8q9*ZlJ3N!42y6S@qVBXHlA5h|MXc43v(kH=I4_v|i zYwGJ7U;tlK!{*1|gKKR*U?&V8`0)j(I|d+TnAO>SpCL>9Pfss>oM+?w``Ulr&%ePh z322=tug1UK*i*XnCwUvoFforZVBl9eND9f`3REwS0n%{qS_`k(^ z{umDzuJxeZ3HmVg&`OunE*VYM8zE!9z*8c_Wo_Eu0AGo$`Bgd)C6ZFCi_NNgfe&UN zl%rteGCCTGn~#*6@SG>M)Jn-lZC06_!LoqC!qY4T+J0(Tky~577`IG^y5_35(hlR{ z7^HjY)R>?oI4&TUNC~~~GOuCX27_$tihbYS@ljs(+9PMT^j8&yLnTZO8c4d!a#cSY zZZ7k(yAyH!hW&5;p6_Jl1+jYckf_apI>)8@u|EQz917=W*qsjy=u~eqs#r%qDkfzy z%AJyvIapd!@W@{PS_V8k(n1qdudCi$tz}671_oZSngMuOoM>SR+giJzz^!qd&gyXs z&^1TGKwiw6E}TW@)$%DL_B94c$J(E@z8XS=Bm-R0eMW!C?-sAOP7&N)aFN&U>_tlpgU3)enUSn zL&`#X^$5TkfAFx!EpQ;;MBC5w3vGYCa~n@7;>($FQtiko*ze|S*F)T4NxBZqd_0+a zp6L~Ph9v3-du|cuAK;trJ3QIeRqwI+G4DLZA@o}wNC-#})bqv;F1sIM$$C%Cl#D=!IQNp9Gun_3w9)8%_E_P(o`nH1VgwTVHLXvmn^C@HrFjEZkB%}g-_ zO+}AMq)eB5qh45ej)Q&gb`@uX)#<^$Zv>?-$a!x2ZH;sr#FpgM?D^GBDaF~N%&>ZB z!J@wfLWQy+?KFHL!7R$8s`vx&m_VI&Hh_H_`z7~ zt^~D?zuMCYD>7z|j0AY{7i=z@4;~{ya*_{D&78BNJrQ4syI`EUrwTb^&%px*2p9$Q z9p|pDUB(nqD-QNzN%h5*M#$9gn0D~N?_!ulBqxc^4!a26$ssYZ-bQ&~&%^uV$MVAi z*L!gR`K??b&l$bvnO?LX6&^z$giQ*UVdUq~Y7P$o1UJeg5uoe0uhxo)y$E>GXz1IvZ zHoJ#XN4M~6KJ2hvS-TmDGzBd2Wn?JDmsy;r#8bAwq4$aQV`PGTzOH$IN8QCf7B8Yna9g}%Dv^k{a;E%< zRb?{W9M7Xn$l4Z?P~sqDCc~Br!hDb9tBzs`oW+K-$Eb4K!Qijm7JGu$Uk~?O}j6AZ*C) zF+ax?d*0sZF~pAuZaKxivbbR%NR%dQSR{~awNnLBl!$oM9qChe6www&;s)x~Y3mN; zn?B${i^4pd(4K&$UAN^cy@=K}ba+IFS9u!@IWo0tc1wcFr}?$~Y~a9#;H|D#^>c~Y zCnq+a!#|i67p^vK!M8M7=81isI%ko# z1D@rC3hfNDLtyC=f1|vBotJj>YIm4N>5myuC=1>NaAc=St?0P~ayS&&3K+f_bZfTX@OmuZT7%<%L(vU4xC{7lKrTLoS0$Auv2RiC1@KT_SDU1sF@~ME(2yw|BHY> zFn?}-W22mR8>e8y1FGu_>JflHdXF(j=7e&I^^!J${P(D-_J^2R6Z&@-_*-iT>GyxX z@9jh!*?IoJE>a^#O?rE!V~->*n}gm5`=|V=Ea#Re?0)Ezbqx$#vcFqqo#2&jh|4zac#ZmD|)W^is(339>qVcc{T;Q7%7zzm>i2)Q5ze?XTmcN%J5Vcydux)wDlrhth zx*i^Q39-gvhcs84GhhO*q2P3+$~zu^dd(A8d5KW{w$%K#H-8d)9JC?~~XE zIl>PEB!MoUA7$3nV(qV^41fw`;;jFecQt)==jm_$!bbG|(GYN%4_5s&+HVKl(auZ!X)H@X#xn5>$%znUFzv13I$^!y+b&889DE#6AD5LkjtC^>NsQ!ni@4KJ>2sJi;0-WA3&|_Cf ze_y;`XD8oPelNwI*K=hbFO$$EkMO_y6knUqJQW!XSTiv2R8vQ$6}sknL=0v`aA^Mm z26bkCx0-sH+}zq?gYlB-p@lTwHk&8|=%R6hHf9E}={9>B=dPor9a>xCvD`8 z57G>tzRIDTr=7ISEx_h((s*}^C0(#{PG;JSe12RHa&oEm2X7B8d}a70Z}j#uXT5%u zm@gkR;;ZWOI3ETWlbL8515oVQ;Ysy+^V=Ex2m4X|u>rq$BRKrRfDlU90T#xk1-$dg zy?T$$kp%JggL<_*lPvJL^Z@M4znK+^W%g}|72gyqgq)F}fZ2VC6y~#hFS@iKU(2>qtvpCR*gK>a^UNC0wNI(QrPdz2 zn?Ub_kQyJPlgZoMgm}r<@n>T{p*|Srl}RE#NHD+;Ko<|N$5))s@9~~#d@sl5XY&1r z6vBY~5)&$)kjqX1XSKSB6(@d2z#S z-KVDn#e?qSf9`tkoyLuTw_&iM`I+PaFJT@LzsGJ7DiO)?mi4qp$9$(0*GH%U`h3^071UE`P^`(4!?O z^ENw({m5d?+QQ!ze^Jjl^PEE}AfSkEaaB!oS;>yUr~JKG3(r|RXd%?e(tjcG7j$@8 zFm4y1JKAr8MV&~u_u0;a1X<~b?&%2X>?&Yxl?QZ(LxGF!eFt#Ez5^Ho;8Xm5Qjy3G zX~bT}=JPx(M=e2skDd2ZIjjYET{C|~0kPjg{T2S@^~FA$`B~j%V~2i zTq^OZ-AH_C5m^U-!rXTSc%zb)x2B~O2{4Ny7F!ihJJuQ-aC)b}c1JCFV@^rqINNN; zYG_4ge0`(-CfJYmr~CAz z_ZoxWC=V$d8?cVQnTlg&G|;L&2laIgLx@PTUZ6Ig^pSpyga{QpO9q2{(|&Y)?xxHZ z6J1q&NE0J}8HO3pI-uTacNz@XFqdKv^K6+OVPt97-`_XRm+|rF4d_Nn$s`9w*9Pzr zp8Ou8!M_j3WBk#^d{5Ucyt;WH7yh&N8kg^SJ75KSHg@ujHNL4Ts*k7JcQx1GTOeQA zd-sONIfYz|)4}`z*udV!2H~DYCIoEZyd_eTwM^H0MJSoxI)d^5DI87l=w9t)+NeAr^TLV!oc1|9pT30NCmM^xcA17Fckhm+j$o6 zA;hi%fd2rDe)mY`D&OP;-Cy+%<0C58J<7q31HljA zz13Q>!660pLlI=w%(P5{xh(dylVX?wCs^CwM_hTV1si7bZr62DaSXc~qdD{7j>9)} zi2%r{7ao5f&32_Xde3j@0>LrQ^MSQ23-f~Z?a$^G=b^wo)*Aw#2fu#ieUB{LqW5BN z)5ZRZ?T;Cd4bl4$6I0`>CV~Ip9mq>?6qEytmqdXl!4YApvbhDQs8lpedw@pfkR005 zLA_--Q%vlsRW~tZ=!F3k`(`#hQ66f6ilfKsdR5le#IgW$wpb!Q{#ibm695)?UiZTi zq$K@17zdy<%Jq&1RmPHI7oEQLlEpnFFu0=tY|t0@1%~~dWHCnXJ=}(=k9IfqUB0fC z9X&s=7K3q~-?)pjk8iN~ornKf=Kjd@`z|GGNsi@DPu21eqBh5zWTN-HM;zcY;>CF2 z?i5<~xRL;L0hp5hMW!_sV>6}}Y?vvvhxE`L_VeyGR4~Y|#)GuGJz@|1V*l>X{-rb}A1ns@VBvw$?fVwG=_-AK z{O7;Gb)I{=)_C{%=Pr+NvH4?I*7DO+;4k*5yVzTdTUq9%Kl~F@T8v4+^qW19_#hV) z6-3f=s9s2o{KothVlb=2o?4^*mZT|rq`@IjY90L}O?mLhOwX$<=y6q6TnBzRVfBUF zGK)RJYe`b-40g3mwF`zi*fWMogR$}Uj^>@P&io)9aiR3t$TK~we2st7cztYY^{pz0 zDlYIz)ZjOfGl3ovek^}>YlMzkU3Cv zut(z~E~$XaAAirw`3a-|ySDZOVGr;ZFWfYb?}9zA>^=OYG^e)16#JVjPX4biAM!%D zO{cBy8wkJH_uY+nng{GP3G;Up+`-LX!`9U;>bt}92t4pdQbj9?y(BZ~!lva{?@|5A zv0#I@Rfq&9(OTLGs#8Tp48yO2VW>KET5U`VB@4?UT zE<>nRfbkgoI{SF^9AUsN_Snql<2(ckY_X$<0FTiie&;|IjtMfiTzDL5Y=pL{q z#0Gw>^6NK$8s%y2pPv5mHNBnd{l54=|!W=egYVJ+~75@|R|WTol3nehIoqlqLkYEGgI!C8m{%+myZ*OVGl)?S=4~ zEZBQ6^O48^zgn9cQ~rj17IF}xm280qs`@ep>PS`xma%ns#{B9xiUI1JW8|as*}uy{ zpeF+enUUc)BmBfzSlQ!wukYvy5b)!p^P|{#c89gUW1msY03E5Ly}qeBc}k#Zp5$i9 z-j}t-RR+ZDjJ21BN%IVM(%Jh96Z=y5fOL)*>UwcRlYhB&%tKnJRcMu)4XFL69rgyw9>axY zOn_$qkTQlx;4^(-zTV1hNF@Ah+GE=n^-_V@NTpxJtJxnr&tJmjW!lj_JVKC4Sm1kF zIiFWFXKI~b=V|z2-V^%+gL5vHrFqk_ zeg~}!vxEAP9ZFwxFXW zfXgOg`2)O@ScyQl;i53dH@txK_&@zsBF*Fa7WA^v%4k85PGaQS( zWDiI<`=pyM*iTi9K#L%v9|!nbv6P%*7ql>dI6%dkTIGQo!0QHc6@Q<$+}5Sn^hCJP zz#i&(K*{8X5NdqOyvf%Yd1*7K0CuVEt`^pQ^|HTJ$R))tK^$v;qk>f=!KL>^c{#Fb zhcROql>61fRMB(;t@c@r2We(0#w2e4%7C8DuCP+}s@SxxjW?;CcY;I%8UPreatBWI z7=q2gpa~tR>2mQUPI}AQwQyn2Ie*>(lyPG)^kR>PKJxjY_pIGl>yw#b{4E|j2 zyl(q?=N^pC&@%|$72%Bx*La%xYClmP*z**5a%%0h6Sw!b4yY=+FssM7KsgcQF#fCP zClM5Rv8SM-ta!2pEer_MOOn!^s*Th6Rab`UIDt+J|Ka{}{0bqIb_avU&)vu91 zz#nLnz!$8yy9yiwpwv$JwWY*O6kawM$@7c{9<0k~<6I_F01A(IBLruMdnR8V$Obr3 z8KnT}N@jdPJ;Ftrt)lcOGr;4#a>V#I1lbvd84N6ze-?GwsMi3*+4ECNOoAKu*&O2t zT|$Cv=V5UV_88!RO`zwpzV`SPYkFSA2Y7yPzxZ`JXHxge^PVn+DgV6A{0Wtsmum!& zKsLYwfj^tOhI_s*wy)(MoxT*k+7NXwyAcXzU<;HA2RtrCvFGMbI{A9mV0?0t82G*Q z9AE=-VOC`a{z?F7A7v0Z){)2e7x;*&37tq>#_R-S0NVL8l5&y3T!xLo%X_!&2=CDW zMdV5krO)rK^$P;u=QqJVqJ{*<_5|QPz`h3mDE;o?%j22Mi)_H(R|I!XP;EtU``li; zN4YQU*9=tS=iT89r62sryL;|t2<;=xz=;&VKJx_o&VTY%S;bT!Ex&Po@|CY(uUj3D zP%5lKX7=IpFT8Wu)A-Yxt`GR@q+0DgxpQwwtj8AU%6WaRGH z#G_xpOL{FoPwm{*@6X}_t;QAX5qo5dh2Pa(bTXpuMqc7O|G~)nzsIZI>5Mkkvjn2) zza%&k=KhKe(dPJ}J^C*8JDTBRGI0lTLJyQ-`RmM*`kH*CaCZc-UhWGdQSOMWY|t1e zudP-2Mz}H{w~m)>8q;c-YGI~vK%Lp~p8}7~XNQ0O6+9-+yvH7-WQbxT-QDxT(`h-7 zF9SM$?M;V$=QMM75syc&@h{gC4{HBe0pjL)OUJ)n5?xp0?@C|n-(vs@d_28wKJR9| zsNXw3G36qo=ijS?H@d$6Nb|uho*!_)FB8F@O~hDu&&vbINLp61!Ibqzp6BLSzU$h< z`jZH9nIXmyJ@D`{`KQcS!c}qdMY?e!NP9Wh?_HIzwii5raEv@tcGhKmjro~AQ_tNR z_RvLZ@e3M}CZCqa0HkH{=F+X3j-*5CdHBb4j)NzWOP<#$nG(f_BoDxH#;4*viqx8F?BS?Jdfer92l)&15 zruOoBPxpZ)dppkKOa2~fda41)I5HXs)G?iH2dK&|qrZHWBb3aWrr=tWE(1E@NCXH` zaW;HRjDQ{>hZ!Dg8z@|<4fbMyy)6kyXd5Wc%WXQyn9M$COOVTz+Df|gHPY#i5rVhYU^&&8Taq4o8F8pDv|O7BU!z_7<0iN$Ti5xDJ`(T?(@VN$2}9G zKUnphUH+SjaE15aqFw;Z`-UE`P`-oum0+vG*O%`^G1}r486o#Mve;jdX?%SDREivR zMGE%x9>>Ze9%2>y;62z^#dFC^5}E;>x<;P8`UETg&3~7_M;vWzXn<-oC+9xWRo4@3 z2L3|67HNTRI9emY9C(c>{(S}jNwGE(r}jREwNr68i4tg+1THAFw*b$MfIaB7bB;g`@W? z7X_3;H+8Xi1f6&B@;X4aAU^mj-3*K2>W$QO2~n5tIWmoKqY$9AFeg2Sz5o(D9(l!h=1UG>2;KYUc{%m&VZ(ZR)X_yzv~cdp@X}$b;Hi z`!lrwd8HTKD+i#T|I6L+_qTFvR$K*7GKr@1afUyQ|4|pU9~;14<6I^kGlj{5>}*=q z{{fi6-MM7`3w%(?k;~?sTfO9NHQQpjoNy^%7v@Xp`Kf)Ec^Z6FEroqJ*4>h|*o%Gj z7=VLT;7>k&cSxWO;FqSG(_4f6az&M`%NP#n9mcK@n#m#H%#nq7{$OI}7`Dp-%yNt1cfy#jlrZ z-m%!D#|v=q!)}4S0Eg3K28#FVKboJj4k9EdIXcR7#Zl+0DDW9npnra12I0Oc%?-bh8As(v*Cm4XfW&Yd8`NO9DvPF60fJaBea#G+8|Z29U&3A<LD1VH8>{djay zpl#6cTc*W8T8|EmObqtNB-8+C30mdz*H=VyXe5V26^RVBpaK#F+>&}#6%Y196c`{C zs_RRLp-37@b(G%2yM5LY7cRgpkbX&QTxrOx2^oIChRBd&FvEv(cXfYE|Gu;fJ}BpZ z@!t)5>)vV7rV9L>FYSiVDP4a4mJu5O^0|f~z7%%0Jlff4|6oigClwyC4_d*pEJ>O} zGf))El{;gM^;%`4yz%`RIgxx8r3g1tMyDfF#A+<2pw-KuJ_pK88HgL?I4Fz(OBpaW zZ6h@aG{voVZ}=(#je{S}B8RGb5p5>AUZvk*4CGc3_+Zaa^Z0J?*74sWzJLC?#orO2 zAU@;94g0zC8-4Ja>kh_fq-giZTtIkfUJWbRfat zK|(W5rYerm0b5TjT_gm>Jh+SM=Lp6v3B|P#s5=H9o)!CBU(9{!>$c34^%N1=5 zmvHD<_?x;X(+?x(**yOSMbo#_-@rx*Z?S^A%3N{&@6A1SLp5`F^)dgGfLBAmzGrVT ztN;CI1A2fsT%lsYSnLHDj>0c^2g|^QW~<6I4-NPs#OnQ+4U6UHZGF_8yM1rs<5$!O z`9_F5?#!i1k2MBz6XpMHP}UfCy?~{N+7haoVyH8 zBRxjTOA)lf{PFQqM%9n`{F|j6*zdFX!TTou8v_>U&H5eL-nsVkA;i6{dwN^xf6IV- z;nR8&uB82|AK4P`3kBhCX8S%{8+nWLSo>hF>emv0boE=L&wCu@M9 z{jw}Ozx^C>>rjCZ<|+38L#F;4Xa%(jm-HS$KH6V}PBD!EMn2=u-u@?49~DoI6~Ugu zV4wCmn=|>`qC0x5`=^VPoK9yj)EcIyBsLON`Q7FxColG_s7DV$B-;F_(3g3>Z`BAM z)fd@={UCo27q=TMj4q!twrlNMyVlw!?IS1L@CP3OC>ktnNRX$Eg?WsBwLf@wS-+|u zuxkSj_OrS>Aw46>$7CYMCqD3$Pm**Wtw;+zsEh$n{}uqS(G3esFvF^kRp@SvYdk;~6Ytap&MoMl_#R&C2npf~NMfLj8k#TfyN$%BfK zuP+hvh>XuX<_Ch$!44H>T^H0t2+e?*mpGa{W{m9cwUHp`R*eRX zWNH95vpR?J2{{rcAW-vwt^QbMh*|#LOh)_b>FLM25BV%X&NAS=5A?7Bnv?WSMMFq{ z)Zft>dcTd=2ITjOv48%V(?m%8ZE4u)Vd5o?Hv)L?i+BgZ>ru|0Z@-rC&= zU(_$iqv#R6$Bi0oLMqHSqMH7-y+9IKV-S}L6rsnJjBq!u&Sl!y7!1-k$jSMeyZB>b zw^(U_fBoUd>nDzUB4NAHb(J3XpD?*{K*ay}?}B-7oc|22TmjZ|y??RI>2d-JkvOec z0rr#`T?_PX&w23A@=t{mfYA?Vp1^fu_+np)EFsvazdeJ`FgRjM@@z1?$&PoRQm2p3 zaaovmafPuF5=5-+5&Id>{ceh-!2tg%do{7`Pd_;V@Q0u8KIQ93dDi|b*njzyAIau* zCXO%3q(GkAetrG^GoQV~<tnYj|z zu_>3xC=!YL@BWPDJx;yGU|-1T<`Uzvqck1^ki}%y4oA3=b<+xw^d0+0@BaJUSZQgL zgy6Lg@p!iq5UiJ}-!_5AX>Be&QEC ze1kE-A1}b`U%Y9h#lx03Xf%_3l#u24il;<^TBg^qtETGe2DM=n7EF-^Yf1X+2}efVENvgN$t! zc!4~Mo)=-X0a*vVZ0$>h$G>|ry81gnzvG7rrCiV6R;9^Y?C+Jptj2&oz^P>+uX-KS5{a>0%PsOl5*_sF|U z1wQ920lNH)%U~mjp=L0=QJK#eFe+E`U_T!)$iOnwwfXbY`76+Se;I(kS=j^4i~oQ^ zq@LYv{@yy+7uCnIr|3iWDfxJNATK4`yahb@(Kg)kgu&I?h^Bg9)$c-_kHqoXkC0bE zE#}ALgcjs9rzWQ4#1P^g#fpfd?wrBCjA<{_4cHTYN`+YatmV}5zz_B)eNm4ADE6U3 zayS?Gfj+SYcUSpI}OMFPuwBqB(GvxnONAy)wrn-p~ zARUa0{W1WJ@74|5b{P*u4E8@?7kkfv{L8saLXCeS=+idzRviTCWAK{@_E{!;d!4X9 zPaHnD0X$^Q2>YRe4Dt;w?EMGVdwItF^rGIInV0+i>8)ImyPYcbTgEN9yK|N~Hh;8v z1A)78Kh!NP%%Xwoa=Ofa(gA(Io0CYIZLI9MjsYJMgaI5t1sgzu93fFaTJIb7$ZjmB zB>`IxO2kC)d|^*ty9xk%yD0Ft2H*0@O2YM6`yT7g#|&ud%Yd9y^3yMg5>p>4{9vo+ zGXAmi!9F{_*%u1%A%Q_mMwm5yhS#0^a5u5-$4{*8lJhpM{Uz-EO?4>p^p9_3SIHKL z<8u#0ql8=FLKB-$?jXkv6<6dI+Q$NyPAC6xA@-BKyQqqjUik<{oCKR<-eNK^<&?7tg)X7xHe;MhXX|9k2Et4+S#Hr)R)G1{@L2od zQ!Z;rV2?ej^jaV~O&AfIpN-q1o^#B2LVA5XkYneG`x@&>g4qVZ0D%2&?6|~7@1yZ5 z{d=GK2imWnzhoOf%U7O3f6e1ZxXZHs4WCU2@J0GWdGYkk`OGgmsys~a*+29);{C7w zn<~$+Z!6w=sm+=M3*|N?h7e?-=;Q47)~G)D(_A7x&2O+*%L}<0nH)4eLK%ceXetQV zRDI)r9t-g_jP2e9-k*%+PYY=CHTwa$rXnqLV?UQJBhw~^$Gd4ZEW<)9e6ngATb1mKlA2IbJ_I|l&4 zx>vSlJ$--ms#qWZvTy*9_4hFeU=fd*$qfs8qFnK<>jb3zUvCD{8taE%M1DCHjURa@?qruQx>D=UkL5hxc+(BfRD5dc(;UqP zCeKeH@GC_;v;79B(b=?JcKu&_M$Yk;P!~tcg{F3kwH*MmPhtlW{q{PQRJ9ua??s6Met~G)QLud%_%3dfXPn7tCN&7h#TzgVRA*pdIa$xcr`bO!(F6PIzm zXa?}@&p&kE2n{4yO{zbC)?7(%kOhehF|4iaW1hsyl{f;oumpHtqEB$k6?6lan|KWN z!{g8w47Lf=#RK_doNnCBW3x z{v_=LjRQq-qZ}^GuqN>928lmBA)R`FN9IoQ`0pEWwx=WC4j;!I!?ZB&QD%Pz`8HY`7AS&9EI39^#jIVsD+dC@sp`T0=qr$#!#a9}uC0$U{78pBLk7h5 z8)}P9{GR+bzb5LuKjlm)qwK6Gq#JM9s}=?YhSGmBA~N06v)#3P~XjO8G}-f1dg=GaxzZtxev)uN>a_z@z>h<#rByB0P9ZF4C29$33IZ zIUJG=$C&7U8}v23_hT#vC(QVRUsrhBs6BX_2l6S4S<7H=nbaO01YVVf5_yZUV)qub ztVmg?Jv_tdO0IJ$Tgo~zR;>ZU<<6WLJBfSIb$a$$Grk)2zv+!IZi@VpU(WZ)_W!Gg zVwFF2O36qO>*GTV9QP9VMI?pb2XaS}!B^fRbLbP<{s5D|#N?+184i4{MuQ7kgmK;Q zt8C}XA*?lX`^OY-N4$nWt^i&(kF{fATN~SjI8~WZl@ z>GM3RzVZURos@0bu&egjmoM$2o{I_3U?{l%dN`O`>ojJheCaVMi<%yGvVILPMAPwNK&g^BcYRf zO^tc4Ll1fbxjsp&SvUVJo~eG}RDuD?$OSNYK!8;El3?01R4aM`FDX)jv_S-Bt|$a= zr;YeZAV;~KphkDRgsb{D@ZO!c_oe&t;1@eJ3a6qe3prW;r*lTc@A1Bs2dV>DfmGGq za9p7rBbyd9=Zst3L)ErylS-w1NRQ|09+xinYOIw9aIr5QVB2Bn-fhnakTt89A9xWw zdImm_BhpJS4oDaF_KyM{X7T}O1$%V5Y3N$;Av54HE{Ev2FA8qq`Fwjx1OIk!!tjkI%*oX^^PHA$SKf6DG2Y<}B@2aexeyCv0gv#yPlZL;Z2o4vAA?Uz-(m$Hkk z!Db%OQ*bc9#Qj!%OO^*nZ1Jc(o*@`d^VY6ipV8q@i%oqvD(aMPr!3v<(K&YoH`$d@ zz_DluF{^InX|Y=bLUM!g0NO5Jg+|oiRb)ptIX~HcqFGg7Z>g;95OTO=dwNC3>?JhX zh4_IedLSpSS?O+UPww)S#NMrGsWFM^Y^Z~gN})qKHtTXIULUqgIy)`d+fdJVzY$fP zbv5q;@78{|7iPiVQq4wBMT5Mm9Q4v~l++ku9+h=&rqdxVz;UsbHL>Ugi<1vF_O||k zKf76LsJ2@O!qz~cfCnT-`UNvL-?YdNiYRfPzu|V>XnbfOkI1NXpM4&`@_dGTtuxqb zRe!gZ5+0EfYZKfS?P~W zdmd*2M}UjIJlV}6_>~@ZRmtNSGmBMF20f7yNA%)pJ zNaY!ADvtKUR;{;2?W%4^_7=orwig$i&KXT#s?n5_1r_XV?gQPpyY2*_Q-2TqhStb| zUm$cKP81HVk3f9xHvGXm=!$1@z9OE5b}K^^z?A^vk%K)KYu&_enrbAz?>wJtI9ltR zL{}jEno-$zHp@JsmD#7Z3OAF980|;Du-n?jVv0m+yf5Kf?FzxFxZ1dxchh1!oXsZq zD_e+ip^GTBFq9M6YrCvkf5jWLxO8vG8FUMkLXr4mF};zHNN0uSPm+)lafXe=t^}a7 zyJQQmeJbAylL->s7xrd=uGYy+Z!g>V{TrdK3-!N$)nxWheM8{HrES$#TI8`P_F~5w zF*dY$x6G8`JI3EYj6Unq>SeBXanuf2b_Xc8_U=J?md=?k%mz}-qtdeF7Rc&gP968IT+4IZu#bXnsTSv)_75+ZP(Gjd^EbO&n&^*Bwc;siRoqrl(-KV<{& ztnOXwY1AjOs~|sM(JOcQ47IK>66>!{Z$!^AzZfA^56f)+AD73tQ#ia*_!sZxY=N@= z5sf!^Ki$%Lmd#e>_$)h8MTmRt%4sJ-&n~s{j8{wPV+D=G47UL|XcbYA7}Ro+LI__G zTOlo?cZb5RDFt)qeBF|XTS#ZJ2pUwTCp@0Tb60CZH{X=|%9qFW4=Vf@YCXX%>?!c^$X|5_*%Nr8-1iiCE?Y*3Pjis6TMv9sSIBXWVa;v+ zNYy?YTe!B_D;vesxYSE7S>mVo2K!Sgg#+g8;otgY0JmslvA&2Lh5X}y2Hs$Hp7F-^mVRLo{rW$&|cVLDN4 z+MMWzg_vHw8Gehas%noum=96f^sbXk4`v>NGu8JMUk2mGKH1)Z3-He89p80!(5DXx z^qDS<2S}SPH8QSe28R>i2b{#~nc6>$x`5BGj?~$XgP%~#QQJPy{hLA)yd9BsycfgS zxfEpQA`NG&s@gl}i4v1O-8u(flL18Tv7#i)%LwnU_K z7l2n@h&RVhxchBZ@h9;PMPUr77Xb$fQ zJUyiEy*$eFFu&99SheYwLl4n~BeLla@m;0zV9|wG^{MKb=Z{9)x-)Q#P}}8c%p!-H z#>y7sM@-Wqp^f_Cofc|bTRDS8`dW=xCxYE*bu80`CT6Sm@lGb-G|v+PyrJ&>Fmi*g zy#b#v(ltO#S$H#!WFDuh@n7{JTRkS!_hTIT$~U^>&iyySee95ekC6@!J;v~^yPBh! z!(x}C&VryB4u4aY9ju4dL)Xx|kb3Veh2MEMqxWGcU|P!CBWh*?b7;d_;;jw(QeLg3 zws{=cFh-VA{hTu*zLmJPI?xXKrayR(zQn`}?#k7~eVvj8U7ew6q9C^*tY=~3#^SM@ z7vlZlZy@(qpauU2{}dhua*Sqn8sOFQ>Z(0*%%VaT_1MHdXL0e^vZIZECfq z@X8aEpE>_Tp@d4ddOunQ3miBK=gxCh7)L&+c_`iKZ5Zjh!$b2r$SikA7}df z&GUI8-YJSc@Jm0kwMUlStAFC4+r5lPD5*8^?^gCUH`6UjVil`Di{je7PZPqvdbt`5 z5YTWvbyJ&G{AJ=*41tz02Y zct)Hf=(>y>@d|*?*7{fso4)~uc%ORUnyq&VO>j5d4qei3)+rpmluYfa(N?k-GfZL7 zdKR;^eDjYU2)1VwR@|2sA5V!K4X5Kwd!KltVL4cl;1Zr)T?j=MeZ69Md2Ac!`4WLlcPG~ zr_X4KhM|cKnaifQZx+r_wBR7ZhJ zZRfbV;3mx+p7f@uZPixQ%-#+s`isJL=uatIZ&Vz%AzcO6OJw3+ge(`^U+mQJH%FVp z`%g`7jhc4b-PWo!%j}DNthR}1LaMx2tAhrMc!4=(D-1u4JKR+@+EUQEI_9J3MiH{h$t2v@oov``V|9vMKpzS7o?<>i{ziT+eb&?>U{AQTZ8~`y~d` zK4yA6)m4b1Y6IUN6BMo6u&&T7dJ7h_Hch|uM@dyx%?0*IQHXx|N;rk+U+9@;oc;V~<;u5x2uht{6%~tMV4Lo%vPTK!)C}n( +// 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 0000000000000000000000000000000000000000..e9916963852a9748baf1b9ac6093fb3b9179dbbc GIT binary patch literal 89322 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 literal 0 HcmV?d00001 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 @@ - - - -- 2.17.1