[Scummvm-git-logs] scummvm master -> 4ec6fc5d2f92e7cc3b48008ee70463c1344e5b8e

bluegr noreply at scummvm.org
Sun Jul 13 17:01:34 UTC 2025


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

Summary:
eefb88b492 GRAPHICS: Make endian-aware Graphics::PixelFormat functions constexpr
1c7e5a75c2 IMAGE: Unify the default pixel format for YUV codecs
7192271ac0 IMAGE: Simplify mapping pixel formats to JPEG colour spaces
136e5e7168 IMAGE: Remove filler alpha channel from 24bpp PNG images
e16e0d55c7 IMAGE: Use endian-aware pixel formats for TGA images
b93a5e68dc IMAGE: Use a 24bpp pixel format for true colour PCX images
751167c988 IMAGE: Use a 24bpp pixel format for true colour PICT images
db4fb8dc9e IMAGE: Use endian-aware pixel formats for QuickTime RLE frames
4ec6fc5d2f TESTBED: Add more TGA and PNG example images


Commit: eefb88b492161c18c92e3ba61ec44231c6e234d3
    https://github.com/scummvm/scummvm/commit/eefb88b492161c18c92e3ba61ec44231c6e234d3
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
GRAPHICS: Make endian-aware Graphics::PixelFormat functions constexpr

Changed paths:
    graphics/pixelformat.h


diff --git a/graphics/pixelformat.h b/graphics/pixelformat.h
index 6b1b12fe040..c7a213ea2cb 100644
--- a/graphics/pixelformat.h
+++ b/graphics/pixelformat.h
@@ -186,7 +186,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware RGB24 pixel format. */
-	static inline PixelFormat createFormatRGB24() {
+	static constexpr inline PixelFormat createFormatRGB24() {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0);
 #else
@@ -195,7 +195,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware BGR24 pixel format. */
-	static inline PixelFormat createFormatBGR24() {
+	static constexpr inline PixelFormat createFormatBGR24() {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0);
 #else
@@ -204,7 +204,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware RGBA32 pixel format. */
-	static inline PixelFormat createFormatRGBA32(bool alpha = true) {
+	static constexpr inline PixelFormat createFormatRGBA32(bool alpha = true) {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(4, 8, 8, 8, alpha ? 8 : 0, 24, 16, 8, 0);
 #else
@@ -213,7 +213,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware BGRA32 pixel format. */
-	static inline PixelFormat createFormatBGRA32(bool alpha = true) {
+	static constexpr inline PixelFormat createFormatBGRA32(bool alpha = true) {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(4, 8, 8, 8, alpha ? 8 : 0, 8, 16, 24, 0);
 #else
@@ -222,7 +222,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware ABGR32 pixel format. */
-	static inline PixelFormat createFormatABGR32(bool alpha = true) {
+	static constexpr inline PixelFormat createFormatABGR32(bool alpha = true) {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(4, 8, 8, 8, alpha ? 8 : 0, 0, 8, 16, 24);
 #else
@@ -231,7 +231,7 @@ struct PixelFormat {
 	}
 
 	/** Define an endian-aware ARGB32 pixel format. */
-	static inline PixelFormat createFormatARGB32(bool alpha = true) {
+	static constexpr inline PixelFormat createFormatARGB32(bool alpha = true) {
 #ifdef SCUMM_BIG_ENDIAN
 		return Graphics::PixelFormat(4, 8, 8, 8, alpha ? 8 : 0, 16, 8, 0, 24);
 #else


Commit: 1c7e5a75c2779ac0cd8523189e14f7d7b21e1105
    https://github.com/scummvm/scummvm/commit/1c7e5a75c2779ac0cd8523189e14f7d7b21e1105
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Unify the default pixel format for YUV codecs

Changed paths:
    image/codecs/cinepak.cpp
    image/codecs/codec.cpp
    image/codecs/codec.h
    image/codecs/indeo/indeo.cpp
    image/codecs/indeo3.cpp
    image/codecs/indeo4.cpp
    image/codecs/mjpeg.cpp
    image/codecs/mpeg.cpp
    image/codecs/svq1.cpp
    image/codecs/xan.cpp
    video/bink_decoder.cpp
    video/mkv_decoder.cpp
    video/mpegps_decoder.cpp
    video/psx_decoder.cpp
    video/theora_decoder.cpp


diff --git a/image/codecs/cinepak.cpp b/image/codecs/cinepak.cpp
index e3cf84537d9..1d429cae59c 100644
--- a/image/codecs/cinepak.cpp
+++ b/image/codecs/cinepak.cpp
@@ -289,11 +289,7 @@ CinepakDecoder::CinepakDecoder(int bitsPerPixel) : Codec(), _bitsPerPixel(bitsPe
 	if (bitsPerPixel == 8) {
 		_pixelFormat = Graphics::PixelFormat::createFormatCLUT8();
 	} else {
-		_pixelFormat = g_system->getScreenFormat();
-
-		// Default to a 32bpp format, if in 8bpp mode
-		if (_pixelFormat.bytesPerPixel == 1)
-			_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+		_pixelFormat = getDefaultYUVFormat();
 	}
 
 	// Create a lookup for the clip function
diff --git a/image/codecs/codec.cpp b/image/codecs/codec.cpp
index be7858183e1..cf0280edc79 100644
--- a/image/codecs/codec.cpp
+++ b/image/codecs/codec.cpp
@@ -48,10 +48,21 @@
 #include "image/codecs/xan.h"
 
 #include "common/endian.h"
+#include "common/system.h"
 #include "common/textconsole.h"
 
 namespace Image {
 
+Graphics::PixelFormat Codec::getDefaultYUVFormat() {
+	Graphics::PixelFormat format = g_system->getScreenFormat();
+
+	// Default to a 32bpp format, if in 8bpp mode
+	if (format.isCLUT8())
+		return Graphics::PixelFormat::createFormatRGBA32();
+	else
+		return format;
+}
+
 Codec *createBitmapCodec(uint32 tag, uint32 streamTag, int width, int height, int bitsPerPixel) {
 	// Crusader videos are special cased here because the frame type is not in the "compression"
 	// tag but in the "stream handler" tag for these files
diff --git a/image/codecs/codec.h b/image/codecs/codec.h
index 50916aaebc0..dc6aed3d25e 100644
--- a/image/codecs/codec.h
+++ b/image/codecs/codec.h
@@ -122,6 +122,11 @@ public:
 	 * Set the decoding accuracy of the codec, if supported
 	 */
 	virtual void setCodecAccuracy(CodecAccuracy accuracy) {}
+
+	/**
+	 * Get the preferred default pixel format for use with YUV codecs
+	 */
+	static Graphics::PixelFormat getDefaultYUVFormat();
 };
 
 /**
diff --git a/image/codecs/indeo/indeo.cpp b/image/codecs/indeo/indeo.cpp
index aa307906fa7..06c097e2106 100644
--- a/image/codecs/indeo/indeo.cpp
+++ b/image/codecs/indeo/indeo.cpp
@@ -467,11 +467,7 @@ IndeoDecoderBase::IndeoDecoderBase(uint16 width, uint16 height, uint bitsPerPixe
 	_width = width;
 	_height = height;
 	_bitsPerPixel = bitsPerPixel;
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 
 	_ctx._bRefBuf = 3; // buffer 2 is used for scalability mode
 }
diff --git a/image/codecs/indeo3.cpp b/image/codecs/indeo3.cpp
index dead6b528f4..7ecda3d74cb 100644
--- a/image/codecs/indeo3.cpp
+++ b/image/codecs/indeo3.cpp
@@ -45,11 +45,7 @@ Indeo3Decoder::Indeo3Decoder(uint16 width, uint16 height, uint bitsPerPixel) : _
 
 	_width = width;
 	_height = height;
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 
 	buildModPred();
 	allocFrames();
diff --git a/image/codecs/indeo4.cpp b/image/codecs/indeo4.cpp
index 37d24106ab9..a79f4c7db9f 100644
--- a/image/codecs/indeo4.cpp
+++ b/image/codecs/indeo4.cpp
@@ -114,7 +114,8 @@ int Indeo4Decoder::decodePictureHeader() {
 	if (_ctx._hasTransp && _surface->format.aBits() == 0) {
 		// Surface is 4 bytes per pixel, but only RGB. So promote the
 		// surface to full RGBA, and convert all the existing pixels
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
+		// TODO: Use a mask instead?
+		_pixelFormat = Graphics::PixelFormat::createFormatRGBA32();
 		_surface->convertToInPlace(_pixelFormat);
 	}
 
diff --git a/image/codecs/mjpeg.cpp b/image/codecs/mjpeg.cpp
index 51d42731a15..4813828a828 100644
--- a/image/codecs/mjpeg.cpp
+++ b/image/codecs/mjpeg.cpp
@@ -39,11 +39,7 @@ class SeekableReadStream;
 namespace Image {
 
 MJPEGDecoder::MJPEGDecoder() : Codec() {
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 
 	_surface = 0;
 	_accuracy = CodecAccuracy::Default;
diff --git a/image/codecs/mpeg.cpp b/image/codecs/mpeg.cpp
index 34314be3b01..8f2de31b254 100644
--- a/image/codecs/mpeg.cpp
+++ b/image/codecs/mpeg.cpp
@@ -36,11 +36,7 @@ extern "C" {
 namespace Image {
 
 MPEGDecoder::MPEGDecoder() : Codec() {
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 
 	_surface = 0;
 
diff --git a/image/codecs/svq1.cpp b/image/codecs/svq1.cpp
index 30b4f2a4000..72b993bbe20 100644
--- a/image/codecs/svq1.cpp
+++ b/image/codecs/svq1.cpp
@@ -51,11 +51,7 @@ SVQ1Decoder::SVQ1Decoder(uint16 width, uint16 height) {
 	debug(1, "SVQ1Decoder::SVQ1Decoder(width:%d, height:%d)", width, height);
 	_width = width;
 	_height = height;
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 
 	_frameWidth = _frameHeight = 0;
 	_surface = 0;
diff --git a/image/codecs/xan.cpp b/image/codecs/xan.cpp
index 653fd31459e..fd5bca65a1c 100644
--- a/image/codecs/xan.cpp
+++ b/image/codecs/xan.cpp
@@ -63,11 +63,7 @@ XanDecoder::XanDecoder(int width, int height, int bitsPerPixel) : Codec(),
 	_ubuf = new uint8[_width * _height / 2]();
 	_vbuf = new uint8[_width * _height / 2]();
 
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = getDefaultYUVFormat();
 }
 
 XanDecoder::~XanDecoder() {
diff --git a/video/bink_decoder.cpp b/video/bink_decoder.cpp
index 2b426a4e810..ef4d1a13f2b 100644
--- a/video/bink_decoder.cpp
+++ b/video/bink_decoder.cpp
@@ -40,6 +40,8 @@
 #include "graphics/yuv_to_rgb.h"
 #include "graphics/surface.h"
 
+#include "image/codecs/codec.h"
+
 #include "math/rdft.h"
 #include "math/dct.h"
 
@@ -279,11 +281,7 @@ BinkDecoder::BinkVideoTrack::BinkVideoTrack(uint32 width, uint32 height, uint32
 		_surfaceWidth++;
 	}
 
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = Image::Codec::getDefaultYUVFormat();
 
 	// Compute the video dimensions in blocks
 	_yBlockWidth   = (width  +  7) >> 3;
diff --git a/video/mkv_decoder.cpp b/video/mkv_decoder.cpp
index 606ab19f182..b939dfc1eea 100644
--- a/video/mkv_decoder.cpp
+++ b/video/mkv_decoder.cpp
@@ -30,6 +30,7 @@
 #include "common/util.h"
 #include "graphics/pixelformat.h"
 #include "graphics/yuv_to_rgb.h"
+#include "image/codecs/codec.h"
 
 #include "video/mkv/mkvparser.h"
 
@@ -315,11 +316,7 @@ MKVDecoder::VPXVideoTrack::VPXVideoTrack(const mkvparser::Track *const pTrack) {
 
 	_width = pVideoTrack->GetWidth();
 	_height = pVideoTrack->GetHeight();
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = Image::Codec::getDefaultYUVFormat();
 
 	debugC(1, kDebugLevelGVideo, "VideoTrack: %d x %d", _width, _height);
 
diff --git a/video/mpegps_decoder.cpp b/video/mpegps_decoder.cpp
index 03b57d6bfbe..a0fc2a73142 100644
--- a/video/mpegps_decoder.cpp
+++ b/video/mpegps_decoder.cpp
@@ -737,9 +737,7 @@ void MPEGPSDecoder::MPEGVideoTrack::findDimensions(Common::SeekableReadStream *f
 	_height = firstPacket->readByte();
 	_width |= (_height & 0xF0) >> 4;
 	_height = ((_height & 0x0F) << 8) | firstPacket->readByte();
-	_pixelFormat = g_system->getScreenFormat();
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = Image::Codec::getDefaultYUVFormat();
 
 	debugC(3, kDebugLevelGVideo, "MPEG dimensions: %dx%d", _width, _height);
 
diff --git a/video/psx_decoder.cpp b/video/psx_decoder.cpp
index bb6d2b5c519..5eb7f741da2 100644
--- a/video/psx_decoder.cpp
+++ b/video/psx_decoder.cpp
@@ -30,6 +30,7 @@
 #include "common/system.h"
 #include "common/textconsole.h"
 #include "graphics/yuv_to_rgb.h"
+#include "image/codecs/codec.h"
 
 #include "video/psx_decoder.h"
 
@@ -353,12 +354,7 @@ PSXStreamDecoder::PSXVideoTrack::PSXVideoTrack(Common::SeekableReadStream *first
 	firstSector->seek(40);
 	_width = firstSector->readUint16LE();
 	_height = firstSector->readUint16LE();
-
-	_pixelFormat = g_system->getScreenFormat();
-
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
+	_pixelFormat = Image::Codec::getDefaultYUVFormat();
 
 	_macroBlocksW = (_width + 15) / 16;
 	_macroBlocksH = (_height + 15) / 16;
diff --git a/video/theora_decoder.cpp b/video/theora_decoder.cpp
index d42b483d3b5..3d40a0be435 100644
--- a/video/theora_decoder.cpp
+++ b/video/theora_decoder.cpp
@@ -43,6 +43,7 @@
 #include "common/util.h"
 #include "graphics/pixelformat.h"
 #include "graphics/yuv_to_rgb.h"
+#include "image/codecs/codec.h"
 
 namespace Video {
 
@@ -272,13 +273,9 @@ TheoraDecoder::TheoraVideoTrack::TheoraVideoTrack(th_info &theoraInfo, th_setup_
 	_surfaceWidth = theoraInfo.frame_width;
 	_surfaceHeight = theoraInfo.frame_height;
 
-	_pixelFormat = g_system->getScreenFormat();
+	_pixelFormat = Image::Codec::getDefaultYUVFormat();
 	_theoraPixelFormat = theoraInfo.pixel_fmt;
 
-	// Default to a 32bpp format, if in 8bpp mode
-	if (_pixelFormat.bytesPerPixel == 1)
-		_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0);
-
 	// Set the frame rate
 	_frameRate = Common::Rational(theoraInfo.fps_numerator, theoraInfo.fps_denominator);
 


Commit: 7192271ac06b475f662813d1727b0ddc983450a7
    https://github.com/scummvm/scummvm/commit/7192271ac06b475f662813d1727b0ddc983450a7
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Simplify mapping pixel formats to JPEG colour spaces

Changed paths:
    image/jpeg.cpp


diff --git a/image/jpeg.cpp b/image/jpeg.cpp
index 4122dc03ec4..eaf4f4f9c60 100644
--- a/image/jpeg.cpp
+++ b/image/jpeg.cpp
@@ -190,37 +190,32 @@ J_COLOR_SPACE fromScummvmPixelFormat(const Graphics::PixelFormat &format) {
 #if defined(JCS_EXTENSIONS) || defined(JCS_ALPHA_EXTENSIONS)
 	struct PixelFormatMapping {
 		Graphics::PixelFormat pixelFormat;
-		J_COLOR_SPACE bigEndianColorSpace;
-		J_COLOR_SPACE littleEndianColorSpace;
+		J_COLOR_SPACE colorSpace;
 	};
 
 	static const PixelFormatMapping mappings[] = {
-#ifdef JCS_EXTENSIONS
-		{ Graphics::PixelFormat(4, 8, 8, 8, 0, 24, 16,  8,  0), JCS_EXT_RGBX, JCS_EXT_XBGR },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 0,  0,  8, 16, 24), JCS_EXT_XBGR, JCS_EXT_RGBX },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 0, 16,  8,  0, 24), JCS_EXT_XRGB, JCS_EXT_BGRX },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 0,  8, 16, 24,  0), JCS_EXT_BGRX, JCS_EXT_XRGB },
-		{ Graphics::PixelFormat(3, 8, 8, 8, 0, 16,  8,  0,  0), JCS_EXT_RGB,  JCS_EXT_BGR  },
-		{ Graphics::PixelFormat(3, 8, 8, 8, 0,  0,  8, 16,  0), JCS_EXT_BGR,  JCS_EXT_RGB  }
+#ifdef JCS_ALPHA_EXTENSIONS
+		{ Graphics::PixelFormat::createFormatRGBA32(true),  JCS_EXT_RGBA },
+		{ Graphics::PixelFormat::createFormatBGRA32(true),  JCS_EXT_BGRA },
+		{ Graphics::PixelFormat::createFormatARGB32(true),  JCS_EXT_ARGB },
+		{ Graphics::PixelFormat::createFormatABGR32(true),  JCS_EXT_ABGR }
 #endif
 #if defined(JCS_EXTENSIONS) && defined(JCS_ALPHA_EXTENSIONS)
 		,
 #endif
-#ifdef JCS_ALPHA_EXTENSIONS
-		{ Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16,  8,  0), JCS_EXT_RGBA, JCS_EXT_ABGR },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 8,  0,  8, 16, 24), JCS_EXT_ABGR, JCS_EXT_RGBA },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 8, 16,  8,  0, 24), JCS_EXT_ARGB, JCS_EXT_BGRA },
-		{ Graphics::PixelFormat(4, 8, 8, 8, 8,  8, 16, 24,  0), JCS_EXT_BGRA, JCS_EXT_ARGB }
+#ifdef JCS_EXTENSIONS
+		{ Graphics::PixelFormat::createFormatRGB24(),       JCS_EXT_RGB },
+		{ Graphics::PixelFormat::createFormatBGR24(),       JCS_EXT_BGR },
+		{ Graphics::PixelFormat::createFormatRGBA32(false), JCS_EXT_RGBX },
+		{ Graphics::PixelFormat::createFormatBGRA32(false), JCS_EXT_BGRX },
+		{ Graphics::PixelFormat::createFormatARGB32(false), JCS_EXT_XRGB },
+		{ Graphics::PixelFormat::createFormatABGR32(false), JCS_EXT_XBGR }
 #endif
 	};
 
 	for (uint i = 0; i < ARRAYSIZE(mappings); i++) {
 		if (mappings[i].pixelFormat == format) {
-#ifdef SCUMM_BIG_ENDIAN
-			return mappings[i].bigEndianColorSpace;
-#else
-			return mappings[i].littleEndianColorSpace;
-#endif
+			return mappings[i].colorSpace;
 		}
 	}
 #endif


Commit: 136e5e7168fd517fdd9b74d5ed05af5df4a7213d
    https://github.com/scummvm/scummvm/commit/136e5e7168fd517fdd9b74d5ed05af5df4a7213d
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Remove filler alpha channel from 24bpp PNG images

Changed paths:
    image/png.cpp


diff --git a/image/png.cpp b/image/png.cpp
index a48afbf763b..2e4b0e88a32 100644
--- a/image/png.cpp
+++ b/image/png.cpp
@@ -63,7 +63,10 @@ void PNGDecoder::destroy() {
 }
 
 Graphics::PixelFormat PNGDecoder::getByteOrderRgbaPixelFormat(bool isAlpha) const {
-	return Graphics::PixelFormat::createFormatRGBA32(isAlpha);
+	if (isAlpha)
+		return Graphics::PixelFormat::createFormatRGBA32();
+	else
+		return Graphics::PixelFormat::createFormatRGB24();
 }
 
 #ifdef USE_PNG
@@ -228,9 +231,6 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) {
 		if (colorType == PNG_COLOR_TYPE_GRAY ||
 			colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
 			png_set_gray_to_rgb(pngPtr);
-
-		if (colorType != PNG_COLOR_TYPE_RGB_ALPHA)
-			png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER);
 	}
 
 	// After the transformations have been registered, the image data is read again.


Commit: e16e0d55c72a77c3e44a3ce579bab03355ce0662
    https://github.com/scummvm/scummvm/commit/e16e0d55c72a77c3e44a3ce579bab03355ce0662
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Use endian-aware pixel formats for TGA images

Changed paths:
    image/tga.cpp


diff --git a/image/tga.cpp b/image/tga.cpp
index 9331de790b1..e48b12cba25 100644
--- a/image/tga.cpp
+++ b/image/tga.cpp
@@ -145,12 +145,12 @@ bool TGADecoder::readHeader(Common::SeekableReadStream &tga, byte &imageType, by
 		}
 	} else if (imageType == TYPE_TRUECOLOR || imageType == TYPE_RLE_TRUECOLOR) {
 		if (pixelDepth == 24) {
-			_format = Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0);
+			_format = Graphics::PixelFormat::createFormatBGR24();
 		} else if (pixelDepth == 32) {
 			// HACK: According to the spec, attributeBits should determine the amount
 			// of alpha-bits, however, as the game files that use this decoder seems
 			// to ignore that fact, we force the amount to 8 for 32bpp files for now.
-			_format = Graphics::PixelFormat(4, 8, 8, 8, /* attributeBits */ 8, 16, 8, 0, 24);
+			_format = Graphics::PixelFormat::createFormatBGRA32(/* attributeBits */);
 		} else if (pixelDepth == 16) {
 			// 16bpp TGA is ARGB1555
 			_format = Graphics::PixelFormat(2, 5, 5, 5, attributeBits, 10, 5, 0, 15);
@@ -160,7 +160,7 @@ bool TGADecoder::readHeader(Common::SeekableReadStream &tga, byte &imageType, by
 		}
 	} else if (imageType == TYPE_BW || imageType == TYPE_RLE_BW) {
 		if (pixelDepth == 8) {
-			_format = Graphics::PixelFormat(4, 8, 8, 8, 0, 16, 8, 0, 0);
+			_format = Graphics::PixelFormat::createFormatBGR24();
 		} else {
 			warning("Unsupported pixel depth: %d, %d", imageType, pixelDepth);
 			return false;
@@ -194,10 +194,9 @@ bool TGADecoder::readColorMap(Common::SeekableReadStream &tga, byte imageType, b
 			g = tga.readByte();
 			r = tga.readByte();
 		} else if (_colorMapEntryLength == 16) {
-			byte a;
-			static const Graphics::PixelFormat format(2, 5, 5, 5, 0, 10, 5, 0, 15);
+			static const Graphics::PixelFormat format(2, 5, 5, 5, 0, 10, 5, 0, 0);
 			uint16 color = tga.readUint16LE();
-			format.colorToARGB(color, a, r, g, b);
+			format.colorToRGB(color, r, g, b);
 		} else {
 			warning("Unsupported image type: %d", imageType);
 			r = g = b = 0;
@@ -234,9 +233,7 @@ bool TGADecoder::readData(Common::SeekableReadStream &tga, byte imageType, byte
 				} else {
 					dst = (uint32 *)_surface.getBasePtr(0, i);
 				}
-				for (int j = 0; j < _surface.w; j++) {
-					*dst++ = tga.readUint32LE();
-				}
+				tga.read(dst, _surface.w * 4);
 			}
 		} else if (pixelDepth == 24) {
 			for (int i = 0; i < _surface.h; i++) {
@@ -246,20 +243,7 @@ bool TGADecoder::readData(Common::SeekableReadStream &tga, byte imageType, byte
 				} else {
 					dst = (byte *)_surface.getBasePtr(0, i);
 				}
-				for (int j = 0; j < _surface.w; j++) {
-					byte r = tga.readByte();
-					byte g = tga.readByte();
-					byte b = tga.readByte();
-#ifdef SCUMM_LITTLE_ENDIAN
-					*dst++ = r;
-					*dst++ = g;
-					*dst++ = b;
-#else
-					*dst++ = b;
-					*dst++ = g;
-					*dst++ = r;
-#endif
-				}
+				tga.read(dst, _surface.w * 3);
 			}
 		}
 		// Black/White
@@ -274,7 +258,6 @@ bool TGADecoder::readData(Common::SeekableReadStream &tga, byte imageType, byte
 			*data++ = g;
 			*data++ = g;
 			*data++ = g;
-			*data++ = g;
 		}
 	}
 	return true;
@@ -292,10 +275,7 @@ bool TGADecoder::readDataColorMapped(Common::SeekableReadStream &tga, byte image
 				} else {
 					dst = (byte *)_surface.getBasePtr(0, i);
 				}
-				for (int j = 0; j < _surface.w; j++) {
-					byte index = tga.readByte();
-					*dst++ = index;
-				}
+				tga.read(dst, _surface.w);
 			}
 		} else if (indexDepth == 16) {
 			warning("16 bit indexes not supported");
@@ -322,26 +302,25 @@ bool TGADecoder::readDataRLE(Common::SeekableReadStream &tga, byte imageType, by
 			// RLE-packet
 			if (type == 1) {
 				if (pixelDepth == 32 && imageType == TYPE_RLE_TRUECOLOR) {
-					uint32 color = tga.readUint32LE();
+					byte b = tga.readByte();
+					byte g = tga.readByte();
+					byte r = tga.readByte();
+					byte a = tga.readByte();
 					while (rleCount-- > 0) {
-						*((uint32 *)data) = color;
-						data += 4;
+						*data++ = b;
+						*data++ = g;
+						*data++ = r;
+						*data++ = a;
 						count--;
 					}
 				} else if (pixelDepth == 24 && imageType == TYPE_RLE_TRUECOLOR) {
-					byte r = tga.readByte();
-					byte g = tga.readByte();
 					byte b = tga.readByte();
+					byte g = tga.readByte();
+					byte r = tga.readByte();
 					while (rleCount-- > 0) {
-#ifdef SCUMM_LITTLE_ENDIAN
-						*data++ = r;
-						*data++ = g;
-						*data++ = b;
-#else
 						*data++ = b;
 						*data++ = g;
 						*data++ = r;
-#endif
 						count--;
 					}
 				} else if (pixelDepth == 16 && imageType == TYPE_RLE_TRUECOLOR) {
@@ -357,7 +336,6 @@ bool TGADecoder::readDataRLE(Common::SeekableReadStream &tga, byte imageType, by
 						*data++ = color;
 						*data++ = color;
 						*data++ = color;
-						*data++ = color;
 						count--;
 					}
 				} else if (pixelDepth == 8 && imageType == TYPE_RLE_CMAP) {
@@ -373,28 +351,13 @@ bool TGADecoder::readDataRLE(Common::SeekableReadStream &tga, byte imageType, by
 				// Raw-packet
 			} else if (type == 0) {
 				if (pixelDepth == 32 && imageType == TYPE_RLE_TRUECOLOR) {
-					while (rleCount-- > 0) {
-						uint32 color = tga.readUint32LE();
-						*((uint32 *)data) = color;
-						data += 4;
-						count--;
-					}
+					tga.read(data, rleCount * 4);
+					data += rleCount * 4;
+					count -= rleCount;
 				} else if (pixelDepth == 24 && imageType == TYPE_RLE_TRUECOLOR) {
-					while (rleCount-- > 0) {
-						byte r = tga.readByte();
-						byte g = tga.readByte();
-						byte b = tga.readByte();
-#ifdef SCUMM_LITTLE_ENDIAN
-						*data++ = r;
-						*data++ = g;
-						*data++ = b;
-#else
-						*data++ = b;
-						*data++ = g;
-						*data++ = r;
-#endif
-						count--;
-					}
+					tga.read(data, rleCount * 3);
+					data += rleCount * 3;
+					count -= rleCount;
 				} else if (pixelDepth == 16 && imageType == TYPE_RLE_TRUECOLOR) {
 					while (rleCount-- > 0) {
 						*((uint16 *)data) = tga.readUint16LE();
@@ -407,15 +370,12 @@ bool TGADecoder::readDataRLE(Common::SeekableReadStream &tga, byte imageType, by
 						*data++ = color;
 						*data++ = color;
 						*data++ = color;
-						*data++ = color;
 						count--;
 					}
 				} else if (pixelDepth == 8 && imageType == TYPE_RLE_CMAP) {
-					while (rleCount-- > 0) {
-						byte index = tga.readByte();
-						*data++ = index;
-						count--;
-					}
+					tga.read(data, rleCount);
+					data += rleCount;
+					count -= rleCount;
 				} else {
 					warning("Unhandled pixel-depth for image-type 10");
 					return false;


Commit: b93a5e68dc1120d4a5288a9e7454560d7847ebe3
    https://github.com/scummvm/scummvm/commit/b93a5e68dc1120d4a5288a9e7454560d7847ebe3
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Use a 24bpp pixel format for true colour PCX images

Changed paths:
    image/pcx.cpp


diff --git a/image/pcx.cpp b/image/pcx.cpp
index 7d466715a63..7bd5eda07e1 100644
--- a/image/pcx.cpp
+++ b/image/pcx.cpp
@@ -111,8 +111,7 @@ bool PCXDecoder::loadStream(Common::SeekableReadStream &stream) {
 	int x, y;
 
 	if (nPlanes == 3 && bitsPerPixel == 8) {	// 24bpp
-		Graphics::PixelFormat format = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
-		_surface->create(width, height, format);
+		_surface->create(width, height, Graphics::PixelFormat::createFormatRGB24());
 		dst = (byte *)_surface->getPixels();
 		_palette.clear();
 
@@ -120,13 +119,9 @@ bool PCXDecoder::loadStream(Common::SeekableReadStream &stream) {
 			decodeRLE(stream, scanLine, bytesPerscanLine, compressed);
 
 			for (x = 0; x < width; x++) {
-				byte r = scanLine[x];
-				byte g = scanLine[x +  bytesPerLine];
-				byte b = scanLine[x + (bytesPerLine << 1)];
-				uint32 color = format.RGBToColor(r, g, b);
-
-				*((uint32 *)dst) = color;
-				dst += format.bytesPerPixel;
+				*dst++ = scanLine[x];
+				*dst++ = scanLine[x +  bytesPerLine];
+				*dst++ = scanLine[x + (bytesPerLine << 1)];
 			}
 		}
 	} else if (nPlanes == 1 && bitsPerPixel == 8) {	// 8bpp indexed


Commit: 751167c98851a33cfc409f42d9132f7ebbde3442
    https://github.com/scummvm/scummvm/commit/751167c98851a33cfc409f42d9132f7ebbde3442
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Use a 24bpp pixel format for true colour PICT images

Changed paths:
    image/pict.cpp


diff --git a/image/pict.cpp b/image/pict.cpp
index 63890564ca3..078c30a4576 100644
--- a/image/pict.cpp
+++ b/image/pict.cpp
@@ -517,13 +517,13 @@ void PICTDecoder::unpackBitsRect(Common::SeekableReadStream &stream, bool withPa
 		break;
 	case 3:
 		// We have a planar 24-bit surface
-		_outputSurface->create(width, height, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+		_outputSurface->create(width, height, Graphics::PixelFormat::createFormatRGB24());
 		for (uint16 y = 0; y < _outputSurface->h; y++) {
+			byte *dst = (byte *)_outputSurface->getBasePtr(0, y);
 			for (uint16 x = 0; x < _outputSurface->w; x++) {
-				byte r = *(buffer + y * _outputSurface->w * 3 + x);
-				byte g = *(buffer + y * _outputSurface->w * 3 + _outputSurface->w + x);
-				byte b = *(buffer + y * _outputSurface->w * 3 + _outputSurface->w * 2 + x);
-				*((uint32 *)_outputSurface->getBasePtr(x, y)) = _outputSurface->format.RGBToColor(r, g, b);
+				*dst++ = *(buffer + y * _outputSurface->w * 3 + _outputSurface->w * 0 + x);
+				*dst++ = *(buffer + y * _outputSurface->w * 3 + _outputSurface->w * 1 + x);
+				*dst++ = *(buffer + y * _outputSurface->w * 3 + _outputSurface->w * 2 + x);
 			}
 		}
 		break;
@@ -532,14 +532,14 @@ void PICTDecoder::unpackBitsRect(Common::SeekableReadStream &stream, bool withPa
 		// Note that we ignore the alpha channel since it seems to not be correct
 		// macOS does not ignore it, but then displays it incorrectly. Photoshop
 		// does ignore it and displays it correctly.
-		_outputSurface->create(width, height, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+		_outputSurface->create(width, height, Graphics::PixelFormat::createFormatRGB24());
 		for (uint16 y = 0; y < _outputSurface->h; y++) {
+			byte *dst = (byte *)_outputSurface->getBasePtr(0, y);
 			for (uint16 x = 0; x < _outputSurface->w; x++) {
-				byte a = 0xFF;
-				byte r = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w + x);
-				byte g = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 2 + x);
-				byte b = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 3 + x);
-				*((uint32 *)_outputSurface->getBasePtr(x, y)) = _outputSurface->format.ARGBToColor(a, r, g, b);
+				// *dst++ = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 0 + x);
+				*dst++ = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 1 + x);
+				*dst++ = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 2 + x);
+				*dst++ = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 3 + x);
 			}
 		}
 		break;


Commit: db4fb8dc9e9ba5f73709ddc1ca22c0bfc1795ec5
    https://github.com/scummvm/scummvm/commit/db4fb8dc9e9ba5f73709ddc1ca22c0bfc1795ec5
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
IMAGE: Use endian-aware pixel formats for QuickTime RLE frames

Changed paths:
    image/codecs/qtrle.cpp


diff --git a/image/codecs/qtrle.cpp b/image/codecs/qtrle.cpp
index c780bcb7021..3da9d78aa19 100644
--- a/image/codecs/qtrle.cpp
+++ b/image/codecs/qtrle.cpp
@@ -325,7 +325,7 @@ void QTRLEDecoder::dither16(Common::SeekableReadStream &stream, uint32 rowPtr, u
 
 void QTRLEDecoder::decode24(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
 	uint32 pixelPtr = 0;
-	uint32 *rgb = (uint32 *)_surface->getPixels();
+	uint8 *rgb = (uint8 *)_surface->getPixels();
 
 	while (linesToChange--) {
 		CHECK_STREAM_PTR(2);
@@ -345,23 +345,22 @@ void QTRLEDecoder::decode24(Common::SeekableReadStream &stream, uint32 rowPtr, u
 				byte r = stream.readByte();
 				byte g = stream.readByte();
 				byte b = stream.readByte();
-				uint32 color = _surface->format.RGBToColor(r, g, b);
 
 				CHECK_PIXEL_PTR(rleCode);
 
-				while (rleCode--)
-					rgb[pixelPtr++] = color;
+				while (rleCode--) {
+					rgb[(pixelPtr * 3) + 0] = r;
+					rgb[(pixelPtr * 3) + 1] = g;
+					rgb[(pixelPtr * 3) + 2] = b;
+					pixelPtr++;
+				}
 			} else {
 				CHECK_STREAM_PTR(rleCode * 3);
 				CHECK_PIXEL_PTR(rleCode);
 
 				// copy pixels directly to output
-				while (rleCode--) {
-					byte r = stream.readByte();
-					byte g = stream.readByte();
-					byte b = stream.readByte();
-					rgb[pixelPtr++] = _surface->format.RGBToColor(r, g, b);
-				}
+				stream.read(&rgb[pixelPtr * 3], rleCode * 3);
+				pixelPtr += rleCode;
 			}
 		}
 
@@ -439,7 +438,7 @@ void QTRLEDecoder::dither24(Common::SeekableReadStream &stream, uint32 rowPtr, u
 
 void QTRLEDecoder::decode32(Common::SeekableReadStream &stream, uint32 rowPtr, uint32 linesToChange) {
 	uint32 pixelPtr = 0;
-	uint32 *rgb = (uint32 *)_surface->getPixels();
+	uint8 *rgb = (uint8 *)_surface->getPixels();
 
 	while (linesToChange--) {
 		CHECK_STREAM_PTR(2);
@@ -460,24 +459,23 @@ void QTRLEDecoder::decode32(Common::SeekableReadStream &stream, uint32 rowPtr, u
 				byte r = stream.readByte();
 				byte g = stream.readByte();
 				byte b = stream.readByte();
-				uint32 color = _surface->format.ARGBToColor(a, r, g, b);
 
 				CHECK_PIXEL_PTR(rleCode);
 
-				while (rleCode--)
-					rgb[pixelPtr++] = color;
+				while (rleCode--) {
+					rgb[(pixelPtr * 4) + 0] = a;
+					rgb[(pixelPtr * 4) + 1] = r;
+					rgb[(pixelPtr * 4) + 2] = g;
+					rgb[(pixelPtr * 4) + 3] = b;
+					pixelPtr++;
+				}
 			} else {
 				CHECK_STREAM_PTR(rleCode * 4);
 				CHECK_PIXEL_PTR(rleCode);
 
 				// copy pixels directly to output
-				while (rleCode--) {
-					byte a = stream.readByte();
-					byte r = stream.readByte();
-					byte g = stream.readByte();
-					byte b = stream.readByte();
-					rgb[pixelPtr++] = _surface->format.ARGBToColor(a, r, g, b);
-				}
+				stream.read(&rgb[pixelPtr * 4], rleCode * 4);
+				pixelPtr += rleCode;
 			}
 		}
 
@@ -642,8 +640,9 @@ Graphics::PixelFormat QTRLEDecoder::getPixelFormat() const {
 	case 16:
 		return Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
 	case 24:
+		return Graphics::PixelFormat::createFormatRGB24();
 	case 32:
-		return Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24);
+		return Graphics::PixelFormat::createFormatARGB32();
 	default:
 		error("Unsupported QTRLE bits per pixel %d", _bitsPerPixel);
 	}


Commit: 4ec6fc5d2f92e7cc3b48008ee70463c1344e5b8e
    https://github.com/scummvm/scummvm/commit/4ec6fc5d2f92e7cc3b48008ee70463c1344e5b8e
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-07-13T20:01:28+03:00

Commit Message:
TESTBED: Add more TGA and PNG example images

Changed paths:
  A dists/engine-data/testbed-audiocd-files/image/pm5544-24bpp-rle.tga
  A dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey-rle.tga
  A dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.png
  A dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.tga
  A dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-rle.tga
    dists/engine-data/testbed-audiocd-files/image/image-gen.sh
    engines/testbed/image.cpp


diff --git a/dists/engine-data/testbed-audiocd-files/image/image-gen.sh b/dists/engine-data/testbed-audiocd-files/image/image-gen.sh
old mode 100644
new mode 100755
index da098a86cba..9b72f92f07e
--- a/dists/engine-data/testbed-audiocd-files/image/image-gen.sh
+++ b/dists/engine-data/testbed-audiocd-files/image/image-gen.sh
@@ -13,11 +13,16 @@ magick $1 -depth 24 -type TrueColor $base-24bpp.pcx
 magick $1 -depth 24 -type TrueColor $base-24bpp.pict
 magick $1 -depth 24 -type TrueColor $base-24bpp.png
 magick $1 -depth 24 -type TrueColor $base-24bpp.tga
+magick $1 -depth 24 -type TrueColor -compress RLE $base-24bpp-rle.tga
 magick $1 -depth 8 -type Palette $base-8bpp.bmp
 magick $1 -depth 8 -type Palette $base-8bpp.gif
 magick $1 -depth 8 -type Palette $base-8bpp.pcx
 magick $1 -depth 8 -type Palette $base-8bpp.pict
 magick $1 -depth 8 -type Palette $base-8bpp.png
 magick $1 -depth 8 -type Palette $base-8bpp.tga
-magick $1 -depth 1 -type Palette $base-1bpp.xbm
+magick $1 -depth 8 -type Palette -compress RLE $base-8bpp-rle.tga
+magick $1 -depth 8 -type Grayscale $base-8bpp-grey.png
+magick $1 -depth 8 -type Grayscale $base-8bpp-grey.tga
+magick $1 -depth 8 -type Grayscale -compress RLE $base-8bpp-grey-rle.tga
+magick $1 -depth 1 -type Grayscale $base-1bpp.xbm
 
diff --git a/dists/engine-data/testbed-audiocd-files/image/pm5544-24bpp-rle.tga b/dists/engine-data/testbed-audiocd-files/image/pm5544-24bpp-rle.tga
new file mode 100644
index 00000000000..a3383491f07
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/image/pm5544-24bpp-rle.tga differ
diff --git a/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey-rle.tga b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey-rle.tga
new file mode 100644
index 00000000000..ec0c6dd0d7d
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey-rle.tga differ
diff --git a/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.png b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.png
new file mode 100644
index 00000000000..e08b9de7201
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.png differ
diff --git a/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.tga b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.tga
new file mode 100644
index 00000000000..c24a2cddd4d
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-grey.tga differ
diff --git a/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-rle.tga b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-rle.tga
new file mode 100644
index 00000000000..57701d3530d
Binary files /dev/null and b/dists/engine-data/testbed-audiocd-files/image/pm5544-8bpp-rle.tga differ
diff --git a/engines/testbed/image.cpp b/engines/testbed/image.cpp
index 7a56e0afdfd..848f10bbd6c 100644
--- a/engines/testbed/image.cpp
+++ b/engines/testbed/image.cpp
@@ -248,6 +248,12 @@ TestExitStatus ImageTests::testPNGDecoder() {
 		return kTestFailed;
 	}
 
+	filepath = "image/pm5544-8bpp-grey.png";
+	decoder.reset(new Image::PNGDecoder());
+	if (!testImageDecoder(filepath, *decoder)) {
+		return kTestFailed;
+	}
+
 	Testsuite::logDetailedPrintf("PNG decoder is OK\n");
 	return kTestPassed;
 }
@@ -267,12 +273,36 @@ TestExitStatus ImageTests::testTGADecoder() {
 		return kTestFailed;
 	}
 
+	filepath = "image/pm5544-24bpp-rle.tga";
+	decoder.reset(new Image::TGADecoder());
+	if (!testImageDecoder(filepath, *decoder)) {
+		return kTestFailed;
+	}
+
 	filepath = "image/pm5544-8bpp.tga";
 	decoder.reset(new Image::TGADecoder());
 	if (!testImageDecoder(filepath, *decoder)) {
 		return kTestFailed;
 	}
 
+	filepath = "image/pm5544-8bpp-rle.tga";
+	decoder.reset(new Image::TGADecoder());
+	if (!testImageDecoder(filepath, *decoder)) {
+		return kTestFailed;
+	}
+
+	filepath = "image/pm5544-8bpp-grey.tga";
+	decoder.reset(new Image::TGADecoder());
+	if (!testImageDecoder(filepath, *decoder)) {
+		return kTestFailed;
+	}
+
+	filepath = "image/pm5544-8bpp-grey-rle.tga";
+	decoder.reset(new Image::TGADecoder());
+	if (!testImageDecoder(filepath, *decoder)) {
+		return kTestFailed;
+	}
+
 	Testsuite::logDetailedPrintf("TGA decoder is OK\n");
 	return kTestPassed;
 }




More information about the Scummvm-git-logs mailing list