From 38499b2ceec400feaa657258458f859276f75d0c Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Tue, 24 Feb 2026 08:50:49 +0100 Subject: [PATCH] rendering: Added scaled rendering from frame buffer -> window --- src/lrts.c | 16 ++++++++++++++++ src/p_r_sdl/p_draw.c | 9 ++++++++- src/p_r_sdl/p_init.c | 8 ++++++-- src/u_defs.h | 6 ++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/lrts.c b/src/lrts.c index 01149c0..193c2e0 100644 --- a/src/lrts.c +++ b/src/lrts.c @@ -44,6 +44,22 @@ struct u_vec2 lrts_get_render_res(void) { return render_res; } +#define U_SCREEN_W 1280 +#define U_SCREEN_H 720 + +struct u_vec2 lrts_get_screen_res(void) { + struct lrts_config *cfg = lrts_cfg(); + + struct u_vec2 screen_res = cfg->screen_res; + if (screen_res.x == 0) { + screen_res.x = U_SCREEN_W; + } + if (screen_res.y == 0) { + screen_res.y = U_SCREEN_H; + } + return screen_res; +} + int lrts_main(int argc, char **argv) { p_io_init(); lrts_getopt(argc, argv, lrts_cfg()); diff --git a/src/p_r_sdl/p_draw.c b/src/p_r_sdl/p_draw.c index c465e42..cf5416e 100644 --- a/src/p_r_sdl/p_draw.c +++ b/src/p_r_sdl/p_draw.c @@ -12,6 +12,13 @@ void p_draw_end(void) { void p_draw_present(void) { SDL_Surface* screen = SDL_GetWindowSurface(p_main_window); - SDL_BlitSurface(r_target, NULL, screen, NULL); + SDL_Rect dst; + + dst.x = 0; + dst.y = 0; + dst.w = screen->w; + dst.h = screen->h; + + SDL_BlitSurfaceScaled(r_target, NULL, screen, &dst, SDL_SCALEMODE_PIXELART); SDL_UpdateWindowSurface(p_main_window); } diff --git a/src/p_r_sdl/p_init.c b/src/p_r_sdl/p_init.c index 51de98d..41f2b13 100644 --- a/src/p_r_sdl/p_init.c +++ b/src/p_r_sdl/p_init.c @@ -7,9 +7,11 @@ #include "p_window.c" +#define DEFAULT_COLOR 0x222222FF + int p_render_init(void) { struct lrts_config *cfg = lrts_cfg(); - struct u_vec2 target_res = lrts_get_render_res(); + struct u_vec2 target_res = lrts_get_screen_res(); if (!SDL_Init(SDL_INIT_VIDEO)) { u_log(U_LOG_ERR, "Failed to init video: %s\n", @@ -24,7 +26,7 @@ int p_render_init(void) { exit(-1); } - + SDL_FillSurfaceRect(SDL_GetWindowSurface(p_main_window), NULL, DEFAULT_COLOR); u_log(U_LOG_DEBUG, "Init successful\n"); return 0; @@ -37,6 +39,8 @@ int p_render_init_framebuffer(void) { u_log(U_LOG_ERR, "Failed to create surface: %s\n", SDL_GetError()); exit(-1); } + + SDL_FillSurfaceRect(r_target, NULL, DEFAULT_COLOR); r_framebuffer.pixels = r_target->pixels; r_framebuffer.width = r_target->w; diff --git a/src/u_defs.h b/src/u_defs.h index f6f30fc..5207fb4 100644 --- a/src/u_defs.h +++ b/src/u_defs.h @@ -41,6 +41,7 @@ struct lrts_config { const char *name; struct u_vec2 render_res; + struct u_vec2 screen_res; char **argv; int argc; @@ -58,6 +59,11 @@ int lrts_main(int argc, char **argv); */ struct u_vec2 lrts_get_render_res(void); +/** + * Returns the screen resolution + */ +struct u_vec2 lrts_get_screen_res(void); + #define LRTS_UNUSED(x) (void)(x) -- 2.30.2