diff options
author | md5 | 2011-02-28 14:22:16 +0200 |
---|---|---|
committer | md5 | 2011-02-28 15:56:03 +0200 |
commit | 0d555c497d7208d0fa686f1b2369a52841873990 (patch) | |
tree | 41e30bc5bbe13f79e26b4f60e6192b3b3bc79d5b /engines/sci/graphics | |
parent | 9a60c58a8d1c91eb5731eaae0093b0ee4b68958f (diff) | |
download | scummvm-rg350-0d555c497d7208d0fa686f1b2369a52841873990.tar.gz scummvm-rg350-0d555c497d7208d0fa686f1b2369a52841873990.tar.bz2 scummvm-rg350-0d555c497d7208d0fa686f1b2369a52841873990.zip |
SCI: Moved hunk pointer handling to the GC, and removed some related workarounds
SCI scripts can contain stale pointers, which are used later on. We now delete
the contents of hunk entries without invalidating the relevant pointers and let
the GC clear the references. Many thanks to waltervn and wjp for all their work
and help on this.
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r-- | engines/sci/graphics/paint16.cpp | 17 | ||||
-rw-r--r-- | engines/sci/graphics/ports.h | 15 |
2 files changed, 10 insertions, 22 deletions
diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 935dd4e62e..53c43d94c3 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -360,7 +360,7 @@ void GfxPaint16::bitsRestore(reg_t memoryHandle) { if (memoryPtr) { _screen->bitsRestore(memoryPtr); - _segMan->freeHunkEntry(memoryHandle); + bitsFree(memoryHandle); } } } @@ -532,20 +532,7 @@ reg_t GfxPaint16::kernelDisplay(const char *text, int argc, reg_t *argv) { case SCI_DISPLAY_RESTOREUNDER: bitsGetRect(argv[0], &rect); rect.translate(-_ports->getPort()->left, -_ports->getPort()->top); - if (g_sci->getGameId() == GID_PQ3 && g_sci->getEngineState()->currentRoomNumber() == 29) { - // WORKAROUND: PQ3 calls this without calling the associated - // kDisplay(SCI_DISPLAY_SAVEUNDER) call before. Theoretically, - // this would result in no rect getting restored. However, we - // still maintain a pointer from the previous room, resulting - // in invalidated content being restored on screen, and causing - // graphics glitches. Thus, we simply don't restore a rect in - // that room. The correct fix for this would be to erase hunk - // pointers when changing rooms, but this will suffice for now, - // as restoring from a totally invalid pointer is very rare. - // Fixes bug #3037945. - } else { - bitsRestore(argv[0]); - } + bitsRestore(argv[0]); kernelGraphRedrawBox(rect); // finishing loop argc = 0; diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h index 21c6d31ebd..b94d54ab10 100644 --- a/engines/sci/graphics/ports.h +++ b/engines/sci/graphics/ports.h @@ -49,6 +49,9 @@ enum { SCI_WINDOWMGR_STYLE_USER = (1 << 7) }; +typedef Common::List<Port *> PortList; +typedef Common::Array<Port *> PortArray; + /** * Ports class, includes all port managment for SCI0->SCI1.1 games. Ports are some sort of windows in SCI * this class also handles adjusting coordinates to a specific port @@ -115,8 +118,12 @@ public: virtual void saveLoadWithSerializer(Common::Serializer &ser); + /** The list of open 'windows' (and ports), in visual order. */ + PortList _windowList; + private: - typedef Common::List<Port *> PortList; + /** The list of all open 'windows' (and ports), ordered by their id. */ + PortArray _windowsById; SegManager *_segMan; GfxPaint16 *_paint16; @@ -130,12 +137,6 @@ private: // counts windows that got disposed but are not freed yet uint16 _freeCounter; - /** The list of open 'windows' (and ports), in visual order. */ - PortList _windowList; - - /** The list of all open 'windows' (and ports), ordered by their id. */ - Common::Array<Port *> _windowsById; - Common::Rect _bounds; // Priority Bands related variables |