diff options
| author | fschildt <florian.schildt@protonmail.com> | 2025-08-22 15:23:11 +0200 | 
|---|---|---|
| committer | fschildt <florian.schildt@protonmail.com> | 2025-10-15 11:33:23 +0200 | 
| commit | 04e4627e6c11254ee6f49edf5feb1b8d711da41a (patch) | |
| tree | e28f2e62d3e1b83f9686cdeb102e3f47379e6793 /src/graveyard/win32/win32_window.cpp | |
Diffstat (limited to 'src/graveyard/win32/win32_window.cpp')
| -rw-r--r-- | src/graveyard/win32/win32_window.cpp | 77 | 
1 files changed, 77 insertions, 0 deletions
diff --git a/src/graveyard/win32/win32_window.cpp b/src/graveyard/win32/win32_window.cpp new file mode 100644 index 0000000..6ec0891 --- /dev/null +++ b/src/graveyard/win32/win32_window.cpp @@ -0,0 +1,77 @@ +#include <platform/platform.h> +#include <windows.h> + +struct Win32OffscreenBuffer { +    PlatformOffscreenBuffer platform_offscreen_buffer; +    BITMAPINFO bitmap_info; +}; + +struct PlatformWindow { +    HWND wnd; +    HDC dc; +    Win32OffscreenBuffer offscreen_buffer; +}; + +Win32Window::Win32Window(HWND handle, HDC dc) +{ +    m_Wnd = handle; +    m_Dc = dc; +    memset((void*)&m_OffscreenBuffer, 0, sizeof(m_OffscreenBuffer)); +} + +bool +Win32Window::RecreateOffscreenBuffer(i32 width, i32 height) +{ +    Sys_Offscreen_Buffer *sys_screen = &m_OffscreenBuffer.sys_offscreen_buffer; + +    sys_screen->red_shift   = 16; +    sys_screen->green_shift = 8; +    sys_screen->blue_shift  = 0; +    sys_screen->alpha_shift = 24; + +    u32 *new_pixels = (u32*)malloc(sizeof(sys_screen->pixels[0]) * width * height); +    if (!new_pixels) +    { +        return false; +    } +    free(sys_screen->pixels); + +    sys_screen->width = width; +    sys_screen->height = height; +    sys_screen->pixels = new_pixels; + + +    BITMAPINFO *bmi = &m_OffscreenBuffer.bitmap_info; +    memset(bmi, 0, sizeof(*bmi)); +    bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader); +    bmi->bmiHeader.biWidth = width; +    bmi->bmiHeader.biHeight = height; +    bmi->bmiHeader.biPlanes = 1; +    bmi->bmiHeader.biBitCount = 32; +    bmi->bmiHeader.biCompression = BI_RGB; + +    return true; +} + +Sys_Offscreen_Buffer * +Win32Window::GetOffscreenBuffer() +{ +    Sys_Offscreen_Buffer *screen = &m_OffscreenBuffer.sys_offscreen_buffer; +    return screen; +} + +void +Win32Window::ShowOffscreenBuffer() +{ +    i32 width = m_OffscreenBuffer.sys_offscreen_buffer.width; +    i32 height = m_OffscreenBuffer.sys_offscreen_buffer.height; +    u32 *pixels = m_OffscreenBuffer.sys_offscreen_buffer.pixels; +    BITMAPINFO *bmi = &m_OffscreenBuffer.bitmap_info; + +    StretchDIBits(m_Dc, +                  0, 0, width, height, +                  0, 0, width, height, +                  pixels, bmi, DIB_RGB_COLORS, SRCCOPY); + +} +  | 
