[Scummvm-git-logs] scummvm master -> a55ea5d152d57fe422d6f7db38d13b8a0d2ee77d

sev- sev at scummvm.org
Sat Jun 13 15:06:06 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a55ea5d152 SDL: Simplify code for taking screenshots


Commit: a55ea5d152d57fe422d6f7db38d13b8a0d2ee77d
    https://github.com/scummvm/scummvm/commit/a55ea5d152d57fe422d6f7db38d13b8a0d2ee77d
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2020-06-13T17:06:02+02:00

Commit Message:
SDL: Simplify code for taking screenshots

Changed paths:
    backends/graphics/surfacesdl/surfacesdl-graphics.cpp


diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 00a8171736..d3982e2703 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -30,6 +30,7 @@
 #include "common/textconsole.h"
 #include "common/translation.h"
 #include "common/util.h"
+#include "common/file.h"
 #include "common/frac.h"
 #ifdef USE_RGB_COLOR
 #include "common/list.h"
@@ -42,8 +43,9 @@
 #include "gui/debugger.h"
 #include "gui/EventRecorder.h"
 #ifdef USE_PNG
-#include "common/file.h"
 #include "image/png.h"
+#else
+#include "image/bmp.h"
 #endif
 #ifdef USE_TTS
 #include "common/text-to-speech.h"
@@ -439,11 +441,17 @@ OSystem::TransactionError SurfaceSdlGraphicsManager::endGFXTransaction() {
 }
 
 Graphics::PixelFormat SurfaceSdlGraphicsManager::convertSDLPixelFormat(SDL_PixelFormat *in) const {
-	return Graphics::PixelFormat(in->BytesPerPixel,
+	Graphics::PixelFormat out(in->BytesPerPixel,
 		8 - in->Rloss, 8 - in->Gloss,
 		8 - in->Bloss, 8 - in->Aloss,
 		in->Rshift, in->Gshift,
 		in->Bshift, in->Ashift);
+
+	// Workaround to SDL not providing an accurate Aloss value on some platforms.
+	if (in->Amask == 0)
+		out.aLoss = 8;
+
+	return out;
 }
 
 #ifdef USE_RGB_COLOR
@@ -548,10 +556,6 @@ void SurfaceSdlGraphicsManager::detectSupportedFormats() {
 		// Get our currently set hardware format
 		Graphics::PixelFormat hwFormat = convertSDLPixelFormat(_hwScreen->format);
 
-		// Workaround to SDL not providing an accurate Aloss value on Mac OS X.
-		if (_hwScreen->format->Amask == 0)
-			hwFormat.aLoss = 8;
-
 		_supportedFormats.push_back(hwFormat);
 
 #if !SDL_VERSION_ATLEAST(2, 0, 0)
@@ -1405,69 +1409,30 @@ bool SurfaceSdlGraphicsManager::saveScreenshot(const Common::String &filename) c
 	assert(_hwScreen != NULL);
 
 	Common::StackLock lock(_graphicsMutex);
-#ifdef USE_PNG
+
 	Common::DumpFile out;
 	if (!out.open(filename)) {
 		return false;
 	}
 
-#if SDL_VERSION_ATLEAST(2, 0, 0)
-	SDL_Surface *rgbScreen = SDL_ConvertSurfaceFormat(_hwScreen, SDL_PIXELFORMAT_RGB24, 0);
-#else
-	// This block of code was taken mostly as-is from SDL 1.2's SDL_SaveBMP_RW
-	SDL_Surface *rgbScreen = SDL_CreateRGBSurface(SDL_SWSURFACE,
-												  _hwScreen->w,
-												  _hwScreen->h,
-												  24,
-#ifdef SCUMM_LITTLE_ENDIAN
-												  0x0000FF, 0x00FF00, 0xFF0000,
-#else
-												  0xFF0000, 0x00FF00, 0x0000FF,
-#endif
-												  0);
-	if (rgbScreen == nullptr) {
-		warning("Could not create RGB24 surface");
-		return false;
-	}
-
-	SDL_Rect bounds;
-	bounds.x = bounds.y = 0;
-	bounds.w = _hwScreen->w;
-	bounds.h = _hwScreen->h;
-	if (SDL_LowerBlit(_hwScreen, &bounds, rgbScreen, &bounds) < 0) {
-		SDL_FreeSurface(rgbScreen);
-		rgbScreen = nullptr;
-	}
-#endif
-
-	if (rgbScreen == nullptr) {
-		warning("Could not convert hardware surface to RGB24");
-		return false;
-	}
-
-	int result = SDL_LockSurface(rgbScreen);
+	int result = SDL_LockSurface(_hwScreen);
 	if (result < 0) {
 		warning("Could not lock RGB surface");
-		SDL_FreeSurface(rgbScreen);
 		return false;
 	}
 
-#ifdef SCUMM_LITTLE_ENDIAN
-	const Graphics::PixelFormat format(3, 8, 8, 8, 0, 0, 8, 16, 0);
-#else
-	const Graphics::PixelFormat format(3, 8, 8, 8, 0, 16, 8, 0, 0);
-#endif
+	Graphics::PixelFormat format = convertSDLPixelFormat(_hwScreen->format);
 	Graphics::Surface data;
-	data.init(rgbScreen->w, rgbScreen->h, rgbScreen->pitch, rgbScreen->pixels, format);
+	data.init(_hwScreen->w, _hwScreen->h, _hwScreen->pitch, _hwScreen->pixels, format);
+#ifdef USE_PNG
 	const bool success = Image::writePNG(out, data);
+#else
+	const bool success = Image::writeBMP(out, data);
+#endif
 
-	SDL_UnlockSurface(rgbScreen);
-	SDL_FreeSurface(rgbScreen);
+	SDL_UnlockSurface(_hwScreen);
 
 	return success;
-#else
-	return SDL_SaveBMP(_hwScreen, filename.c_str()) == 0;
-#endif
 }
 
 void SurfaceSdlGraphicsManager::setFullscreenMode(bool enable) {




More information about the Scummvm-git-logs mailing list