[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pingus-CVS] r3794 - in trunk/pingus/src: . display
From: |
grumbel at BerliOS |
Subject: |
[Pingus-CVS] r3794 - in trunk/pingus/src: . display |
Date: |
Fri, 11 Jul 2008 16:17:57 +0200 |
Author: grumbel
Date: 2008-07-11 16:17:56 +0200 (Fri, 11 Jul 2008)
New Revision: 3794
Modified:
trunk/pingus/src/display/delta_framebuffer.cpp
trunk/pingus/src/display/delta_framebuffer.hpp
trunk/pingus/src/display/display.cpp
trunk/pingus/src/globals.cpp
trunk/pingus/src/globals.hpp
trunk/pingus/src/pingus_main.cpp
Log:
Implemented some experimental DeltaDrawing, use with ./pingus --delta-drawing
Modified: trunk/pingus/src/display/delta_framebuffer.cpp
===================================================================
--- trunk/pingus/src/display/delta_framebuffer.cpp 2008-07-11 13:28:13 UTC
(rev 3793)
+++ trunk/pingus/src/display/delta_framebuffer.cpp 2008-07-11 14:17:56 UTC
(rev 3794)
@@ -30,6 +30,8 @@
void
DeltaFramebuffer::flip()
{
+ last_drawing_ops = drawing_ops;
+ drawing_ops.clear();
framebuffer->flip();
}
@@ -48,13 +50,34 @@
void
DeltaFramebuffer::draw_surface(SDL_Surface* src, const Vector2i& pos)
{
- framebuffer->draw_surface(src, pos);
+ SurfaceDrawOp op;
+ op.pos = pos;
+ op.surface = src;
+ op.rect = Rect(Vector2i(0, 0), Size(src->w, src->h));
+ add_op(op);
+
+ DrawingOps::iterator i = find_op(op);
+ if (i != last_drawing_ops.end())
+ ; //framebuffer->fill_rect(Rect(pos, Size(src->w, src->h)), Color(255, 0,
0, 100));
+ else
+ framebuffer->draw_surface(src, pos);
}
void
DeltaFramebuffer::draw_surface(SDL_Surface* src, const Rect& srcrect, const
Vector2i& pos)
{
- framebuffer->draw_surface(src, srcrect, pos);
+ SurfaceDrawOp op;
+ op.pos = pos;
+ op.surface = src;
+ op.rect = srcrect;
+ add_op(op);
+
+ DrawingOps::iterator i = find_op(op);
+ if (i != last_drawing_ops.end())
+ ; //framebuffer->fill_rect(Rect(pos, srcrect.get_size()), Color(255, 0, 0,
100));
+ else
+ framebuffer->draw_surface(src, srcrect, pos);
+
}
void
@@ -81,4 +104,23 @@
return framebuffer->get_size();
}
+DeltaFramebuffer::DrawingOps::iterator
+DeltaFramebuffer::find_op(const DeltaFramebuffer::SurfaceDrawOp& op)
+{
+ for(DrawingOps::iterator i = last_drawing_ops.begin(); i !=
last_drawing_ops.end(); ++i)
+ {
+ if (i->pos == op.pos &&
+ i->surface == op.surface &&
+ i->rect == op.rect)
+ return i;
+ }
+ return last_drawing_ops.end();
+}
+
+void
+DeltaFramebuffer::add_op(const DeltaFramebuffer::SurfaceDrawOp& op)
+{
+ drawing_ops.push_back(op);
+}
+
/* EOF */
Modified: trunk/pingus/src/display/delta_framebuffer.hpp
===================================================================
--- trunk/pingus/src/display/delta_framebuffer.hpp 2008-07-11 13:28:13 UTC
(rev 3793)
+++ trunk/pingus/src/display/delta_framebuffer.hpp 2008-07-11 14:17:56 UTC
(rev 3794)
@@ -18,13 +18,27 @@
#define HEADER_DELTA_FRAMEBUFFER_HPP
#include <memory>
+#include <map>
+#include "../math/vector2i.hpp"
#include "framebuffer.hpp"
class DeltaFramebuffer : public Framebuffer
{
private:
+ struct SurfaceDrawOp {
+ Vector2i pos;
+ SDL_Surface* surface;
+ Rect rect;
+ };
+
std::auto_ptr<Framebuffer> framebuffer;
+ typedef std::vector<SurfaceDrawOp> DrawingOps;
+ DrawingOps drawing_ops;
+ DrawingOps last_drawing_ops;
+ DrawingOps::iterator find_op(const SurfaceDrawOp& pos);
+ void add_op(const SurfaceDrawOp& op);
+
public:
DeltaFramebuffer(Framebuffer* framebuffer);
Modified: trunk/pingus/src/display/display.cpp
===================================================================
--- trunk/pingus/src/display/display.cpp 2008-07-11 13:28:13 UTC (rev
3793)
+++ trunk/pingus/src/display/display.cpp 2008-07-11 14:17:56 UTC (rev
3794)
@@ -56,7 +56,12 @@
Display::set_video_mode(int width, int height, bool fullscreen)
{
if (!framebuffer.get())
- framebuffer = std::auto_ptr<Framebuffer>(new DeltaFramebuffer(new
SDLFramebuffer()));
+ {
+ if (delta_drawing)
+ framebuffer = std::auto_ptr<Framebuffer>(new DeltaFramebuffer(new
SDLFramebuffer()));
+ else
+ framebuffer = std::auto_ptr<Framebuffer>(new SDLFramebuffer());
+ }
framebuffer->set_video_mode(width, height, fullscreen);
}
Modified: trunk/pingus/src/globals.cpp
===================================================================
--- trunk/pingus/src/globals.cpp 2008-07-11 13:28:13 UTC (rev 3793)
+++ trunk/pingus/src/globals.cpp 2008-07-11 14:17:56 UTC (rev 3794)
@@ -45,5 +45,6 @@
unsigned int pingus_debug_flags = 0;
bool fullscreen_enabled = false;
+bool delta_drawing = false;
/* EOF */
Modified: trunk/pingus/src/globals.hpp
===================================================================
--- trunk/pingus/src/globals.hpp 2008-07-11 13:28:13 UTC (rev 3793)
+++ trunk/pingus/src/globals.hpp 2008-07-11 14:17:56 UTC (rev 3794)
@@ -39,6 +39,7 @@
extern bool drag_drop_scrolling;
extern int tile_size; ///< --tile-size
extern bool fullscreen_enabled; ///< --enable-fullscreen
+extern bool delta_drawing; ///< --delta-drawing
extern int default_screen_width; ///< default screen width
extern int default_screen_height; ///< default screen height
extern int screen_width; ///< user configured
screen width
Modified: trunk/pingus/src/pingus_main.cpp
===================================================================
--- trunk/pingus/src/pingus_main.cpp 2008-07-11 13:28:13 UTC (rev 3793)
+++ trunk/pingus/src/pingus_main.cpp 2008-07-11 14:17:56 UTC (rev 3794)
@@ -242,6 +242,8 @@
_("Start in Window Mode"));
argp.add_option('f', "fullscreen", "",
_("Start in Fullscreen"));
+ argp.add_option(336, "delta-drawing", "",
+ _("Enable experimental delta drawing"));
argp.add_option(346, "enable-swcursor", "",
_("Enable software cursor"));
argp.add_option('g', "geometry", "{width}x{height}",
@@ -307,6 +309,10 @@
{
switch (argp.get_key())
{
+ case 336: // --delta-drawing
+ delta_drawing = true;
+ break;
+
case 359: // --credits
cmd_options.credits.set(true);
break;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3794 - in trunk/pingus/src: . display,
grumbel at BerliOS <=