[Scummvm-git-logs] scummvm master -> 1976d72e471fb208992aff920dc917d472a71c12

aquadran noreply at scummvm.org
Thu Sep 25 20:26:14 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:
1976d72e47 WINTERMUTE: Restored fetching bitmaps dimension based on original code


Commit: 1976d72e471fb208992aff920dc917d472a71c12
    https://github.com/scummvm/scummvm/commit/1976d72e471fb208992aff920dc917d472a71c12
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-09-25T22:26:07+02:00

Commit Message:
WINTERMUTE: Restored fetching bitmaps dimension based on original code

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
    engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp


diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index c7c34673028..fd5d5981d06 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -64,6 +64,154 @@ BaseImage::~BaseImage() {
 	delete _deletableSurface;
 }
 
+bool BaseImage::getImageInfo(const Common::String &filename, int32 &width, int32 &height) {
+	bool ret = false;
+	Common::String file = filename;
+	file.toLowercase();
+	if (file.hasPrefix("savegame:") || file.hasSuffix(".bmp")) {
+		ret = getImageInfoBMP(filename, width, height);
+	} else if (file.hasSuffix(".tga")) {
+		ret = getImageInfoTGA(filename, width, height);
+	} else if (file.hasSuffix(".png")) {
+		ret = getImageInfoPNG(filename, width, height);
+	} else if (file.hasSuffix(".jpg")) {
+		ret = getImageInfoJPG(filename, width, height);
+	} else {
+		error("BaseImage::loadFile : Unsupported fileformat %s", filename.c_str());
+	}
+
+	return ret;
+}
+
+bool BaseImage::getImageInfoBMP(const Common::String &filename, int32 &width, int32 &height) {
+	Common::SeekableReadStream *stream = _fileManager->openFile(filename);
+	if (!stream) {
+		return false;
+	}
+
+	uint16 fileType = stream->readUint16BE();
+	if (fileType != MKTAG16('B', 'M')) {
+		_fileManager->closeFile(stream);
+		return false;
+	}
+
+	stream->skip(16);
+
+	width = stream->readSint32LE();
+	height = stream->readSint32LE();
+
+	_fileManager->closeFile(stream);
+
+	return true;
+}
+
+
+bool BaseImage::getImageInfoTGA(const Common::String &filename, int32 &width, int32 &height) {
+	Common::SeekableReadStream *stream = _fileManager->openFile(filename);
+	if (!stream) {
+		return false;
+	}
+
+	stream->skip(12);
+
+	width = stream->readSint16LE();
+	height = stream->readSint16LE();
+
+	_fileManager->closeFile(stream);
+
+	return true;
+}
+
+bool BaseImage::getImageInfoPNG(const Common::String &filename, int32 &width, int32 &height) {
+	Common::SeekableReadStream *stream = _fileManager->openFile(filename);
+	if (!stream) {
+		return false;
+	}
+
+	if (stream->readUint32BE() != MKTAG(0x89, 'P', 'N', 'G')) {
+		_fileManager->closeFile(stream);
+		return false;
+	}
+	stream->skip(4);
+
+	uint32 headerLen = stream->readUint32BE();
+	uint32 headerType = stream->readUint32BE();
+	if (headerType != MKTAG('I', 'H', 'D', 'R') || headerLen != 13) {
+		_fileManager->closeFile(stream);
+		return false;
+	}
+
+	width = stream->readSint32BE();
+	height = stream->readSint32BE();
+
+	_fileManager->closeFile(stream);
+
+	return true;
+}
+
+bool BaseImage::getImageInfoJPG(const Common::String &filename, int32 &width, int32 &height) {
+	Common::SeekableReadStream *stream = _fileManager->openFile(filename);
+	if (!stream) {
+		return false;
+	}
+
+	uint16 fileType = stream->readSint16BE();
+	if (fileType != 0xFFD8) {
+		_fileManager->closeFile(stream);
+		return false;
+	}
+
+	while (1) {
+		byte markerPrefix = stream->readByte();
+		if (stream->eos() || stream->err()) {
+			break;
+		}
+		if (markerPrefix != 0xff) {
+			continue;
+		}
+
+		byte marker = stream->readByte();
+		while (marker == 0xff) {
+			marker = stream->readByte();
+			if (stream->eos() || stream->err()) {
+				_fileManager->closeFile(stream);
+				return false;
+			}
+		}
+
+		if (marker == 0xd9 || marker == 0xda) {
+			break;
+		}
+
+		uint16 segLength = stream->readUint16BE();
+		if (segLength < 2) {
+			break;
+		}
+
+		if ((marker >= 0xc0 && marker <= 0xc3) ||
+			(marker >= 0xc9 && marker <= 0xcb)) {
+
+			stream->skip(1);
+
+			height = stream->readUint16BE();
+			width = stream->readUint16BE();
+
+			_fileManager->closeFile(stream);
+
+			return true;
+		} else {
+			stream->skip(segLength - 2);
+			if (stream->eos() || stream->err()) {
+				break;
+			}
+		}
+	}
+
+	_fileManager->closeFile(stream);
+
+	return false;
+}
+
 bool BaseImage::loadFile(const Common::String &filename) {
 	_filename = filename;
 	_filename.toLowercase();
diff --git a/engines/wintermute/base/gfx/base_image.h b/engines/wintermute/base/gfx/base_image.h
index b0d0a292154..b99ee79cb21 100644
--- a/engines/wintermute/base/gfx/base_image.h
+++ b/engines/wintermute/base/gfx/base_image.h
@@ -48,6 +48,7 @@ public:
 	BaseImage();
 	~BaseImage();
 
+	bool getImageInfo(const Common::String &filename, int32 &width, int32 &height);
 	bool loadFile(const Common::String &filename);
 	const Graphics::Surface *getSurface() const {
 		return _surface;
@@ -69,6 +70,11 @@ private:
 	const byte *_palette;
 	uint16 _paletteCount;
 	BaseFileManager *_fileManager;
+	
+	bool getImageInfoBMP(const Common::String &filename, int32 &width, int32 &height);
+	bool getImageInfoTGA(const Common::String &filename, int32 &width, int32 &height);
+	bool getImageInfoPNG(const Common::String &filename, int32 &width, int32 &height);
+	bool getImageInfoJPG(const Common::String &filename, int32 &width, int32 &height);
 };
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
index 0a6ea5c2ff5..b385ea14dfe 100644
--- a/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_surface_opengl3d.cpp
@@ -126,6 +126,9 @@ bool BaseSurfaceOpenGL3D::create(const Common::String &filename, bool defaultCK,
 	}
 
 	BaseImage img = BaseImage();
+	if (!img.getImageInfo(filename, _width, _height)) {
+		return false;
+	}
 
 	if (lifeTime != -1 && _lifeTime == 0) {
 		_valid = false;
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
index e454bf45a71..2cfd1b2b6d9 100644
--- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
@@ -85,6 +85,11 @@ bool BaseSurfaceOSystem::create(const Common::String &filename, bool defaultCK,
 		ckBlue  = 255;
 	}
 
+	BaseImage img = BaseImage();
+	if (!img.getImageInfo(filename, _width, _height)) {
+		return false;
+	}
+	
 	if (lifeTime != -1 && _lifeTime == 0) {
 		_valid = false;
 	}




More information about the Scummvm-git-logs mailing list