From 371097d27cca28c1d7163f288fe8b229841d9b8d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 30 Oct 2009 17:13:25 +0000 Subject: Added caching for mouse cursor views svn-id: r45541 --- engines/sci/gui/gui_cursor.cpp | 20 +++++++++++++++++--- engines/sci/gui/gui_cursor.h | 11 +++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) (limited to 'engines/sci') diff --git a/engines/sci/gui/gui_cursor.cpp b/engines/sci/gui/gui_cursor.cpp index 702c9447e6..db1ae1ca6d 100644 --- a/engines/sci/gui/gui_cursor.cpp +++ b/engines/sci/gui/gui_cursor.cpp @@ -44,6 +44,7 @@ SciGuiCursor::SciGuiCursor(ResourceManager *resMan, SciGuiPalette *palette, SciG } SciGuiCursor::~SciGuiCursor() { + purgeCache(); } void SciGuiCursor::show() { @@ -54,6 +55,15 @@ void SciGuiCursor::hide() { CursorMan.showMouse(false); } +void SciGuiCursor::purgeCache() { + for (CursorCache::iterator iter = _cachedCursors.begin(); iter != _cachedCursors.end(); ++iter) { + delete iter->_value; + iter->_value = 0; + } + + _cachedCursors.clear(); +} + void SciGuiCursor::setShape(GuiResourceId resourceId) { Resource *resource; byte *resourceData; @@ -114,7 +124,13 @@ void SciGuiCursor::setShape(GuiResourceId resourceId) { } void SciGuiCursor::setView(GuiResourceId viewNum, int loopNum, int celNum, Common::Point *hotspot) { - SciGuiView *cursorView = new SciGuiView(_resMan, _screen, _palette, viewNum); + if (_cachedCursors.size() >= MAX_CACHED_CURSORS) + purgeCache(); + + if (!_cachedCursors.contains(viewNum)) + _cachedCursors[viewNum] = new SciGuiView(_resMan, _screen, _palette, viewNum); + + SciGuiView *cursorView = _cachedCursors[viewNum]; sciViewCelInfo *celInfo = cursorView->getCelInfo(loopNum, celNum); int16 width = celInfo->width; @@ -129,7 +145,6 @@ void SciGuiCursor::setView(GuiResourceId viewNum, int loopNum, int celNum, Commo if (width < 2 || height < 2) { hide(); delete cursorHotspot; - delete cursorView; return; } @@ -139,7 +154,6 @@ void SciGuiCursor::setView(GuiResourceId viewNum, int loopNum, int celNum, Commo show(); delete cursorHotspot; - delete cursorView; } void SciGuiCursor::setPosition(Common::Point pos) { diff --git a/engines/sci/gui/gui_cursor.h b/engines/sci/gui/gui_cursor.h index 93527643f5..a594f8a6c7 100644 --- a/engines/sci/gui/gui_cursor.h +++ b/engines/sci/gui/gui_cursor.h @@ -26,6 +26,8 @@ #ifndef SCI_GUI_CURSOR_H #define SCI_GUI_CURSOR_H +#include "common/hashmap.h" + namespace Sci { #define SCI_CURSOR_SCI0_HEIGHTWIDTH 16 @@ -33,8 +35,13 @@ namespace Sci { #define SCI_CURSOR_SCI0_TRANSPARENCYCOLOR 1 +#define MAX_CACHED_CURSORS 10 + class SciGuiView; class SciGuiPalette; + +typedef Common::HashMap CursorCache; + class SciGuiCursor { public: SciGuiCursor(ResourceManager *resMan, SciGuiPalette *palette, SciGuiScreen *screen); @@ -56,11 +63,15 @@ public: void setMoveZone(Common::Rect zone) { _moveZone = zone; } private: + void purgeCache(); + ResourceManager *_resMan; SciGuiScreen *_screen; SciGuiPalette *_palette; Common::Rect _moveZone; // Rectangle in which the pointer can move + + CursorCache _cachedCursors; }; } // End of namespace Sci -- cgit v1.2.3