[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