[Scummvm-git-logs] scummvm master -> 2d017a7efc23f5891e0a1e42b20696460124518d

aquadran noreply at scummvm.org
Sat Jul 16 08:44:28 UTC 2022


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:
2d017a7efc WINTERMUTE: WME3D: Implement screenshots in 3d renderers


Commit: 2d017a7efc23f5891e0a1e42b20696460124518d
    https://github.com/scummvm/scummvm/commit/2d017a7efc23f5891e0a1e42b20696460124518d
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2022-07-16T10:44:24+02:00

Commit Message:
WINTERMUTE: WME3D: Implement screenshots in 3d renderers

Changed paths:
    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/save_thumb_helper.cpp


diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index b6ce3f2d267..4db83387e3a 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -120,4 +120,15 @@ Math::Matrix3 BaseRenderer3D::build2dTransformation(const Vector2 &center, float
 	return translateCenterBack * rotation * translateCenter;
 }
 
+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]);
+	}
+}
+
 } // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 43c9ddfc0ea..c3defd93ff1 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -29,6 +29,7 @@
 #include "engines/wintermute/math/vector2.h"
 
 #include "graphics/transform_struct.h"
+#include "graphics/surface.h"
 
 #include "math/matrix4.h"
 #include "math/ray.h"
@@ -114,6 +115,8 @@ protected:
 	Math::Matrix4 _lastViewMatrix;
 	Math::Matrix4 _projectionMatrix3d;
 	Rect32 _viewport3dRect;
+
+	void flipVertical(Graphics::Surface *s);
 };
 
 } // 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 fe2ea4c010f..9377d23f1f5 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -23,6 +23,7 @@
 #include "engines/wintermute/ad/ad_generic.h"
 #include "engines/wintermute/ad/ad_walkplane.h"
 #include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/gfx/base_image.h"
 #include "engines/wintermute/base/gfx/3ds/camera3d.h"
 #include "engines/wintermute/base/gfx/3ds/light3d.h"
 
@@ -221,13 +222,23 @@ bool BaseRenderOpenGL3D::stencilSupported() {
 }
 
 BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
-	warning("BaseRenderOpenGL3D::takeScreenshot not yet implemented");
-	return nullptr;
-}
-
-bool BaseRenderOpenGL3D::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) {
-	warning("BaseRenderOpenGL3D::saveScreenshot not yet implemented");
-	return true;
+	BaseImage *screenshot = new BaseImage();
+	Graphics::Surface *surface = new Graphics::Surface();
+#ifdef SCUMM_BIG_ENDIAN
+	Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+#else
+	Graphics::PixelFormat format(4, 8, 8, 8, 8, 0, 8, 16, 24);
+#endif
+	surface->create(_viewportRect.width(), _viewportRect.height(), format);
+
+	glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
+	flipVertical(surface);
+	Graphics::Surface *converted = surface->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+	screenshot->copyFrom(converted);
+	delete surface;
+	delete converted;
+	return screenshot;
 }
 
 void BaseRenderOpenGL3D::setWindowed(bool windowed) {
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index b3fa2f1c44c..16f2cddd2a0 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -75,7 +75,6 @@ public:
 
 	void dumpData(const char *filename) override {}
 	BaseImage *takeScreenshot() override;
-	bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0) override;
 	void setWindowed(bool windowed) override;
 	void fadeToColor(byte r, byte g, byte b, byte a) 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 0760d6ac7ad..a6ae8fd4d90 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -23,6 +23,7 @@
 #include "engines/wintermute/ad/ad_generic.h"
 #include "engines/wintermute/ad/ad_walkplane.h"
 #include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/gfx/base_image.h"
 #include "engines/wintermute/base/gfx/3ds/camera3d.h"
 
 #include "graphics/opengl/system_headers.h"
@@ -335,13 +336,23 @@ bool BaseRenderOpenGL3DShader::stencilSupported() {
 }
 
 BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
-	warning("BaseRenderOpenGL3DShader::takeScreenshot not yet implemented");
-	return nullptr;
-}
-
-bool BaseRenderOpenGL3DShader::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) {
-	warning("BaseRenderOpenGL3DShader::saveScreenshot not yet implemented");
-	return true;
+	BaseImage *screenshot = new BaseImage();
+	Graphics::Surface *surface = new Graphics::Surface();
+#ifdef SCUMM_BIG_ENDIAN
+	Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+#else
+	Graphics::PixelFormat format(4, 8, 8, 8, 8, 0, 8, 16, 24);
+#endif
+	surface->create(_viewportRect.width(), _viewportRect.height(), format);
+
+	glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
+	flipVertical(surface);
+	Graphics::Surface *converted = surface->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+	screenshot->copyFrom(converted);
+	delete surface;
+	delete converted;
+	return screenshot;
 }
 
 void BaseRenderOpenGL3DShader::setWindowed(bool windowed) {
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 a15dd69e9c6..597d0381f73 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -65,7 +65,6 @@ public:
 
 	void dumpData(const char *filename) override {}
 	BaseImage *takeScreenshot() override;
-	bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0) override;
 	void setWindowed(bool windowed) override;
 	void fadeToColor(byte r, byte g, byte b, byte a) override;
 	bool fill(byte r, byte g, byte b, Common::Rect *rect = nullptr) override;
diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp
index 56de37ff71d..3c77b8faab7 100644
--- a/engines/wintermute/base/save_thumb_helper.cpp
+++ b/engines/wintermute/base/save_thumb_helper.cpp
@@ -50,7 +50,7 @@ SaveThumbHelper::~SaveThumbHelper(void) {
 BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
 	BaseImage *thumbnail = nullptr;
 	if (_gameRef->getSaveThumbWidth() > 0 && _gameRef->getSaveThumbHeight() > 0) {
-		if (doFlip) {
+		if (doFlip && !_gameRef->_useD3D) {
 			// when using opengl on windows it seems to be necessary to do this twice
 			// works normally for direct3d
 			_gameRef->displayContent(false);




More information about the Scummvm-git-logs mailing list