diff --git a/src/core/host_display.cpp b/src/core/host_display.cpp index 0dca4aded..bfc642956 100644 --- a/src/core/host_display.cpp +++ b/src/core/host_display.cpp @@ -233,18 +233,18 @@ void HostDisplay::CalculateDrawRect(s32 window_width, s32 window_height, float* } if (out_top_padding) { - switch (m_display_alignment) + switch (g_settings.display_alignment) { - case Alignment::RightOrBottom: + case DisplayAlignment::RightOrBottom: *out_top_padding = std::max(static_cast(window_height) - (display_height * scale), 0.0f); break; - case Alignment::Center: + case DisplayAlignment::Center: *out_top_padding = std::max((static_cast(window_height) - (display_height * scale)) / 2.0f, 0.0f); break; - case Alignment::LeftOrTop: + case DisplayAlignment::LeftOrTop: default: *out_top_padding = 0.0f; break; @@ -260,18 +260,18 @@ void HostDisplay::CalculateDrawRect(s32 window_width, s32 window_height, float* if (out_left_padding) { - switch (m_display_alignment) + switch (g_settings.display_alignment) { - case Alignment::RightOrBottom: + case DisplayAlignment::RightOrBottom: *out_left_padding = std::max(static_cast(window_width) - (display_width * scale), 0.0f); break; - case Alignment::Center: + case DisplayAlignment::Center: *out_left_padding = std::max((static_cast(window_width) - (display_width * scale)) / 2.0f, 0.0f); break; - case Alignment::LeftOrTop: + case DisplayAlignment::LeftOrTop: default: *out_left_padding = 0.0f; break; diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 1455cf614..c1a40e8f0 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -242,6 +242,10 @@ void Settings::Load(SettingsInterface& si) std::clamp(si.GetIntValue("Display", "CustomAspectRatioNumerator", 4), 1, std::numeric_limits::max())); display_aspect_ratio_custom_denominator = static_cast( std::clamp(si.GetIntValue("Display", "CustomAspectRatioDenominator", 3), 1, std::numeric_limits::max())); + display_alignment = + ParseDisplayAlignment( + si.GetStringValue("Display", "Alignment", GetDisplayAlignmentName(DEFAULT_DISPLAY_ALIGNMENT)).c_str()) + .value_or(DEFAULT_DISPLAY_ALIGNMENT); display_force_4_3_for_24bit = si.GetBoolValue("Display", "Force4_3For24Bit", false); display_active_start_offset = static_cast(si.GetIntValue("Display", "ActiveStartOffset", 0)); display_active_end_offset = static_cast(si.GetIntValue("Display", "ActiveEndOffset", 0)); @@ -454,6 +458,7 @@ void Settings::Save(SettingsInterface& si) const si.SetIntValue("Display", "LineEndOffset", display_line_end_offset); si.SetBoolValue("Display", "Force4_3For24Bit", display_force_4_3_for_24bit); si.SetStringValue("Display", "AspectRatio", GetDisplayAspectRatioName(display_aspect_ratio)); + si.SetStringValue("Display", "Alignment", GetDisplayAlignmentName(display_alignment)); si.SetIntValue("Display", "CustomAspectRatioNumerator", display_aspect_ratio_custom_numerator); si.GetIntValue("Display", "CustomAspectRatioDenominator", display_aspect_ratio_custom_denominator); si.SetBoolValue("Display", "LinearFiltering", display_linear_filtering); @@ -1046,6 +1051,35 @@ float Settings::GetDisplayAspectRatioValue() const } } +static std::array s_display_alignment_names = {{"LeftOrTop", "Center", "RightOrBottom"}}; +static std::array s_display_alignment_display_names = { + {TRANSLATABLE("DisplayAlignment", "LeftOrTop"), TRANSLATABLE("DisplayAlignment", "Center"), + TRANSLATABLE("DisplayAlignment", "RightOrBottom")}}; + +std::optional Settings::ParseDisplayAlignment(const char* str) +{ + int index = 0; + for (const char* name : s_display_alignment_names) + { + if (StringUtil::Strcasecmp(name, str) == 0) + return static_cast(index); + + index++; + } + + return std::nullopt; +} + +const char* Settings::GetDisplayAlignmentName(DisplayAlignment alignment) +{ + return s_display_alignment_names[static_cast(alignment)]; +} + +const char* Settings::GetDisplayAlignmentDisplayName(DisplayAlignment alignment) +{ + return s_display_alignment_display_names[static_cast(alignment)]; +} + static constexpr const char* s_audio_backend_names[] = { "Null", #ifdef WITH_CUBEB diff --git a/src/core/settings.h b/src/core/settings.h index ce4037ef2..2b2ae9aae 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -115,6 +115,7 @@ struct Settings bool gpu_pgxp_depth_buffer = false; DisplayCropMode display_crop_mode = DEFAULT_DISPLAY_CROP_MODE; DisplayAspectRatio display_aspect_ratio = DEFAULT_DISPLAY_ASPECT_RATIO; + DisplayAlignment display_alignment = DEFAULT_DISPLAY_ALIGNMENT; u16 display_aspect_ratio_custom_numerator = 0; u16 display_aspect_ratio_custom_denominator = 0; s16 display_active_start_offset = 0; @@ -359,6 +360,10 @@ struct Settings static std::optional ParseDisplayAspectRatio(const char* str); static const char* GetDisplayAspectRatioName(DisplayAspectRatio ar); + static std::optional ParseDisplayAlignment(const char* str); + static const char* GetDisplayAlignmentName(DisplayAlignment alignment); + static const char* GetDisplayAlignmentDisplayName(DisplayAlignment alignment); + static std::optional ParseAudioBackend(const char* str); static const char* GetAudioBackendName(AudioBackend backend); static const char* GetAudioBackendDisplayName(AudioBackend backend); @@ -416,6 +421,7 @@ struct Settings static constexpr DisplayCropMode DEFAULT_DISPLAY_CROP_MODE = DisplayCropMode::Overscan; static constexpr DisplayAspectRatio DEFAULT_DISPLAY_ASPECT_RATIO = DisplayAspectRatio::Auto; + static constexpr DisplayAlignment DEFAULT_DISPLAY_ALIGNMENT = DisplayAlignment::Center; static constexpr float DEFAULT_OSD_SCALE = 100.0f; static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8; diff --git a/src/core/system.cpp b/src/core/system.cpp index 685583643..41faa79a6 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -3179,6 +3179,7 @@ void System::CheckForSettingsChanges(const Settings& old_settings) g_settings.gpu_downsample_mode != old_settings.gpu_downsample_mode || g_settings.display_crop_mode != old_settings.display_crop_mode || g_settings.display_aspect_ratio != old_settings.display_aspect_ratio || + g_settings.display_alignment != old_settings.display_alignment || g_settings.gpu_pgxp_enable != old_settings.gpu_pgxp_enable || g_settings.gpu_pgxp_texture_correction != old_settings.gpu_pgxp_texture_correction || g_settings.gpu_pgxp_color_correction != old_settings.gpu_pgxp_color_correction || diff --git a/src/core/types.h b/src/core/types.h index e664346a4..c078f4d99 100644 --- a/src/core/types.h +++ b/src/core/types.h @@ -109,6 +109,13 @@ enum class DisplayAspectRatio : u8 Count }; + enum class DisplayAlignment +{ + LeftOrTop, + Center, + RightOrBottom +}; + enum class AudioBackend : u8 { Null,