summaryrefslogtreecommitdiff
path: root/platform_win32.c
blob: 7ebd16c294a247cac3e2fba1eee4989d8cfda503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#define UNICODE
#include <windows.h>

#define SOFTRENDER_IMPLEMENTATION
#include "softrender.h"

// TODO(kard): ofc some resizing stuff
#define WIDTH 256
#define HEIGHT 256

static uint32_t pixel_buffer[WIDTH * HEIGHT];

LRESULT WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY: {
            PostQuitMessage(0);
            return 0;
        }
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nShowCmd
) {
    const wchar_t CLASS_NAME[]  = L"softrender";

    WNDCLASS wc = { 0 };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0,
        CLASS_NAME,
        L"softrender",
        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, // bla bla you can't resize window basically
        CW_USEDEFAULT, CW_USEDEFAULT, WIDTH, HEIGHT,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    if (hwnd == NULL)
        return 1;

    ShowWindow(hwnd, nShowCmd);

    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(bmi));
    bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth       = WIDTH;
    bmi.bmiHeader.biHeight      = -HEIGHT; // negative = top-down
    bmi.bmiHeader.biPlanes      = 1;
    bmi.bmiHeader.biBitCount    = 32;
    bmi.bmiHeader.biCompression = BI_RGB;

    soft_Canvas canvas = {
        .pixels = pixel_buffer,
        .width = WIDTH,
        .height = HEIGHT,
        .stride = WIDTH,
    };

    MSG msg = {0};
    BOOL running = TRUE;

    while (running) {
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                running = FALSE;
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if (!running) break;


        // NOTE(kard): ACTUAL RENDERING CODE HERE !!!
        soft_clear(canvas, 0xFF000000);
        soft_draw_rect(canvas, 80, 70, 80 + 20, 70 + 40, 0xFFFF00FF);
        soft_draw_rect(canvas, 140, 70, 140 + 20, 70 + 40, 0xFFFF00FF);


        HDC hdc = GetDC(hwnd);
        StretchDIBits(
            hdc,
            0, 0, WIDTH, HEIGHT, // dest rectangle
            0, 0, WIDTH, HEIGHT, // src rectangle
            pixel_buffer,
            &bmi,
            DIB_RGB_COLORS,
            SRCCOPY
        );

        InvalidateRect(hwnd, NULL, FALSE);
        UpdateWindow(hwnd);

        // TODO(kard): proper frame limiting
        Sleep(16);
    }

    return (int) msg.wParam;
}