[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3895 - in trunk/pingus/src: . display,
grumbel at BerliOS <=