diff options
| -rw-r--r-- | src/citra/emu_window/emu_window_sdl2.cpp | 5 | ||||
| -rw-r--r-- | src/citra_qt/bootmanager.cpp | 4 | ||||
| -rw-r--r-- | src/core/3ds.h | 21 | ||||
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/frontend/emu_window.cpp | 48 | ||||
| -rw-r--r-- | src/core/frontend/emu_window.h | 6 | ||||
| -rw-r--r-- | src/core/frontend/framebuffer_layout.cpp | 170 | ||||
| -rw-r--r-- | src/core/frontend/framebuffer_layout.h | 66 | 
8 files changed, 43 insertions, 279 deletions
diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index 25643715a..e65b04e4b 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -12,7 +12,6 @@  #include "common/logging/log.h"  #include "common/scm_rev.h"  #include "common/string_util.h" -#include "core/3ds.h"  #include "core/settings.h"  #include "input_common/keyboard.h"  #include "input_common/main.h" @@ -79,13 +78,13 @@ EmuWindow_SDL2::EmuWindow_SDL2() {      SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);      SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); -    std::string window_title = Common::StringFromFormat("Citra %s| %s-%s ", Common::g_build_name, +    std::string window_title = Common::StringFromFormat("yuzu %s| %s-%s ", Common::g_build_name,                                                          Common::g_scm_branch, Common::g_scm_desc);      render_window =          SDL_CreateWindow(window_title.c_str(),                           SDL_WINDOWPOS_UNDEFINED, // x position                           SDL_WINDOWPOS_UNDEFINED, // y position -                         Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight, +                         Layout::ScreenUndocked::Width, Layout::ScreenUndocked::Height,                           SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);      if (render_window == nullptr) { diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 7107bfc60..eb542ad4e 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -12,8 +12,8 @@  #include "common/microprofile.h"  #include "common/scm_rev.h"  #include "common/string_util.h" -#include "core/3ds.h"  #include "core/core.h" +#include "core/frontend/framebuffer_layout.h"  #include "core/settings.h"  #include "input_common/keyboard.h"  #include "input_common/main.h" @@ -271,7 +271,7 @@ void GRenderWindow::InitRenderTarget() {      child = new GGLWidgetInternal(fmt, this);      QBoxLayout* layout = new QHBoxLayout(this); -    resize(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); +    resize(Layout::ScreenUndocked::Width, Layout::ScreenUndocked::Height);      layout->addWidget(child);      layout->setMargin(0);      setLayout(layout); diff --git a/src/core/3ds.h b/src/core/3ds.h deleted file mode 100644 index 8715e27db..000000000 --- a/src/core/3ds.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -namespace Core { - -// 3DS Video Constants -// ------------------- - -// NOTE: The LCDs actually rotate the image 90 degrees when displaying. Because of that the -// framebuffers in video memory are stored in column-major order and rendered sideways, causing -// the widths and heights of the framebuffers read by the LCD to be switched compared to the -// heights and widths of the screens listed here. -constexpr int kScreenTopWidth = 400;     ///< 3DS top screen width -constexpr int kScreenTopHeight = 240;    ///< 3DS top screen height -constexpr int kScreenBottomWidth = 320;  ///< 3DS bottom screen width -constexpr int kScreenBottomHeight = 240; ///< 3DS bottom screen height - -} // namespace Core diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index c836c0196..9a9aa3539 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -10,7 +10,6 @@ set(SRCS              file_sys/savedata_archive.cpp              file_sys/title_metadata.cpp              frontend/emu_window.cpp -            frontend/framebuffer_layout.cpp              gdbstub/gdbstub.cpp              hle/config_mem.cpp              hle/kernel/address_arbiter.cpp @@ -77,7 +76,6 @@ set(SRCS              )  set(HEADERS -            3ds.h              arm/arm_interface.h              arm/dynarmic/arm_dynarmic.h              arm/unicorn/arm_unicorn.h diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index e67394177..2d776c693 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -41,7 +41,8 @@ private:  EmuWindow::EmuWindow() {      // TODO: Find a better place to set this. -    config.min_client_area_size = std::make_pair(400u, 480u); +    config.min_client_area_size = +        std::make_pair(Layout::ScreenUndocked::Width, Layout::ScreenUndocked::Height);      active_config = config;      touch_state = std::make_shared<TouchState>();      Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state); @@ -60,17 +61,16 @@ EmuWindow::~EmuWindow() {   */  static bool IsWithinTouchscreen(const Layout::FramebufferLayout& layout, unsigned framebuffer_x,                                  unsigned framebuffer_y) { -    return ( -        framebuffer_y >= layout.bottom_screen.top && framebuffer_y < layout.bottom_screen.bottom && -        framebuffer_x >= layout.bottom_screen.left && framebuffer_x < layout.bottom_screen.right); +    return (framebuffer_y >= layout.screen.top && framebuffer_y < layout.screen.bottom && +            framebuffer_x >= layout.screen.left && framebuffer_x < layout.screen.right);  }  std::tuple<unsigned, unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) { -    new_x = std::max(new_x, framebuffer_layout.bottom_screen.left); -    new_x = std::min(new_x, framebuffer_layout.bottom_screen.right - 1); +    new_x = std::max(new_x, framebuffer_layout.screen.left); +    new_x = std::min(new_x, framebuffer_layout.screen.right - 1); -    new_y = std::max(new_y, framebuffer_layout.bottom_screen.top); -    new_y = std::min(new_y, framebuffer_layout.bottom_screen.bottom - 1); +    new_y = std::max(new_y, framebuffer_layout.screen.top); +    new_y = std::min(new_y, framebuffer_layout.screen.bottom - 1);      return std::make_tuple(new_x, new_y);  } @@ -80,12 +80,10 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) {          return;      std::lock_guard<std::mutex> guard(touch_state->mutex); -    touch_state->touch_x = -        static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left) / -        (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left); -    touch_state->touch_y = -        static_cast<float>(framebuffer_y - framebuffer_layout.bottom_screen.top) / -        (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top); +    touch_state->touch_x = static_cast<float>(framebuffer_x - framebuffer_layout.screen.left) / +                           (framebuffer_layout.screen.right - framebuffer_layout.screen.left); +    touch_state->touch_y = static_cast<float>(framebuffer_y - framebuffer_layout.screen.top) / +                           (framebuffer_layout.screen.bottom - framebuffer_layout.screen.top);      touch_state->touch_pressed = true;  } @@ -108,25 +106,5 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {  }  void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { -    Layout::FramebufferLayout layout; -    if (Settings::values.custom_layout == true) { -        layout = Layout::CustomFrameLayout(width, height); -    } else { -        switch (Settings::values.layout_option) { -        case Settings::LayoutOption::SingleScreen: -            layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen); -            break; -        case Settings::LayoutOption::LargeScreen: -            layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen); -            break; -        case Settings::LayoutOption::SideScreen: -            layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen); -            break; -        case Settings::LayoutOption::Default: -        default: -            layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen); -            break; -        } -    } -    NotifyFramebufferLayoutChanged(layout); +    NotifyFramebufferLayoutChanged(Layout::DefaultFrameLayout(width, height));  } diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index c10dee51b..e8c29adfb 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -87,9 +87,9 @@ public:      }      /** -      * Gets the framebuffer layout (width, height, and screen regions) -      * @note This method is thread-safe -      */ +     * Gets the framebuffer layout (width, height, and screen regions) +     * @note This method is thread-safe +     */      const Layout::FramebufferLayout& GetFramebufferLayout() const {          return framebuffer_layout;      } diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index e9f778fcb..8551858d1 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -1,25 +1,12 @@ -// Copyright 2016 Citra Emulator Project +// Copyright 2018 Yuzu Emulator Team  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include <cmath> -  #include "common/assert.h" -#include "core/3ds.h"  #include "core/frontend/framebuffer_layout.h" -#include "core/settings.h"  namespace Layout { -static const float TOP_SCREEN_ASPECT_RATIO = -    static_cast<float>(Core::kScreenTopHeight) / Core::kScreenTopWidth; -static const float BOT_SCREEN_ASPECT_RATIO = -    static_cast<float>(Core::kScreenBottomHeight) / Core::kScreenBottomWidth; - -float FramebufferLayout::GetScalingRatio() const { -    return static_cast<float>(top_screen.GetWidth()) / Core::kScreenTopWidth; -} -  // Finds the largest size subrectangle contained in window area that is confined to the aspect ratio  template <class T>  static MathUtil::Rectangle<T> maxRectangle(MathUtil::Rectangle<T> window_area, @@ -30,166 +17,27 @@ static MathUtil::Rectangle<T> maxRectangle(MathUtil::Rectangle<T> window_area,                                    static_cast<T>(std::round(scale * screen_aspect_ratio))};  } -FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height, bool swapped) { -    ASSERT(width > 0); -    ASSERT(height > 0); - -    FramebufferLayout res{width, height, true, true, {}, {}}; -    // Default layout gives equal screen sizes to the top and bottom screen -    MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height / 2}; -    MathUtil::Rectangle<unsigned> top_screen = -        maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO); -    MathUtil::Rectangle<unsigned> bot_screen = -        maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO); - -    float window_aspect_ratio = static_cast<float>(height) / width; -    // both screens height are taken into account by multiplying by 2 -    float emulation_aspect_ratio = TOP_SCREEN_ASPECT_RATIO * 2; - -    if (window_aspect_ratio < emulation_aspect_ratio) { -        // Apply borders to the left and right sides of the window. -        top_screen = -            top_screen.TranslateX((screen_window_area.GetWidth() - top_screen.GetWidth()) / 2); -        bot_screen = -            bot_screen.TranslateX((screen_window_area.GetWidth() - bot_screen.GetWidth()) / 2); -    } else { -        // Window is narrower than the emulation content => apply borders to the top and bottom -        // Recalculate the bottom screen to account for the width difference between top and bottom -        screen_window_area = {0, 0, width, top_screen.GetHeight()}; -        bot_screen = maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO); -        bot_screen = bot_screen.TranslateX((top_screen.GetWidth() - bot_screen.GetWidth()) / 2); -        if (swapped) { -            bot_screen = bot_screen.TranslateY(height / 2 - bot_screen.GetHeight()); -        } else { -            top_screen = top_screen.TranslateY(height / 2 - top_screen.GetHeight()); -        } -    } -    // Move the top screen to the bottom if we are swapped. -    res.top_screen = swapped ? top_screen.TranslateY(height / 2) : top_screen; -    res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateY(height / 2); -    return res; -} - -FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool swapped) { +FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height) {      ASSERT(width > 0);      ASSERT(height > 0);      // The drawing code needs at least somewhat valid values for both screens      // so just calculate them both even if the other isn't showing. -    FramebufferLayout res{width, height, !swapped, swapped, {}, {}}; - -    MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height}; -    MathUtil::Rectangle<unsigned> top_screen = -        maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO); -    MathUtil::Rectangle<unsigned> bot_screen = -        maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO); - -    float window_aspect_ratio = static_cast<float>(height) / width; -    float emulation_aspect_ratio = (swapped) ? BOT_SCREEN_ASPECT_RATIO : TOP_SCREEN_ASPECT_RATIO; - -    if (window_aspect_ratio < emulation_aspect_ratio) { -        top_screen = -            top_screen.TranslateX((screen_window_area.GetWidth() - top_screen.GetWidth()) / 2); -        bot_screen = -            bot_screen.TranslateX((screen_window_area.GetWidth() - bot_screen.GetWidth()) / 2); -    } else { -        top_screen = top_screen.TranslateY((height - top_screen.GetHeight()) / 2); -        bot_screen = bot_screen.TranslateY((height - bot_screen.GetHeight()) / 2); -    } -    res.top_screen = top_screen; -    res.bottom_screen = bot_screen; -    return res; -} - -FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped) { -    ASSERT(width > 0); -    ASSERT(height > 0); - -    FramebufferLayout res{width, height, true, true, {}, {}}; -    // Split the window into two parts. Give 4x width to the main screen and 1x width to the small -    // To do that, find the total emulation box and maximize that based on window size -    float window_aspect_ratio = static_cast<float>(height) / width; -    float emulation_aspect_ratio = -        swapped -            ? Core::kScreenBottomHeight * 4 / -                  (Core::kScreenBottomWidth * 4.0f + Core::kScreenTopWidth) -            : Core::kScreenTopHeight * 4 / -                  (Core::kScreenTopWidth * 4.0f + Core::kScreenBottomWidth); -    float large_screen_aspect_ratio = swapped ? BOT_SCREEN_ASPECT_RATIO : TOP_SCREEN_ASPECT_RATIO; -    float small_screen_aspect_ratio = swapped ? TOP_SCREEN_ASPECT_RATIO : BOT_SCREEN_ASPECT_RATIO; +    FramebufferLayout res{width, height}; +    const float emulation_aspect_ratio{static_cast<float>(ScreenUndocked::Height) / +                                       ScreenUndocked::Width};      MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height}; -    MathUtil::Rectangle<unsigned> total_rect = -        maxRectangle(screen_window_area, emulation_aspect_ratio); -    MathUtil::Rectangle<unsigned> large_screen = -        maxRectangle(total_rect, large_screen_aspect_ratio); -    MathUtil::Rectangle<unsigned> fourth_size_rect = total_rect.Scale(.25f); -    MathUtil::Rectangle<unsigned> small_screen = -        maxRectangle(fourth_size_rect, small_screen_aspect_ratio); - -    if (window_aspect_ratio < emulation_aspect_ratio) { -        large_screen = -            large_screen.TranslateX((screen_window_area.GetWidth() - total_rect.GetWidth()) / 2); -    } else { -        large_screen = large_screen.TranslateY((height - total_rect.GetHeight()) / 2); -    } -    // Shift the small screen to the bottom right corner -    small_screen = -        small_screen.TranslateX(large_screen.right) -            .TranslateY(large_screen.GetHeight() + large_screen.top - small_screen.GetHeight()); -    res.top_screen = swapped ? small_screen : large_screen; -    res.bottom_screen = swapped ? large_screen : small_screen; -    return res; -} - -FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) { -    ASSERT(width > 0); -    ASSERT(height > 0); +    MathUtil::Rectangle<unsigned> screen = maxRectangle(screen_window_area, emulation_aspect_ratio); -    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); +        screen = screen.TranslateX((screen_window_area.GetWidth() - screen.GetWidth()) / 2);      } 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); +        screen = screen.TranslateY((height - screen.GetHeight()) / 2);      } -    // 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()); +    res.screen = screen;      return res;  } -FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) { -    ASSERT(width > 0); -    ASSERT(height > 0); - -    FramebufferLayout res{width, height, true, true, {}, {}}; - -    MathUtil::Rectangle<unsigned> top_screen{ -        Settings::values.custom_top_left, Settings::values.custom_top_top, -        Settings::values.custom_top_right, Settings::values.custom_top_bottom}; -    MathUtil::Rectangle<unsigned> bot_screen{ -        Settings::values.custom_bottom_left, Settings::values.custom_bottom_top, -        Settings::values.custom_bottom_right, Settings::values.custom_bottom_bottom}; - -    res.top_screen = top_screen; -    res.bottom_screen = bot_screen; -    return res; -}  } // namespace Layout diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 4983cf103..b06999e1b 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright 2018 Yuzu Emulator Team  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. @@ -8,68 +8,30 @@  namespace Layout { -/// Describes the layout of the window framebuffer (size and top/bottom screen positions) +enum ScreenUndocked : unsigned { Width = 1280, Height = 720 }; + +/// Describes the layout of the window framebuffer  struct FramebufferLayout { -    unsigned width; -    unsigned height; -    bool top_screen_enabled; -    bool bottom_screen_enabled; -    MathUtil::Rectangle<unsigned> top_screen; -    MathUtil::Rectangle<unsigned> bottom_screen; +    unsigned width{ScreenUndocked::Width}; +    unsigned height{ScreenUndocked::Height}; + +    MathUtil::Rectangle<unsigned> screen;      /** -     * Returns the ration of pixel size of the top screen, compared to the native size of the 3DS -     * screen. +     * Returns the ration of pixel size of the screen, compared to the native size of the undocked +     * Switch screen.       */ -    float GetScalingRatio() const; +    float GetScalingRatio() const { +        return static_cast<float>(screen.GetWidth()) / ScreenUndocked::Width; +    }  };  /**   * Factory method for constructing a default FramebufferLayout   * @param width Window framebuffer width in pixels   * @param height Window framebuffer height in pixels - * @param is_swapped if true, the bottom screen will be displayed above the top screen - * @return Newly created FramebufferLayout object with default screen regions initialized - */ -FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height, bool is_swapped); - -/** - * Factory method for constructing a FramebufferLayout with only the top or bottom screen - * @param width Window framebuffer width in pixels - * @param height Window framebuffer height in pixels - * @param is_swapped if true, the bottom screen will be displayed (and the top won't be displayed) - * @return Newly created FramebufferLayout object with default screen regions initialized - */ -FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool is_swapped); - -/** - * Factory method for constructing a Frame with the a 4x size Top screen with a 1x size bottom - * screen on the right - * This is useful in particular because it matches well with a 1920x1080 resolution monitor - * @param width Window framebuffer width in pixels - * @param height Window framebuffer height in pixels - * @param is_swapped if true, the bottom screen will be the large display - * @return Newly created FramebufferLayout object with default screen regions initialized - */ -FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped); - -/** -* Factory method for constructing a Frame with the Top screen and bottom -* screen side by side -* This is useful for devices with small screens, like the GPDWin -* @param width Window framebuffer width in pixels -* @param height Window framebuffer height in pixels -* @param is_swapped if true, the bottom screen will be the left display -* @return Newly created FramebufferLayout object with default screen regions initialized -*/ -FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool is_swapped); - -/** - * Factory method for constructing a custom FramebufferLayout - * @param width Window framebuffer width in pixels - * @param height Window framebuffer height in pixels   * @return Newly created FramebufferLayout object with default screen regions initialized   */ -FramebufferLayout CustomFrameLayout(unsigned width, unsigned height); +FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height);  } // namespace Layout  | 
