reactos/modules/rostests/dibtests/palbitblt/pal.c

202 lines
4.5 KiB
C

/* The idea of this test app is inspired from tutorial *
* found at http://www.theparticle.com/pgraph.html *
* *
* Developed by: Aleksey Bragin <aleksey@studiocerebral.com> *
* Version: 1.0 */
#include <windows.h>
#include <stdlib.h>
#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<W_WIDTH;i++){
for(y=0;y<=W_HEIGHT-1;y++)
dibits[y*320+i] = c % 256;
if (c > 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;
}