119 lines
3.1 KiB
C++
119 lines
3.1 KiB
C++
#include "util_window.h"
|
|
#include <cmath>
|
|
|
|
const char* wnd_class_name = "Renderer To-Be";
|
|
void* pixels;
|
|
char* pixel_data;
|
|
BITMAPINFO info;
|
|
HBITMAP hbm;
|
|
const int BITCOUNT_PER_PIXEL = 24;
|
|
const int title_height = 39;
|
|
long long bytes_per_row;
|
|
bool screen_changed = false;
|
|
HDC hdc;
|
|
HDRAWDIB hdd;
|
|
HDC bitmap_dc;
|
|
HGDIOBJ old_obj;
|
|
|
|
HWND create_window(HINSTANCE &hInstance) {
|
|
HWND hWnd;
|
|
WNDCLASSEX wnd_class = { 0 };
|
|
init_wnd_class(wnd_class, hInstance);
|
|
|
|
RegisterClassEx(&wnd_class);
|
|
|
|
create_hwnd(hWnd, hInstance);
|
|
init(hWnd);
|
|
|
|
return hWnd;
|
|
}
|
|
|
|
void init(HWND &hWnd) {
|
|
memset(&info, 0, sizeof(info));
|
|
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
info.bmiHeader.biWidth = screen_width;
|
|
info.bmiHeader.biHeight = screen_height;
|
|
info.bmiHeader.biPlanes = 1;
|
|
info.bmiHeader.biBitCount = BITCOUNT_PER_PIXEL;
|
|
info.bmiHeader.biCompression = BI_RGB;
|
|
|
|
hdc = GetDC(hWnd);
|
|
pixels = NULL;
|
|
hbm = CreateDIBSection(hdc, &info, DIB_RGB_COLORS, &pixels, NULL, 0);
|
|
pixel_data = (char*)pixels;
|
|
|
|
hdd = DrawDibOpen();
|
|
|
|
bitmap_dc = CreateCompatibleDC(hdc);
|
|
old_obj = SelectObject(bitmap_dc, hbm);
|
|
bytes_per_row = ceil(screen_width * 0.03) * 100;
|
|
}
|
|
|
|
void create_hwnd(HWND &hwnd, HINSTANCE &hInstance)
|
|
{
|
|
hwnd = CreateWindowEx(
|
|
WS_EX_CLIENTEDGE,
|
|
TEXT(wnd_class_name),
|
|
TEXT("Renderer To-be"), // window caption
|
|
WS_OVERLAPPEDWINDOW, // window style
|
|
0, // initial x position
|
|
0, // initial y position
|
|
screen_width + 16, // Some weird horizontal dead pixels
|
|
screen_height + title_height,
|
|
NULL, // parent window handle
|
|
NULL, // window menu handle
|
|
hInstance, // program instance handle
|
|
NULL); // creation parameters
|
|
}
|
|
|
|
void init_wnd_class(WNDCLASSEX &wndClass, HINSTANCE &hInstance) {
|
|
wndClass.cbSize = sizeof(WNDCLASSEX);
|
|
wndClass.style = 0;
|
|
wndClass.lpfnWndProc = WndProc;
|
|
wndClass.cbClsExtra = 0;
|
|
wndClass.cbWndExtra = 0;
|
|
wndClass.hInstance = hInstance;
|
|
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
|
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
|
wndClass.lpszMenuName = NULL;
|
|
wndClass.lpszClassName = TEXT(wnd_class_name);
|
|
wndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
|
}
|
|
|
|
void destroy_window() {
|
|
DrawDibEnd(hdd);
|
|
DrawDibClose(hdd);
|
|
SelectObject(bitmap_dc, old_obj);
|
|
DeleteDC(hdc);
|
|
DeleteDC(bitmap_dc);
|
|
DeleteObject(hbm);
|
|
DeleteObject(old_obj);
|
|
}
|
|
|
|
|
|
void set_pixel(unsigned int x, unsigned int y, unsigned int color) {
|
|
unsigned long pixel_index = y * bytes_per_row + x * 3;
|
|
|
|
pixel_data[pixel_index + 2] = (char)(color >> 0);
|
|
pixel_data[pixel_index + 1] = (char)(color >> 8);
|
|
pixel_data[pixel_index + 0] = (char)(color >> 16);
|
|
|
|
if (!screen_changed)
|
|
screen_changed = true;
|
|
}
|
|
|
|
void clear_screen() {
|
|
for (int x = 0; x < screen_width; x++)
|
|
for (int y = 0; y < screen_height; y++)
|
|
set_pixel(x, y, 0);
|
|
}
|
|
|
|
void Update() {
|
|
if (screen_changed) {
|
|
DrawDibDraw(hdd, hdc, 0, 0, screen_width, screen_height, &info.bmiHeader, pixels, 0, 0, screen_width, screen_height, 0);
|
|
clear_screen();
|
|
screen_changed = false;
|
|
}
|
|
}
|