RenderBase: Extract the framebuffer size to display size code into function.

This commit is contained in:
Admiral H. Curtiss 2017-01-23 19:33:26 +01:00
parent 90ee85f4e8
commit e1fa6c374f
2 changed files with 18 additions and 15 deletions

View File

@ -476,6 +476,21 @@ float Renderer::CalculateDrawAspectRatio(int target_width, int target_height)
} }
} }
std::tuple<float, float> Renderer::ScaleToDisplayAspectRatio(const int width, const int height)
{
// Scale either the width or height depending the content aspect ratio.
// This way we preserve as much resolution as possible when scaling.
float ratio = CalculateDrawAspectRatio(width, height);
if (ratio >= 1.0f)
{
// Preserve horizontal resolution, scale vertically.
return std::make_tuple(static_cast<float>(width), static_cast<float>(height) * ratio);
}
// Preserve vertical resolution, scale horizontally.
return std::make_tuple(static_cast<float>(width) / ratio, static_cast<float>(height));
}
TargetRectangle Renderer::CalculateFrameDumpDrawRectangle() TargetRectangle Renderer::CalculateFrameDumpDrawRectangle()
{ {
// No point including any borders in the frame dump image, since they'd have to be cropped anyway. // No point including any borders in the frame dump image, since they'd have to be cropped anyway.
@ -498,22 +513,8 @@ TargetRectangle Renderer::CalculateFrameDumpDrawRectangle()
unsigned int efb_width, efb_height; unsigned int efb_width, efb_height;
g_framebuffer_manager->GetTargetSize(&efb_width, &efb_height); g_framebuffer_manager->GetTargetSize(&efb_width, &efb_height);
// Scale either the width or height depending the content aspect ratio.
// This way we preserve as much resolution as possible when scaling.
float ratio = CalculateDrawAspectRatio(efb_width, efb_height);
float draw_width, draw_height; float draw_width, draw_height;
if (ratio >= 1.0f) std::tie(draw_width, draw_height) = ScaleToDisplayAspectRatio(efb_width, efb_height);
{
// Preserve horizontal resolution, scale vertically.
draw_width = static_cast<float>(efb_width);
draw_height = static_cast<float>(efb_height) * ratio;
}
else
{
// Preserve vertical resolution, scale horizontally.
draw_width = static_cast<float>(efb_width) / ratio;
draw_height = static_cast<float>(efb_height);
}
rc.right = static_cast<int>(std::ceil(draw_width)); rc.right = static_cast<int>(std::ceil(draw_width));
rc.bottom = static_cast<int>(std::ceil(draw_height)); rc.bottom = static_cast<int>(std::ceil(draw_height));

View File

@ -19,6 +19,7 @@
#include <mutex> #include <mutex>
#include <string> #include <string>
#include <thread> #include <thread>
#include <tuple>
#include <vector> #include <vector>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -94,6 +95,7 @@ public:
static const TargetRectangle& GetTargetRectangle() { return target_rc; } static const TargetRectangle& GetTargetRectangle() { return target_rc; }
static float CalculateDrawAspectRatio(int target_width, int target_height); static float CalculateDrawAspectRatio(int target_width, int target_height);
static std::tuple<float, float> ScaleToDisplayAspectRatio(int width, int height);
static TargetRectangle CalculateFrameDumpDrawRectangle(); static TargetRectangle CalculateFrameDumpDrawRectangle();
static void UpdateDrawRectangle(); static void UpdateDrawRectangle();