[Scummvm-cvs-logs] SF.net SVN: scummvm:[45541] scummvm/trunk/engines/sci/gui

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Fri Oct 30 18:13:26 CET 2009


Revision: 45541
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45541&view=rev
Author:   thebluegr
Date:     2009-10-30 17:13:25 +0000 (Fri, 30 Oct 2009)

Log Message:
-----------
Added caching for mouse cursor views

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gui/gui_cursor.cpp
    scummvm/trunk/engines/sci/gui/gui_cursor.h

Modified: scummvm/trunk/engines/sci/gui/gui_cursor.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_cursor.cpp	2009-10-30 16:20:24 UTC (rev 45540)
+++ scummvm/trunk/engines/sci/gui/gui_cursor.cpp	2009-10-30 17:13:25 UTC (rev 45541)
@@ -44,6 +44,7 @@
 }
 
 SciGuiCursor::~SciGuiCursor() {
+	purgeCache();
 }
 
 void SciGuiCursor::show() {
@@ -54,6 +55,15 @@
 	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,8 +124,14 @@
 }
 
 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;
 	int16 height = celInfo->height;
@@ -129,7 +145,6 @@
 	if (width < 2 || height < 2) {
 		hide();
 		delete cursorHotspot;
-		delete cursorView;
 		return;
 	}
 
@@ -139,7 +154,6 @@
 	show();
 
 	delete cursorHotspot;
-	delete cursorView;
 }
 
 void SciGuiCursor::setPosition(Common::Point pos) {

Modified: scummvm/trunk/engines/sci/gui/gui_cursor.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_cursor.h	2009-10-30 16:20:24 UTC (rev 45540)
+++ scummvm/trunk/engines/sci/gui/gui_cursor.h	2009-10-30 17:13:25 UTC (rev 45541)
@@ -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 @@
 
 #define SCI_CURSOR_SCI0_TRANSPARENCYCOLOR 1
 
+#define MAX_CACHED_CURSORS 10
+
 class SciGuiView;
 class SciGuiPalette;
+
+typedef Common::HashMap<int, SciGuiView *> CursorCache;
+
 class SciGuiCursor {
 public:
 	SciGuiCursor(ResourceManager *resMan, SciGuiPalette *palette, SciGuiScreen *screen);
@@ -56,11 +63,15 @@
 	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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list