diff options
Diffstat (limited to 'engines/sci/engine/gc.cpp')
-rw-r--r-- | engines/sci/engine/gc.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/engines/sci/engine/gc.cpp b/engines/sci/engine/gc.cpp index 70c8c52bf0..50f7709baf 100644 --- a/engines/sci/engine/gc.cpp +++ b/engines/sci/engine/gc.cpp @@ -24,6 +24,10 @@ #include "common/array.h" #include "sci/graphics/ports.h" +#ifdef ENABLE_SCI32 +#include "sci/graphics/controls32.h" +#endif + namespace Sci { //#define GC_DEBUG_CODE @@ -42,7 +46,7 @@ const char *segmentTypeNames[] = { "dynmem", // 9 "obsolete", // 10: obsolete string fragments "array", // 11: SCI32 arrays - "string" // 12: SCI32 strings + "obsolete" // 12: obsolete SCI32 strings }; #endif @@ -139,14 +143,29 @@ AddrSet *findAllActiveReferences(EngineState *s) { const Common::Array<SegmentObj *> &heap = s->_segMan->getSegments(); uint heapSize = heap.size(); - // Init: Explicitly loaded scripts for (uint i = 1; i < heapSize; i++) { - if (heap[i] && heap[i]->getType() == SEG_TYPE_SCRIPT) { - Script *script = (Script *)heap[i]; + if (heap[i]) { + // Init: Explicitly loaded scripts + if (heap[i]->getType() == SEG_TYPE_SCRIPT) { + Script *script = (Script *)heap[i]; + + if (script->getLockers()) { // Explicitly loaded? + wm.pushArray(script->listObjectReferences()); + } + } + +#ifdef ENABLE_SCI32 + // Init: Explicitly opted-out bitmaps + else if (heap[i]->getType() == SEG_TYPE_BITMAP) { + BitmapTable *bt = static_cast<BitmapTable *>(heap[i]); - if (script->getLockers()) { // Explicitly loaded? - wm.pushArray(script->listObjectReferences()); + for (uint j = 0; j < bt->_table.size(); j++) { + if (bt->_table[j].data && bt->_table[j].data->getShouldGC() == false) { + wm.push(make_reg(i, j)); + } + } } +#endif } } |