/* 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(HBITMAP *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; }