[Scummvm-git-logs] scummvm master -> 8bbd84702c2355ce4203b5dc938ae8f4cd6dae00

bluegr noreply at scummvm.org
Sun Jun 1 20:40:54 UTC 2025


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

Summary:
baa4b6a73c GRAPHICS: Allow flipping with Surface::scale()
8bbd84702c WINTERMUTE: Reduce the number of surface copies when taking screenshots


Commit: baa4b6a73cf9a7c9090988b7f623737825680227
    https://github.com/scummvm/scummvm/commit/baa4b6a73cf9a7c9090988b7f623737825680227
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-01T23:40:51+03:00

Commit Message:
GRAPHICS: Allow flipping with Surface::scale()

Changed paths:
    graphics/surface.cpp
    graphics/surface.h


diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index d1d7c8822fa..06899051d65 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -538,15 +538,15 @@ AlphaType Surface::detectAlpha() const {
 	return alphaType;
 }
 
-Graphics::Surface *Surface::scale(int16 newWidth, int16 newHeight, bool filtering) const {
+Graphics::Surface *Surface::scale(int16 newWidth, int16 newHeight, bool filtering, byte flip) const {
 	Graphics::Surface *target = new Graphics::Surface();
 
 	target->create(newWidth, newHeight, format);
 
 	if (filtering) {
-		scaleBlitBilinear((byte *)target->getPixels(), (const byte *)getPixels(), target->pitch, pitch, target->w, target->h, w, h, format);
+		scaleBlitBilinear((byte *)target->getPixels(), (const byte *)getPixels(), target->pitch, pitch, target->w, target->h, w, h, format, flip);
 	} else {
-		scaleBlit((byte *)target->getPixels(), (const byte *)getPixels(), target->pitch, pitch, target->w, target->h, w, h, format);
+		scaleBlit((byte *)target->getPixels(), (const byte *)getPixels(), target->pitch, pitch, target->w, target->h, w, h, format, flip);
 	}
 
 	return target;
diff --git a/graphics/surface.h b/graphics/surface.h
index 6122333fba7..5d204836dbf 100644
--- a/graphics/surface.h
+++ b/graphics/surface.h
@@ -566,8 +566,9 @@ public:
 	 * @param newWidth   The resulting width.
 	 * @param newHeight  The resulting height.
 	 * @param filtering  Whether or not to use bilinear filtering.
+	 * @param flip       The flipping flags to use (see Graphics::FLIP_FLAGS).
 	 */
-	Graphics::Surface *scale(int16 newWidth, int16 newHeight, bool filtering = false) const;
+	Graphics::Surface *scale(int16 newWidth, int16 newHeight, bool filtering = false, byte flip = 0) const;
 
 	/**
 	 * @brief Rotoscale function; this returns a transformed version of this surface after rotation and


Commit: 8bbd84702c2355ce4203b5dc938ae8f4cd6dae00
    https://github.com/scummvm/scummvm/commit/8bbd84702c2355ce4203b5dc938ae8f4cd6dae00
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-01T23:40:51+03:00

Commit Message:
WINTERMUTE: Reduce the number of surface copies when taking screenshots

Changed paths:
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/gfx/base_image.cpp
    engines/wintermute/base/gfx/base_image.h
    engines/wintermute/base/gfx/base_renderer.h
    engines/wintermute/base/gfx/base_renderer3d.cpp
    engines/wintermute/base/gfx/base_renderer3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/save_thumb_helper.cpp


diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 0eb4c56213c..38f46a972ff 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -1844,11 +1844,9 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		_gameRef->displayContent(false);
 
 		bool ret = false;
-		BaseImage *image = _gameRef->_renderer->takeScreenshot();
+		BaseImage *image = _gameRef->_renderer->takeScreenshot(sizeX, sizeY);
 		if (image) {
-			ret = image->resize(sizeX, sizeY);
-			if (ret)
-				ret = image->saveBMPFile(filename);
+			ret = image->saveBMPFile(filename);
 			delete image;
 		}
 
diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index fc2d73d7e8c..b8fb3267c0a 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -101,11 +101,6 @@ byte BaseImage::getAlphaAt(int x, int y) const {
 	return a;
 }
 
-void BaseImage::copyFrom(const Graphics::Surface *surface) {
-	_surface = _deletableSurface = new Graphics::Surface();
-	_deletableSurface->copyFrom(*surface);
-}
-
 //////////////////////////////////////////////////////////////////////////
 bool BaseImage::saveBMPFile(const Common::String &filename) const {
 	Common::WriteStream *stream = openSfmFileForWrite(filename);
@@ -118,19 +113,6 @@ bool BaseImage::saveBMPFile(const Common::String &filename) const {
 }
 
 
-//////////////////////////////////////////////////////////////////////////
-bool BaseImage::resize(int newWidth, int newHeight) {
-	Graphics::Surface *temp = _surface->scale((uint16)newWidth, (uint16)newHeight, true);
-	if (_deletableSurface) {
-		_deletableSurface->free();
-		delete _deletableSurface;
-		_deletableSurface = nullptr;
-	}
-	_surface = _deletableSurface = temp;
-	return true;
-}
-
-
 //////////////////////////////////////////////////////////////////////////
 bool BaseImage::writeBMPToStream(Common::WriteStream *stream) const {
 	if (!stream || !_surface) {
@@ -142,15 +124,26 @@ bool BaseImage::writeBMPToStream(Common::WriteStream *stream) const {
 
 
 //////////////////////////////////////////////////////////////////////////
-bool BaseImage::copyFrom(BaseImage *origImage, int newWidth, int newHeight) {
-	Graphics::Surface *temp = origImage->_surface->scale((uint16)newWidth, (uint16)newHeight, true);
+void BaseImage::copyFrom(const Graphics::Surface *surface, int newWidth, int newHeight, byte flip) {
+	if (newWidth == 0)
+		newWidth = surface->w;
+	if (newHeight == 0)
+		newHeight = surface->h;
+
+	Graphics::Surface *temp;
+	if (newWidth == surface->w && newHeight == surface->h && flip == 0) {
+		temp = new Graphics::Surface();
+		temp->copyFrom(*surface);
+	} else {
+		temp = surface->scale((uint16)newWidth, (uint16)newHeight, true, flip);
+	}
+
 	if (_deletableSurface) {
 		_deletableSurface->free();
 		delete _deletableSurface;
 		_deletableSurface = nullptr;
 	}
 	_surface = _deletableSurface = temp;
-	return true;
 }
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/gfx/base_image.h b/engines/wintermute/base/gfx/base_image.h
index 8b1ff120bfc..a5f309573b4 100644
--- a/engines/wintermute/base/gfx/base_image.h
+++ b/engines/wintermute/base/gfx/base_image.h
@@ -60,10 +60,8 @@ public:
 	}
 	byte getAlphaAt(int x, int y) const;
 	bool writeBMPToStream(Common::WriteStream *stream) const;
-	bool resize(int newWidth, int newHeight);
 	bool saveBMPFile(const Common::String &filename) const;
-	bool copyFrom(BaseImage *origImage, int newWidth = 0, int newHeight = 0);
-	void copyFrom(const Graphics::Surface *surface);
+	void copyFrom(const Graphics::Surface *surface, int newWidth = 0, int newHeight = 0, byte flip = 0);
 private:
 	Common::String _filename;
 	Image::ImageDecoder *_decoder;
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index 805ff5170c6..ecafde7d4ad 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -63,7 +63,7 @@ public:
 	 *
 	 * @return a BaseImage containing the current screen-buffer.
 	 */
-	virtual BaseImage *takeScreenshot() = 0;
+	virtual BaseImage *takeScreenshot(int newWidth = 0, int newHeight = 0) = 0;
 	virtual bool setViewport(int left, int top, int right, int bottom);
 	virtual bool setViewport(Rect32 *rect);
 	virtual bool setScreenViewport();
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index 4c2ae2a7264..315bfb69b66 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -139,17 +139,6 @@ Graphics::PixelFormat BaseRenderer3D::getPixelFormat() const {
 #endif
 }
 
-void BaseRenderer3D::flipVertical(Graphics::Surface *s) {
-	for (int y = 0; y < s->h / 2; ++y) {
-		// Flip the lines
-		byte *line1P = (byte *)s->getBasePtr(0, y);
-		byte *line2P = (byte *)s->getBasePtr(0, s->h - y - 1);
-
-		for (int x = 0; x < s->pitch; ++x)
-			SWAP(line1P[x], line2P[x]);
-	}
-}
-
 bool BaseRenderer3D::flip() {
 	_lastTexture = nullptr;
 	g_system->updateScreen();
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 5636d6ae92e..5639f1c340b 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -166,10 +166,6 @@ protected:
 	PostFilter _postFilterMode;
 
 	virtual void setAmbientLightRenderState() = 0;
-
-	// ScummVM specific methods -->
-	void flipVertical(Graphics::Surface *s);
-	// ScummVM specific methods <--
 };
 
 } // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index 5e29ea51552..23a97aa438d 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -606,7 +606,7 @@ void BaseRenderOpenGL3D::fadeToColor(byte r, byte g, byte b, byte a) {
 	setup2D(true);
 }
 
-BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
+BaseImage *BaseRenderOpenGL3D::takeScreenshot(int newWidth, int newHeight) {
 	BaseImage *screenshot = new BaseImage();
 	Graphics::Surface *surface = new Graphics::Surface();
 #ifdef SCUMM_BIG_ENDIAN
@@ -619,11 +619,8 @@ BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
 	glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom,
 	             _viewportRect.width(), _viewportRect.height(),
 	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
-	flipVertical(surface);
-	Graphics::Surface *converted = surface->convertTo(getPixelFormat());
-	screenshot->copyFrom(converted);
+	screenshot->copyFrom(surface, newWidth, newHeight, Graphics::FLIP_V);
 	delete surface;
-	delete converted;
 	return screenshot;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index c687ee6005e..645b46abc7b 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -98,7 +98,7 @@ public:
 	bool disableShadows() override;
 	bool stencilSupported() override;
 
-	BaseImage *takeScreenshot() override;
+	BaseImage *takeScreenshot(int newWidth = 0, int newHeight = 0) override;
 	void fadeToColor(byte r, byte g, byte b, byte a) override;
 
 	bool flip() override;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
index 6bf4fbbf487..2a2b6ef8d42 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -709,7 +709,7 @@ void BaseRenderOpenGL3DShader::fadeToColor(byte r, byte g, byte b, byte a) {
 	setup2D(true);
 }
 
-BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
+BaseImage *BaseRenderOpenGL3DShader::takeScreenshot(int newWidth, int newHeight) {
 	BaseImage *screenshot = new BaseImage();
 	Graphics::Surface *surface = new Graphics::Surface();
 #ifdef SCUMM_BIG_ENDIAN
@@ -722,11 +722,8 @@ BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
 	glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom,
 	             _viewportRect.width(), _viewportRect.height(),
 	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
-	flipVertical(surface);
-	Graphics::Surface *converted = surface->convertTo(getPixelFormat());
-	screenshot->copyFrom(converted);
+	screenshot->copyFrom(surface, newWidth, newHeight, Graphics::FLIP_V);
 	delete surface;
-	delete converted;
 	return screenshot;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
index 642e0aeadc1..2dc1141989f 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -100,7 +100,7 @@ public:
 	bool disableShadows() override;
 	bool stencilSupported() override;
 
-	BaseImage *takeScreenshot() override;
+	BaseImage *takeScreenshot(int newWidth = 0, int newHeight = 0) override;
 	void fadeToColor(byte r, byte g, byte b, byte a) override;
 	bool flip() override;
 	bool fill(byte r, byte g, byte b, Common::Rect *rect = nullptr) override;
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index b71a1d550bc..d1fca551cad 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -511,10 +511,10 @@ bool BaseRenderOSystem::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-BaseImage *BaseRenderOSystem::takeScreenshot() {
+BaseImage *BaseRenderOSystem::takeScreenshot(int newWidth, int newHeight) {
 	// TODO: Clip by viewport.
 	BaseImage *screenshot = new BaseImage();
-	screenshot->copyFrom(_renderSurface);
+	screenshot->copyFrom(_renderSurface, newWidth, newHeight);
 	return screenshot;
 }
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 250a44f93d1..c509c662456 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -78,7 +78,7 @@ public:
 
 	bool drawLine(int x1, int y1, int x2, int y2, uint32 color) override;
 
-	BaseImage *takeScreenshot() override;
+	BaseImage *takeScreenshot(int newWidth = 0, int newHeight = 0) override;
 	void onWindowChange() override;
 	void setWindowed(bool windowed) override;
 
diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp
index 36dfdd513b2..efe5ad49f04 100644
--- a/engines/wintermute/base/save_thumb_helper.cpp
+++ b/engines/wintermute/base/save_thumb_helper.cpp
@@ -48,7 +48,6 @@ SaveThumbHelper::~SaveThumbHelper() {
 }
 
 BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
-	BaseImage *thumbnail = nullptr;
 	if (_gameRef->getSaveThumbWidth() > 0 && _gameRef->getSaveThumbHeight() > 0) {
 		if (doFlip) {
 			// when using opengl on windows it seems to be necessary to do this twice
@@ -60,22 +59,10 @@ BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
 			_gameRef->_renderer->flip();
 		}
 
-		BaseImage *screenshot = _gameRef->_renderer->takeScreenshot();
-		if (!screenshot) {
-			return nullptr;
-		}
-
 		// normal thumbnail
-		if (_gameRef->getSaveThumbWidth() > 0 && _gameRef->getSaveThumbHeight() > 0) {
-			thumbnail = new BaseImage();
-			thumbnail->copyFrom(screenshot, width, height);
-		}
-
-
-		delete screenshot;
-		screenshot = nullptr;
+		return _gameRef->_renderer->takeScreenshot(width, height);
 	}
-	return thumbnail;
+	return nullptr;
 }
 
 //////////////////////////////////////////////////////////////////////////




More information about the Scummvm-git-logs mailing list