[Scummvm-git-logs] scummvm master -> 16d5eed27d764ff1ff47683444b148d86207b000

bluegr noreply at scummvm.org
Mon Jun 16 21:03:52 UTC 2025


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

Summary:
9467561a0f WINTERMUTE: Simplify casts when parsing text files
da0a592788 WINTERMUTE: Simplify loading thumbnail files
d824f3ae90 WINTERMUTE: Avoid leaking file handles when loading subtitles
cc7a3572d8 WINTERMUTE: Reduce memory usage when dumping files
5ac16169a0 WINTERMUTE: Clean up ownership of streaming file handles
93a93bd264 WINTERMUTE: Make more use of hasFile()
16d5eed27d WINTERMUTE: Improve portability when loading values from files


Commit: 9467561a0f388430e7a0cb763752b91da808d36c
    https://github.com/scummvm/scummvm/commit/9467561a0f388430e7a0cb763752b91da808d36c
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Simplify casts when parsing text files

Changed paths:
    engines/wintermute/ad/ad_actor.cpp
    engines/wintermute/ad/ad_actor_3dx.cpp
    engines/wintermute/ad/ad_actor_3dx.h
    engines/wintermute/ad/ad_geom_ext.cpp
    engines/wintermute/ad/ad_geom_ext.h
    engines/wintermute/ad/ad_geom_ext_node.cpp
    engines/wintermute/ad/ad_geom_ext_node.h
    engines/wintermute/base/base_string_table.cpp
    engines/wintermute/base/gfx/xmodel.cpp
    engines/wintermute/base/gfx/xmodel.h


diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp
index 8078a85a715..4879c233a4f 100644
--- a/engines/wintermute/ad/ad_actor.cpp
+++ b/engines/wintermute/ad/ad_actor.cpp
@@ -354,7 +354,7 @@ bool AdActor::loadBuffer(char *buffer, bool complete) {
 		case TOKEN_CURSOR:
 			delete _cursor;
 			_cursor = new BaseSprite(_gameRef);
-			if (!_cursor || DID_FAIL(_cursor->loadFile((char *)params))) {
+			if (!_cursor || DID_FAIL(_cursor->loadFile(params))) {
 				delete _cursor;
 				_cursor = nullptr;
 				cmd = PARSERR_GENERIC;
diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index 5c0780899b5..b3b67084193 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -851,7 +851,7 @@ bool AdActor3DX::turnToStep(float velocity) {
 
 //////////////////////////////////////////////////////////////////////////
 bool AdActor3DX::loadFile(const char *filename) {
-	byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename);
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename);
 
 	if (buffer == nullptr) {
 		_gameRef->LOG(0, "AdActor3DX::LoadFile failed for file '%s'", filename);
@@ -911,7 +911,7 @@ TOKEN_DEF_START
 	TOKEN_DEF(MATERIAL)
 TOKEN_DEF_END
 //////////////////////////////////////////////////////////////////////////
-bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
+bool AdActor3DX::loadBuffer(char *buffer, bool complete) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(ACTOR3DX)
 		TOKEN_TABLE(X)
@@ -950,12 +950,12 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 		TOKEN_TABLE(EFFECT)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
 	if (complete) {
-		if (parser.getCommand((char **)&buffer, commands, (char **)&params) != TOKEN_ACTOR3DX) {
+		if (parser.getCommand(&buffer, commands, &params) != TOKEN_ACTOR3DX) {
 			_gameRef->LOG(0, "'ACTOR3DX' keyword expected.");
 			return false;
 		}
@@ -968,39 +968,39 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 	delete _shadowModel;
 	_shadowModel = nullptr;
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_TEMPLATE:
-			if (!loadFile((char *)params)) {
+			if (!loadFile(params)) {
 				cmd = PARSERR_GENERIC;
 			}
 			break;
 
 		case TOKEN_X:
-			parser.scanStr((char *)params, "%f", &_posVector._x);
+			parser.scanStr(params, "%f", &_posVector._x);
 			break;
 
 		case TOKEN_Y:
-			parser.scanStr((char *)params, "%f", &_posVector._y);
+			parser.scanStr(params, "%f", &_posVector._y);
 			break;
 
 		case TOKEN_Z:
-			parser.scanStr((char *)params, "%f", &_posVector._z);
+			parser.scanStr(params, "%f", &_posVector._z);
 			break;
 
 		case TOKEN_ANGLE:
-			parser.scanStr((char *)params, "%f", &_angle);
+			parser.scanStr(params, "%f", &_angle);
 			BaseUtils::normalizeAngle(_angle);
 			break;
 
 		case TOKEN_SHADOW_SIZE:
-			parser.scanStr((char *)params, "%f", &_shadowSize);
+			parser.scanStr(params, "%f", &_shadowSize);
 			_shadowSize = MAX(_shadowSize, 0.0f);
 			break;
 
 		case TOKEN_SIMPLE_SHADOW: {
 			bool simpleShadow;
-			parser.scanStr((char *)params, "%b", &simpleShadow);
+			parser.scanStr(params, "%b", &simpleShadow);
 			if (simpleShadow) {
 				_shadowType = SHADOW_SIMPLE;
 			}
@@ -1010,19 +1010,19 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 
 		case TOKEN_SHADOW_COLOR: {
 			int r, g, b, a;
-			parser.scanStr((char *)params, "%d,%d,%d,%d", &r, &g, &b, &a);
+			parser.scanStr(params, "%d,%d,%d,%d", &r, &g, &b, &a);
 			_shadowColor = BYTETORGBA(r, g, b, a);
 
 			break;
 		}
 
 		case TOKEN_LIGHT_POSITION:
-			parser.scanStr((char *)params, "%f,%f,%f", &_shadowLightPos._x, &_shadowLightPos._y, &_shadowLightPos._z);
+			parser.scanStr(params, "%f,%f,%f", &_shadowLightPos._x, &_shadowLightPos._y, &_shadowLightPos._z);
 			break;
 
 		case TOKEN_SHADOW: {
 			bool shadowEnabled;
-			parser.scanStr((char *)params, "%b", &shadowEnabled);
+			parser.scanStr(params, "%b", &shadowEnabled);
 			if (!shadowEnabled) {
 				_shadowType = SHADOW_NONE;
 			}
@@ -1031,49 +1031,49 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 		}
 
 		case TOKEN_DRAW_BACKFACES:
-			parser.scanStr((char *)params, "%b", &_drawBackfaces);
+			parser.scanStr(params, "%b", &_drawBackfaces);
 			break;
 
 		case TOKEN_VELOCITY:
-			parser.scanStr((char *)params, "%f", &_velocity);
+			parser.scanStr(params, "%f", &_velocity);
 			break;
 
 		case TOKEN_ANGULAR_VELOCITY:
-			parser.scanStr((char *)params, "%f", &_angVelocity);
+			parser.scanStr(params, "%f", &_angVelocity);
 			break;
 
 		case TOKEN_SCALE:
-			parser.scanStr((char *)params, "%f", &_scale3D);
+			parser.scanStr(params, "%f", &_scale3D);
 			_scale3D /= 100.0f;
 			break;
 
 		case TOKEN_NAME:
-			setName((char *)params);
+			setName(params);
 			break;
 
 		case TOKEN_CAPTION:
-			setCaption((char *)params);
+			setCaption(params);
 			break;
 
 		case TOKEN_FONT:
-			setFont((char *)params);
+			setFont(params);
 			break;
 
 		case TOKEN_REGISTRABLE:
 		case TOKEN_INTERACTIVE:
-			parser.scanStr((char *)params, "%b", &_registrable);
+			parser.scanStr(params, "%b", &_registrable);
 			break;
 
 		case TOKEN_ACTIVE:
-			parser.scanStr((char *)params, "%b", &_active);
+			parser.scanStr(params, "%b", &_active);
 			break;
 
 		case TOKEN_DROP_TO_FLOOR:
-			parser.scanStr((char *)params, "%b", &_dropToFloor);
+			parser.scanStr(params, "%b", &_dropToFloor);
 			break;
 
 		case TOKEN_SHADOW_TYPE: {
-			char *typeName = (char *)params;
+			char *typeName = params;
 			if (scumm_stricmp(typeName, "none") == 0) {
 				_shadowType = SHADOW_NONE;
 			} else if (scumm_stricmp(typeName, "simple") == 0) {
@@ -1098,13 +1098,13 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 			if (!_xmodel) {
 				_xmodel = new XModel(_gameRef, this);
 
-				if (!_xmodel || !_xmodel->loadFromFile((char *)params)) {
+				if (!_xmodel || !_xmodel->loadFromFile(params)) {
 					delete _xmodel;
 					_xmodel = nullptr;
 					cmd = PARSERR_GENERIC;
 				}
 			} else {
-				if (!_xmodel->mergeFromFile((char *)params)) {
+				if (!_xmodel->mergeFromFile(params)) {
 					cmd = PARSERR_GENERIC;
 				}
 			}
@@ -1115,7 +1115,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 				delete _shadowModel;
 				_shadowModel = new XModel(_gameRef, this);
 
-				if (!_shadowModel || !_shadowModel->loadFromFile((char *)params, _xmodel)) {
+				if (!_shadowModel || !_shadowModel->loadFromFile(params, _xmodel)) {
 					delete _shadowModel;
 					_shadowModel = nullptr;
 					cmd = PARSERR_GENERIC;
@@ -1128,7 +1128,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 		case TOKEN_CURSOR:
 			delete _cursor;
 			_cursor = new BaseSprite(_gameRef);
-			if (!_cursor || !_cursor->loadFile((char *)params)) {
+			if (!_cursor || !_cursor->loadFile(params)) {
 				delete _cursor;
 				_cursor = nullptr;
 				cmd = PARSERR_GENERIC;
@@ -1136,15 +1136,15 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 			break;
 
 		case TOKEN_SCRIPT:
-			addScript((char *)params);
+			addScript(params);
 			break;
 
 		case TOKEN_PROPERTY:
-			parseProperty((char *)params, false);
+			parseProperty(params, false);
 			break;
 
 		case TOKEN_EDITOR_PROPERTY:
-			parseEditorProperty((char *)params, false);
+			parseEditorProperty(params, false);
 			break;
 
 		case TOKEN_ANIMATION:
@@ -1167,7 +1167,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 				_gameRef->_surfaceStorage->removeSurface(_shadowImage);
 			_shadowImage = nullptr;
 
-			_shadowImage = _gameRef->_surfaceStorage->addSurface((char *)params);
+			_shadowImage = _gameRef->_surfaceStorage->addSurface(params);
 			break;
 
 		case TOKEN_BLOCKED_REGION: {
@@ -1177,7 +1177,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 			_currentBlockRegion = nullptr;
 			BaseRegion *rgn = new BaseRegion(_gameRef);
 			BaseRegion *crgn = new BaseRegion(_gameRef);
-			if (!rgn || !crgn || !rgn->loadBuffer((char *)params, false)) {
+			if (!rgn || !crgn || !rgn->loadBuffer(params, false)) {
 				delete rgn;
 				delete crgn;
 				cmd = PARSERR_GENERIC;
@@ -1196,7 +1196,7 @@ bool AdActor3DX::loadBuffer(byte *buffer, bool complete) {
 			_currentWptGroup = nullptr;
 			AdWaypointGroup *wpt = new AdWaypointGroup(_gameRef);
 			AdWaypointGroup *cwpt = new AdWaypointGroup(_gameRef);
-			if (!wpt || !cwpt || !wpt->loadBuffer((char *)params, false)) {
+			if (!wpt || !cwpt || !wpt->loadBuffer(params, false)) {
 				delete wpt;
 				delete cwpt;
 				cmd = PARSERR_GENERIC;
@@ -2392,18 +2392,18 @@ bool AdActor3DX::mergeAnimations2(const char *filename) {
 		TOKEN_TABLE(ANIMATION)
 	TOKEN_TABLE_END
 
-	byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename);
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename);
 	if (buffer == nullptr) {
 		return false;
 	}
 
-	byte *bufferOrig = buffer;
+	char *bufferOrig = buffer;
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_ANIMATION:
 			if (!_xmodel->parseAnim(params)) {
@@ -2496,27 +2496,27 @@ bool AdActor3DX::updatePartEmitter() {
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool AdActor3DX::parseEffect(byte *buffer) {
+bool AdActor3DX::parseEffect(char *buffer) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(MATERIAL)
 		TOKEN_TABLE(EFFECT_FILE)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
 	char *effectFile = nullptr;
 	char *material = nullptr;
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_EFFECT_FILE:
-			BaseUtils::setString(&effectFile, (char *)params);
+			BaseUtils::setString(&effectFile, params);
 			break;
 
 		case TOKEN_MATERIAL:
-			BaseUtils::setString(&material, (char *)params);
+			BaseUtils::setString(&material, params);
 			break;
 		}
 	}
diff --git a/engines/wintermute/ad/ad_actor_3dx.h b/engines/wintermute/ad/ad_actor_3dx.h
index d0979076019..b953a05ab64 100644
--- a/engines/wintermute/ad/ad_actor_3dx.h
+++ b/engines/wintermute/ad/ad_actor_3dx.h
@@ -107,7 +107,7 @@ public:
 	AdPath3D *_path3D;
 	AdPath *_path2D;
 	bool loadFile(const char *filename);
-	bool loadBuffer(byte *buffer, bool complete = true);
+	bool loadBuffer(char *buffer, bool complete = true);
 	float dirToAngle(TDirection dir);
 	TDirection angleToDir(float angle);
 
@@ -121,7 +121,7 @@ public:
 	const char *scToString() override;
 
 private:
-	bool parseEffect(byte *buffer);
+	bool parseEffect(char *buffer);
 	BaseArray<AdAttach3DX *> _attachments;
 	bool turnToStep(float velocity);
 	bool prepareTurn(float targetAngle);
diff --git a/engines/wintermute/ad/ad_geom_ext.cpp b/engines/wintermute/ad/ad_geom_ext.cpp
index 746f0187157..ff1af1f9476 100644
--- a/engines/wintermute/ad/ad_geom_ext.cpp
+++ b/engines/wintermute/ad/ad_geom_ext.cpp
@@ -49,7 +49,7 @@ AdGeomExt::~AdGeomExt() {
 
 //////////////////////////////////////////////////////////////////////////
 bool AdGeomExt::loadFile(char *filename) {
-	byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename);
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename);
 	if (buffer == nullptr) {
 		_gameRef->LOG(0, "AdGeomExt::LoadFile failed for file '%s'", filename);
 		return false;
@@ -70,24 +70,24 @@ TOKEN_DEF_START
 	TOKEN_DEF(NODE)
 TOKEN_DEF_END
 //////////////////////////////////////////////////////////////////////////
-bool AdGeomExt::loadBuffer(byte *buffer) {
+bool AdGeomExt::loadBuffer(char *buffer) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(GEOMETRY)
 		TOKEN_TABLE(NODE)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
-	if (parser.getCommand((char **)&buffer, commands, (char **)&params) != TOKEN_GEOMETRY) {
+	if (parser.getCommand(&buffer, commands, &params) != TOKEN_GEOMETRY) {
 		_gameRef->LOG(0, "'GEOMETRY' keyword expected.");
 		return false;
 	}
 
 	buffer = params;
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_NODE: {
 			AdGeomExtNode *node = new AdGeomExtNode(_gameRef);
diff --git a/engines/wintermute/ad/ad_geom_ext.h b/engines/wintermute/ad/ad_geom_ext.h
index 228e53549f7..405990c8809 100644
--- a/engines/wintermute/ad/ad_geom_ext.h
+++ b/engines/wintermute/ad/ad_geom_ext.h
@@ -40,7 +40,7 @@ public:
 	AdGeomExt(BaseGame *inGame);
 	virtual ~AdGeomExt();
 	bool loadFile(char *filename);
-	bool loadBuffer(byte *buffer);
+	bool loadBuffer(char *buffer);
 	bool addStandardNodes();
 	AdGeomExtNode *matchName(const char *name);
 
diff --git a/engines/wintermute/ad/ad_geom_ext_node.cpp b/engines/wintermute/ad/ad_geom_ext_node.cpp
index 871bd923425..4122eb8e577 100644
--- a/engines/wintermute/ad/ad_geom_ext_node.cpp
+++ b/engines/wintermute/ad/ad_geom_ext_node.cpp
@@ -56,7 +56,7 @@ TOKEN_DEF_START
 	TOKEN_DEF(RECEIVE_SHADOWS)
 TOKEN_DEF_END
 //////////////////////////////////////////////////////////////////////////
-bool AdGeomExtNode::loadBuffer(byte *buffer, bool complete) {
+bool AdGeomExtNode::loadBuffer(char *buffer, bool complete) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(NODE)
 		TOKEN_TABLE(NAME)
@@ -66,12 +66,12 @@ bool AdGeomExtNode::loadBuffer(byte *buffer, bool complete) {
 		TOKEN_TABLE(RECEIVE_SHADOWS)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd = 2;
 	BaseParser parser;
 
 	if (complete) {
-		if (parser.getCommand((char **)&buffer, commands, (char **)&params) != TOKEN_NODE) {
+		if (parser.getCommand(&buffer, commands, &params) != TOKEN_NODE) {
 			_gameRef->LOG(0, "'NODE' keyword expected.");
 			return false;
 		}
@@ -79,19 +79,19 @@ bool AdGeomExtNode::loadBuffer(byte *buffer, bool complete) {
 		buffer = params;
 	}
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_NAME:
-			BaseUtils::setString(&_namePattern, (char *)params);
+			BaseUtils::setString(&_namePattern, params);
 			break;
 
 		case TOKEN_RECEIVE_SHADOWS:
-			parser.scanStr((char *)params, "%b", &_receiveShadows);
+			parser.scanStr(params, "%b", &_receiveShadows);
 			break;
 
 		case TOKEN_WALKPLANE: {
 			bool isWalkplane = false;
-			parser.scanStr((char *)params, "%b", &isWalkplane);
+			parser.scanStr(params, "%b", &isWalkplane);
 			if (isWalkplane) {
 				_type = GEOM_WALKPLANE;
 			}
@@ -100,7 +100,7 @@ bool AdGeomExtNode::loadBuffer(byte *buffer, bool complete) {
 
 		case TOKEN_BLOCKED: {
 			bool isBlocked = false;
-			parser.scanStr((char *)params, "%b", &isBlocked);
+			parser.scanStr(params, "%b", &isBlocked);
 			if (isBlocked) {
 				_type = GEOM_BLOCKED;
 			}
@@ -109,7 +109,7 @@ bool AdGeomExtNode::loadBuffer(byte *buffer, bool complete) {
 
 		case TOKEN_WAYPOINT: {
 			bool isWaypoint = false;
-			parser.scanStr((char *)params, "%b", &isWaypoint);
+			parser.scanStr(params, "%b", &isWaypoint);
 			if (isWaypoint) {
 				_type = GEOM_WAYPOINT;
 			}
diff --git a/engines/wintermute/ad/ad_geom_ext_node.h b/engines/wintermute/ad/ad_geom_ext_node.h
index db7ecde6134..4bb1730293c 100644
--- a/engines/wintermute/ad/ad_geom_ext_node.h
+++ b/engines/wintermute/ad/ad_geom_ext_node.h
@@ -37,7 +37,7 @@ class AdGeomExtNode : public BaseClass {
 public:
 	AdGeomExtNode(BaseGame *inGame);
 	virtual ~AdGeomExtNode();
-	bool loadBuffer(byte *buffer, bool complete);
+	bool loadBuffer(char *buffer, bool complete);
 
 	bool setupNode(const char *namePattern, TGeomNodeType type = GEOM_GENERIC, bool receiveShadows = false);
 	bool matchesName(const char *name);
diff --git a/engines/wintermute/base/base_string_table.cpp b/engines/wintermute/base/base_string_table.cpp
index f3884185a8a..cd8b297cd77 100644
--- a/engines/wintermute/base/base_string_table.cpp
+++ b/engines/wintermute/base/base_string_table.cpp
@@ -206,7 +206,7 @@ bool BaseStringTable::loadFile(const char *filename, bool clearOld) {
 	_filenames.push_back(Common::String(filename));
 
 	uint32 size;
-	byte *buffer = BaseFileManager::getEngineInstance()->readWholeFile(filename, &size);
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename, &size);
 	if (buffer == nullptr) {
 		BaseEngine::LOG(0, "BaseStringTable::LoadFile failed for file '%s'", filename);
 		return STATUS_FAILED;
@@ -214,7 +214,7 @@ bool BaseStringTable::loadFile(const char *filename, bool clearOld) {
 
 	uint32 pos = 0;
 
-	if (size > 3 && buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF) {
+	if (size > 3 && buffer[0] == '\xEF' && buffer[1] == '\xBB' && buffer[2] == '\xBF') {
 		pos += 3;
 		if (_gameRef->_textEncoding != TEXT_UTF8) {
 			_gameRef->_textEncoding = TEXT_UTF8;
@@ -234,7 +234,7 @@ bool BaseStringTable::loadFile(const char *filename, bool clearOld) {
 
 		uint32 realLength = lineLength - (pos + lineLength >= size ? 0 : 1);
 		char *line = new char[realLength + 1];
-		Common::strlcpy(line, (char *)&buffer[pos], realLength + 1);
+		Common::strlcpy(line, &buffer[pos], realLength + 1);
 		char *value = strchr(line, '\t');
 		if (value == nullptr) {
 			value = strchr(line, ' ');
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index 1014b0815e6..aebff7f3a18 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -682,14 +682,14 @@ TOKEN_DEF_START
 	TOKEN_DEF(FRAME)
 TOKEN_DEF_END
 //////////////////////////////////////////////////////////////////////////
-bool XModel::parseAnim(byte *buffer) {
+bool XModel::parseAnim(char *buffer) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(NAME)
 		TOKEN_TABLE(LOOPING)
 		TOKEN_TABLE(EVENT)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
@@ -697,10 +697,10 @@ bool XModel::parseAnim(byte *buffer) {
 	bool looping = false;
 	bool loopingSet = false;
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_NAME: {
-			BaseUtils::setString(&name, (char *)params);
+			BaseUtils::setString(&name, params);
 
 			AnimationSet *anim = getAnimationSetByName(name);
 			if (!anim) {
@@ -710,7 +710,7 @@ bool XModel::parseAnim(byte *buffer) {
 		}
 
 		case TOKEN_LOOPING:
-			parser.scanStr((char *)params, "%b", &looping);
+			parser.scanStr(params, "%b", &looping);
 			loopingSet = true;
 			break;
 
@@ -746,13 +746,13 @@ bool XModel::parseAnim(byte *buffer) {
 }
 
 //////////////////////////////////////////////////////////////////////////
-bool XModel::parseEvent(AnimationSet *anim, byte *buffer) {
+bool XModel::parseEvent(AnimationSet *anim, char *buffer) {
 	TOKEN_TABLE_START(commands)
 		TOKEN_TABLE(NAME)
 		TOKEN_TABLE(FRAME)
 	TOKEN_TABLE_END
 
-	byte *params;
+	char *params;
 	int cmd;
 	BaseParser parser;
 
@@ -761,14 +761,14 @@ bool XModel::parseEvent(AnimationSet *anim, byte *buffer) {
 		return false;
 	}
 
-	while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)&params)) > 0) {
+	while ((cmd = parser.getCommand(&buffer, commands, &params)) > 0) {
 		switch (cmd) {
 		case TOKEN_NAME:
-			BaseUtils::setString(&event->_eventName, (char *)params);
+			BaseUtils::setString(&event->_eventName, params);
 			break;
 
 		case TOKEN_FRAME:
-			parser.scanStr((char *)params, "%d", &event->_frame);
+			parser.scanStr(params, "%d", &event->_frame);
 			break;
 		}
 	}
diff --git a/engines/wintermute/base/gfx/xmodel.h b/engines/wintermute/base/gfx/xmodel.h
index b47fd22c328..65e1d48fd5a 100644
--- a/engines/wintermute/base/gfx/xmodel.h
+++ b/engines/wintermute/base/gfx/xmodel.h
@@ -223,8 +223,8 @@ public:
 	Rect32 _boundingRect;
 	BaseObject *_owner{};
 
-	bool parseAnim(byte *buffer);
-	bool parseEvent(AnimationSet *anim, byte *buffer);
+	bool parseAnim(char *buffer);
+	bool parseEvent(AnimationSet *anim, char *buffer);
 	AnimationSet *getAnimationSetByName(const Common::String &name);
 
 	bool stopAnim(int channel, uint32 transitionTime);


Commit: da0a5927882284b8bd54268a91759dc33d9045d9
    https://github.com/scummvm/scummvm/commit/da0a5927882284b8bd54268a91759dc33d9045d9
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Simplify loading thumbnail files

Changed paths:
  R engines/wintermute/base/file/base_file.cpp
  R engines/wintermute/base/file/base_file.h
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/base/base_file_manager.cpp
    engines/wintermute/base/file/base_save_thumb_file.cpp
    engines/wintermute/base/file/base_save_thumb_file.h
    engines/wintermute/base/scriptables/script_ext_file.h
    engines/wintermute/base/sound/base_sound_buffer.h
    engines/wintermute/module.mk


diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index bb3fa89970b..3abebcaefe4 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -42,7 +42,6 @@
 #include "engines/wintermute/base/base_file_manager.h"
 #include "engines/wintermute/base/base_game.h"
 #include "engines/wintermute/base/base_sprite.h"
-#include "engines/wintermute/base/file/base_file.h"
 #include "engines/wintermute/base/gfx/opengl/base_render_opengl3d.h"
 #include "engines/wintermute/base/gfx/3dcamera.h"
 #include "engines/wintermute/base/gfx/3dlight.h"
diff --git a/engines/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp
index 3b58e02f4e1..7fad0cf75e2 100644
--- a/engines/wintermute/base/base_file_manager.cpp
+++ b/engines/wintermute/base/base_file_manager.cpp
@@ -31,6 +31,7 @@
 #include "engines/wintermute/base/file/base_savefile_manager_file.h"
 #include "engines/wintermute/base/file/base_save_thumb_file.h"
 #include "engines/wintermute/base/file/base_package.h"
+#include "engines/wintermute/base/base.h"
 #include "engines/wintermute/base/base_engine.h"
 #include "engines/wintermute/wintermute.h"
 #include "common/algorithm.h"
@@ -476,12 +477,7 @@ Common::SeekableReadStream *BaseFileManager::openFileRaw(const Common::String &f
 		if (!BaseEngine::instance().getGameRef()) {
 			error("Attempt to load filename: %s without BaseEngine-object, this is unsupported", filename.c_str());
 		}
-		BaseSaveThumbFile *saveThumbFile = new BaseSaveThumbFile();
-		if (DID_SUCCEED(saveThumbFile->open(filename))) {
-			ret = saveThumbFile->getMemStream();
-		}
-		delete saveThumbFile;
-		return ret;
+		return openThumbFile(filename);
 	}
 
 	ret = openSfmFile(filename);
diff --git a/engines/wintermute/base/file/base_file.cpp b/engines/wintermute/base/file/base_file.cpp
deleted file mode 100644
index df7d7035bc9..00000000000
--- a/engines/wintermute/base/file/base_file.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#include "engines/wintermute/base/file/base_file.h"
-#include "common/memstream.h"
-
-namespace Wintermute {
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-
-//////////////////////////////////////////////////////////////////////////
-BaseFile::BaseFile() {
-	_pos = 0;
-	_size = 0;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-BaseFile::~BaseFile() {
-
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseFile::isEOF() {
-	return _pos == _size;
-}
-
-Common::SeekableReadStream *BaseFile::getMemStream() {
-	uint32 oldPos = getPos();
-	seek(0);
-	byte *data = (byte *)malloc(getSize());
-	read(data, getSize());
-	seek(oldPos);
-	Common::MemoryReadStream *memStream = new Common::MemoryReadStream(data, getSize(), DisposeAfterUse::YES);
-	return memStream;
-}
-
-
-} // End of namespace Wintermute
diff --git a/engines/wintermute/base/file/base_file.h b/engines/wintermute/base/file/base_file.h
deleted file mode 100644
index 5fb86390379..00000000000
--- a/engines/wintermute/base/file/base_file.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * This file is based on WME Lite.
- * http://dead-code.org/redir.php?target=wmelite
- * Copyright (c) 2011 Jan Nedoma
- */
-
-#ifndef WINTERMUTE_BASE_FILE_H
-#define WINTERMUTE_BASE_FILE_H
-
-
-#include "engines/wintermute/base/base.h"
-#include "common/str.h"
-#include "common/stream.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace Wintermute {
-
-class BaseFile {
-protected:
-	uint32 _pos;
-	uint32 _size;
-public:
-	virtual uint32 getSize() const {
-		return _size;
-	};
-	virtual uint32 getPos() const {
-		return _pos;
-	};
-	virtual bool seek(uint32 pos, int whence = SEEK_SET) = 0;
-	virtual bool read(void *buffer, uint32 size) = 0;
-	virtual bool close() = 0;
-	virtual bool open(const Common::String &filename) = 0;
-	virtual bool isEOF();
-	BaseFile();
-	virtual ~BaseFile();
-	// Temporary solution to allow usage in ScummVM-code:
-	virtual Common::SeekableReadStream *getMemStream();
-};
-
-} // End of namespace Wintermute
-
-#endif
diff --git a/engines/wintermute/base/file/base_save_thumb_file.cpp b/engines/wintermute/base/file/base_save_thumb_file.cpp
index a9016e5d691..912006b96fe 100644
--- a/engines/wintermute/base/file/base_save_thumb_file.cpp
+++ b/engines/wintermute/base/file/base_save_thumb_file.cpp
@@ -27,32 +27,14 @@
 
 #include "engines/wintermute/base/base_persistence_manager.h"
 #include "engines/wintermute/base/file/base_save_thumb_file.h"
+#include "engines/wintermute/base/base.h"
+#include "common/memstream.h"
 
 namespace Wintermute {
 
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-
-//////////////////////////////////////////////////////////////////////////
-BaseSaveThumbFile::BaseSaveThumbFile() {
-	_data = nullptr;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-BaseSaveThumbFile::~BaseSaveThumbFile() {
-	close();
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseSaveThumbFile::open(const Common::String &filename) {
-	close();
-
+Common::SeekableReadStream *openThumbFile(const Common::String &filename) {
 	if (scumm_strnicmp(filename.c_str(), "savegame:", 9) != 0) {
-		return STATUS_FAILED;
+		return nullptr;
 	}
 
 	size_t filenameSize = strlen(filename.c_str()) - 9 + 1;
@@ -71,85 +53,27 @@ bool BaseSaveThumbFile::open(const Common::String &filename) {
 
 	BasePersistenceManager *pm = new BasePersistenceManager();
 	if (!pm) {
-		return STATUS_FAILED;
+		return nullptr;
 	}
 
 	Common::String slotFilename = pm->getFilenameForSlot(slot);
 
 	if (DID_FAIL(pm->initLoad(slotFilename))) {
 		delete pm;
-		return STATUS_FAILED;
+		return nullptr;
 	}
 
-	bool res;
-
-	if (pm->_thumbnailDataSize != 0) {
-		_data = new byte[pm->_thumbnailDataSize];
-		memcpy(_data, pm->_thumbnailData, pm->_thumbnailDataSize);
-		_size = pm->_thumbnailDataSize;
-		res = STATUS_OK;
-	} else {
-		res = STATUS_FAILED;
-	}
-	delete pm;
-
-	return res;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseSaveThumbFile::close() {
-	delete[] _data;
-	_data = nullptr;
-
-	_pos = 0;
-	_size = 0;
-
-	return STATUS_OK;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseSaveThumbFile::read(void *buffer, uint32 size) {
-	if (!_data || _pos + size > _size) {
-		return STATUS_FAILED;
-	}
-
-	memcpy(buffer, (byte *)_data + _pos, size);
-	_pos += size;
-
-	return STATUS_OK;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-bool BaseSaveThumbFile::seek(uint32 pos, int whence) {
-	if (!_data) {
-		return STATUS_FAILED;
-	}
-
-	uint32 newPos = 0;
-
-	switch (whence) {
-	case SEEK_SET:
-	default:
-		newPos = pos;
-		break;
-	case SEEK_END:
-		newPos = _size + pos;
-		break;
-	case SEEK_CUR:
-		newPos = _pos + pos;
-		break;
+	if (pm->_thumbnailDataSize == 0) {
+		delete pm;
+		return nullptr;
 	}
 
-	if (newPos > _size) {
-		return STATUS_FAILED;
-	} else {
-		_pos = newPos;
-	}
+	uint32 size = pm->_thumbnailDataSize;
+	byte *data = (byte *)malloc(size);
+	memcpy(data, pm->_thumbnailData, size);
+	delete pm;
 
-	return STATUS_OK;
+	return new Common::MemoryReadStream(data, size, DisposeAfterUse::YES);
 }
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/file/base_save_thumb_file.h b/engines/wintermute/base/file/base_save_thumb_file.h
index dfc3986e512..68b4bd128fa 100644
--- a/engines/wintermute/base/file/base_save_thumb_file.h
+++ b/engines/wintermute/base/file/base_save_thumb_file.h
@@ -28,23 +28,12 @@
 #ifndef WINTERMUTE_BASE_SAVETHUMBFILE_H
 #define WINTERMUTE_BASE_SAVETHUMBFILE_H
 
-
-#include "engines/wintermute/base/file/base_file.h"
+#include "common/str.h"
+#include "common/stream.h"
 
 namespace Wintermute {
 
-//TODO: Get rid of this
-class BaseSaveThumbFile : public BaseFile {
-public:
-	BaseSaveThumbFile();
-	~BaseSaveThumbFile() override;
-	bool seek(uint32 pos, int whence = SEEK_SET) override;
-	bool read(void *buffer, uint32 size) override;
-	bool close() override;
-	bool open(const Common::String &filename) override;
-private:
-	byte *_data;
-};
+Common::SeekableReadStream *openThumbFile(const Common::String &filename);
 
 } // End of namespace Wintermute
 
diff --git a/engines/wintermute/base/scriptables/script_ext_file.h b/engines/wintermute/base/scriptables/script_ext_file.h
index 8cca2a8cf6e..25832152ee4 100644
--- a/engines/wintermute/base/scriptables/script_ext_file.h
+++ b/engines/wintermute/base/scriptables/script_ext_file.h
@@ -34,8 +34,6 @@
 
 namespace Wintermute {
 
-class BaseFile;
-
 class SXFile : public BaseScriptable {
 public:
 	DECLARE_PERSISTENT(SXFile, BaseScriptable)
diff --git a/engines/wintermute/base/sound/base_sound_buffer.h b/engines/wintermute/base/sound/base_sound_buffer.h
index 1ae580a8751..abc773fc87e 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.h
+++ b/engines/wintermute/base/sound/base_sound_buffer.h
@@ -40,7 +40,6 @@ class SoundHandle;
 
 namespace Wintermute {
 
-class BaseFile;
 class BaseSoundBuffer : public BaseClass {
 public:
 
diff --git a/engines/wintermute/module.mk b/engines/wintermute/module.mk
index 7f7b30bf5b6..58f2783fe2b 100644
--- a/engines/wintermute/module.mk
+++ b/engines/wintermute/module.mk
@@ -42,7 +42,6 @@ MODULE_OBJS := \
 	base/scriptables/script_ext_mem_buffer.o \
 	base/scriptables/script_ext_string.o \
 	base/file/base_disk_file.o \
-	base/file/base_file.o \
 	base/file/base_file_entry.o \
 	base/file/base_package.o \
 	base/file/base_save_thumb_file.o \


Commit: d824f3ae9002b23a86a1f0102395990bce027f50
    https://github.com/scummvm/scummvm/commit/d824f3ae9002b23a86a1f0102395990bce027f50
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Avoid leaking file handles when loading subtitles

Changed paths:
    engines/wintermute/video/video_subtitler.cpp


diff --git a/engines/wintermute/video/video_subtitler.cpp b/engines/wintermute/video/video_subtitler.cpp
index 13d714b47d0..7e384d92a6e 100644
--- a/engines/wintermute/video/video_subtitler.cpp
+++ b/engines/wintermute/video/video_subtitler.cpp
@@ -73,22 +73,18 @@ bool VideoSubtitler::loadSubtitles(const Common::String &filename, const Common:
 		newFile = PathUtil::combine(path, name + ext);
 	}
 
-	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(newFile, true, false);
+	uint32 fileSize;
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(newFile, &fileSize);
 
-	if (file == nullptr) {
+	if (buffer == nullptr) {
 		return false; // no subtitles
 	}
 
-	int fileSize = file->size();
-	char *buffer = new char[fileSize];
-
-	file->read(buffer, fileSize);
-
 	/* This is where we parse .sub files.
 	 * Subtitles cards are in the form
 	 * {StartFrame}{EndFrame} FirstLine | SecondLine \n
 	 */
-	int pos = 0;
+	uint32 pos = 0;
 
 	while (pos < fileSize) {
 		char *tokenStart = 0;
@@ -116,7 +112,7 @@ bool VideoSubtitler::loadSubtitles(const Common::String &filename, const Common:
 		}
 
 		Common::String cardText;
-		char *fileLine = (char *)&buffer[pos];
+		char *fileLine = &buffer[pos];
 
 		for (int i = 0; i < realLength; i++) {
 			if (fileLine[i] == '{') {


Commit: cc7a3572d8e9a3324a37a5dd94e4a5fb8dd8866b
    https://github.com/scummvm/scummvm/commit/cc7a3572d8e9a3324a37a5dd94e4a5fb8dd8866b
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Reduce memory usage when dumping files

Changed paths:
    engines/wintermute/debugger.cpp


diff --git a/engines/wintermute/debugger.cpp b/engines/wintermute/debugger.cpp
index e55c2f860a3..41061c8679a 100644
--- a/engines/wintermute/debugger.cpp
+++ b/engines/wintermute/debugger.cpp
@@ -325,15 +325,12 @@ bool Console::Cmd_DumpFile(int argc, const char **argv) {
 	Common::DumpFile *outFile = new Common::DumpFile();
 	outFile->open(Common::Path(outFileName, Common::Path::kNativeSeparator));
 
-	byte *data = new byte[inFile->size()];
-	inFile->read(data, inFile->size());
-	outFile->write(data, inFile->size());
+	outFile->writeStream(inFile);
 	outFile->finalize();
 	outFile->close();
-	delete[] data;
 
 	delete outFile;
-	delete inFile;
+	fileManager->closeFile(inFile);
 
 	debugPrintf("Resource file '%s' dumped to file '%s'\n", argv[1], argv[2]);
 	return true;


Commit: 5ac16169a0cbbea29374db2a909480af633d72fd
    https://github.com/scummvm/scummvm/commit/5ac16169a0cbbea29374db2a909480af633d72fd
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Clean up ownership of streaming file handles

Changed paths:
    engines/wintermute/base/font/base_font_truetype.cpp
    engines/wintermute/base/gfx/base_image.cpp
    engines/wintermute/base/sound/base_sound_buffer.cpp
    engines/wintermute/base/sound/base_sound_buffer.h
    engines/wintermute/ext/wme_vlink.cpp
    engines/wintermute/video/video_theora_player.cpp
    engines/wintermute/video/video_theora_player.h


diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp
index 71dc41dcea7..367b00d43d0 100644
--- a/engines/wintermute/base/font/base_font_truetype.cpp
+++ b/engines/wintermute/base/font/base_font_truetype.cpp
@@ -563,6 +563,7 @@ bool BaseFontTT::initFont() {
 		fallbackFilename = "LiberationSans-Regular.ttf";
 	}
 
+	// Load a file, but avoid having the File-manager handle the disposal of it.
 	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(_fontFile, true, false);
 	if (!file) {
 		if (Common::String(_fontFile) != "arial.ttf") {
diff --git a/engines/wintermute/base/gfx/base_image.cpp b/engines/wintermute/base/gfx/base_image.cpp
index aece1331ca2..4b3d51fc80e 100644
--- a/engines/wintermute/base/gfx/base_image.cpp
+++ b/engines/wintermute/base/gfx/base_image.cpp
@@ -77,7 +77,7 @@ bool BaseImage::loadFile(const Common::String &filename) {
 		error("BaseImage::loadFile : Unsupported fileformat %s", filename.c_str());
 	}
 	_filename = filename;
-	Common::SeekableReadStream *file = _fileManager->openFile(filename.c_str());
+	Common::SeekableReadStream *file = _fileManager->openFile(filename);
 	if (!file) {
 		return false;
 	}
diff --git a/engines/wintermute/base/sound/base_sound_buffer.cpp b/engines/wintermute/base/sound/base_sound_buffer.cpp
index e185350d4a7..af9ece8407d 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.cpp
+++ b/engines/wintermute/base/sound/base_sound_buffer.cpp
@@ -56,7 +56,6 @@ BaseSoundBuffer::BaseSoundBuffer(BaseGame *inGame) : BaseClass(inGame) {
 
 	_streamed = false;
 	_filename = "";
-	_file = nullptr;
 	_privateVolume = 255;
 	_volume = 255;
 	_pan = 0;
@@ -96,8 +95,8 @@ bool BaseSoundBuffer::loadFromFile(const Common::String &filename, bool forceRel
 	debugC(kWintermuteDebugAudio, "BSoundBuffer::LoadFromFile(%s,%d)", filename.c_str(), forceReload);
 
 	// Load a file, but avoid having the File-manager handle the disposal of it.
-	_file = BaseFileManager::getEngineInstance()->openFile(filename, true, false);
-	if (!_file) {
+	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(filename, true, false);
+	if (!file) {
 		_gameRef->LOG(0, "Error opening sound file '%s'", filename.c_str());
 		return STATUS_FAILED;
 	}
@@ -105,7 +104,7 @@ bool BaseSoundBuffer::loadFromFile(const Common::String &filename, bool forceRel
 	strFilename.toLowercase();
 	if (strFilename.hasSuffix(".ogg")) {
 #ifdef USE_VORBIS
-		_stream = Audio::makeVorbisStream(_file, DisposeAfterUse::YES);
+		_stream = Audio::makeVorbisStream(file, DisposeAfterUse::YES);
 #else
 		error("BSoundBuffer::LoadFromFile - Ogg Vorbis not supported by this version of ScummVM (please report as this shouldn't trigger)");
 #endif
@@ -114,11 +113,11 @@ bool BaseSoundBuffer::loadFromFile(const Common::String &filename, bool forceRel
 		byte waveFlags;
 		uint16 waveType;
 
-		if (Audio::loadWAVFromStream(*_file, waveSize, waveRate, waveFlags, &waveType)) {
+		if (Audio::loadWAVFromStream(*file, waveSize, waveRate, waveFlags, &waveType)) {
 			if (waveType == 1) {
 				// We need to wrap the file in a substream to make sure the size is right.
-				_file = new Common::SeekableSubReadStream(_file, _file->pos(), waveSize + _file->pos(), DisposeAfterUse::YES);
-				_stream = Audio::makeRawStream(_file, waveRate, waveFlags, DisposeAfterUse::YES);
+				file = new Common::SeekableSubReadStream(file, file->pos(), waveSize + file->pos(), DisposeAfterUse::YES);
+				_stream = Audio::makeRawStream(file, waveRate, waveFlags, DisposeAfterUse::YES);
 			} else {
 				error("BSoundBuffer::LoadFromFile - WAVE not supported yet for %s with type %d", filename.c_str(), waveType);
 			}
diff --git a/engines/wintermute/base/sound/base_sound_buffer.h b/engines/wintermute/base/sound/base_sound_buffer.h
index abc773fc87e..979c1b6525e 100644
--- a/engines/wintermute/base/sound/base_sound_buffer.h
+++ b/engines/wintermute/base/sound/base_sound_buffer.h
@@ -92,7 +92,6 @@ private:
 	uint32 _startPos;
 	Common::String _filename;
 	bool _streamed;
-	Common::SeekableReadStream *_file;
 	int32 _volume;
 	int8 _pan;
 };
diff --git a/engines/wintermute/ext/wme_vlink.cpp b/engines/wintermute/ext/wme_vlink.cpp
index fe21c332f27..5099476bf90 100644
--- a/engines/wintermute/ext/wme_vlink.cpp
+++ b/engines/wintermute/ext/wme_vlink.cpp
@@ -103,69 +103,66 @@ bool SXVlink::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 		_gameRef->freeze();
 		((WintermuteEngine *)g_engine)->savingEnable(false);
 
-		Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(path);
+		// Load a file, but avoid having the File-manager handle the disposal of it.
+		Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(path, true, false);
 		if (file) {
-			Common::SeekableReadStream *bink = new Common::SeekableSubReadStream(file, 0, file->size(), DisposeAfterUse::NO);
-			if (bink) {
-				_videoDecoder = new Video::BinkDecoder();
-				if (_videoDecoder && _videoDecoder->loadStream(bink) && _videoDecoder->isVideoLoaded()) {
-					_videoDecoder->setOutputPixelFormat(Graphics::PixelFormat(_gameRef->_renderer->getPixelFormat()));
-					BaseSurface *texture = _gameRef->_renderer->createSurface();
-					texture->create(_videoDecoder->getWidth(), _videoDecoder->getHeight());
-
-					_gameRef->_renderer->setup2D();
-
-					_frame = -1;
-					_updateNeeded = false;
-					_videoFinished = false;
-
-					_videoDecoder->start();
-					_videoDecoder->setVolume(_volume);
-
-					g_system->getTimerManager()->installTimerProc(&timerCallback, 10000, this, "movieLoop");
-
-					do {
-						if (_updateNeeded) {
-							{
-								Common::StackLock lock(_frameMutex);
-								texture->startPixelOp();
-								texture->putSurface(_surface, false);
-								texture->endPixelOp();
-							}
-							texture->display(0, 0, Rect32(texture->getWidth(), texture->getHeight()));
-							_updateNeeded = false;
-							_gameRef->_renderer->flip();
+			_videoDecoder = new Video::BinkDecoder();
+			if (_videoDecoder && _videoDecoder->loadStream(file) && _videoDecoder->isVideoLoaded()) {
+				_videoDecoder->setOutputPixelFormat(Graphics::PixelFormat(_gameRef->_renderer->getPixelFormat()));
+				BaseSurface *texture = _gameRef->_renderer->createSurface();
+				texture->create(_videoDecoder->getWidth(), _videoDecoder->getHeight());
+
+				_gameRef->_renderer->setup2D();
+
+				_frame = -1;
+				_updateNeeded = false;
+				_videoFinished = false;
+
+				_videoDecoder->start();
+				_videoDecoder->setVolume(_volume);
+
+				g_system->getTimerManager()->installTimerProc(&timerCallback, 10000, this, "movieLoop");
+
+				do {
+					if (_updateNeeded) {
+						{
+							Common::StackLock lock(_frameMutex);
+							texture->startPixelOp();
+							texture->putSurface(_surface, false);
+							texture->endPixelOp();
 						}
-						g_system->delayMillis(10);
-
-						Common::Event event;
-						while (g_system->getEventManager()->pollEvent(event)) {
-							if (event.type == Common::EVENT_KEYDOWN) {
-								if (event.kbd.keycode == Common::KEYCODE_ESCAPE) {
-									_videoFinished = true;
-									g_system->getEventManager()->purgeKeyboardEvents();
-								}
-							} else if (event.type == Common::EVENT_LBUTTONDOWN) {
+						texture->display(0, 0, Rect32(texture->getWidth(), texture->getHeight()));
+						_updateNeeded = false;
+						_gameRef->_renderer->flip();
+					}
+					g_system->delayMillis(10);
+
+					Common::Event event;
+					while (g_system->getEventManager()->pollEvent(event)) {
+						if (event.type == Common::EVENT_KEYDOWN) {
+							if (event.kbd.keycode == Common::KEYCODE_ESCAPE) {
 								_videoFinished = true;
-							} else if (event.type == Common::EVENT_SCREEN_CHANGED) {
-								_gameRef->_renderer->onWindowChange();
+								g_system->getEventManager()->purgeKeyboardEvents();
 							}
+						} else if (event.type == Common::EVENT_LBUTTONDOWN) {
+							_videoFinished = true;
+						} else if (event.type == Common::EVENT_SCREEN_CHANGED) {
+							_gameRef->_renderer->onWindowChange();
 						}
-					} while (!g_engine->shouldQuit() && !_videoFinished);
-
-					g_system->getTimerManager()->removeTimerProc(&timerCallback);
-
-					{
-						Common::StackLock lock(_frameMutex);
-						_videoDecoder->stop();
-						_videoDecoder->close();
 					}
+				} while (!g_engine->shouldQuit() && !_videoFinished);
+
+				g_system->getTimerManager()->removeTimerProc(&timerCallback);
 
-					delete texture;
+				{
+					Common::StackLock lock(_frameMutex);
+					_videoDecoder->stop();
+					_videoDecoder->close();
 				}
-				delete _videoDecoder;
+
+				delete texture;
 			}
-			BaseFileManager::getEngineInstance()->closeFile(file);
+			delete _videoDecoder;
 		}
 
 		((WintermuteEngine *)g_engine)->savingEnable(true);
diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp
index 7953874c38b..680194c6225 100644
--- a/engines/wintermute/video/video_theora_player.cpp
+++ b/engines/wintermute/video/video_theora_player.cpp
@@ -49,7 +49,6 @@ VideoTheoraPlayer::VideoTheoraPlayer(BaseGame *inGame) : BaseClass(inGame) {
 //////////////////////////////////////////////////////////////////////////
 void VideoTheoraPlayer::SetDefaults() {
 
-	_file = nullptr;
 	_filename = "";
 	_startTime = 0;
 	_looping = false;
@@ -96,11 +95,6 @@ VideoTheoraPlayer::~VideoTheoraPlayer() {
 
 //////////////////////////////////////////////////////////////////////////
 void VideoTheoraPlayer::cleanup() {
-	if (_file) {
-		BaseFileManager::getEngineInstance()->closeFile(_file);
-		_file = nullptr;
-	}
-
 	_surface.free();
 	if (_theoraDecoder) {
 		_theoraDecoder->close();
@@ -118,13 +112,16 @@ bool VideoTheoraPlayer::initialize(const Common::String &filename, const Common:
 	cleanup();
 
 	_filename = filename;
-	_file = BaseFileManager::getEngineInstance()->openFile(filename, true, false);
-	if (!_file) {
+
+#if defined (USE_THEORADEC)
+	// Load a file, but avoid having the File-manager handle the disposal of it.
+	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(filename, true, false);
+	if (!file) {
 		return STATUS_FAILED;
 	}
 
-#if defined (USE_THEORADEC)
 	_theoraDecoder = new Video::TheoraDecoder();
+	_theoraDecoder->loadStream(file);
 #else
 	warning("VideoTheoraPlayer::initialize - Theora support not compiled in, video will be skipped: %s", filename.c_str());
 	return STATUS_FAILED;
@@ -132,8 +129,6 @@ bool VideoTheoraPlayer::initialize(const Common::String &filename, const Common:
 
 	_foundSubtitles = _subtitler->loadSubtitles(_filename, subtitleFile);
 
-	_theoraDecoder->loadStream(_file);
-
 	if (!_theoraDecoder->isVideoLoaded()) {
 		return STATUS_FAILED;
 	}
@@ -160,17 +155,18 @@ bool VideoTheoraPlayer::resetStream() {
 	delete _theoraDecoder;
 	_theoraDecoder = nullptr;
 
-	_file = BaseFileManager::getEngineInstance()->openFile(_filename, true, false);
-	if (!_file) {
+#if defined (USE_THEORADEC)
+	// Load a file, but avoid having the File-manager handle the disposal of it.
+	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(_filename, true, false);
+	if (!file) {
 		return STATUS_FAILED;
 	}
 
-#if defined (USE_THEORADEC)
 	_theoraDecoder = new Video::TheoraDecoder();
+	_theoraDecoder->loadStream(file);
 #else
 	return STATUS_FAILED;
 #endif
-	_theoraDecoder->loadStream(_file);
 
 	if (!_theoraDecoder->isVideoLoaded()) {
 		return STATUS_FAILED;
diff --git a/engines/wintermute/video/video_theora_player.h b/engines/wintermute/video/video_theora_player.h
index 4a4123f2670..a807dd0ea74 100644
--- a/engines/wintermute/video/video_theora_player.h
+++ b/engines/wintermute/video/video_theora_player.h
@@ -55,7 +55,6 @@ public:
 	~VideoTheoraPlayer() override;
 
 	// external objects
-	Common::SeekableReadStream *_file;
 	Common::String _filename;
 
 	BaseSurface *_texture;


Commit: 93a93bd26499ecb2ac9827640239784981d6f00c
    https://github.com/scummvm/scummvm/commit/93a93bd26499ecb2ac9827640239784981d6f00c
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Make more use of hasFile()

Changed paths:
    engines/wintermute/base/base_sprite.cpp
    engines/wintermute/base/particles/part_emitter.cpp


diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp
index 73fab410bfa..6810aacb8ce 100644
--- a/engines/wintermute/base/base_sprite.cpp
+++ b/engines/wintermute/base/base_sprite.cpp
@@ -132,17 +132,13 @@ bool BaseSprite::isFinished() {
 
 //////////////////////////////////////////////////////////////////////
 bool BaseSprite::loadFile(const Common::String &filename, int lifeTime, TSpriteCacheType cacheType) {
-	Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(filename);
-	if (!file) {
+	if (!BaseFileManager::getEngineInstance()->hasFile(filename)) {
 		BaseEngine::LOG(0, "BaseSprite::LoadFile failed for file '%s'", filename.c_str());
 		if (_gameRef->_debugDebugMode) {
 			return loadFile("invalid_debug.bmp", lifeTime, cacheType);
 		} else {
 			return loadFile("invalid.bmp", lifeTime, cacheType);
 		}
-	} else {
-		BaseFileManager::getEngineInstance()->closeFile(file);
-		file = nullptr;
 	}
 
 	bool ret = STATUS_FAILED;
diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp
index d113720c396..dbc73c3178e 100644
--- a/engines/wintermute/base/particles/part_emitter.cpp
+++ b/engines/wintermute/base/particles/part_emitter.cpp
@@ -128,12 +128,9 @@ bool PartEmitter::addSprite(const char *filename) {
 	}
 
 	// check if file exists
-	Common::SeekableReadStream *File = BaseFileManager::getEngineInstance()->openFile(filename);
-	if (!File) {
+	if (!BaseFileManager::getEngineInstance()->hasFile(filename)) {
 		BaseEngine::LOG(0, "Sprite '%s' not found", filename);
 		return STATUS_FAILED;
-	} else {
-		BaseFileManager::getEngineInstance()->closeFile(File);
 	}
 
 	size_t filenameSize = strlen(filename) + 1;


Commit: 16d5eed27d764ff1ff47683444b148d86207b000
    https://github.com/scummvm/scummvm/commit/16d5eed27d764ff1ff47683444b148d86207b000
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-17T00:03:46+03:00

Commit Message:
WINTERMUTE: Improve portability when loading values from files

Changed paths:
    engines/wintermute/base/scriptables/script.cpp
    engines/wintermute/base/scriptables/script_engine.cpp
    engines/wintermute/base/scriptables/script_ext_file.cpp


diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp
index 27822053cf7..2ed0fee0d09 100644
--- a/engines/wintermute/base/scriptables/script.cpp
+++ b/engines/wintermute/base/scriptables/script.cpp
@@ -478,19 +478,7 @@ uint32 ScScript::getDWORD() {
 //////////////////////////////////////////////////////////////////////////
 double ScScript::getFloat() {
 	_scriptStream->seek((int32)_iP);
-	byte buffer[8];
-	_scriptStream->read(buffer, 8);
-
-#ifdef SCUMM_BIG_ENDIAN
-	// TODO: For lack of a READ_LE_UINT64
-	SWAP(buffer[0], buffer[7]);
-	SWAP(buffer[1], buffer[6]);
-	SWAP(buffer[2], buffer[5]);
-	SWAP(buffer[3], buffer[4]);
-#endif
-
-	double ret;
-	memcpy(&ret, buffer, sizeof(double));
+	double ret = _scriptStream->readDoubleLE();
 	_iP += 8; // Hardcode the double-size used originally.
 	return ret;
 }
diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp
index 166fa09efd1..b4463b1c814 100644
--- a/engines/wintermute/base/scriptables/script_engine.cpp
+++ b/engines/wintermute/base/scriptables/script_engine.cpp
@@ -220,7 +220,7 @@ byte *ScEngine::getCompiledScript(const char *filename, uint32 *outSize, bool ig
 	}
 
 	// needs to be compiled?
-	if (FROM_LE_32(*(uint32 *)buffer) == SCRIPT_MAGIC) {
+	if (READ_LE_UINT32(buffer) == SCRIPT_MAGIC) {
 		compBuffer = buffer;
 		compSize = size;
 	} else {
diff --git a/engines/wintermute/base/scriptables/script_ext_file.cpp b/engines/wintermute/base/scriptables/script_ext_file.cpp
index f934818a17c..5c4f7eb2cb5 100644
--- a/engines/wintermute/base/scriptables/script_ext_file.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_file.cpp
@@ -364,6 +364,7 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 			return STATUS_OK;
 		}
 		bool val;
+		STATIC_ASSERT(sizeof(val) == 1, bool_is_not_1_byte);
 		if (_readFile->read(&val, sizeof(bool)) == sizeof(bool)) {
 			stack->pushBool(val);
 		} else {
@@ -442,8 +443,7 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 			stack->pushNULL();
 			return STATUS_OK;
 		}
-		float val;
-		WRITE_UINT32(&val, _readFile->readUint32LE());
+		float val = _readFile->readFloatLE();
 		if (!_readFile->err()) {
 			stack->pushFloat(val);
 		} else {
@@ -464,8 +464,8 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 			stack->pushNULL();
 			return STATUS_OK;
 		}
-		double val;
-		if (_readFile->read(&val, sizeof(double)) == sizeof(double)) {
+		double val = _readFile->readDoubleLE();
+		if (!_readFile->err()) {
 			stack->pushFloat(val);
 		} else {
 			stack->pushNULL();




More information about the Scummvm-git-logs mailing list