mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
Small program to test ReactOS palette support in bitblt operations (Crashes on ROS for now, I'll commit patches to ROS later to fix this).
svn path=/trunk/; revision=6038
This commit is contained in:
parent
2d66ad555c
commit
156ce01884
3 changed files with 226 additions and 0 deletions
6
reactos/apps/tests/palbitblt/.cvsignore
Normal file
6
reactos/apps/tests/palbitblt/.cvsignore
Normal file
|
@ -0,0 +1,6 @@
|
|||
*.o
|
||||
*.d
|
||||
*.exe
|
||||
*.coff
|
||||
*.sym
|
||||
*.map
|
20
reactos/apps/tests/palbitblt/makefile
Normal file
20
reactos/apps/tests/palbitblt/makefile
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
PATH_TO_TOP = ../../..
|
||||
|
||||
TARGET_NORC = yes
|
||||
|
||||
TARGET_TYPE = program
|
||||
|
||||
TARGET_APPTYPE = windows
|
||||
|
||||
TARGET_NAME = palbitblt
|
||||
|
||||
TARGET_SDKLIBS = kernel32.a gdi32.a
|
||||
|
||||
TARGET_OBJECTS = pal.o
|
||||
|
||||
include $(PATH_TO_TOP)/rules.mak
|
||||
|
||||
include $(TOOLS_PATH)/helper.mk
|
||||
|
||||
# EOF
|
200
reactos/apps/tests/palbitblt/pal.c
Normal file
200
reactos/apps/tests/palbitblt/pal.c
Normal file
|
@ -0,0 +1,200 @@
|
|||
/* 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>
|
||||
|
||||
#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(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;
|
||||
}
|
Loading…
Reference in a new issue