From f09780d761d4cbea778dddedd7d72e8f5028c824 Mon Sep 17 00:00:00 2001 From: Carlos Aragones Date: Tue, 15 Sep 2020 11:35:11 +0200 Subject: [PATCH] added mfb_update_ex - Windows version --- include/MiniFB.h | 2 ++ src/windows/WinMiniFB.c | 23 ++++++++++++++++++++--- tests/noise.c | 27 ++++++++++++++++++++------- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/include/MiniFB.h b/include/MiniFB.h index 1e6c5a4..2eedb7f 100644 --- a/include/MiniFB.h +++ b/include/MiniFB.h @@ -23,6 +23,8 @@ struct mfb_window * mfb_open_ex(const char *title, unsigned width, unsigned heig // Also updates the window events mfb_update_state mfb_update(struct mfb_window *window, void *buffer); +mfb_update_state mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned height); + // Only updates the window events mfb_update_state mfb_update_events(struct mfb_window *window); diff --git a/src/windows/WinMiniFB.c b/src/windows/WinMiniFB.c index 1c94c70..ce733d6 100644 --- a/src/windows/WinMiniFB.c +++ b/src/windows/WinMiniFB.c @@ -375,13 +375,26 @@ mfb_open(const char *title, unsigned width, unsigned height) { mfb_update_state mfb_update(struct mfb_window *window, void *buffer) { + if (window == 0x0) { + return STATE_INVALID_WINDOW; + } + + SWindowData *window_data = (SWindowData *) window; + + return mfb_update_ex(window, buffer, window_data->buffer_width, window_data->buffer_height); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +mfb_update_state +mfb_update_ex(struct mfb_window *window, void *buffer, unsigned width, unsigned height) { MSG msg; if (window == 0x0) { return STATE_INVALID_WINDOW; } - SWindowData *window_data = (SWindowData *)window; + SWindowData *window_data = (SWindowData *) window; if (window_data->close) { destroy_window_data(window_data); return STATE_EXIT; @@ -391,9 +404,13 @@ mfb_update(struct mfb_window *window, void *buffer) { return STATE_INVALID_BUFFER; } - window_data->draw_buffer = buffer; + window_data->draw_buffer = buffer; + window_data->buffer_width = width; + window_data->buffer_height = height; SWindowData_Win *window_data_win = (SWindowData_Win *) window_data->specific; + window_data_win->bitmapInfo->bmiHeader.biWidth = window_data->buffer_width; + window_data_win->bitmapInfo->bmiHeader.biHeight = -(LONG) window_data->buffer_height; InvalidateRect(window_data_win->window, 0x0, TRUE); SendMessage(window_data_win->window, WM_PAINT, 0, 0); @@ -692,7 +709,7 @@ translate_key(unsigned int wParam, unsigned long lParam) { bool mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) { - SWindowData *window_data = (SWindowData *) window; + SWindowData *window_data = (SWindowData *) window; if (offset_x + width > window_data->window_width) { return false; diff --git a/tests/noise.c b/tests/noise.c index 6556fdc..4fba5a3 100644 --- a/tests/noise.c +++ b/tests/noise.c @@ -1,25 +1,38 @@ #include #include +#include #include -#define WIDTH 800 -#define HEIGHT 600 -static unsigned int g_buffer[WIDTH * HEIGHT]; +static uint32_t g_width = 800; +static uint32_t g_height = 600; +static uint32_t *g_buffer = 0x0; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void +resize(struct mfb_window *window, int width, int height) { + g_width = width; + g_height = height; + g_buffer = realloc(g_buffer, g_width * g_height * 4); +} /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main() { - int i, noise, carry, seed = 0xbeef; + uint32_t i, noise, carry, seed = 0xbeef; - struct mfb_window *window = mfb_open_ex("Noise Test", WIDTH, HEIGHT, WF_RESIZABLE); + struct mfb_window *window = mfb_open_ex("Noise Test", g_width, g_height, WF_RESIZABLE); if (!window) return 0; + g_buffer = (uint32_t *) malloc(g_width * g_height * 4); + mfb_set_resize_callback(window, resize); + mfb_update_state state; do { - for (i = 0; i < WIDTH * HEIGHT; ++i) { + for (i = 0; i < g_width * g_height; ++i) { noise = seed; noise >>= 3; noise ^= seed; @@ -31,7 +44,7 @@ main() g_buffer[i] = MFB_RGB(noise, noise, noise); } - state = mfb_update(window, g_buffer); + state = mfb_update_ex(window, g_buffer, g_width, g_height); if (state != STATE_OK) { window = 0x0; break;