aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-04-14 01:51:56 +0200
committerkdx <kikoodx@paranoici.org>2023-04-14 01:51:56 +0200
commitd77814424e5e3fe1b01cc4d2250d97248a70e2a9 (patch)
treef6a737cd3864107be9b969512f5008d644fc3b9f
parent0a40f97a1eb0de80e38a51d19d6b7c92d766554b (diff)
downloadorga-d77814424e5e3fe1b01cc4d2250d97248a70e2a9.tar.gz
cool kid upscale
-rw-r--r--src/orgaemu.c32
1 files 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();
}