From d77814424e5e3fe1b01cc4d2250d97248a70e2a9 Mon Sep 17 00:00:00 2001 From: kdx Date: Fri, 14 Apr 2023 01:51:56 +0200 Subject: cool kid upscale --- src/orgaemu.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/orgaemu.c b/src/orgaemu.c index 4b7630e..7de0334 100644 --- a/src/orgaemu.c +++ b/src/orgaemu.c @@ -10,10 +10,13 @@ static uint16_t *mem = NULL, *stack = NULL, *rstack = NULL; static size_t stack_ptr = 0, rstack_ptr = 0; static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; +static SDL_Texture *target = NULL; static int fail(void) { + if (target != NULL) + SDL_DestroyTexture(target); if (renderer != NULL) SDL_DestroyRenderer(renderer); if (window != NULL) @@ -52,6 +55,20 @@ cycle_events(void) static void render(uint16_t *mem) { + int win_w, win_h; + SDL_GetWindowSize(window, &win_w, &win_h); + win_w = win_w ? win_w : 1; + win_h = win_h ? win_h : 1; + const float ratio_w = win_w / 128.0; + const float ratio_h = win_h / 128.0; + float scale = (ratio_w < ratio_h) ? ratio_w : ratio_h; + if (scale > 1.0) + scale = (int)scale; + const int off_x = (win_w - 128 * scale) / 2; + const int off_y = (win_h - 128 * scale) / 2; + const SDL_Rect dest = { off_x, off_y, 128 * scale, 128 * scale }; + + SDL_SetRenderTarget(renderer, target); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); for (int y = 0; y < 128; y++) { @@ -66,8 +83,12 @@ render(uint16_t *mem) SDL_RenderDrawPoint(renderer, x, y); } } + SDL_SetRenderTarget(renderer, NULL); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, target, NULL, &dest); SDL_RenderPresent(renderer); - SDL_Delay(1000 / 30); + SDL_Delay(1000 / 30); /* TODO: proper fps cap */ } static void @@ -331,7 +352,14 @@ main(int argc, char **argv) fprintf(stderr, "%s\n", SDL_GetError()); return fail(); } - if (SDL_CreateWindowAndRenderer(128, 128, 0, &window, &renderer) < 0) { + if (SDL_CreateWindowAndRenderer(128, 128, SDL_WINDOW_RESIZABLE, + &window, &renderer) < 0) { + fprintf(stderr, "%s\n", SDL_GetError()); + return fail(); + } + target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB888, + SDL_TEXTUREACCESS_TARGET, 128, 128); + if (target == NULL) { fprintf(stderr, "%s\n", SDL_GetError()); return fail(); } -- cgit v1.2.3