From 27e19f87c63437db641b736429ac3503160f21ae Mon Sep 17 00:00:00 2001 From: Morph Date: Thu, 13 Feb 2020 22:17:28 -0500 Subject: Add following aspect ratios: 16:9, 21:9, Stretch to Window Available as a drop down within the configure graphics tab. --- src/core/frontend/framebuffer_layout.cpp | 17 +++++++++++++++-- src/core/settings.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'src/core') diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d6d2cf3f0..f94fa0041 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -27,9 +27,22 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { // so just calculate them both even if the other isn't showing. FramebufferLayout res{width, height}; - const float emulation_aspect_ratio{static_cast(ScreenUndocked::Height) / - ScreenUndocked::Width}; const auto window_aspect_ratio = static_cast(height) / width; + float emulation_aspect_ratio; + + switch (Settings::values.aspect_ratio) { + case 0: // 16:9 (Default) + emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + break; + case 1: // 21:9 + emulation_aspect_ratio = 9.f / 21; + break; + case 2: // Stretch to Window + emulation_aspect_ratio = window_aspect_ratio; + break; + default: // 16:9 + emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + } const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); diff --git a/src/core/settings.h b/src/core/settings.h index e1a9a0ffa..f837d3fbc 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -429,6 +429,7 @@ struct Values { int vulkan_device; float resolution_factor; + int aspect_ratio; bool use_frame_limit; u16 frame_limit; bool use_disk_shader_cache; -- cgit v1.2.3 From 22f58cca5e0be7a40c8c8fbebe3d45fb68dfcf10 Mon Sep 17 00:00:00 2001 From: Morph Date: Thu, 13 Feb 2020 23:13:23 -0500 Subject: Use enumeration instead of magic numbers --- src/core/frontend/framebuffer_layout.cpp | 10 +++++----- src/core/frontend/framebuffer_layout.h | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'src/core') diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index f94fa0041..d8821f8fd 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -30,17 +30,17 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { const auto window_aspect_ratio = static_cast(height) / width; float emulation_aspect_ratio; - switch (Settings::values.aspect_ratio) { - case 0: // 16:9 (Default) + switch (static_cast(Settings::values.aspect_ratio)) { + case Aspect::AspectDefault: emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; break; - case 1: // 21:9 + case Aspect::Aspect21by9: emulation_aspect_ratio = 9.f / 21; break; - case 2: // Stretch to Window + case Aspect::AspectStretch: emulation_aspect_ratio = window_aspect_ratio; break; - default: // 16:9 + default: emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; } diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index d2370adde..948c140ac 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -18,6 +18,12 @@ enum ScreenDocked : u32 { HeightDocked = 1080, }; +enum class Aspect { + AspectDefault, + Aspect21by9, + AspectStretch, +}; + /// Describes the layout of the window framebuffer struct FramebufferLayout { u32 width{ScreenUndocked::Width}; -- cgit v1.2.3 From 20dc2e3622df0c97e4d41030fd66df1087f8ef7b Mon Sep 17 00:00:00 2001 From: Morph Date: Fri, 14 Feb 2020 00:06:26 -0500 Subject: Address feedback --- src/core/frontend/framebuffer_layout.cpp | 32 ++++++++++++++++---------------- src/core/frontend/framebuffer_layout.h | 12 ++++++++++-- 2 files changed, 26 insertions(+), 18 deletions(-) (limited to 'src/core') diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d8821f8fd..1b4f0255e 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -27,22 +27,9 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { // so just calculate them both even if the other isn't showing. FramebufferLayout res{width, height}; - const auto window_aspect_ratio = static_cast(height) / width; - float emulation_aspect_ratio; - - switch (static_cast(Settings::values.aspect_ratio)) { - case Aspect::AspectDefault: - emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - break; - case Aspect::Aspect21by9: - emulation_aspect_ratio = 9.f / 21; - break; - case Aspect::AspectStretch: - emulation_aspect_ratio = window_aspect_ratio; - break; - default: - emulation_aspect_ratio = static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - } + const float window_aspect_ratio = static_cast(height) / width; + float emulation_aspect_ratio = EmulationAspectRatio( + static_cast(Settings::values.aspect_ratio), window_aspect_ratio); const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); @@ -71,4 +58,17 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { return DefaultFrameLayout(width, height); } +float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio) { + switch (aspect) { + case Aspect::Default: + return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + case Aspect::Aspect21by9: + return 9.0f / 21.0f; + case Aspect::StretchToWindow: + return window_aspect_ratio; + default: + return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; + } +} + } // namespace Layout diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 948c140ac..7f6fbe468 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -19,9 +19,9 @@ enum ScreenDocked : u32 { }; enum class Aspect { - AspectDefault, + Default, Aspect21by9, - AspectStretch, + StretchToWindow, }; /// Describes the layout of the window framebuffer @@ -54,4 +54,12 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height); */ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); +/** + * Convenience method to determine emulation aspect ratio + * @param aspect Represents the index of aspect ratio in Settings::values.aspect_ratio + * @param window_aspect_ratio Current window aspect ratio + * @return Emulation render window aspect ratio + */ +float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio); + } // namespace Layout -- cgit v1.2.3 From c3d0a0d6277c97d6e3c99914358dce15cc26871c Mon Sep 17 00:00:00 2001 From: Morph Date: Fri, 14 Feb 2020 14:39:04 -0500 Subject: Add 4:3 aspect ratio and address feedback --- src/core/frontend/framebuffer_layout.cpp | 14 ++++++++------ src/core/frontend/framebuffer_layout.h | 9 +++++---- 2 files changed, 13 insertions(+), 10 deletions(-) (limited to 'src/core') diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 1b4f0255e..2dc795d56 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -28,8 +28,8 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { FramebufferLayout res{width, height}; const float window_aspect_ratio = static_cast(height) / width; - float emulation_aspect_ratio = EmulationAspectRatio( - static_cast(Settings::values.aspect_ratio), window_aspect_ratio); + const float emulation_aspect_ratio = EmulationAspectRatio( + static_cast(Settings::values.aspect_ratio), window_aspect_ratio); const Common::Rectangle screen_window_area{0, 0, width, height}; Common::Rectangle screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); @@ -58,13 +58,15 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { return DefaultFrameLayout(width, height); } -float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio) { +float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio) { switch (aspect) { - case Aspect::Default: + case AspectRatio::Default: return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; - case Aspect::Aspect21by9: + case AspectRatio::R4_3: + return 3.0f / 4.0f; + case AspectRatio::R21_9: return 9.0f / 21.0f; - case Aspect::StretchToWindow: + case AspectRatio::StretchToWindow: return window_aspect_ratio; default: return static_cast(ScreenUndocked::Height) / ScreenUndocked::Width; diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 7f6fbe468..1d39c1faf 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -18,9 +18,10 @@ enum ScreenDocked : u32 { HeightDocked = 1080, }; -enum class Aspect { +enum class AspectRatio { Default, - Aspect21by9, + R4_3, + R21_9, StretchToWindow, }; @@ -56,10 +57,10 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); /** * Convenience method to determine emulation aspect ratio - * @param aspect Represents the index of aspect ratio in Settings::values.aspect_ratio + * @param aspect Represents the index of aspect ratio stored in Settings::values.aspect_ratio * @param window_aspect_ratio Current window aspect ratio * @return Emulation render window aspect ratio */ -float EmulationAspectRatio(Aspect aspect, float window_aspect_ratio); +float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio); } // namespace Layout -- cgit v1.2.3