allow for custom SDL window parameters #8

Merged
odweta merged 2 commits from feat/custom-sdl-window-params into dev 2026-10-06 10:42:34 +02:00
4 changed files with 57 additions and 21 deletions
+11 -7
View File
@@ -6,16 +6,13 @@
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
#define WINDOW_WIDTH 1280 #define WINDOW_NAME_MAX_LENGTH 128
#define WINDOW_HEIGHT 720
#define DEFAULT_WINDOW_NAME "Dangerzone"
#define WINDOW_NAME_LENGTH 128
#define TARGET_FRAME 1.0 / 60.0 #define TARGET_FRAME 1.0 / 60.0
#define FONT_ROWS 7 #define FONT_ROWS 7
#define FONT_COLS 5 #define FONT_COLS 5
typedef struct { typedef struct {
char window_name[WINDOW_NAME_LENGTH]; char window_name[WINDOW_NAME_MAX_LENGTH];
uint16_t width, height; uint16_t width, height;
SDL_Window *window; SDL_Window *window;
SDL_Renderer *renderer; SDL_Renderer *renderer;
@@ -38,19 +35,23 @@ typedef struct {
} engine_internal_state_t; } engine_internal_state_t;
typedef struct { typedef struct {
uint32_t framebuffer[WINDOW_WIDTH * WINDOW_HEIGHT];
SDL_Event event; SDL_Event event;
bool is_running; bool is_running;
bool framebuffer_dirty; bool framebuffer_dirty;
SDL_Rect dirty_rect; SDL_Rect dirty_rect;
uint16_t width, height; uint16_t width, height;
uint32_t *framebuffer;
} game_state_t; } game_state_t;
extern engine_internal_state_t *internal_state; extern engine_internal_state_t *internal_state;
extern game_state_t *game_state; extern game_state_t *game_state;
engine_sdl_state_t* engine_sdl_state_t*
engine_sdl_init(); engine_sdl_init(
uint32_t window_width,
uint32_t window_height,
const char window_name[]
);
void void
engine_sdl_destroy( engine_sdl_destroy(
@@ -59,6 +60,9 @@ engine_sdl_destroy(
bool bool
engine_init( engine_init(
uint32_t window_width,
uint32_t window_height,
const char window_name[],
void (*engine_poll_events)(void), void (*engine_poll_events)(void),
void (*engine_update_framebuffer)(void) void (*engine_update_framebuffer)(void)
); );
+1
View File
@@ -172,5 +172,6 @@ void
engine_stop() { engine_stop() {
engine_sdl_destroy(internal_state->sdl_state); engine_sdl_destroy(internal_state->sdl_state);
free(internal_state); free(internal_state);
free(game_state->framebuffer);
free(game_state); free(game_state);
} }
+40 -9
View File
@@ -2,9 +2,15 @@
#include "error.h" #include "error.h"
#include <SDL3/SDL_render.h> #include <SDL3/SDL_render.h>
#include <SDL3/SDL_video.h> #include <SDL3/SDL_video.h>
#include <stdint.h>
bool bool
engine_sdl_init_state(engine_sdl_state_t **state) { engine_sdl_init_state(
engine_sdl_state_t **state,
uint32_t window_width,
uint32_t window_height,
const char window_name[]
) {
*state = (engine_sdl_state_t *) *state = (engine_sdl_state_t *)
malloc(sizeof(engine_sdl_state_t)); malloc(sizeof(engine_sdl_state_t));
@@ -13,12 +19,13 @@ engine_sdl_init_state(engine_sdl_state_t **state) {
return RCODE_FAILURE; return RCODE_FAILURE;
} }
(*state)->width = WINDOW_WIDTH; (*state)->width = window_width;
(*state)->height = WINDOW_HEIGHT; (*state)->height = window_height;
strncpy( strncpy(
(*state)->window_name, DEFAULT_WINDOW_NAME, (*state)->window_name, window_name,
WINDOW_NAME_LENGTH WINDOW_NAME_MAX_LENGTH - 1
); );
(*state)->window_name[WINDOW_NAME_MAX_LENGTH - 1] = '\0';
return RCODE_SUCCESS; return RCODE_SUCCESS;
} }
@@ -94,11 +101,19 @@ engine_sdl_init_texture(
} }
engine_sdl_state_t* engine_sdl_state_t*
engine_sdl_init() engine_sdl_init(
{ uint32_t window_width,
uint32_t window_height,
const char window_name[]
) {
engine_sdl_state_t *state; engine_sdl_state_t *state;
if (!engine_sdl_init_state(&state) || if (!engine_sdl_init_state(
&state,
window_width,
window_height,
window_name
) ||
!engine_sdl_init_root() || !engine_sdl_init_root() ||
!engine_sdl_init_window(state) || !engine_sdl_init_window(state) ||
!engine_sdl_init_renderer(state) || !engine_sdl_init_renderer(state) ||
@@ -127,6 +142,9 @@ engine_sdl_destroy(
bool bool
engine_init( engine_init(
uint32_t window_width,
uint32_t window_height,
const char window_name[],
void (*engine_poll_events)(void), void (*engine_poll_events)(void),
void (*engine_update_framebuffer)(void) void (*engine_update_framebuffer)(void)
) { ) {
@@ -143,15 +161,28 @@ engine_init(
return RCODE_FAILURE; return RCODE_FAILURE;
} }
game_state->framebuffer = (uint32_t *)
malloc(sizeof(uint32_t) * window_width * window_height);
if (game_state->framebuffer == NULL) {
free(internal_state);
free(game_state);
return RCODE_FAILURE;
}
internal_state->engine_poll_events internal_state->engine_poll_events
= engine_poll_events; = engine_poll_events;
internal_state->engine_update_framebuffer internal_state->engine_update_framebuffer
= engine_update_framebuffer; = engine_update_framebuffer;
internal_state->sdl_state = engine_sdl_init(); internal_state->sdl_state = engine_sdl_init(
window_width,
window_height,
window_name
);
if (internal_state->sdl_state == NULL) { if (internal_state->sdl_state == NULL) {
free(internal_state); free(internal_state);
free(game_state->framebuffer);
free(game_state); free(game_state);
return RCODE_FAILURE; return RCODE_FAILURE;
} }
+4 -4
View File
@@ -25,10 +25,8 @@ client_poll_event()
void void
client_update_framebuffer() client_update_framebuffer()
{ {
// single green demo pixel // example window contents
game_state->framebuffer[0] = 0x00FF00; clear_framebuffer(0xFFFF00);
put_rect(0, 0, 1100, 200, 0xFFFF00);
put_string("Hello, traveller. You have come\nto the right place!", put_string("Hello, traveller. You have come\nto the right place!",
20, 20, 2, 2, 3, 0x000000, 0xFFFF00 20, 20, 2, 2, 3, 0x000000, 0xFFFF00
); );
@@ -39,6 +37,8 @@ main()
{ {
// initialize the engine // initialize the engine
if (engine_init( if (engine_init(
500, 100,
"Dangerzone",
client_poll_event, client_poll_event,
client_update_framebuffer client_update_framebuffer
)) { )) {