[Scummvm-git-logs] scummvm master -> 4624dc9116cf77ab83e387f7d95d041511071e3d

aquadran noreply at scummvm.org
Thu Nov 21 17:40:22 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:
4624dc9116 WINTERMUTE: Correctly implement W/A for TGA decoder


Commit: 4624dc9116cf77ab83e387f7d95d041511071e3d
    https://github.com/scummvm/scummvm/commit/4624dc9116cf77ab83e387f7d95d041511071e3d
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-11-21T18:40:16+01:00

Commit Message:
WINTERMUTE: Correctly implement W/A for TGA decoder

Changed paths:
    engines/wintermute/base/gfx/base_image.cpp
    engines/wintermute/base/gfx/base_image.h
    engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp


diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index 2ece650548a..b718ed59a78 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -46,6 +46,7 @@ namespace Wintermute {
 BaseImage::BaseImage() {
 	_fileManager = BaseFileManager::getEngineInstance();
 	_palette = nullptr;
+	_paletteTga = nullptr;
 	_paletteCount = 0;
 	_surface = nullptr;
 	_decoder = nullptr;
@@ -60,6 +61,8 @@ BaseImage::~BaseImage() {
 		_deletableSurface->free();
 	}
 	delete _deletableSurface;
+	delete _paletteTga;
+	_paletteTga = nullptr;
 }
 
 bool BaseImage::loadFile(const Common::String &filename) {
@@ -88,6 +91,20 @@ bool BaseImage::loadFile(const Common::String &filename) {
 	_paletteCount = _decoder->getPaletteColorCount();
 	_fileManager->closeFile(file);
 
+	//
+	// W/A: ScummVM TGA decoder interpreting palette as RGB, but TGA format should be as BGR
+	// So, swap R and B color components
+	//
+	if (_filename.hasSuffix(".tga")) {
+		_paletteTga = new byte[_paletteCount * 3];
+		for (uint32 i = 0; i < _paletteCount * 3; i += 3) {
+			_paletteTga[i + 0] = _palette[i + 2];
+			_paletteTga[i + 1] = _palette[i + 1];
+			_paletteTga[i + 2] = _palette[i + 0];
+		}
+		_palette = _paletteTga;
+	}
+
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/base_image.h b/engines/wintermute/base/gfx/base_image.h
index 8b1ff120bfc..354066fc482 100644
--- a/engines/wintermute/base/gfx/base_image.h
+++ b/engines/wintermute/base/gfx/base_image.h
@@ -70,6 +70,7 @@ private:
 	const Graphics::Surface *_surface;
 	Graphics::Surface *_deletableSurface;
 	const byte *_palette;
+	byte *_paletteTga;
 	uint16 _paletteCount;
 	BaseFileManager *_fileManager;
 };
diff --git a/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
index 2cef722000e..2d3d377213d 100644
--- a/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
@@ -141,16 +141,6 @@ bool BaseSurfaceOpenGL3D::create(const Common::String &filename, bool defaultCK,
 		ckBlue = 255;
 	}
 
-	//
-	// ScummVM TGA decoder interpreting palette as RGB, but TGA data has as BGR
-	// swap R and B color components
-	//
-	if (img.getPaletteCount() != 0 && _filename.hasSuffix(".tga")) {
-		byte tmp = ckBlue;
-		ckBlue = ckRed;
-		ckRed = tmp;
-	}
-
 	_ckDefault = defaultCK;
 	_ckRed = ckRed;
 	_ckGreen = ckGreen;
@@ -165,17 +155,9 @@ bool BaseSurfaceOpenGL3D::create(const Common::String &filename, bool defaultCK,
 	}
 
 #ifdef SCUMM_BIG_ENDIAN
-	if (img.getSurface()->format.bytesPerPixel == 1 && _filename.hasSuffix(".tga")) {
-		_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 0, 8, 16), img.getPalette(), img.getPaletteCount());
-	} else {
-		_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), img.getPalette(), img.getPaletteCount());
-	}
+	_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), img.getPalette(), img.getPaletteCount());
 #else
-	if (img.getSurface()->format.bytesPerPixel == 1 && _filename.hasSuffix(".tga")) {
-		_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), img.getPalette(), img.getPaletteCount());
-	} else {
-		_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), img.getPalette(), img.getPaletteCount());
-	}
+	_imageData = img.getSurface()->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), img.getPalette(), img.getPaletteCount());
 #endif
 
 	if (BaseEngine::instance().getTargetExecutable() < WME_LITE) {




More information about the Scummvm-git-logs mailing list