summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/Render.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/Render.cpp96
1 files changed, 75 insertions, 21 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp
index b8632a9deb..932daf6f89 100644
--- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp
+++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp
@@ -50,6 +50,7 @@
#include "XFB.h"
#include "OnScreenDisplay.h"
#include "Timer.h"
+#include "StringUtil.h"
#include "main.h" // Local
#ifdef _WIN32
@@ -868,6 +869,32 @@ void Renderer::Swap(const TRectangle& rc)
v_max = (float)GetTargetHeight();
}
+ // ---------------------------------------------------------------------
+ // Save screenshot
+ // ŻŻŻŻŻŻŻŻŻŻŻŻŻ
+ if (s_bScreenshot)
+ {
+ s_criticalScreenshot.Enter();
+
+ /*
+ // Logging
+ char msg[255];
+ sprintf(msg, "Target: %i | %i %i %i %i\n",
+ (int)v_min,
+ //back_rc.top, back_rc.left, back_rc.right, back_rc.bottom);
+ rc.right, rc.bottom - (int)(v_min), rc.right, rc.bottom);
+ OSD::AddMessage(msg, 5000);
+ */
+
+ // Save screenshot
+ SaveRenderTarget(s_sScreenshotName.c_str(), rc.right, rc.bottom, (int)(v_min));
+ // Reset settings
+ s_sScreenshotName = "";
+ s_bScreenshot = false;
+ s_criticalScreenshot.Leave();
+ }
+ // ---------------------------------------------------------------------
+
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
if (/*s_bHaveFramebufferBlit*/ s_MSAASamples > 1)
@@ -940,21 +967,6 @@ void Renderer::Swap(const TRectangle& rc)
if (g_Config.bWireFrame)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- // Take screenshot, if requested
- if (s_bScreenshot) {
- s_criticalScreenshot.Enter();
- if (SaveRenderTarget(s_sScreenshotName.c_str(), OpenGL_GetBackbufferWidth(), OpenGL_GetBackbufferHeight())) {
- char msg[255];
- sprintf(msg, "Saved %s\n", s_sScreenshotName.c_str());
- OSD::AddMessage(msg, 2000);
- } else {
- PanicAlert("Error capturing or saving screenshot.");
- }
- s_sScreenshotName = "";
- s_bScreenshot = false;
- s_criticalScreenshot.Leave();
- }
-
// Frame dumps are handled a little differently in Windows
#ifdef _WIN32
if (g_Config.bDumpFrames) {
@@ -1262,18 +1274,60 @@ void Renderer::SetScreenshot(const char *filename)
s_criticalScreenshot.Leave();
}
-bool Renderer::SaveRenderTarget(const char *filename, int w, int h)
+bool Renderer::SaveRenderTarget(const char *filename, int W, int H, int YOffset)
{
- u8 *data = (u8 *)malloc(3 * w * h);
+ // The height seemed to be one less than the setting sometimes (and sometimes not),
+ // perhaps a rounding error
+ if (H == 479) H = 480;
+ if (H == 599) H = 600;
+ if (H == 767) H = 768;
+ if (H == 1023) H = 1024;
+
+ u8 *data = (u8 *)malloc(3 * W * H);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
- glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, data);
+ glReadPixels(0, YOffset, W, H, GL_RGB, GL_UNSIGNED_BYTE, data);
+ // Show failure messages
if (glGetError() != GL_NO_ERROR)
- return false;
- FlipImageData(data, w, h);
+ OSD::AddMessage("Error capturing or saving screenshot.", 2000);
+ // Turn image upside down
+ FlipImageData(data, W, H);
#if defined(HAVE_WX) && HAVE_WX
- wxImage a(w, h, data);
+ // Create wxImage
+ wxImage a(W, H, data);
+
+ // ---------------------------------------------------------------------
+ // If it's not a 4:3 picture rescale it to 4:3. This only applied to native resolutions.
+ // ŻŻŻŻŻŻŻŻŻŻŻŻŻ
+ // Todo: There is currently no adjustment for non-16:9 source pictures that are intended for a 16:9
+ // size because I think all Wii 16:9 source pictures are 16:9 to begin with. If not, add a 16:9 adjustment
+ // too.
+ // ŻŻŻŻŻŻŻŻŻŻŻŻŻ
+ /**/
+ float Ratio = (float)W / (float)(H);
+ // Don't bother with 1.25 resolutions either, for example 1280 x 1024
+ if (g_Config.bNativeResolution && Ratio != 4.0/3.0 && Ratio != 1.25 && Ratio != 16.0/9.0)
+ {
+ // Check if the height or width should be changed
+ if (Ratio < 4.0/3.0)
+ {
+ float fW = (float)W * 4.0/3.0;
+ W = (int)fW;
+ }
+ else
+ {
+ float fH = (float)W * 3.0/4.0;
+ H = (int)fH;
+ }
+ a.Rescale(W, H, wxIMAGE_QUALITY_HIGH);
+ }
+ // ---------------------------------------------------------------------
+
a.SaveFile(wxString::FromAscii(filename), wxBITMAP_TYPE_BMP);
bool result = true;
+
+ // Show success messages
+ OSD::AddMessage(StringFromFormat("Saved %i x %i %s\n", W, H, s_sScreenshotName.c_str()).c_str(), 2000);
+
#else
bool result = SaveTGA(filename, w, h, data);
free(data);