[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