[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