From 9f08c4e8a3b68345296f22cf9bea4e79e2ae1d9d Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 18 May 2026 09:47:22 +0200 Subject: [PATCH] - [FIX] Arreglat el ampastre de zooms i modes --- ascii.cpp | 54 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/ascii.cpp b/ascii.cpp index 430a883..6871f40 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -9,8 +9,8 @@ #include #include -#define BASE_WINDOW_WIDTH 360 -#define BASE_WINDOW_HEIGHT 280 +#define BASE_WINDOW_WIDTH 720 +#define BASE_WINDOW_HEIGHT 560 #define swap(a, b) {auto tmp=a;a=b;b=tmp;} @@ -37,6 +37,8 @@ uint8_t *char_screen = NULL; uint8_t *color_screen = NULL; uint8_t screen_width = 40; uint8_t screen_height = 30; +uint16_t pixels_width = 640; +uint16_t pixels_height = 480; uint8_t current_color = 0x1e; uint8_t current_border = 0; uint8_t current_mode = 1; @@ -52,12 +54,12 @@ uint8_t cursor_y = 0; SDL_Window *mini_win; SDL_Renderer *mini_ren; SDL_Texture *mini_bak = NULL; -uint8_t window_zoom = 2; +uint8_t window_zoom = 1; bool window_fullscreen = false; uint16_t window_width = BASE_WINDOW_WIDTH * window_zoom; uint16_t window_height = BASE_WINDOW_HEIGHT * window_zoom; -uint16_t window_hborder = (window_width - screen_width*8*window_zoom) / 2; -uint16_t window_vborder = (window_height - screen_height*8*window_zoom) / 2; +uint16_t window_hborder = (window_width - pixels_width*window_zoom) / 2; +uint16_t window_vborder = (window_height - pixels_height*window_zoom) / 2; Uint32 *pixels; int pitch; @@ -88,6 +90,8 @@ void reinit() { case 0: screen_width = 80; screen_height = 30; + pixels_width = 640; + pixels_height = 480; current_color = 0x07; current_border = 0; cursor_x = 0; @@ -98,6 +102,8 @@ void reinit() { case 1: screen_width = 40; screen_height = 30; + pixels_width = 640; + pixels_height = 480; current_color = 0x07; current_border = 0; cursor_x = 0; @@ -108,6 +114,8 @@ void reinit() { case 2: screen_width = 20; screen_height = 15; + pixels_width = 640; + pixels_height = 480; current_color = 0x07; current_border = 0; cursor_x = 0; @@ -118,6 +126,8 @@ void reinit() { case 3: screen_width = 32; screen_height = 24; + pixels_width = 512; + pixels_height = 384; current_color = 0x07; current_border = 0; cursor_x = 0; @@ -128,18 +138,30 @@ void reinit() { case 4: screen_width = 80; screen_height = 30; + pixels_width = 640; + pixels_height = 480; current_color = 0x07; current_border = 0; cursor_x = 0; cursor_y = 0; char_screen = &mem[0]; - color_screen = &mem[0x1200]; + color_screen = &mem[2400]; break; } - window_width = BASE_WINDOW_WIDTH * window_zoom; - window_height = BASE_WINDOW_HEIGHT * window_zoom; - window_hborder = (window_width - screen_width*8*window_zoom) / 2; - window_vborder = (window_height - screen_height*8*window_zoom) / 2; + uint8_t zoom = window_zoom; + if (window_fullscreen) { + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); + int max_w_zoom = dm->w / (pixels_width); + int max_h_zoom = dm->h / (pixels_height); + zoom = SDL_min(max_w_zoom, max_h_zoom); + window_width = dm->w; + window_height = dm->h; + } else { + window_width = BASE_WINDOW_WIDTH * zoom; + window_height = BASE_WINDOW_HEIGHT * zoom; + } + window_hborder = (window_width - pixels_width*zoom) / 2; + window_vborder = (window_height - pixels_height*zoom) / 2; mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen_width*8, screen_height*8); SDL_SetTextureScaleMode(mini_bak, SDL_SCALEMODE_NEAREST); @@ -233,8 +255,8 @@ void applyZoom(int zoom) // 3. Nuevo tamaño window_width = BASE_WINDOW_WIDTH * window_zoom; window_height = BASE_WINDOW_HEIGHT * window_zoom; - window_hborder = (window_width - screen_width*8*window_zoom) / 2; - window_vborder = (window_height - screen_height*8*window_zoom) / 2; + window_hborder = (window_width - pixels_width*window_zoom) / 2; + window_vborder = (window_height - pixels_height*window_zoom) / 2; // 4. Calcular nueva posición para mantener el centro int newX = SDL_max(0, oldX - (window_width - oldW) / 2); @@ -253,13 +275,13 @@ void applyFullScreen() { } else { window_fullscreen = true; const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); - int max_w_zoom = dm->w / (screen_width*8); - int max_h_zoom = dm->h / (screen_height*8); + int max_w_zoom = dm->w / (pixels_width); + int max_h_zoom = dm->h / (pixels_height); int max_window_zoom = SDL_min(max_w_zoom, max_h_zoom); window_width = dm->w; window_height = dm->h; - window_hborder = (window_width - screen_width*8*max_window_zoom) / 2; - window_vborder = (window_height - screen_height*8*max_window_zoom) / 2; + window_hborder = (window_width - pixels_width*max_window_zoom) / 2; + window_vborder = (window_height - pixels_height*max_window_zoom) / 2; SDL_SetWindowFullscreen(mini_win, window_fullscreen); } }