From 7975eb37b3fc2b1a02f1e40588402c36af0f795e Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 18 May 2026 06:49:20 +0200 Subject: [PATCH] INESTABLE - Canvi de comp --- ascii.cpp | 101 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 26 deletions(-) diff --git a/ascii.cpp b/ascii.cpp index bf1064a..11b10aa 100644 --- a/ascii.cpp +++ b/ascii.cpp @@ -9,6 +9,9 @@ #include #include +#define BASE_WINDOW_WIDTH 360 +#define BASE_WINDOW_HEIGHT 280 + #define swap(a, b) {auto tmp=a;a=b;b=tmp;} #define AUDIO_NONE 0 @@ -34,10 +37,6 @@ uint8_t *char_screen = NULL; uint8_t *color_screen = NULL; uint8_t screen_width = 40; uint8_t screen_height = 30; -int v_screen_w = 640; -int v_screen_h = 480; -uint8_t hborder = 40; -uint8_t vborder = 40; uint8_t current_color = 0x1e; uint8_t current_border = 0; uint8_t current_mode = 1; @@ -53,6 +52,12 @@ uint8_t cursor_y = 0; SDL_Window *mini_win; SDL_Renderer *mini_ren; SDL_Texture *mini_bak = NULL; +uint8_t window_zoom = 2; +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; + Uint32 *pixels; int pitch; Uint32 counter=0; @@ -78,8 +83,6 @@ const char* get_filename() { void reinit() { if (mini_bak != NULL) SDL_DestroyTexture(mini_bak); counter=0; - hborder = vborder = 40; - v_screen_w = 640; v_screen_h = 480; switch (current_mode) { case 0: screen_width = 80; @@ -90,8 +93,6 @@ void reinit() { cursor_y = 0; char_screen = &mem[0]; color_screen = &mem[1200]; - //SDL_RenderSetLogicalSize(mini_ren, 640, 480); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 240); break; case 1: screen_width = 40; @@ -102,8 +103,6 @@ void reinit() { cursor_y = 0; char_screen = &mem[0]; color_screen = &mem[1200]; - //SDL_RenderSetLogicalSize(mini_ren, 320, 240); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 240); break; case 2: screen_width = 20; @@ -114,14 +113,8 @@ void reinit() { cursor_y = 0; char_screen = &mem[0]; color_screen = &mem[300]; - //SDL_RenderSetLogicalSize(mini_ren, 160, 120); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 160, 120); break; case 3: - hborder = 104; - vborder = 88; - v_screen_w = 512; - v_screen_h = 384; screen_width = 32; screen_height = 24; current_color = 0x07; @@ -130,8 +123,6 @@ void reinit() { cursor_y = 0; char_screen = &mem[0]; color_screen = &mem[768]; - //SDL_RenderSetLogicalSize(mini_ren, 640, 480); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 192); break; case 4: screen_width = 80; @@ -142,10 +133,14 @@ void reinit() { cursor_y = 0; char_screen = &mem[0]; color_screen = &mem[0x1200]; - //SDL_RenderSetLogicalSize(mini_ren, 640, 480); - mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 240); 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; + + 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); } @@ -217,6 +212,29 @@ void romcpy() { void debug_set_prompt(); +void applyZoom(SDL_Window* win, int zoom, int baseW, int baseH) +{ + // 1. Tamaño actual + int oldW, oldH; + SDL_GetWindowSize(win, &oldW, &oldH); + + // 2. Posición actual + int oldX, oldY; + SDL_GetWindowPosition(win, &oldX, &oldY); + + // 3. Nuevo tamaño + int newW = baseW * zoom; + int newH = baseH * zoom; + + // 4. Calcular nueva posición para mantener el centro + int newX = SDL_max(0, oldX - (newW - oldW) / 2); + int newY = SDL_max(0, oldY - (newH - oldH) / 2); + + // 5. Aplicar + SDL_SetWindowSize(win, newW, newH); + SDL_SetWindowPosition(win, newX, newY); +} + int main(int argc,char*argv[]) { bool skip_bios = false; SDL_strlcpy(lua_filename, "game.lua", 9); @@ -230,7 +248,7 @@ int main(int argc,char*argv[]) { //[TODEL]for (int i=0; i1) { + window_zoom--; + 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; + + applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); + } + } else if (mini_eve.key.scancode == SDL_SCANCODE_F2) { + const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay()); + if ( (BASE_WINDOW_WIDTH*(window_zoom+1) <= dm->w) && (BASE_WINDOW_HEIGHT*(window_zoom+1) <= dm->h) ) { + window_zoom++; + 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; + applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); + } + } else if (mini_eve.key.scancode == SDL_SCANCODE_F3) { + 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_window_zoom = SDL_min(max_w_zoom, max_h_zoom); + window_width = BASE_WINDOW_WIDTH * max_window_zoom; + window_height = BASE_WINDOW_HEIGHT * max_window_zoom; + window_hborder = (window_width - screen_width*8*window_zoom) / 2; + window_vborder = (window_height - screen_height*8*window_zoom) / 2; + applyZoom(mini_win, max_window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT); + + } else if ((mini_eve.key.scancode == SDL_SCANCODE_ESCAPE) && (mini_eve.key.mod & SDL_KMOD_LCTRL) ) { if (lua_is_playing()) { lua_pause(); //lua_quit(); @@ -305,9 +354,9 @@ int main(int argc,char*argv[]) { keys = SDL_GetKeyboardState(NULL); float mx, my; mouse_buttons = SDL_GetMouseState(&mx, &my); - if (mx>=hborder && my>=vborder && mx<(v_screen_w+hborder) && my<(v_screen_h+vborder)) { - mouse_x = (mx-hborder) / (v_screen_w/screen_width); - mouse_y = (my-vborder) / (v_screen_h/screen_height); + if (mx>=window_hborder && my>=window_vborder && mx<(window_width-window_hborder) && my<(window_height-window_vborder)) { + mouse_x = (mx-window_hborder) / ((window_width-window_hborder)/screen_width); + mouse_y = (my-window_vborder) / ((window_height-window_vborder)/screen_height); } if (lua_is_playing()) { @@ -382,7 +431,7 @@ int main(int argc,char*argv[]) { SDL_SetRenderDrawColor(mini_ren, (palette[current_border] >> 16)&0xff, (palette[current_border] >> 8)&0xff, palette[current_border]&0xff, 0); //SDL_SetRenderDrawColor(mini_ren, 255, 0, 0, 0); SDL_RenderClear(mini_ren); - SDL_FRect rect = {(float)hborder, (float)vborder, (float)v_screen_w, (float)v_screen_h}; + SDL_FRect rect = {(float)window_hborder, (float)window_vborder, (float)(window_width-window_hborder*2), (float)(window_height-window_vborder*2)}; SDL_RenderTexture(mini_ren, mini_bak, NULL, &rect); //SDL_RenderCopy(mini_ren, mini_bak, NULL, NULL); SDL_RenderPresent(mini_ren);