yeah i was looking at cookie cutting code earlier and thought it was really cool.
ive just done a quick test and the way i have it isnt quite right im trying to fill a dc with 0x00000000 and push it to my offscreendc in a clearscreen function it compiles fine but doesnt clear the pixel stuff out.
#include <windows.h>
#include <math.h>
#include <string.h>
#include "main.hpp"
HDC OffScreenDC,ClearGfx,scene_dc;
HBITMAP BufferStorage;
LRESULT CALLBACK WindowProc( HWND hwnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
switch (uMsg)
{
case WM_CREATE:
scene_dc = GetDC( hwnd );
OffScreenDC = CreateCompatibleDC( scene_dc );
BufferStorage = CreateCompatibleBitmap( scene_dc, SCREEN_X, SCREEN_Y );
SelectObject( OffScreenDC, BufferStorage );
ClearGfx = CreateCompatibleDC( scene_dc );
SelectObject( ClearGfx, BufferStorage );
ReleaseDC( hwnd, scene_dc );
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = SCREEN_X;
bmi.bmiHeader.biHeight = -SCREEN_Y;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = SCREEN_BPP;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 75;
bmi.bmiHeader.biYPelsPerMeter = 75;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
SetDIBitsToDevice(ClearGfx, 0,0, SCREEN_X,SCREEN_Y, 0,0, 0,SCREEN_Y, (const void*)0x00000000, &bmi, DIB_RGB_COLORS);
//for( int y=0;y<800;y++)
//for( int x=0;x<600;x++)
//COLORF is 00bbggrr
//SetPixel(ClearGfx,x,y,0x00000000);
//
GenioInit( OffScreenDC ,hwnd );
break;
case WM_DESTROY:
GenioCleanUp( OffScreenDC, hwnd );
DeleteDC( OffScreenDC );
ChangeDisplaySettings( NULL , 0 );
ShowCursor(1);
PostQuitMessage(0);
quit = 1;
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
quit = 1;
break;
}
break;
case WM_PAINT:
PAINTSTRUCT paint;
memset(&paint, 0, sizeof paint);
paint.hdc = (HDC)wParam;
GetUpdateRect(hwnd, &paint.rcPaint,TRUE);
BeginPaint(hwnd, &paint);
GenioMain(OffScreenDC,hwnd);
BitBlt(paint.hdc, 0, 0, SCREEN_X, SCREEN_Y, OffScreenDC, 0, 0, SRCCOPY);
EndPaint(hwnd, &paint);
break;
case WM_ERASEBKGND:
return 1;
break;
case WM_TIMER:
InvalidateRect(hwnd, NULL, 0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
int APIENTRY WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
WNDCLASSEX clas;
MSG msg;
HDC hdc;
clas.cbSize = sizeof(WNDCLASSEX);
clas.style = CS_HREDRAW | CS_VREDRAW;
clas.lpfnWndProc = WindowProc;
clas.cbClsExtra = 0;
clas.cbWndExtra = 0;
clas.hInstance = hInstance;
clas.hIcon = NULL;
clas.hCursor = NULL;
clas.hbrBackground = 0;
clas.lpszMenuName = NULL;
clas.lpszClassName = scene_class;
clas.hIconSm = 0;
RegisterClassEx(&clas);
DEVMODE dmScreenSettings;
memset(&dmScreenSettings, 0, sizeof dmScreenSettings);
dmScreenSettings.dmSize = sizeof dmScreenSettings;
dmScreenSettings.dmPelsWidth = SCREEN_X;
dmScreenSettings.dmPelsHeight = SCREEN_Y;
dmScreenSettings.dmBitsPerPel = SCREEN_BPP;
dmScreenSettings.dmDisplayFrequency = 60;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) scene_window = CreateWindowEx(0, scene_class, "scene!", WS_POPUP, 0,0,SCREEN_X,SCREEN_Y, NULL, NULL, hInstance, 0);
Sleep(1000);
ShowWindow(scene_window, nCmdShow);
UpdateWindow(scene_window);
ShowCursor(0);
SetTimer(scene_window, 1, 0, NULL);
do
{
while (!quit && GetMessage(&msg, scene_window, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} while (!quit);
return 0;
}
void renderworld(HDC hdc)
{
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = SCREEN_X;
bmi.bmiHeader.biHeight = -SCREEN_Y;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = SCREEN_BPP;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 75;
bmi.bmiHeader.biYPelsPerMeter = 75;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
SetDIBitsToDevice(hdc, 0,0, SCREEN_X,SCREEN_Y, 0,0, 0,SCREEN_Y, screen_ptr, &bmi, DIB_RGB_COLORS);
}
void clearworld(void)
{
BitBlt(OffScreenDC, 0, 0, SCREEN_X, SCREEN_Y, ClearGfx, 0, 0, SRCCOPY);
}
this is the same code as my font drawing stuff where in geniomain i do this
main()
{
draw some pixel stuff
render world
clearworld
draw some text
}