diff --git a/SDL/gui.c b/SDL/gui.c index 81a9e42..57e232d 100644 --- a/SDL/gui.c +++ b/SDL/gui.c @@ -170,6 +170,10 @@ void update_viewport(void) } } +void rescale_window() { + SDL_SetWindowSize(window, GB_get_screen_width(&gb) * configuration.default_scale, GB_get_screen_height(&gb) * configuration.default_scale); +} + /* Does NOT check for bounds! */ static void draw_char(uint32_t *buffer, unsigned width, unsigned height, unsigned char ch, uint32_t color) { @@ -435,6 +439,12 @@ const char *current_scaling_mode(unsigned index) [configuration.scaling_mode]; } +const char *current_default_scale(unsigned index) +{ + return (const char *[]){"1x", "2x", "3x", "4x", "5x", "6x", "7x", "8x"} + [configuration.default_scale - 1]; +} + const char *current_color_correction_mode(unsigned index) { return (const char *[]){"Disabled", "Correct Color Curves", "Emulate Hardware", "Preserve Brightness", "Reduce Contrast"} @@ -475,6 +485,30 @@ void cycle_scaling_backwards(unsigned index) render_texture(NULL, NULL); } +void cycle_default_scale(unsigned index) +{ + if (configuration.default_scale == GB_SDL_DEFAULT_SCALE_MAX) { + configuration.default_scale = 1; + } else { + configuration.default_scale++; + } + + rescale_window(); + update_viewport(); +} + +void cycle_default_scale_backwards(unsigned index) +{ + if (configuration.default_scale == 1) { + configuration.default_scale = GB_SDL_DEFAULT_SCALE_MAX; + } else { + configuration.default_scale--; + } + + rescale_window(); + update_viewport(); +} + static void cycle_color_correction(unsigned index) { if (configuration.color_correction_mode == GB_COLOR_CORRECTION_REDUCE_CONTRAST) { @@ -643,6 +677,7 @@ const char *blending_mode_string(unsigned index) static const struct menu_item graphics_menu[] = { {"Scaling Mode:", cycle_scaling, current_scaling_mode, cycle_scaling_backwards}, + {"Default Window Scale:", cycle_default_scale, current_default_scale, cycle_default_scale_backwards}, {"Scaling Filter:", cycle_filter, current_filter_name, cycle_filter_backwards}, {"Color Correction:", cycle_color_correction, current_color_correction_mode, cycle_color_correction_backwards}, {"Frame Blending:", cycle_blending_mode, blending_mode_string, cycle_blending_mode_backwards}, diff --git a/SDL/gui.h b/SDL/gui.h index af7543b..c950907 100644 --- a/SDL/gui.h +++ b/SDL/gui.h @@ -41,6 +41,7 @@ enum pending_command { GB_SDL_QUIT_COMMAND, }; +#define GB_SDL_DEFAULT_SCALE_MAX 8 extern enum pending_command pending_command; extern unsigned command_parameter; @@ -107,6 +108,8 @@ typedef struct { GB_border_mode_t border_mode; uint8_t volume; GB_rumble_mode_t rumble_mode; + + uint8_t default_scale; } configuration_t; extern configuration_t configuration; diff --git a/SDL/main.c b/SDL/main.c index 3df369f..f17867e 100644 --- a/SDL/main.c +++ b/SDL/main.c @@ -624,12 +624,48 @@ int main(int argc, char **argv) SDL_Init(SDL_INIT_EVERYTHING); + strcpy(prefs_path, resource_path("prefs.bin")); + if (access(prefs_path, R_OK | W_OK) != 0) { + char *prefs_dir = SDL_GetPrefPath("", "SameBoy"); + snprintf(prefs_path, sizeof(prefs_path) - 1, "%sprefs.bin", prefs_dir); + SDL_free(prefs_dir); + } + + FILE *prefs_file = fopen(prefs_path, "rb"); + if (prefs_file) { + fread(&configuration, 1, sizeof(configuration), prefs_file); + fclose(prefs_file); + + /* Sanitize for stability */ + configuration.color_correction_mode %= GB_COLOR_CORRECTION_REDUCE_CONTRAST +1; + configuration.scaling_mode %= GB_SDL_SCALING_MAX; + configuration.default_scale %= GB_SDL_DEFAULT_SCALE_MAX + 1; + configuration.blending_mode %= GB_FRAME_BLENDING_MODE_ACCURATE + 1; + configuration.highpass_mode %= GB_HIGHPASS_MAX; + configuration.model %= MODEL_MAX; + configuration.sgb_revision %= SGB_MAX; + configuration.dmg_palette %= 3; + configuration.border_mode %= GB_BORDER_ALWAYS + 1; + configuration.rumble_mode %= GB_RUMBLE_ALL_GAMES + 1; + } + + if (configuration.model >= MODEL_MAX) { + configuration.model = MODEL_CGB; + } + + if (configuration.default_scale == 0) { + configuration.default_scale = 2; + } + + atexit(save_configuration); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + printf("scale %d\n", configuration.default_scale); window = SDL_CreateWindow("SameBoy v" xstr(VERSION), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 160 * 2, 144 * 2, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + 160 * configuration.default_scale, 144 * configuration.default_scale, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); SDL_SetWindowMinimumSize(window, 160, 144); if (fullscreen) { @@ -660,36 +696,6 @@ int main(int argc, char **argv) SDL_EventState(SDL_DROPFILE, SDL_ENABLE); - strcpy(prefs_path, resource_path("prefs.bin")); - if (access(prefs_path, R_OK | W_OK) != 0) { - char *prefs_dir = SDL_GetPrefPath("", "SameBoy"); - snprintf(prefs_path, sizeof(prefs_path) - 1, "%sprefs.bin", prefs_dir); - SDL_free(prefs_dir); - } - - FILE *prefs_file = fopen(prefs_path, "rb"); - if (prefs_file) { - fread(&configuration, 1, sizeof(configuration), prefs_file); - fclose(prefs_file); - - /* Sanitize for stability */ - configuration.color_correction_mode %= GB_COLOR_CORRECTION_REDUCE_CONTRAST +1; - configuration.scaling_mode %= GB_SDL_SCALING_MAX; - configuration.blending_mode %= GB_FRAME_BLENDING_MODE_ACCURATE + 1; - configuration.highpass_mode %= GB_HIGHPASS_MAX; - configuration.model %= MODEL_MAX; - configuration.sgb_revision %= SGB_MAX; - configuration.dmg_palette %= 3; - configuration.border_mode %= GB_BORDER_ALWAYS + 1; - configuration.rumble_mode %= GB_RUMBLE_ALL_GAMES + 1; - } - - if (configuration.model >= MODEL_MAX) { - configuration.model = MODEL_CGB; - } - - atexit(save_configuration); - if (!init_shader_with_name(&shader, configuration.filter)) { init_shader_with_name(&shader, "NearestNeighbor"); }