From 41e80ae249a4c98906925ae6e124e48f7cba204f Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sat, 24 Jan 2026 22:41:33 +0100 Subject: [PATCH] Use render output size to compute content location The coordinates of the content to render depend on the render output size, not the window size in pixels. In theory, the two could differ. --- app/src/screen.c | 31 +++++++++++++++---------------- app/src/util/sdl.c | 19 +++++++++++++++++++ app/src/util/sdl.h | 3 +++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/src/screen.c b/app/src/screen.c index 698ce2aa..46f2a14f 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -148,34 +148,33 @@ sc_screen_update_content_rect(struct sc_screen *screen) { assert(screen->video); struct sc_size content_size = screen->content_size; - // The drawable size is the window size * the HiDPI scale - struct sc_size drawable_size = - sc_sdl_get_window_size_in_pixels(screen->window); + struct sc_size render_size = + sc_sdl_get_render_output_size(screen->renderer); SDL_Rect *rect = &screen->rect; - if (is_optimal_size(drawable_size, content_size)) { + if (is_optimal_size(render_size, content_size)) { rect->x = 0; rect->y = 0; - rect->w = drawable_size.width; - rect->h = drawable_size.height; + rect->w = render_size.width; + rect->h = render_size.height; return; } - bool keep_width = content_size.width * drawable_size.height - > content_size.height * drawable_size.width; + bool keep_width = content_size.width * render_size.height + > content_size.height * render_size.width; if (keep_width) { rect->x = 0; - rect->w = drawable_size.width; - rect->h = drawable_size.width * content_size.height - / content_size.width; - rect->y = (drawable_size.height - rect->h) / 2; + rect->w = render_size.width; + rect->h = render_size.width * content_size.height + / content_size.width; + rect->y = (render_size.height - rect->h) / 2; } else { rect->y = 0; - rect->h = drawable_size.height; - rect->w = drawable_size.height * content_size.width - / content_size.height; - rect->x = (drawable_size.width - rect->w) / 2; + rect->h = render_size.height; + rect->w = render_size.height * content_size.width + / content_size.height; + rect->x = (render_size.width - rect->w) / 2; } } diff --git a/app/src/util/sdl.c b/app/src/util/sdl.c index 07921817..84ce357d 100644 --- a/app/src/util/sdl.c +++ b/app/src/util/sdl.c @@ -130,6 +130,25 @@ sc_sdl_hide_window(SDL_Window *window) { } } +struct sc_size +sc_sdl_get_render_output_size(SDL_Renderer *renderer) { + int width; + int height; + bool ok = SDL_GetRenderOutputSize(renderer, &width, &height); + if (!ok) { + LOGE("Could not get render output size: %s", SDL_GetError()); + LOGE("Please report the error"); + // fatal error + abort(); + } + + struct sc_size size = { + .width = width, + .height = height, + }; + return size; +} + bool sc_sdl_render_clear(SDL_Renderer *renderer) { bool ok = SDL_RenderClear(renderer); diff --git a/app/src/util/sdl.h b/app/src/util/sdl.h index 78b8319e..bdd748c2 100644 --- a/app/src/util/sdl.h +++ b/app/src/util/sdl.h @@ -34,6 +34,9 @@ sc_sdl_show_window(SDL_Window *window); void sc_sdl_hide_window(SDL_Window *window); +struct sc_size +sc_sdl_get_render_output_size(SDL_Renderer *renderer); + bool sc_sdl_render_clear(SDL_Renderer *renderer);