[Scummvm-git-logs] scummvm master -> 8201244f4f56826153b986d80ffe19268d63262a
rvanlaar
noreply at scummvm.org
Fri Oct 7 11:18:01 UTC 2022
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2d58f23c39 DIRECTOR: use variables instead of repeated gets
c128f4056c DIRECTOR: make use of Datum constructor
c3e74c928d DIRECTOR: Fix dereference null return value
ae201e7adf JANITORIAL: DIRECTOR: Fix whitepace
8201244f4f DIRECTOR: Fix dereference null return value
Commit: 2d58f23c393af4e50b9c9ead9d5044ee307f17d7
https://github.com/scummvm/scummvm/commit/2d58f23c393af4e50b9c9ead9d5044ee307f17d7
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-10-07T13:17:41+02:00
Commit Message:
DIRECTOR: use variables instead of repeated gets
Refactor repeated getCurrentMovie en getScores calls to one per
function.
Changed paths:
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-the.cpp
engines/director/transitions.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 4a2f640e0da..0bf81d370a3 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1574,8 +1574,9 @@ void LB::b_printFrom(int nargs) {
}
void LB::b_quit(int nargs) {
- if (g_director->getCurrentMovie())
- g_director->getCurrentMovie()->getScore()->_playState = kPlayStopped;
+ Movie *movie = g_director->getCurrentMovie();
+ if (movie)
+ movie->getScore()->_playState = kPlayStopped;
g_lingo->pushVoid();
}
@@ -1814,12 +1815,15 @@ void LB::b_duplicate(int nargs) {
Datum to = g_lingo->pop();
Datum from = g_lingo->pop();
- Frame *currentFrame = g_director->getCurrentMovie()->getScore()->_frames[g_director->getCurrentMovie()->getScore()->getCurrentFrame()];
- CastMember *castMember = g_director->getCurrentMovie()->getCastMember(from.asMemberID());
- auto channels = g_director->getCurrentMovie()->getScore()->_channels;
+ Movie *movie = g_director->getCurrentMovie();
+ Score *score = movie->getScore();
+
+ Frame *currentFrame = score->_frames[score->getCurrentFrame()];
+ CastMember *castMember = movie->getCastMember(from.asMemberID());
+ auto channels = score->_channels;
castMember->setModified(true);
- g_director->getCurrentMovie()->createOrReplaceCastMember(to.asMemberID(), castMember);
+ movie->createOrReplaceCastMember(to.asMemberID(), castMember);
for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) {
if (currentFrame->_sprites[i]->_castId == to.asMemberID())
@@ -1868,11 +1872,12 @@ void LB::b_editableText(int nargs) {
void LB::b_erase(int nargs) {
Datum d = g_lingo->pop();
- CastMember *eraseCast = g_director->getCurrentMovie()->getCastMember(d.asMemberID());
+ Movie *movie = g_director->getCurrentMovie();
+ CastMember *eraseCast = movie->getCastMember(d.asMemberID());
if (eraseCast) {
eraseCast->_erase = true;
- Common::Array<Channel *> channels = g_director->getCurrentMovie()->getScore()->_channels;
+ Common::Array<Channel *> channels = movie->getScore()->_channels;
for (uint i = 0; i < channels.size(); i++) {
if (channels[i]->_sprite->_castId == d.asMemberID()) {
@@ -1953,7 +1958,7 @@ void LB::b_importFileInto(int nargs) {
bitmapCast->setModified(true);
const Graphics::Surface *surf = img->getSurface();
bitmapCast->_size = surf->pitch * surf->h + img->getPaletteColorCount() * 3;
- auto channels = g_director->getCurrentMovie()->getScore()->_channels;
+ auto channels = movie->getScore()->_channels;
for (uint i = 0; i < channels.size(); i++) {
if (channels[i]->_sprite->_castId == dst.asMemberID()) {
@@ -1976,8 +1981,8 @@ void LB::b_installMenu(int nargs) {
g_director->_wm->removeMenu();
return;
}
-
- CastMember *member = g_director->getCurrentMovie()->getCastMember(memberID);
+ Movie *movie = g_director->getCurrentMovie();
+ CastMember *member = movie->getCastMember(memberID);
if (!member) {
g_lingo->lingoError("installMenu: Unknown %s", memberID.asString().c_str());
return;
@@ -2001,7 +2006,7 @@ void LB::b_installMenu(int nargs) {
debugC(3, kDebugLingoExec, "installMenu: '%s'", Common::toPrintable(menuStxt).encode().c_str());
- LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
+ LingoArchive *mainArchive = movie->getMainLingoArch();
// Since loading the STXT converts the text to Unicode based on the platform
// encoding, we need to fetch the correct Unicode character for the platform.
@@ -2164,7 +2169,9 @@ void LB::b_move(int nargs) {
return;
}
- if (!g_director->getCurrentMovie()->getCastMember(*src.u.cast)) {
+ Movie *movie = g_director->getCurrentMovie();
+
+ if (!movie->getCastMember(*src.u.cast)) {
warning("b_move: Source CastMember doesn't exist");
return;
}
@@ -2175,21 +2182,20 @@ void LB::b_move(int nargs) {
g_lingo->push(dest);
b_erase(1);
-
- Movie *movie = g_director->getCurrentMovie();
- uint16 frame = movie->getScore()->getCurrentFrame();
- Frame *currentFrame = movie->getScore()->_frames[frame];
- auto channels = g_director->getCurrentMovie()->getScore()->_channels;
+ Score *score = movie->getScore();
+ uint16 frame = score->getCurrentFrame();
+ Frame *currentFrame = score->_frames[frame];
+ auto channels = score->_channels;
- movie->getScore()->renderFrame(frame, kRenderForceUpdate);
+ score->renderFrame(frame, kRenderForceUpdate);
- g_director->getCurrentMovie()->eraseCastMember(dest.asMemberID());
+ movie->eraseCastMember(dest.asMemberID());
- CastMember *toMove = g_director->getCurrentMovie()->getCastMember(src.asMemberID());
+ CastMember *toMove = movie->getCastMember(src.asMemberID());
CastMember *toReplace = new CastMember(toMove->getCast(), src.asMemberID().member);
- g_director->getCurrentMovie()->createOrReplaceCastMember(dest.asMemberID(), toMove);
- g_director->getCurrentMovie()->createOrReplaceCastMember(src.asMemberID(), toReplace);
+ movie->createOrReplaceCastMember(dest.asMemberID(), toMove);
+ movie->createOrReplaceCastMember(src.asMemberID(), toReplace);
for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) {
if (currentFrame->_sprites[i]->_castId == dest.asMemberID())
@@ -2203,12 +2209,13 @@ void LB::b_move(int nargs) {
}
}
- movie->getScore()->renderFrame(frame, kRenderForceUpdate);
+ score->renderFrame(frame, kRenderForceUpdate);
}
void LB::b_moveableSprite(int nargs) {
- Score *sc = g_director->getCurrentMovie()->getScore();
- Frame *frame = sc->_frames[g_director->getCurrentMovie()->getScore()->getCurrentFrame()];
+ Movie *movie = g_director->getCurrentMovie();
+ Score *score = movie->getScore();
+ Frame *frame = score->_frames[score->getCurrentFrame()];
if (g_lingo->_currentChannelId == -1) {
warning("b_moveableSprite: channel Id is missing");
@@ -2217,8 +2224,8 @@ void LB::b_moveableSprite(int nargs) {
}
// since we are using value copying, in order to make it taking effect immediately. we modify the sprites in channel
- if (sc->_channels[g_lingo->_currentChannelId])
- sc->_channels[g_lingo->_currentChannelId]->_sprite->_moveable = true;
+ if (score->_channels[g_lingo->_currentChannelId])
+ score->_channels[g_lingo->_currentChannelId]->_sprite->_moveable = true;
frame->_sprites[g_lingo->_currentChannelId]->_moveable = true;
}
@@ -2230,10 +2237,11 @@ void LB::b_pasteClipBoardInto(int nargs) {
}
Movie *movie = g_director->getCurrentMovie();
- uint16 frame = movie->getScore()->getCurrentFrame();
- Frame *currentFrame = movie->getScore()->_frames[frame];
+ Score *score = movie->getScore();
+ uint16 frame = score->getCurrentFrame();
+ Frame *currentFrame = score->_frames[frame];
CastMember *castMember = movie->getCastMember(*g_director->_clipBoard);
- auto channels = movie->getScore()->_channels;
+ auto channels = score->_channels;
castMember->setModified(true);
movie->createOrReplaceCastMember(*to.u.cast, castMember);
@@ -2255,6 +2263,7 @@ void LB::b_puppetPalette(int nargs) {
g_lingo->convertVOIDtoString(0, nargs);
int numFrames = 0, speed = 0, palette = 0;
Datum d;
+ Movie *movie = g_director->getCurrentMovie();
switch (nargs) {
case 3:
@@ -2284,7 +2293,7 @@ void LB::b_puppetPalette(int nargs) {
}
}
if (!palette) {
- CastMember *member = g_director->getCurrentMovie()->getCastMember(d.asMemberID());
+ CastMember *member = movie->getCastMember(d.asMemberID());
if (member && member->_type == kCastPalette)
palette = ((PaletteCastMember *)member)->getPaletteId();
@@ -2295,20 +2304,21 @@ void LB::b_puppetPalette(int nargs) {
return;
}
+ Score *score = movie->getScore();
if (palette) {
g_director->setPalette(palette);
- g_director->getCurrentMovie()->getScore()->_puppetPalette = true;
+ score->_puppetPalette = true;
} else {
// Setting puppetPalette to 0 disables it (Lingo Dictionary, 226)
- Score *sc = g_director->getCurrentMovie()->getScore();
- g_director->getCurrentMovie()->getScore()->_puppetPalette = false;
+
+ score->_puppetPalette = false;
// FIXME: set system palette decided by platform, should be fixed after windows palette is working.
// try to set mac system palette if lastPalette is 0.
- if (sc->_lastPalette == 0)
+ if (score->_lastPalette == 0)
g_director->setPalette(-1);
else
- g_director->setPalette(sc->resolvePaletteId(sc->_lastPalette));
+ g_director->setPalette(score->resolvePaletteId(score->_lastPalette));
}
// TODO: Implement advanced features that use these.
@@ -2876,6 +2886,7 @@ void LB::b_sound(int nargs) {
}
DirectorSound *soundManager = g_director->getCurrentWindow()->getSoundManager();
+ Score *score = g_director->getCurrentMovie()->getScore();
if (verb.u.s->equalsIgnoreCase("close") || verb.u.s->equalsIgnoreCase("stop")) {
if (nargs != 2) {
@@ -2890,24 +2901,24 @@ void LB::b_sound(int nargs) {
TYPECHECK(secondArg, INT);
ticks = secondArg.u.i;
} else {
- ticks = 15 * (60 / g_director->getCurrentMovie()->getScore()->_currentFrameRate);
+ ticks = 15 * (60 / score->_currentFrameRate);
}
TYPECHECK(firstArg, INT);
soundManager->registerFade(firstArg.u.i, true, ticks);
- g_director->getCurrentMovie()->getScore()->_activeFade = firstArg.u.i;
+ score->_activeFade = firstArg.u.i;
return;
} else if (verb.u.s->equalsIgnoreCase("fadeOut")) {
if (nargs > 2) {
TYPECHECK(secondArg, INT);
ticks = secondArg.u.i;
} else {
- ticks = 15 * (60 / g_director->getCurrentMovie()->getScore()->_currentFrameRate);
+ ticks = 15 * (60 / score->_currentFrameRate);
}
TYPECHECK(firstArg, INT);
soundManager->registerFade(firstArg.u.i, false, ticks);
- g_director->getCurrentMovie()->getScore()->_activeFade = firstArg.u.i;
+ score->_activeFade = firstArg.u.i;
return;
} else if (verb.u.s->equalsIgnoreCase("playFile")) {
ARGNUMCHECK(3)
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 937a2023202..336774b0a49 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -380,7 +380,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
d = g_lingo->_actorList;
break;
case kTheBeepOn:
- d = (int)g_director->getCurrentMovie()->_isBeepOn;
+ d = (int)movie->_isBeepOn;
break;
case kTheButtonStyle:
d = (int)(g_director->_wm->_mode & Graphics::kWMModeButtonDialogStyle);
@@ -395,10 +395,10 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
d = g_director->_centerStage;
break;
case kTheCheckBoxAccess:
- d = g_director->getCurrentMovie()->_checkBoxAccess;
+ d = movie->_checkBoxAccess;
break;
case kTheCheckBoxType:
- d = g_director->getCurrentMovie()->_checkBoxType;
+ d = movie->_checkBoxType;
break;
case kTheChunk:
d = getTheChunk(id, field);
@@ -845,19 +845,19 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
d = getTheTime(field);
break;
case kTheTimeoutKeyDown:
- d= g_director->getCurrentMovie()->_timeOutKeyDown;
+ d= movie->_timeOutKeyDown;
break;
case kTheTimeoutLapsed:
- d = (int)(_vm->getMacTicks() - g_director->getCurrentMovie()->_lastTimeOut);
+ d = (int)(_vm->getMacTicks() - movie->_lastTimeOut);
break;
case kTheTimeoutLength:
- d = (int)g_director->getCurrentMovie()->_timeOutLength;
+ d = (int)movie->_timeOutLength;
break;
case kTheTimeoutMouse:
- d = g_director->getCurrentMovie()->_timeOutMouse;
+ d = movie->_timeOutMouse;
break;
case kTheTimeoutPlay:
- d = g_director->getCurrentMovie()->_timeOutPlay;
+ d = movie->_timeOutPlay;
break;
case kTheTimeoutScript:
d.type = STRING;
@@ -917,7 +917,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
g_lingo->_actorList = d;
break;
case kTheBeepOn:
- g_director->getCurrentMovie()->_isBeepOn = (bool)d.u.i;
+ movie->_isBeepOn = (bool)d.u.i;
break;
case kTheButtonStyle:
if (d.asInt())
@@ -932,10 +932,10 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
g_director->_centerStage = d.asInt();
break;
case kTheCheckBoxAccess:
- g_director->getCurrentMovie()->_checkBoxAccess = d.asInt();
+ movie->_checkBoxAccess = d.asInt();
break;
case kTheCheckBoxType:
- g_director->getCurrentMovie()->_checkBoxType = d.asInt();
+ movie->_checkBoxType = d.asInt();
break;
case kTheChunk:
setTheChunk(id, field, d);
@@ -952,7 +952,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
case kTheFixStageSize:
g_director->_fixStageSize = (bool)d.u.i;
if (d.u.i) {
- g_director->_fixStageRect = g_director->getCurrentMovie()->_movieRect;
+ g_director->_fixStageRect = movie->_movieRect;
}
break;
case kTheField:
@@ -1033,7 +1033,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
break;
case kTheScript:
{
- LingoArchive *mainArchive = g_director->getCurrentMovie()->getMainLingoArch();
+ LingoArchive *mainArchive = movie->getMainLingoArch();
int commandId = 100;
while (mainArchive->getScriptContext(kEventScript, commandId))
commandId++;
@@ -1078,7 +1078,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
warning("BUILDBOT: Trying to set SearchCurrentFolder lingo property");
break;
case kTheSelEnd:
- g_director->getCurrentMovie()->_selEnd = d.asInt();
+ movie->_selEnd = d.asInt();
if (movie->_currentEditableTextChannel != 0) {
Channel *channel = score->getChannelById(movie->_currentEditableTextChannel);
@@ -1087,7 +1087,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
}
break;
case kTheSelStart:
- g_director->getCurrentMovie()->_selStart = d.asInt();
+ movie->_selStart = d.asInt();
if (movie->_currentEditableTextChannel != 0) {
Channel *channel = score->getChannelById(movie->_currentEditableTextChannel);
@@ -1136,7 +1136,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
setTheEntitySTUB(kTheSwitchColorDepth);
break;
case kTheTimeoutKeyDown:
- g_director->getCurrentMovie()->_timeOutKeyDown = d.asInt();
+ movie->_timeOutKeyDown = d.asInt();
break;
case kTheTimeoutLapsed:
// timeOutLapsed can be set in D4, but can't in D3. see D3.1 interactivity manual p312 and D4 dictionary p296.
@@ -1148,13 +1148,13 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
}
break;
case kTheTimeoutLength:
- g_director->getCurrentMovie()->_timeOutLength = d.asInt();
+ movie->_timeOutLength = d.asInt();
break;
case kTheTimeoutMouse:
- g_director->getCurrentMovie()->_timeOutMouse = d.asInt();
+ movie->_timeOutMouse = d.asInt();
break;
case kTheTimeoutPlay:
- g_director->getCurrentMovie()->_timeOutPlay = d.asInt();
+ movie->_timeOutPlay = d.asInt();
break;
case kTheTimeoutScript:
movie->setPrimaryEventHandler(kEventTimeout, d.asString());
@@ -1385,7 +1385,8 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
int id = id1.asInt();
- Score *score = _vm->getCurrentMovie()->getScore();
+ Movie *movie = _vm->getCurrentMovie();
+ Score *score = movie->getScore();
if (!score) {
warning("Lingo::setTheSprite(): The sprite %d field \"%s\" setting over non-active score", id, field2str(field));
@@ -1422,7 +1423,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
case kTheCastNum:
{
CastMemberID castId = d.asMemberID();
- CastMember *castMember = g_director->getCurrentMovie()->getCastMember(castId);
+ CastMember *castMember = movie->getCastMember(castId);
if (castMember && castMember->_type == kCastDigitalVideo) {
Common::String path = castMember->getCast()->getVideoPath(castId.member);
@@ -1432,13 +1433,13 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
// b_updateStage needs to have _videoPlayback set to render video
// in the regular case Score::renderSprites sets it.
// However Score::renderSprites is not in the current code path.
- g_director->getCurrentMovie()->_videoPlayback = true;
+ movie->_videoPlayback = true;
}
}
if (castId != sprite->_castId) {
if (!sprite->_trails) {
- g_director->getCurrentMovie()->getWindow()->addDirtyRect(channel->getBbox());
+ movie->getWindow()->addDirtyRect(channel->getBbox());
channel->_dirty = true;
}
channel->setCast(castId);
@@ -1512,7 +1513,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
break;
case kTheLoc:
if (channel->_currentPoint.x != d.asPoint().x || channel->_currentPoint.y != d.asPoint().y) {
- g_director->getCurrentMovie()->getWindow()->addDirtyRect(channel->getBbox());
+ movie->getWindow()->addDirtyRect(channel->getBbox());
channel->_dirty = true;
}
@@ -1524,7 +1525,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
// adding the dirtyRect only when the trails is false. Other changes which will add dirtyRect may also apply this patch
// this is for fixing the bug in jman-win. Currently, i've only patched the LocH, LocV and castNum since those are the only ones used in jman
if (!channel->_sprite->_trails) {
- g_director->getCurrentMovie()->getWindow()->addDirtyRect(channel->getBbox());
+ movie->getWindow()->addDirtyRect(channel->getBbox());
channel->_dirty = true;
}
channel->_currentPoint.x = d.asInt();
@@ -1533,7 +1534,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
case kTheLocV:
if (d.asInt() != channel->_currentPoint.y) {
if (!channel->_sprite->_trails) {
- g_director->getCurrentMovie()->getWindow()->addDirtyRect(channel->getBbox());
+ movie->getWindow()->addDirtyRect(channel->getBbox());
channel->_dirty = true;
}
channel->_currentPoint.y = d.asInt();
@@ -1634,8 +1635,8 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
warning("Lingo::setTheSprite(): Unprocessed setting field \"%s\" of sprite", field2str(field));
}
- if (channel->_dirty && g_director->getCurrentMovie())
- g_director->getCurrentMovie()->getWindow()->addDirtyRect(channel->getBbox());
+ if (channel->_dirty && movie)
+ movie->getWindow()->addDirtyRect(channel->getBbox());
}
Datum Lingo::getTheCast(Datum &id1, int field) {
diff --git a/engines/director/transitions.cpp b/engines/director/transitions.cpp
index 04732801343..3d5d6bf5668 100644
--- a/engines/director/transitions.cpp
+++ b/engines/director/transitions.cpp
@@ -190,9 +190,10 @@ void Window::playTransition(uint frame, uint16 transDuration, uint8 transArea, u
Graphics::ManagedSurface nextFrame(Graphics::ManagedSurface(_composeSurface->w, _composeSurface->h, g_director->_pixelformat));
Common::Rect clipRect;
+ Score *score = g_director->getCurrentMovie()->getScore();
if (t.area) {
// Changed area transition
- g_director->getCurrentMovie()->getScore()->renderSprites(t.frame);
+ score->renderSprites(t.frame);
if (_dirtyRects.size() == 0)
return;
@@ -218,7 +219,7 @@ void Window::playTransition(uint frame, uint16 transDuration, uint8 transArea, u
render(false, &nextFrame);
} else {
// Full stage transition
- g_director->getCurrentMovie()->getScore()->renderSprites(t.frame, kRenderForceUpdate);
+ score->renderSprites(t.frame, kRenderForceUpdate);
render(true, &nextFrame);
clipRect = _innerDims;
Commit: c128f4056c1ac5599895dc940f6377417be411ec
https://github.com/scummvm/scummvm/commit/c128f4056c1ac5599895dc940f6377417be411ec
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-10-07T13:17:41+02:00
Commit Message:
DIRECTOR: make use of Datum constructor
Replace handcrafted creation of CASTREF with the datum constructor
which handles the creation itself.
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 0bf81d370a3..870bdcc654b 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2142,10 +2142,9 @@ void LB::b_move(int nargs) {
Datum src, dest;
if (nargs == 1) {
- Datum d;
- d.type = CASTREF;
- d.u.cast = new CastMemberID();
- d.u.cast->member = (int) g_director->getCurrentMovie()->getCast()->_castArrayStart;
+ int id = (int) g_director->getCurrentMovie()->getCast()->_castArrayStart;
+ CastMemberID *castId = new CastMemberID(id, 0);
+ Datum d = Datum(*castId);
g_lingo->push(d);
b_findEmpty(1);
dest = g_lingo->pop();
Commit: c3e74c928d74aee8e85e0a64bdab3a56965a2efc
https://github.com/scummvm/scummvm/commit/c3e74c928d74aee8e85e0a64bdab3a56965a2efc
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-10-07T13:17:41+02:00
Commit Message:
DIRECTOR: Fix dereference null return value
Check if castMember is not a nullptr before querying it.
Fixes COVERITY: 1490158
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 870bdcc654b..81489959188 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2236,10 +2236,16 @@ void LB::b_pasteClipBoardInto(int nargs) {
}
Movie *movie = g_director->getCurrentMovie();
+
+ CastMember *castMember = movie->getCastMember(*g_director->_clipBoard);
+ if (!castMember) {
+ warning("LB:B_pasteClipBoardInto(): castMember not found");
+ return;
+ }
+
Score *score = movie->getScore();
uint16 frame = score->getCurrentFrame();
Frame *currentFrame = score->_frames[frame];
- CastMember *castMember = movie->getCastMember(*g_director->_clipBoard);
auto channels = score->_channels;
castMember->setModified(true);
Commit: ae201e7adf047c169a96ef50348020e5273a0013
https://github.com/scummvm/scummvm/commit/ae201e7adf047c169a96ef50348020e5273a0013
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-10-07T13:17:41+02:00
Commit Message:
JANITORIAL: DIRECTOR: Fix whitepace
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 81489959188..60276658c51 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2190,7 +2190,7 @@ void LB::b_move(int nargs) {
score->renderFrame(frame, kRenderForceUpdate);
movie->eraseCastMember(dest.asMemberID());
-
+
CastMember *toMove = movie->getCastMember(src.asMemberID());
CastMember *toReplace = new CastMember(toMove->getCast(), src.asMemberID().member);
movie->createOrReplaceCastMember(dest.asMemberID(), toMove);
Commit: 8201244f4f56826153b986d80ffe19268d63262a
https://github.com/scummvm/scummvm/commit/8201244f4f56826153b986d80ffe19268d63262a
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-10-07T13:17:41+02:00
Commit Message:
DIRECTOR: Fix dereference null return value
Refactor LB:b_movie to check once if castMember is not a nullptr
Fixes COVERITY: 1490723
Changed paths:
engines/director/lingo/lingo-builtins.cpp
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 60276658c51..2f7678b85b1 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2168,17 +2168,18 @@ void LB::b_move(int nargs) {
return;
}
+ if (src.u.cast->castLib != 0) {
+ warning("b_move: wrong castLib '%d' in src CastMemberID", src.u.cast->castLib);
+ }
+
Movie *movie = g_director->getCurrentMovie();
+ CastMember *toMove = movie->getCastMember(src.asMemberID());
- if (!movie->getCastMember(*src.u.cast)) {
+ if (!toMove) {
warning("b_move: Source CastMember doesn't exist");
return;
}
- if (src.u.cast->castLib != 0) {
- warning("b_move: wrong castLib '%d' in src CastMemberID", src.u.cast->castLib);
- }
-
g_lingo->push(dest);
b_erase(1);
Score *score = movie->getScore();
@@ -2186,12 +2187,10 @@ void LB::b_move(int nargs) {
Frame *currentFrame = score->_frames[frame];
auto channels = score->_channels;
-
score->renderFrame(frame, kRenderForceUpdate);
movie->eraseCastMember(dest.asMemberID());
- CastMember *toMove = movie->getCastMember(src.asMemberID());
CastMember *toReplace = new CastMember(toMove->getCast(), src.asMemberID().member);
movie->createOrReplaceCastMember(dest.asMemberID(), toMove);
movie->createOrReplaceCastMember(src.asMemberID(), toReplace);
More information about the Scummvm-git-logs
mailing list