1 /* The idea of this test app is inspired from tutorial       *
2  * found at http://www.theparticle.com/pgraph.html           *
3  *                                                           *
4  * Developed by: Aleksey Bragin <aleksey@studiocerebral.com> *
5  * Version: 1.0                                              */
6 
7 #include <windows.h>
8 #include <stdlib.h>
9 
10 #define W_WIDTH 320
11 #define W_HEIGHT 240
12 
13 // special version of BITMAPINFO and LOGPALETTE for max of 256 palette entries
14 typedef struct
15 {
16 	BITMAPINFOHEADER bmiHeader;
17 	RGBQUAD bmiColors[256];
18 } BITMAPINFO256;
19 
20 typedef struct {
21 	WORD	palVersion;
22 	WORD	palNumEntries;
23 	PALETTEENTRY palPalEntry[256];
24 } LOGPALETTE256;
25 
26 // The only global variable --- contents of the DIBitmap
27 BYTE* dibits;
28 
29 void GeneratePalette(RGBQUAD* p)
30 {
31 	int i;
32 	for(i=0;i<256;i++)
33 	{
34 		p[i].rgbRed = i;
35 		p[i].rgbGreen = i;
36 		p[i].rgbBlue = i;
37 		p[i].rgbReserved = 0;
38 	}
39 }
40 
41 void DoBlt(HBITMAP hBM)
42 {
43 	HDC hDC,Context;
44 	HWND ActiveWindow;
45 	RECT dest;
46 	HBITMAP dflBmp;
47 
48 	if((ActiveWindow = GetActiveWindow()) == NULL)
49 		return;
50 
51 	hDC = GetDC(ActiveWindow);
52 	GetClientRect(ActiveWindow,&dest);
53 
54 	Context = CreateCompatibleDC(0);
55 	dflBmp = SelectObject(Context, hBM);
56 	BitBlt(hDC, 0, 0, dest.right, dest.bottom, Context, 0, 0, SRCCOPY);
57 	SelectObject(Context, dflBmp);
58 	DeleteDC(Context);
59 	DeleteObject(dflBmp);
60 	ReleaseDC(ActiveWindow, hDC);
61 }
62 
63 void UpdatePalette(HBITMAP hBM){
64 	int i,y;
65 	static unsigned int c=0;
66 
67 	for(i=0;i<W_WIDTH;i++){
68 		for(y=0;y<=W_HEIGHT-1;y++)
69 			dibits[y*320+i] = c % 256;
70 
71 		if (c > 512)
72 			c = 0;
73 		else
74 			c++; // It's operation of incrementing of c variable, not reference of a cool OO language :-)
75 	}
76 
77 	DoBlt(hBM);
78 }
79 
80 void InitBitmap(HBITMAP *hBM){
81 	HPALETTE PalHan;
82 	HWND ActiveWindow;
83 	HDC hDC;
84 	RGBQUAD palette[256];
85 	int i;
86 	BITMAPINFO256 bmInf;
87 	LOGPALETTE256 palInf;
88 
89 	ActiveWindow = GetActiveWindow();
90 	hDC = GetDC(ActiveWindow);
91 
92 	bmInf.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
93 	bmInf.bmiHeader.biWidth = W_WIDTH;
94 	bmInf.bmiHeader.biHeight = -abs(W_HEIGHT);
95 	bmInf.bmiHeader.biPlanes = 1;
96 	bmInf.bmiHeader.biBitCount = 8;
97 	bmInf.bmiHeader.biCompression = BI_RGB;
98 	bmInf.bmiHeader.biSizeImage = 0;
99 	bmInf.bmiHeader.biXPelsPerMeter = 0;
100 	bmInf.bmiHeader.biYPelsPerMeter = 0;
101 	bmInf.bmiHeader.biClrUsed = 256;
102 	bmInf.bmiHeader.biClrImportant = 256;
103 
104 	GeneratePalette(palette);
105 
106 	for(i=0;i<256;i++)
107 		bmInf.bmiColors[i] = palette[i];
108 
109 	palInf.palVersion = 0x300;
110 	palInf.palNumEntries = 256;
111 	for(i=0;i<256;i++){
112 		palInf.palPalEntry[i].peRed = palette[i].rgbRed;
113 		palInf.palPalEntry[i].peGreen = palette[i].rgbGreen;
114 		palInf.palPalEntry[i].peBlue = palette[i].rgbBlue;
115 		palInf.palPalEntry[i].peFlags = PC_NOCOLLAPSE;
116 	}
117 
118 	// Create palette
119 	PalHan = CreatePalette((LOGPALETTE*)&palInf);
120 
121 	// Select it into hDC
122 	SelectPalette(hDC,PalHan,FALSE);
123 
124 	// Realize palette in hDC
125 	RealizePalette(hDC);
126 
127 	// Delete handle to palette
128 	DeleteObject(PalHan);
129 
130 	// Create dib section
131 	*hBM = CreateDIBSection(hDC,(BITMAPINFO*)&bmInf,
132 		DIB_RGB_COLORS,(void**)&dibits,0,0);
133 
134 	// Release dc
135 	ReleaseDC(ActiveWindow,hDC);
136 }
137 
138 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam,LPARAM lParam)
139 {
140 	switch(msg){
141 		case WM_DESTROY:
142 			PostQuitMessage(0);
143 			return 0;
144 		default:
145 			return DefWindowProc(hWnd,msg,wParam,lParam);
146 	}
147 }
148 
149 
150 
151 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,int nCmdShow)
152 {
153 	WNDCLASS WndClass;
154 	HWND hWnd;
155 	MSG msg;
156 	char szName[] = "Palette BitBlt test";
157 	BOOL exit = FALSE;
158 	HBITMAP hBM;
159 
160 	// Create and register window class (not modified!!!!!!!!!!!1)
161 	WndClass.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
162 	WndClass.lpfnWndProc = WndProc;
163 	WndClass.cbClsExtra = 0;
164 	WndClass.cbWndExtra = 0;
165 	WndClass.hbrBackground = NULL;//GetStockObject(BLACK_BRUSH);
166 	WndClass.hIcon = NULL;//LoadIcon(hInstance,NULL);
167 	WndClass.hCursor = NULL;//LoadCursor(NULL,IDC_ARROW);
168 	WndClass.hInstance = hInstance;
169 	WndClass.lpszClassName = szName;
170 	WndClass.lpszMenuName = 0;
171 
172 	RegisterClass(&WndClass);
173 
174 	// Create and show window (change styles !!!!!!!!)
175 	hWnd = CreateWindow(szName, "ReactOS palette bitblt test",
176 		WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
177 		CW_USEDEFAULT,CW_USEDEFAULT,W_WIDTH,W_HEIGHT,
178 		0,0,hInstance,0);
179 	ShowWindow(hWnd,nCmdShow);
180 
181 	// Prepare bitmap to be bitblt
182 	InitBitmap(&hBM);
183 
184 	// Main message loop
185 	while (!exit)
186 	{
187 		UpdatePalette(hBM);
188 		Sleep(200);
189 
190 		if(PeekMessage(&msg,0,0,0,PM_NOREMOVE) == TRUE)
191 		{
192 			if (!GetMessage(&msg,0,0,0))
193 				exit = TRUE;
194 
195 			TranslateMessage(&msg);
196 			DispatchMessage(&msg);
197 		}
198 	}
199 
200 	return msg.wParam;
201 }
202