Merge pull request #281 from nadiaholmquist/feature/sdl-scale
SDL: Make default window scale configurable
This commit is contained in:
commit
ebcc0d18ce
38
SDL/gui.c
38
SDL/gui.c
@ -170,6 +170,11 @@ void update_viewport(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rescale_window(void)
|
||||||
|
{
|
||||||
|
SDL_SetWindowSize(window, GB_get_screen_width(&gb) * configuration.default_scale, GB_get_screen_height(&gb) * configuration.default_scale);
|
||||||
|
}
|
||||||
|
|
||||||
/* Does NOT check for bounds! */
|
/* Does NOT check for bounds! */
|
||||||
static void draw_char(uint32_t *buffer, unsigned width, unsigned height, unsigned char ch, uint32_t color)
|
static void draw_char(uint32_t *buffer, unsigned width, unsigned height, unsigned char ch, uint32_t color)
|
||||||
{
|
{
|
||||||
@ -435,6 +440,12 @@ const char *current_scaling_mode(unsigned index)
|
|||||||
[configuration.scaling_mode];
|
[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)
|
const char *current_color_correction_mode(unsigned index)
|
||||||
{
|
{
|
||||||
return (const char *[]){"Disabled", "Correct Color Curves", "Emulate Hardware", "Preserve Brightness", "Reduce Contrast"}
|
return (const char *[]){"Disabled", "Correct Color Curves", "Emulate Hardware", "Preserve Brightness", "Reduce Contrast"}
|
||||||
@ -475,6 +486,32 @@ void cycle_scaling_backwards(unsigned index)
|
|||||||
render_texture(NULL, NULL);
|
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)
|
static void cycle_color_correction(unsigned index)
|
||||||
{
|
{
|
||||||
if (configuration.color_correction_mode == GB_COLOR_CORRECTION_REDUCE_CONTRAST) {
|
if (configuration.color_correction_mode == GB_COLOR_CORRECTION_REDUCE_CONTRAST) {
|
||||||
@ -643,6 +680,7 @@ const char *blending_mode_string(unsigned index)
|
|||||||
|
|
||||||
static const struct menu_item graphics_menu[] = {
|
static const struct menu_item graphics_menu[] = {
|
||||||
{"Scaling Mode:", cycle_scaling, current_scaling_mode, cycle_scaling_backwards},
|
{"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},
|
{"Scaling Filter:", cycle_filter, current_filter_name, cycle_filter_backwards},
|
||||||
{"Color Correction:", cycle_color_correction, current_color_correction_mode, cycle_color_correction_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},
|
{"Frame Blending:", cycle_blending_mode, blending_mode_string, cycle_blending_mode_backwards},
|
||||||
|
@ -41,6 +41,7 @@ enum pending_command {
|
|||||||
GB_SDL_QUIT_COMMAND,
|
GB_SDL_QUIT_COMMAND,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define GB_SDL_DEFAULT_SCALE_MAX 8
|
||||||
|
|
||||||
extern enum pending_command pending_command;
|
extern enum pending_command pending_command;
|
||||||
extern unsigned command_parameter;
|
extern unsigned command_parameter;
|
||||||
@ -107,6 +108,8 @@ typedef struct {
|
|||||||
GB_border_mode_t border_mode;
|
GB_border_mode_t border_mode;
|
||||||
uint8_t volume;
|
uint8_t volume;
|
||||||
GB_rumble_mode_t rumble_mode;
|
GB_rumble_mode_t rumble_mode;
|
||||||
|
|
||||||
|
uint8_t default_scale;
|
||||||
} configuration_t;
|
} configuration_t;
|
||||||
|
|
||||||
extern configuration_t configuration;
|
extern configuration_t configuration;
|
||||||
|
67
SDL/main.c
67
SDL/main.c
@ -624,12 +624,47 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
SDL_Init(SDL_INIT_EVERYTHING);
|
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_MAJOR_VERSION, 3);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||||
|
|
||||||
window = SDL_CreateWindow("SameBoy v" xstr(VERSION), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
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);
|
SDL_SetWindowMinimumSize(window, 160, 144);
|
||||||
|
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
@ -660,36 +695,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
|
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)) {
|
if (!init_shader_with_name(&shader, configuration.filter)) {
|
||||||
init_shader_with_name(&shader, "NearestNeighbor");
|
init_shader_with_name(&shader, "NearestNeighbor");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user