[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 **)¶ms) != TOKEN_ACTOR3DX) {
+ if (parser.getCommand(&buffer, commands, ¶ms) != 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms) != TOKEN_GEOMETRY) {
+ if (parser.getCommand(&buffer, commands, ¶ms) != TOKEN_GEOMETRY) {
_gameRef->LOG(0, "'GEOMETRY' keyword expected.");
return false;
}
buffer = params;
- while ((cmd = parser.getCommand((char **)&buffer, commands, (char **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms) != TOKEN_NODE) {
+ if (parser.getCommand(&buffer, commands, ¶ms) != 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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 **)¶ms)) > 0) {
+ while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 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