SDL: Simplify code for taking screenshots

This commit is contained in:
Cameron Cawley 2020-06-07 13:22:36 +01:00 committed by Eugene Sandulenko
parent 6f575e580c
commit a55ea5d152

View File

@ -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) {