diff options
-rw-r--r-- | scumm/debugger.cpp | 2 | ||||
-rw-r--r-- | scumm/object.cpp | 22 | ||||
-rw-r--r-- | scumm/script_v2.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v5.cpp | 6 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 4 | ||||
-rw-r--r-- | scumm/scumm.h | 2 |
6 files changed, 18 insertions, 24 deletions
diff --git a/scumm/debugger.cpp b/scumm/debugger.cpp index 03e9414d6f..d25ddb98e9 100644 --- a/scumm/debugger.cpp +++ b/scumm/debugger.cpp @@ -486,7 +486,7 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) { _vm->putOwner(obj, _vm->VAR(_vm->VAR_EGO)); _vm->putClass(obj, kObjectClassUntouchable, 1); _vm->putState(obj, 1); - _vm->forceObjectRedraw(obj); + _vm->markObjectRectAsDirty(obj); _vm->clearDrawObjectQueue(); _vm->runInventoryScript(obj); } else if (!strcmp(argv[2], "state")) { diff --git a/scumm/object.cpp b/scumm/object.cpp index c64e3177f5..d7ea606902 100644 --- a/scumm/object.cpp +++ b/scumm/object.cpp @@ -851,25 +851,19 @@ void ScummEngine::clearOwnerOf(int obj) { } /** - * Force a screen redraw at the location of the specifed object. This is - * typically called when an object was just removed from the room, or when its - * state changed. + * Mark the rectangle covered by the given object as dirty, thus eventually + * ensuring a redraw of that area. This function is typically invoked when an + * object gets removed from the current room, or when its state changed. */ -void ScummEngine::forceObjectRedraw(int obj) { - int i, j, strip; +void ScummEngine::markObjectRectAsDirty(int obj) { + int i, strip; for (i = 1; i < _numLocalObjects; i++) { if (_objs[i].obj_nr == (uint16)obj) { if (_objs[i].width != 0) { - for (j = 0; j < _objs[i].width / 8; j++) { - strip = (_objs[i].x_pos / 8) + j; - - // Clip value - if (strip < _screenStartStrip) - continue; - if (strip > _screenEndStrip) - break; - + const int minStrip = MAX(_screenStartStrip, _objs[i].x_pos / 8); + const int maxStrip = MIN(_screenEndStrip+1, _objs[i].x_pos / 8 + _objs[i].width / 8); + for (strip = minStrip; strip < maxStrip; strip++) { setGfxUsageBit(strip, USAGE_BIT_DIRTY); } } diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp index 979ddac2a6..5768f27189 100644 --- a/scumm/script_v2.cpp +++ b/scumm/script_v2.cpp @@ -468,14 +468,14 @@ void ScummEngine_v2::clearStateCommon(byte type) { void ScummEngine_v2::o2_setState08() { int obj = getVarOrDirectWord(PARAM_1); putState(obj, getState(obj) | 0x08); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); clearDrawObjectQueue(); } void ScummEngine_v2::o2_clearState08() { int obj = getVarOrDirectWord(PARAM_1); putState(obj, getState(obj) & ~0x08); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); clearDrawObjectQueue(); } @@ -1449,7 +1449,7 @@ void ScummEngine_v2::o2_pickupObject() { return; /* object twice */ addObjectToInventory(obj, _roomResource); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); putOwner(obj, VAR(VAR_EGO)); putState(obj, getState(obj) | 0xA); clearDrawObjectQueue(); diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index 93d6251dac..777723cde3 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -1592,7 +1592,7 @@ void ScummEngine_v5::o5_pickupObject() { putOwner(obj, VAR(VAR_EGO)); putClass(obj, kObjectClassUntouchable, 1); putState(obj, 1); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); clearDrawObjectQueue(); runInventoryScript(1); } @@ -2174,7 +2174,7 @@ void ScummEngine_v5::o5_setState() { obj = getVarOrDirectWord(PARAM_1); state = getVarOrDirectByte(PARAM_2); putState(obj, state); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); if (_BgNeedsRedraw) clearDrawObjectQueue(); } @@ -2911,7 +2911,7 @@ void ScummEngine_v5::o5_pickupObjectOld() { // warning("adding %d from %d to inventoryOld", obj, _currentRoom); addObjectToInventory(obj, _roomResource); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); putOwner(obj, VAR(VAR_EGO)); putClass(obj, kObjectClassUntouchable, 1); putState(obj, 1); diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index ad23cb83f1..3a7b28e4e2 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -916,7 +916,7 @@ void ScummEngine_v6::o6_setState() { } putState(obj, state); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); if (_BgNeedsRedraw) clearDrawObjectQueue(); } @@ -1151,7 +1151,7 @@ void ScummEngine_v6::o6_pickupObject() { putOwner(obj, VAR(VAR_EGO)); putClass(obj, kObjectClassUntouchable, 1); putState(obj, 1); - forceObjectRedraw(obj); + markObjectRectAsDirty(obj); clearDrawObjectQueue(); runInventoryScript(obj); /* Difference */ } diff --git a/scumm/scumm.h b/scumm/scumm.h index 6d0be49de6..4757661f73 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -672,7 +672,7 @@ protected: byte _numObjectsInRoom; void setupRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL); - void forceObjectRedraw(int obj); + void markObjectRectAsDirty(int obj); void loadFlObject(uint object, uint room); void nukeFlObjects(int min, int max); int findFlObjectSlot(); |