[Scummvm-git-logs] scummvm master -> e683fcb76d3592d702daf539b4834c4164499898
aquadran
noreply at scummvm.org
Sat Nov 16 05:20:06 UTC 2024
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:
e683fcb76d WINTERMUTE: Implemented screenshots for "Stroke of Fate" duology
Commit: e683fcb76d3592d702daf539b4834c4164499898
https://github.com/scummvm/scummvm/commit/e683fcb76d3592d702daf539b4834c4164499898
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-11-16T06:20:01+01:00
Commit Message:
WINTERMUTE: Implemented screenshots for "Stroke of Fate" duology
Changed paths:
engines/wintermute/base/base_game.cpp
engines/wintermute/base/gfx/base_image.cpp
engines/wintermute/base/gfx/base_renderer.cpp
engines/wintermute/base/gfx/base_renderer.h
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index b3a3d50344b..ff77e4ad93b 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -38,6 +38,7 @@
#ifdef ENABLE_WME3D
#include "engines/wintermute/base/gfx/base_renderer3d.h"
#endif
+#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/base_keyboard_state.h"
#include "engines/wintermute/base/base_parser.h"
#include "engines/wintermute/base/base_quick_msg.h"
@@ -56,6 +57,7 @@
#include "engines/wintermute/base/scriptables/script_stack.h"
#include "engines/wintermute/base/scriptables/script.h"
#include "engines/wintermute/base/sound/base_sound.h"
+#include "engines/wintermute/base/file/base_savefile_manager_file.h"
#include "engines/wintermute/ext/plugins.h"
#include "engines/wintermute/video/video_player.h"
#include "engines/wintermute/video/video_theora_player.h"
@@ -1726,6 +1728,11 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
const char *filename = stack->pop()->getString();
bool exists = BaseFileManager::getEngineInstance()->hasFile(filename); // Had absPathWarning = false
+
+ // Used for screenshot files in "Stroke of Fate" duology
+ if (!exists)
+ exists = sfmFileExists(filename);
+
stack->pushBool(exists);
return STATUS_OK;
}
@@ -1799,18 +1806,24 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
ScValue *val = stack->pop();
- warning("BGame::ScCallMethod - Screenshot not reimplemented"); //TODO
int fileNum = 0;
-
while (true) {
Common::sprintf_s(filename, "%s%03d.bmp", val->isNULL() ? getName() : val->getString(), fileNum);
- if (!Common::File::exists(filename)) {
+ if (!sfmFileExists(filename)) {
break;
}
fileNum++;
}
- bool ret = _gameRef->_renderer->saveScreenShot(filename);
+ // redraw before taking screenshot
+ _gameRef->displayContent(false);
+
+ bool ret = false;
+ BaseImage *image = _gameRef->_renderer->takeScreenshot();
+ if (image) {
+ ret = image->saveBMPFile(filename);
+ delete image;
+ }
stack->pushBool(ret);
return STATUS_OK;
@@ -1825,7 +1838,17 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
int sizeX = stack->pop()->getInt(_renderer->getWidth());
int sizeY = stack->pop()->getInt(_renderer->getHeight());
- bool ret = _gameRef->_renderer->saveScreenShot(filename, sizeX, sizeY);
+ // redraw before taking screenshot
+ _gameRef->displayContent(false);
+
+ bool ret = false;
+ BaseImage *image = _gameRef->_renderer->takeScreenshot();
+ if (image) {
+ ret = image->resize(sizeX, sizeY);
+ if (ret)
+ ret = image->saveBMPFile(filename);
+ delete image;
+ }
stack->pushBool(ret);
return STATUS_OK;
diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index 740021cdd71..2ece650548a 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -27,6 +27,7 @@
#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/base_file_manager.h"
+#include "engines/wintermute/base/file/base_savefile_manager_file.h"
#include "graphics/surface.h"
@@ -107,15 +108,19 @@ void BaseImage::copyFrom(const Graphics::Surface *surface) {
//////////////////////////////////////////////////////////////////////////
bool BaseImage::saveBMPFile(const Common::String &filename) const {
- warning("BaseImage::saveBMPFile - stubbed"); // TODO
+ Common::WriteStream *stream = openSfmFileForWrite(filename);
+ if (stream) {
+ bool ret = writeBMPToStream(stream);
+ delete stream;
+ return ret;
+ }
return false;
}
//////////////////////////////////////////////////////////////////////////
bool BaseImage::resize(int newWidth, int newHeight) {
- // WME Lite used FILTER_BILINEAR with FreeImage_Rescale here.
- Graphics::Surface *temp = _surface->scale((uint16)newWidth, (uint16)newHeight);
+ Graphics::Surface *temp = _surface->scale((uint16)newWidth, (uint16)newHeight, true);
if (_deletableSurface) {
_deletableSurface->free();
delete _deletableSurface;
@@ -216,9 +221,7 @@ bool BaseImage::writeBMPToStream(Common::WriteStream *stream) const {
//////////////////////////////////////////////////////////////////////////
bool BaseImage::copyFrom(BaseImage *origImage, int newWidth, int newHeight) {
- // WME Lite used FILTER_BILINEAR with FreeImage_Rescale here.
-
- Graphics::Surface *temp = origImage->_surface->scale((uint16)newWidth, (uint16)newHeight);
+ Graphics::Surface *temp = origImage->_surface->scale((uint16)newWidth, (uint16)newHeight, true);
if (_deletableSurface) {
_deletableSurface->free();
delete _deletableSurface;
diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp
index 882c7143dd6..c5b8d62d6b9 100644
--- a/engines/wintermute/base/gfx/base_renderer.cpp
+++ b/engines/wintermute/base/gfx/base_renderer.cpp
@@ -359,22 +359,6 @@ void BaseRenderer::addRectToList(BaseActiveRect *rect) {
_rectList.push_back(rect);
}
-bool BaseRenderer::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) {
- BaseImage *image = takeScreenshot();
- if (image) {
- if (sizeX != 0 && sizeY != 0) {
- if (!DID_SUCCEED(image->resize(sizeX, sizeY))) {
- delete image;
- return false;
- }
- }
- image->saveBMPFile(filename);
- delete image;
- return true;
- }
- return false;
-}
-
//////////////////////////////////////////////////////////////////////////
bool BaseRenderer::displayIndicator() {
if (!_indicatorDisplay || !_indicatorProgress) {
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index e899eaa998e..dee6633aa53 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -64,7 +64,6 @@ public:
* @return a BaseImage containing the current screen-buffer.
*/
virtual BaseImage *takeScreenshot() = 0;
- virtual bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0);
virtual bool setViewport(int left, int top, int right, int bottom);
virtual bool setViewport(Rect32 *rect);
virtual bool setScreenViewport();
More information about the Scummvm-git-logs
mailing list