- [FIX] Arreglat el ampastre de zooms i modes

This commit is contained in:
2026-05-18 09:47:22 +02:00
parent 5b82b260ab
commit 9f08c4e8a3
+38 -16
View File
@@ -9,8 +9,8 @@
#include <string>
#include <SDL3/SDL.h>
#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);
}
}