Fix double-scaling by locking page layout to logical presentation

Pages computed layout from SDL_GetWindowSize() (real window
coordinates) while SDL_SetRenderLogicalPresentation() independently
remapped every draw call into a 1920x1080 space. The two coordinate
systems only agreed when the window happened to be exactly 1920x1080;
at any other size, layout coordinates were transformed a second time,
so content shrank/grew quadratically toward the top-left on resize or
on non-1080p monitors. Commenting the call out masked the bug by
making rendering 1:1 with the window, but then nothing scaled: fonts
and margins stayed fixed-pixel while backgrounds cover-fit, and HiDPI
displays drew at point resolution and relied on blurry compositor
upsampling.

Restore SDL_SetRenderLogicalPresentation(1920x1080, LETTERBOX) as the
single source of scaling, and route all twelve layout sites through a
new radiantwave::getLayoutSize() helper (src/logical_size.h) that
returns the renderer's logical size, so pages always lay out against
the design resolution regardless of window or monitor geometry. Add
SDL_WINDOW_HIGH_PIXEL_DENSITY so HiDPI displays render at native pixel
density instead of being upscaled by the OS. Cached per-page textures
become resolution-independent since layout no longer depends on window
size.
This commit is contained in:
NeilClack
2026-08-21 09:29:23 -05:00
parent 8e930ef8d9
commit 3c9de0bee2
14 changed files with 47 additions and 18 deletions
+2 -1
View File
@@ -5,6 +5,7 @@
#include "proclamation_options_page.h"
#include "scramble/fibonacci_scrambler.h"
#include "utf8_utils.h"
#include "logical_size.h"
#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>
@@ -35,7 +36,7 @@ void ScrollerPage::onPush(AppState &state)
int winW = 0;
int winH = 0;
SDL_GetWindowSize(state.window, &winW, &winH);
radiantwave::getLayoutSize(state.renderer, &winW, &winH);
screenW_ = static_cast<float>(winW);
screenH_ = static_cast<float>(winH);
// Lines are capped at the full screen width; the widest Fibonacci lines are