pingus-cvs
[Top][All Lists]
Advanced

[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;





reply via email to

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