77 changes: 3 additions & 74 deletions Source/Core/VideoCommon/Src/RenderBase.cpp
Expand Up @@ -30,12 +30,6 @@
#include "XFMemory.h"
#include "FifoPlayer/FifoRecorder.h"
#include "AVIDump.h"
#include "OnScreenDisplay.h"
#if defined(HAVE_WX) && HAVE_WX
#include "WxUtils.h"
#include <wx/image.h>
#endif
#include "ImageWrite.h"

#include <cmath>
#include <string>
Expand Down Expand Up @@ -73,8 +67,6 @@ unsigned int Renderer::efb_scale_numeratorY = 1;
unsigned int Renderer::efb_scale_denominatorX = 1;
unsigned int Renderer::efb_scale_denominatorY = 1;

// TODO: remove
extern bool g_aspect_wide;

Renderer::Renderer()
: frame_data()
Expand Down Expand Up @@ -250,72 +242,6 @@ void Renderer::SetScreenshot(const char *filename)
s_bScreenshot = true;
}

#if defined(HAVE_WX) && HAVE_WX
void Renderer::SaveScreenshotOnThread(u8* data, size_t width, size_t height, std::string filename)
{
wxImage *img = new wxImage(width, height, data);

// These will contain the final image size
float FloatW = (float)width;
float FloatH = (float)height;

// Handle aspect ratio for the final ScrStrct to look exactly like what's on screen.
if (g_ActiveConfig.iAspectRatio != ASPECT_STRETCH)
{
bool use16_9 = g_aspect_wide;

// Check for force-settings and override.
if (g_ActiveConfig.iAspectRatio == ASPECT_FORCE_16_9)
use16_9 = true;
else if (g_ActiveConfig.iAspectRatio == ASPECT_FORCE_4_3)
use16_9 = false;

float Ratio = (FloatW / FloatH) / (!use16_9 ? (4.0f / 3.0f) : (16.0f / 9.0f));

// If ratio > 1 the picture is too wide and we have to limit the width.
if (Ratio > 1)
FloatW /= Ratio;
// ratio == 1 or the image is too high, we have to limit the height.
else
FloatH *= Ratio;

// This is a bit expensive on high resolutions
img->Rescale((int)FloatW, (int)FloatH, wxIMAGE_QUALITY_HIGH);
}

// Save the screenshot and finally kill the wxImage object
// This is really expensive when saving to PNG, but not at all when using BMP
img->SaveFile(StrToWxStr(filename), wxBITMAP_TYPE_PNG);
img->Destroy();

// Show success messages
OSD::AddMessage(StringFromFormat("Saved %i x %i %s", (int)FloatW, (int)FloatH,
filename.c_str()), 2000);
}
#endif

void Renderer::SaveScreenshot(u8* ptr, size_t width, size_t height, std::string filename)
{
std::lock_guard<std::mutex> lk(s_criticalScreenshot);
#if defined(HAVE_WX) && HAVE_WX
// Create wxImage

std::thread thread(SaveScreenshotOnThread, ptr, width, height, filename);
#ifdef _WIN32
SetThreadPriority(thread.native_handle(), THREAD_PRIORITY_BELOW_NORMAL);
#endif
thread.detach();

OSD::AddMessage("Saving Screenshot... ", 2000);

#else
SaveTGA(filename.c_str(), width, height, ptr);
free(ptr);
#endif

s_bScreenshot = false;
}

// Create On-Screen-Messages
void Renderer::DrawDebugText()
{
Expand Down Expand Up @@ -421,6 +347,9 @@ void Renderer::DrawDebugText()
g_renderer->RenderText(final_yellow.c_str(), 20, 20, 0xFFFFFF00);
}

// TODO: remove
extern bool g_aspect_wide;

void Renderer::UpdateDrawRectangle(int backbuffer_width, int backbuffer_height)
{
float FloatGLWidth = (float)backbuffer_width;
Expand Down
7 changes: 2 additions & 5 deletions Source/Core/VideoCommon/Src/RenderBase.h
Expand Up @@ -110,6 +110,8 @@ class Renderer

virtual void UpdateViewport() = 0;

virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0;

static unsigned int GetPrevPixelFormat() { return prev_efb_format; }
static void StorePixelFormat(unsigned int new_format) { prev_efb_format = new_format; }

Expand All @@ -121,11 +123,6 @@ class Renderer
static void CheckFifoRecording();
static void RecordVideoMemory();

#if defined(HAVE_WX) && HAVE_WX
static void SaveScreenshotOnThread(u8* data, size_t width, size_t height, std::string filename);
#endif
static void SaveScreenshot(u8* ptr, size_t width, size_t height, std::string filename);

static volatile bool s_bScreenshot;
static std::mutex s_criticalScreenshot;
static std::string s_sScreenshotName;
Expand Down