|
@@ -141,6 +141,40 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped
|
|
|
return res;
|
|
return res;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) {
|
|
|
|
|
+ ASSERT(width > 0);
|
|
|
|
|
+ ASSERT(height > 0);
|
|
|
|
|
+
|
|
|
|
|
+ FramebufferLayout res{width, height, true, true, {}, {}};
|
|
|
|
|
+ // Aspect ratio of both screens side by side
|
|
|
|
|
+ const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
|
|
|
|
|
+ (Core::kScreenTopWidth + Core::kScreenBottomWidth);
|
|
|
|
|
+ float window_aspect_ratio = static_cast<float>(height) / width;
|
|
|
|
|
+ MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
|
|
|
|
+ // Find largest Rectangle that can fit in the window size with the given aspect ratio
|
|
|
|
|
+ MathUtil::Rectangle<unsigned> screen_rect =
|
|
|
|
|
+ maxRectangle(screen_window_area, emulation_aspect_ratio);
|
|
|
|
|
+ // Find sizes of top and bottom screen
|
|
|
|
|
+ MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
|
|
|
|
|
+ MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
|
|
|
|
|
+
|
|
|
|
|
+ if (window_aspect_ratio < emulation_aspect_ratio) {
|
|
|
|
|
+ // Apply borders to the left and right sides of the window.
|
|
|
|
|
+ u32 shift_horizontal = (screen_window_area.GetWidth() - screen_rect.GetWidth()) / 2;
|
|
|
|
|
+ top_screen = top_screen.TranslateX(shift_horizontal);
|
|
|
|
|
+ bot_screen = bot_screen.TranslateX(shift_horizontal);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // Window is narrower than the emulation content => apply borders to the top and bottom
|
|
|
|
|
+ u32 shift_vertical = (screen_window_area.GetHeight() - screen_rect.GetHeight()) / 2;
|
|
|
|
|
+ top_screen = top_screen.TranslateY(shift_vertical);
|
|
|
|
|
+ bot_screen = bot_screen.TranslateY(shift_vertical);
|
|
|
|
|
+ }
|
|
|
|
|
+ // Move the top screen to the right if we are swapped.
|
|
|
|
|
+ res.top_screen = swapped ? top_screen.TranslateX(bot_screen.GetWidth()) : top_screen;
|
|
|
|
|
+ res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateX(top_screen.GetWidth());
|
|
|
|
|
+ return res;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
|
|
FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
|
|
|
ASSERT(width > 0);
|
|
ASSERT(width > 0);
|
|
|
ASSERT(height > 0);
|
|
ASSERT(height > 0);
|
|
@@ -158,4 +192,4 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
|
|
|
res.bottom_screen = bot_screen;
|
|
res.bottom_screen = bot_screen;
|
|
|
return res;
|
|
return res;
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+} // namespace Layout
|