pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3895 - in trunk/pingus/src: . display


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3895 - in trunk/pingus/src: . display
Date: Tue, 22 Jul 2008 21:26:06 +0200

Author: grumbel
Date: 2008-07-22 21:26:05 +0200 (Tue, 22 Jul 2008)
New Revision: 3895

Modified:
   trunk/pingus/src/display/framebuffer_surface.hpp
   trunk/pingus/src/sprite.cpp
   trunk/pingus/src/sprite_impl.cpp
   trunk/pingus/src/sprite_impl.hpp
Log:
Added very basic resource system

Modified: trunk/pingus/src/display/framebuffer_surface.hpp
===================================================================
--- trunk/pingus/src/display/framebuffer_surface.hpp    2008-07-22 04:14:12 UTC 
(rev 3894)
+++ trunk/pingus/src/display/framebuffer_surface.hpp    2008-07-22 19:26:05 UTC 
(rev 3895)
@@ -50,6 +50,8 @@
 
   operator bool() const { return impl.get() != 0; }
 
+  long use_count() const { return impl.use_count(); }
+
   Surface to_surface() const { return impl->to_surface(); }
 private:
   boost::shared_ptr<FramebufferSurfaceImpl> impl;

Modified: trunk/pingus/src/sprite.cpp
===================================================================
--- trunk/pingus/src/sprite.cpp 2008-07-22 04:14:12 UTC (rev 3894)
+++ trunk/pingus/src/sprite.cpp 2008-07-22 19:26:05 UTC (rev 3895)
@@ -72,8 +72,7 @@
 
 Sprite::Sprite(const Surface& surface)
   : impl(new SpriteImpl(surface))
-{
-  
+{  
 }
 
 Sprite::Sprite(const SpriteDescription& desc, 
ResourceModifierNS::ResourceModifier mod)

Modified: trunk/pingus/src/sprite_impl.cpp
===================================================================
--- trunk/pingus/src/sprite_impl.cpp    2008-07-22 04:14:12 UTC (rev 3894)
+++ trunk/pingus/src/sprite_impl.cpp    2008-07-22 19:26:05 UTC (rev 3895)
@@ -14,39 +14,77 @@
 //  You should have received a copy of the GNU General Public License
 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+#include <map>
 #include "display/framebuffer.hpp"
 #include "display/display.hpp"
 #include "sprite_description.hpp"
 #include "sprite_impl.hpp"
+
+typedef std::map<std::string, FramebufferSurface> SurfaceCache;
+SurfaceCache surface_cache;
 
+FramebufferSurface load_framebuffer_surface(const Pathname& filename, 
ResourceModifierNS::ResourceModifier mod)
+{
+  SurfaceCache::iterator i = surface_cache.find(filename.get_sys_path());
+  
+  if (i == surface_cache.end())
+    {
+
+      Surface surface(filename);
+      if (mod != ResourceModifierNS::ROT0)
+        surface = surface.mod(mod);
+
+      if (!surface)
+        {
+          std::cout << "Error: Sprite: couldn't load '" << filename << "'" << 
std::endl;
+          surface = Surface(Pathname("images/core/misc/404.png", 
Pathname::DATA_PATH));
+          if (!surface) assert(!"Surface Couldn't find 404");
+        }
+
+      FramebufferSurface framebuffer_surface = 
Display::get_framebuffer().create_surface(surface);
+
+      surface_cache[filename.get_sys_path()] = framebuffer_surface;
+
+      return framebuffer_surface;
+    }
+  else
+    {
+      //std::cout << "Sharing: " << filename.get_sys_path() << std::endl;
+      return i->second;
+    }
+}
+
+void delete_framebuffer_surface(const Pathname& filename)
+{
+  SurfaceCache::iterator i = surface_cache.find(filename.get_sys_path());
+  if (i != surface_cache.end())
+    {
+      //std::cout << "UseCount for " << filename << ": " << 
i->second.use_count() << std::endl;
+      if (i->second.use_count() == 1)
+        {
+          surface_cache.erase(i);
+        }
+    }
+}
+
 SpriteImpl::SpriteImpl()
 {
 }
 
 SpriteImpl::SpriteImpl(const SpriteDescription& desc, 
ResourceModifierNS::ResourceModifier mod)
-  : finished(false),
+  : filename(desc.filename),
+    finished(false),
     frame(0),
     tick_count(0)
 {
-  Surface surface(desc.filename);
-  if (mod != ResourceModifierNS::ROT0)
-    surface = surface.mod(mod);
+  framebuffer_surface = load_framebuffer_surface(filename, mod);
 
-  if (!surface)
-    {
-      std::cout << "Error: Sprite: couldn't load '" << desc.filename << "'" << 
std::endl;
-      surface = Surface(Pathname("images/core/misc/404.png", 
Pathname::DATA_PATH));
-      if (!surface) assert(!"Surface Couldn't find 404");
-    }
-
-  framebuffer_surface = Display::get_framebuffer().create_surface(surface);
-
   frame_pos = desc.frame_pos;
 
   array = desc.array;
 
-  frame_size.width  = (desc.frame_size.width  == -1) ? 
surface.get_width()/array.width   : desc.frame_size.width;
-  frame_size.height = (desc.frame_size.height == -1) ? 
surface.get_height()/array.height : desc.frame_size.height;
+  frame_size.width  = (desc.frame_size.width  == -1) ? 
framebuffer_surface.get_width()/array.width   : desc.frame_size.width;
+  frame_size.height = (desc.frame_size.height == -1) ? 
framebuffer_surface.get_height()/array.height : desc.frame_size.height;
 
   frame_delay  = desc.speed;
 
@@ -74,6 +112,8 @@
 
 SpriteImpl::~SpriteImpl()
 {
+  framebuffer_surface = FramebufferSurface();
+  delete_framebuffer_surface(filename);
 }
 
 void

Modified: trunk/pingus/src/sprite_impl.hpp
===================================================================
--- trunk/pingus/src/sprite_impl.hpp    2008-07-22 04:14:12 UTC (rev 3894)
+++ trunk/pingus/src/sprite_impl.hpp    2008-07-22 19:26:05 UTC (rev 3895)
@@ -28,6 +28,7 @@
 private:
   friend class Sprite;
 
+  Pathname filename;
   FramebufferSurface framebuffer_surface;
   Vector2i offset;
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]