[Scummvm-git-logs] scummvm master -> dd5ff1e4417fcd07641198b85d79b2eb74b02740

bluegr noreply at scummvm.org
Mon Jun 30 14:08:04 UTC 2025


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

Summary:
dd5ff1e441 FREESCAPE: Reduce pixel format conversion when loading images


Commit: dd5ff1e4417fcd07641198b85d79b2eb74b02740
    https://github.com/scummvm/scummvm/commit/dd5ff1e4417fcd07641198b85d79b2eb74b02740
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-30T17:08:00+03:00

Commit Message:
FREESCAPE: Reduce pixel format conversion when loading images

Changed paths:
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/castle/zx.cpp
    engines/freescape/games/dark/zx.cpp
    engines/freescape/games/driller/zx.cpp
    engines/freescape/games/eclipse/zx.cpp
    engines/freescape/gfx.cpp
    engines/freescape/gfx.h
    engines/freescape/gfx_tinygl.cpp
    engines/freescape/gfx_tinygl_texture.cpp
    image/scr.cpp


diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index a3aa4e9953d..b64a8a6e435 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -1151,7 +1151,7 @@ Graphics::ManagedSurface *FreescapeEngine::loadAndConvertNeoImage(Common::Seekab
 	decoder.loadStream(*stream);
 	Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
 	surface->copyFrom(*decoder.getSurface());
-	surface->convertToInPlace(_gfx->_currentPixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
+	surface->convertToInPlace(_gfx->_texturePixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
 	return surface;
 }
 
@@ -1160,18 +1160,18 @@ Graphics::ManagedSurface *FreescapeEngine::loadAndConvertDoodleImage(Common::See
 	decoder.loadStreams(*bitmap, *color1, *color2);
 	Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
 	surface->copyFrom(*decoder.getSurface());
-	surface->convertToInPlace(_gfx->_currentPixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
+	surface->convertToInPlace(_gfx->_texturePixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
 	return surface;
 }
 
 
-Graphics::ManagedSurface *FreescapeEngine::loadAndCenterScrImage(Common::SeekableReadStream *stream) {
+Graphics::ManagedSurface *FreescapeEngine::loadAndConvertScrImage(Common::SeekableReadStream *stream) {
 	Image::ScrDecoder decoder;
 	decoder.loadStream(*stream);
 	Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
 	const Graphics::Surface *decoded = decoder.getSurface();
-	surface->create(320, 200, decoded->format);
-	surface->copyRectToSurface(*decoded, (320 - decoded->w) / 2, (200 - decoded->h) / 2, Common::Rect(decoded->w, decoded->h));
+	surface->create(320, 200, _gfx->_texturePixelFormat);
+	surface->simpleBlitFrom(*decoded, Common::Point((320 - decoded->w) / 2, (200 - decoded->h) / 2), &decoder.getPalette());
 	return surface;
 }
 
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index e7c6b21d5da..682a7553a83 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -263,7 +263,7 @@ public:
 	Graphics::Surface *loadBundledImage(const Common::String &name, bool appendRenderMode = true);
 	byte *getPaletteFromNeoImage(Common::SeekableReadStream *stream, int offset);
 	Graphics::ManagedSurface *loadAndConvertNeoImage(Common::SeekableReadStream *stream, int offset, byte *palette = nullptr);
-	Graphics::ManagedSurface *loadAndCenterScrImage(Common::SeekableReadStream *stream);
+	Graphics::ManagedSurface *loadAndConvertScrImage(Common::SeekableReadStream *stream);
 	Graphics::ManagedSurface *loadAndConvertDoodleImage(Common::SeekableReadStream *bitmap, Common::SeekableReadStream *color1, Common::SeekableReadStream *color2, byte *palette);
 
 	void loadPalettes(Common::SeekableReadStream *file, int offset);
diff --git a/engines/freescape/games/castle/zx.cpp b/engines/freescape/games/castle/zx.cpp
index c51e47b0599..1484a2eb7a2 100644
--- a/engines/freescape/games/castle/zx.cpp
+++ b/engines/freescape/games/castle/zx.cpp
@@ -92,14 +92,14 @@ void CastleEngine::loadAssetsZXFullGame() {
 
 	file.open("castlemaster.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find castlemaster.zx.title");
 
 	file.close();
 	file.open("castlemaster.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find castlemaster.zx.border");
 	file.close();
diff --git a/engines/freescape/games/dark/zx.cpp b/engines/freescape/games/dark/zx.cpp
index b3c64a56eb6..d526b2a606a 100644
--- a/engines/freescape/games/dark/zx.cpp
+++ b/engines/freescape/games/dark/zx.cpp
@@ -55,14 +55,14 @@ void DarkEngine::loadAssetsZXFullGame() {
 
 	file.open("darkside.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find darkside.zx.title");
 
 	file.close();
 	file.open("darkside.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find driller.zx.border");
 	file.close();
@@ -92,14 +92,14 @@ void DarkEngine::loadAssetsZXDemo() {
 
 	file.open("darkside.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find darkside.zx.title");
 
 	file.close();
 	file.open("darkside.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find driller.zx.border");
 	file.close();
diff --git a/engines/freescape/games/driller/zx.cpp b/engines/freescape/games/driller/zx.cpp
index 1a0deaac29e..b42bbba4bcd 100644
--- a/engines/freescape/games/driller/zx.cpp
+++ b/engines/freescape/games/driller/zx.cpp
@@ -35,7 +35,7 @@ void DrillerEngine::loadAssetsZXFullGame() {
 	Common::File file;
 	file.open("driller.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find driller.zx.title");
 
@@ -43,7 +43,7 @@ void DrillerEngine::loadAssetsZXFullGame() {
 
 	file.open("driller.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find driller.zx.border");
 	file.close();
@@ -157,4 +157,4 @@ void DrillerEngine::drawZXUI(Graphics::Surface *surface) {
 	drawCompass(surface, 220 - 3, 160, _pitch - 30, 10, 60, front);
 }
 
-} // End of namespace Freescape
\ No newline at end of file
+} // End of namespace Freescape
diff --git a/engines/freescape/games/eclipse/zx.cpp b/engines/freescape/games/eclipse/zx.cpp
index dd4c49228d8..07de90a3ef9 100644
--- a/engines/freescape/games/eclipse/zx.cpp
+++ b/engines/freescape/games/eclipse/zx.cpp
@@ -57,14 +57,14 @@ void EclipseEngine::loadAssetsZXFullGame() {
 
 	file.open("totaleclipse.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find totaleclipse.zx.title");
 
 	file.close();
 	file.open("totaleclipse.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find totaleclipse.zx.border");
 	file.close();
@@ -100,14 +100,14 @@ void EclipseEngine::loadAssetsZXDemo() {
 
 	file.open("totaleclipse.zx.title");
 	if (file.isOpen()) {
-		_title = loadAndCenterScrImage(&file);
+		_title = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find totaleclipse.zx.title");
 
 	file.close();
 	file.open("totaleclipse.zx.border");
 	if (file.isOpen()) {
-		_border = loadAndCenterScrImage(&file);
+		_border = loadAndConvertScrImage(&file);
 	} else
 		error("Unable to find totaleclipse.zx.border");
 	file.close();
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index 3aff643aa8f..d7cbd89ff53 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -41,7 +41,6 @@ const Graphics::PixelFormat getRGBAPixelFormat() {
 Renderer::Renderer(int screenW, int screenH, Common::RenderMode renderMode, bool authenticGraphics) {
 	_screenW = screenW;
 	_screenH = screenH;
-	_currentPixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
 	_keyColor = -1;
 	_inkColor = -1;
 	_paperColor = -1;
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index 57eb93d17b8..69edbce0857 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -62,7 +62,6 @@ public:
 	Renderer(int screenW, int screenH, Common::RenderMode renderMode, bool authenticGraphics);
 	virtual ~Renderer();
 
-	Graphics::PixelFormat _currentPixelFormat;
 	Graphics::PixelFormat _texturePixelFormat;
 	bool _isAccelerated;
 	bool _authenticGraphics;
diff --git a/engines/freescape/gfx_tinygl.cpp b/engines/freescape/gfx_tinygl.cpp
index 9b08986d199..c2fc21f2ee3 100644
--- a/engines/freescape/gfx_tinygl.cpp
+++ b/engines/freescape/gfx_tinygl.cpp
@@ -40,6 +40,7 @@ Renderer *CreateGfxTinyGL(int screenW, int screenH, Common::RenderMode renderMod
 TinyGLRenderer::TinyGLRenderer(int screenW, int screenH, Common::RenderMode renderMode) : Renderer(screenW, screenH, renderMode, true) {
 	_verts = (Vertex *)malloc(sizeof(Vertex) * kVertexArraySize);
 	_texCoord = (Coord *)malloc(sizeof(Coord) * kVertexArraySize);
+	// TODO: Select this based on the screen format
 	_texturePixelFormat = getRGBAPixelFormat();
 	_variableStippleArray = nullptr;
 }
diff --git a/engines/freescape/gfx_tinygl_texture.cpp b/engines/freescape/gfx_tinygl_texture.cpp
index c3ad12c027b..543474f7f65 100644
--- a/engines/freescape/gfx_tinygl_texture.cpp
+++ b/engines/freescape/gfx_tinygl_texture.cpp
@@ -42,7 +42,7 @@ TinyGL2DTexture::~TinyGL2DTexture() {
 }
 
 void TinyGL2DTexture::update(const Graphics::Surface *surface) {
-	uint32 keyColor = getRGBAPixelFormat().RGBToColor(0xA0, 0xA0, 0xA0);
+	uint32 keyColor = surface->format.RGBToColor(0xA0, 0xA0, 0xA0);
 	tglUploadBlitImage(_blitImage, *surface, keyColor, true);
 }
 
diff --git a/image/scr.cpp b/image/scr.cpp
index 360d0827b52..ae38a28f314 100644
--- a/image/scr.cpp
+++ b/image/scr.cpp
@@ -28,7 +28,26 @@
 
 namespace Image {
 
-ScrDecoder::ScrDecoder() : _surface(nullptr), _palette(0) {
+static const byte scrPalette[16 * 3] = {
+	0x00, 0x00, 0x00, /* black */
+	0x00, 0x00, 0xD8, /* blue */
+	0xD8, 0x00, 0x00, /* red */
+	0xD8, 0x00, 0xD8, /* magenta */
+	0x00, 0xD8, 0x00, /* green */
+	0x00, 0xD8, 0xD8, /* cyan */
+	0xD8, 0xD8, 0x00, /* yellow */
+	0xD8, 0xD8, 0xD8, /* white */
+	0x00, 0x00, 0x00, /* bright black */
+	0x00, 0x00, 0xFF, /* bright blue */
+	0xFF, 0x00, 0x00, /* bright red */
+	0xFF, 0x00, 0xFF, /* bright magenta */
+	0x00, 0xFF, 0x00, /* bright green */
+	0x00, 0xFF, 0xFF, /* bright cyan */
+	0xFF, 0xFF, 0x00, /* bright yellow */
+	0xFF, 0xFF, 0xFF, /* bright white */
+};
+
+ScrDecoder::ScrDecoder() : _surface(nullptr), _palette(scrPalette, 16) {
 }
 
 ScrDecoder::~ScrDecoder() {
@@ -69,12 +88,10 @@ bool ScrDecoder::loadStream(Common::SeekableReadStream &stream) {
 
 	int width = 256;
 	int height = 192;
-	Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
-
 	_surface = new Graphics::Surface();
-	_surface->create(width, height, format);
+	_surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
 
-    for (int y = 0; y < height; y++) {
+	for (int y = 0; y < height; y++) {
 		for (int col = 0; col < width >> 3; col++) {
 			int x = col << 3;
 			byte byt = data[getPixelAddress(x, y)];
@@ -82,16 +99,10 @@ bool ScrDecoder::loadStream(Common::SeekableReadStream &stream) {
 			byte ink = attr & 0x07;
 			byte paper = (attr >> 3) & 0x07;
 			byte bright = (attr >> 6) & 1;
-			byte val = bright ? 0xff : 0xd8;
 			for (int bit = 0; bit < 8; bit++) {
 				bool set = (byt >> (7 - bit)) & 1;
-				int color = set ? ink : paper;
-
-				byte r = val * (color >> 1 & 1);
-				byte g = val * (color >> 2 & 1);
-				byte b = val * (color >> 0 & 1);
-
-				_surface->setPixel(x + bit, y, format.ARGBToColor(0xFF, r, g, b));
+				int color = (bright << 3) | (set ? ink : paper);
+				_surface->setPixel(x + bit, y, color);
 			}
 		}
 	}




More information about the Scummvm-git-logs mailing list