diff --git a/src/core/host_display.cpp b/src/core/host_display.cpp index b765e27c5..7d4bffeea 100644 --- a/src/core/host_display.cpp +++ b/src/core/host_display.cpp @@ -227,12 +227,18 @@ void HostDisplay::CalculateDrawRect(s32 window_width, s32 window_height, float* apply_aspect_ratio ? (display_aspect_ratio / (static_cast(m_display_width) / static_cast(m_display_height))) : 1.0f; - const float display_width = static_cast(m_display_width) * x_scale; - const float display_height = static_cast(m_display_height); - const float active_left = static_cast(m_display_active_left) * x_scale; - const float active_top = static_cast(m_display_active_top); - const float active_width = static_cast(m_display_active_width) * x_scale; - const float active_height = static_cast(m_display_active_height); + const float display_width = g_settings.display_stretch_vertically ? + static_cast(m_display_width) : static_cast(m_display_width) * x_scale; + const float display_height = g_settings.display_stretch_vertically ? + static_cast(m_display_height) / x_scale : static_cast(m_display_height); + const float active_left = g_settings.display_stretch_vertically ? + static_cast(m_display_active_left) : static_cast(m_display_active_left) * x_scale; + const float active_top = g_settings.display_stretch_vertically ? + static_cast(m_display_active_top) / x_scale : static_cast(m_display_active_top); + const float active_width = g_settings.display_stretch_vertically ? + static_cast(m_display_active_width) : static_cast(m_display_active_width) * x_scale; + const float active_height = g_settings.display_stretch_vertically ? + static_cast(m_display_active_height) / x_scale : static_cast(m_display_active_height); if (out_x_scale) *out_x_scale = x_scale; @@ -488,7 +494,12 @@ bool HostDisplay::WriteDisplayTextureToFile(std::string filename, bool full_reso const float ss_width_scale = static_cast(m_display_active_width) / static_cast(m_display_width); const float ss_height_scale = static_cast(m_display_active_height) / static_cast(m_display_height); const float ss_aspect_ratio = m_display_aspect_ratio * ss_width_scale / ss_height_scale; - resize_width = static_cast(static_cast(resize_height) * ss_aspect_ratio); + resize_width = g_settings.display_stretch_vertically ? + m_display_texture_view_width : static_cast(static_cast(resize_height) * ss_aspect_ratio); + resize_height = g_settings.display_stretch_vertically ? + static_cast(static_cast(resize_height) / + (m_display_aspect_ratio / (static_cast(m_display_width) / static_cast(m_display_height)))) : + resize_height; } else { diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 89b50e158..5a8920401 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -270,6 +270,7 @@ void Settings::Load(SettingsInterface& si) display_show_enhancements = si.GetBoolValue("Display", "ShowEnhancements", false); display_all_frames = si.GetBoolValue("Display", "DisplayAllFrames", false); display_internal_resolution_screenshots = si.GetBoolValue("Display", "InternalResolutionScreenshots", false); + display_stretch_vertically = si.GetBoolValue("Display", "StretchVertically", false); video_sync_enabled = si.GetBoolValue("Display", "VSync", DEFAULT_VSYNC_VALUE); display_post_process_chain = si.GetStringValue("Display", "PostProcessChain", ""); display_max_fps = si.GetFloatValue("Display", "MaxFPS", DEFAULT_DISPLAY_MAX_FPS); @@ -487,6 +488,7 @@ void Settings::Save(SettingsInterface& si) const si.SetBoolValue("Display", "ShowEnhancements", display_show_enhancements); si.SetBoolValue("Display", "DisplayAllFrames", display_all_frames); si.SetBoolValue("Display", "InternalResolutionScreenshots", display_internal_resolution_screenshots); + si.SetBoolValue("Display", "StretchVertically", display_stretch_vertically); si.SetBoolValue("Display", "VSync", video_sync_enabled); if (display_post_process_chain.empty()) si.DeleteValue("Display", "PostProcessChain"); diff --git a/src/core/settings.h b/src/core/settings.h index 1461a9870..8eaac374d 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -143,6 +143,7 @@ struct Settings bool display_show_enhancements = false; bool display_all_frames = false; bool display_internal_resolution_screenshots = false; + bool display_stretch_vertically = false; bool video_sync_enabled = DEFAULT_VSYNC_VALUE; float display_osd_scale = 100.0f; float display_max_fps = DEFAULT_DISPLAY_MAX_FPS; diff --git a/src/duckstation-qt/advancedsettingswidget.cpp b/src/duckstation-qt/advancedsettingswidget.cpp index a21fc5465..b189bb2f9 100644 --- a/src/duckstation-qt/advancedsettingswidget.cpp +++ b/src/duckstation-qt/advancedsettingswidget.cpp @@ -288,6 +288,9 @@ void AdvancedSettingsWidget::addTweakOptions() addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Use Debug Host GPU Device"), "GPU", "UseDebugDevice", false); + addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Stretch Display Vertically"), "Display", + "StretchVertically", false); + addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Increase Timer Resolution"), "Main", "IncreaseTimerResolution", true); @@ -354,6 +357,7 @@ void AdvancedSettingsWidget::onResetToDefaultClicked() sif->DeleteValue("Display", "ActiveEndOffset"); sif->DeleteValue("Display", "LineStartOffset"); sif->DeleteValue("Display", "LineEndOffset"); + sif->DeleteValue("Display", "StretchVertically"); sif->DeleteValue("GPU", "Multisamples"); sif->DeleteValue("GPU", "PerSampleShading"); sif->DeleteValue("GPU", "PGXPVertexCache"); diff --git a/src/frontend-common/fullscreen_ui.cpp b/src/frontend-common/fullscreen_ui.cpp index 3ec2dec5d..4edceb0a1 100644 --- a/src/frontend-common/fullscreen_ui.cpp +++ b/src/frontend-common/fullscreen_ui.cpp @@ -4506,6 +4506,9 @@ void FullscreenUI::DrawAdvancedSettingsPage() DrawFloatRangeSetting(bsi, "Display FPS Limit", "Limits how many frames are displayed to the screen. These frames are still rendered.", "Display", "MaxFPS", Settings::DEFAULT_DISPLAY_MAX_FPS, 0.0f, 500.0f, "%.2f FPS"); + DrawToggleSetting(bsi, "Stretch Display Vertically", + "Stretches the display to match the aspect ratio by multiplying vertically instead of horizontally.", + "Display", "StretchVertically", false); MenuHeading("PGXP Settings");