From b8248440438485f6bc69145c78b85cf90c434f3a Mon Sep 17 00:00:00 2001 From: Albert Liu <45282415+ggrtk@users.noreply.github.com> Date: Sun, 20 Dec 2020 17:38:59 -0800 Subject: [PATCH] HostDisplay: Fix framebuffer screenshot scaling --- src/core/host_display.cpp | 57 ++++++++++++--------------------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/core/host_display.cpp b/src/core/host_display.cpp index 1f4626bc8..47f67d2d8 100644 --- a/src/core/host_display.cpp +++ b/src/core/host_display.cpp @@ -486,52 +486,29 @@ bool HostDisplay::WriteDisplayTextureToFile(std::string filename, bool full_reso if (!m_display_texture_handle) return false; - apply_aspect_ratio = (m_display_aspect_ratio > 0) ? apply_aspect_ratio : false; - s32 resize_width = 0; - s32 resize_height = 0; - if (apply_aspect_ratio && full_resolution) + s32 resize_height = std::abs(m_display_texture_view_height); + if (apply_aspect_ratio) { - if (m_display_aspect_ratio > 1.0f) - { - resize_width = m_display_texture_view_width; - resize_height = static_cast(static_cast(resize_width) / m_display_aspect_ratio); - } - else - { - resize_height = std::abs(m_display_texture_view_height); - resize_width = static_cast(static_cast(resize_height) * m_display_aspect_ratio); - } + 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); } - else if (apply_aspect_ratio) + else { - const auto [left, top, right, bottom] = - CalculateDrawRect(GetWindowWidth(), GetWindowHeight(), m_display_top_margin); - resize_width = right - left; - resize_height = bottom - top; - } - else if (!full_resolution) - { - const auto [left, top, right, bottom] = - CalculateDrawRect(GetWindowWidth(), GetWindowHeight(), m_display_top_margin); - const float ratio = - static_cast(m_display_texture_view_width) / static_cast(std::abs(m_display_texture_view_height)); - if (ratio > 1.0f) - { - resize_width = right - left; - resize_height = static_cast(static_cast(resize_width) / ratio); - } - else - { - resize_height = bottom - top; - resize_width = static_cast(static_cast(resize_height) * ratio); - } + resize_width = m_display_texture_view_width; } - if (resize_width < 0) - resize_width = 1; - if (resize_height < 0) - resize_height = 1; + if (!full_resolution) + { + const s32 resolution_scale = std::abs(m_display_texture_view_height) / m_display_active_height; + resize_height /= resolution_scale; + resize_width /= resolution_scale; + } + + if (resize_width <= 0 || resize_height <= 0) + return false; const bool flip_y = (m_display_texture_view_height < 0); s32 read_height = m_display_texture_view_height;