pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3823 - trunk/pingus/src/display


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3823 - trunk/pingus/src/display
Date: Mon, 14 Jul 2008 20:41:52 +0200

Author: grumbel
Date: 2008-07-14 20:41:52 +0200 (Mon, 14 Jul 2008)
New Revision: 3823

Modified:
   trunk/pingus/src/display/
   trunk/pingus/src/display/delta_framebuffer.cpp
   trunk/pingus/src/display/rect_merger.cpp
   trunk/pingus/src/display/sdl_framebuffer.cpp
   trunk/pingus/src/display/sdl_framebuffer.hpp
Log:
Switched from SDL_Rect to Rect in some functions, also hooked up the 
rect_merger (crashes sometimes, not finished)


Property changes on: trunk/pingus/src/display
___________________________________________________________________
Name: svn:ignore
   - .sconsign
semantic.cache

   + rect_merger
.sconsign
semantic.cache


Modified: trunk/pingus/src/display/delta_framebuffer.cpp
===================================================================
--- trunk/pingus/src/display/delta_framebuffer.cpp      2008-07-14 18:31:45 UTC 
(rev 3822)
+++ trunk/pingus/src/display/delta_framebuffer.cpp      2008-07-14 18:41:52 UTC 
(rev 3823)
@@ -16,6 +16,7 @@
 
 #include <iostream>
 #include "../math.hpp"
+#include "rect_merger.hpp"
 #include "sdl_framebuffer.hpp"
 #include "delta_framebuffer.hpp"
 
@@ -28,30 +29,17 @@
     fb.draw_surface(surface, rect, pos);
   }
   
-  SDL_Rect get_region() const {
-    SDL_Rect sdl_rect;
-    sdl_rect.x = pos.x;
-    sdl_rect.y = pos.y;
-    sdl_rect.w = rect.get_width();
-    sdl_rect.h = rect.get_height();
-    return sdl_rect;
+  Rect get_region() const {
+    return Rect(pos, rect.get_size());
   }
 };
 
-void merge_rectangles(const std::vector<SDL_Rect>& rects_in, 
std::vector<SDL_Rect>& rects_out)
+int calculate_region(const std::vector<Rect>& rects)
 {
-  for(std::vector<SDL_Rect>::const_iterator i = rects_in.begin(); i != 
rects_in.end(); ++i)
-    {
-      rects_out.push_back(*i);
-    }
-}
-
-int calculate_region(const std::vector<SDL_Rect>& rects)
-{
   int area = 0;
-  for(std::vector<SDL_Rect>::const_iterator i = rects.begin(); i != 
rects.end(); ++i)
+  for(std::vector<Rect>::const_iterator i = rects.begin(); i != rects.end(); 
++i)
     {
-      area += i->w * i->h;
+      area += i->get_width() * i->get_height();
     }
   return area;
 }
@@ -75,14 +63,14 @@
     for(DrawOps::iterator i = draw_obs.begin(); i != draw_obs.end(); ++i)
       if (op.surface == i->surface &&
           op.pos     == i->pos &&
-          op.rect    == op.rect)
+          op.rect    == i->rect)
         return true;
     return false;
   }
  
   void render(SDLFramebuffer& fb, DrawOpBuffer& frontbuffer) 
   {
-    std::vector<SDL_Rect> changed_regions;
+    std::vector<Rect> changed_regions;
 
     // Find all regions that need updating
     for(DrawOps::iterator i = draw_obs.begin(); i != draw_obs.end(); ++i)
@@ -95,42 +83,44 @@
 
     // Clip things to the screen
     Size screen_size = fb.get_size();
-    for(std::vector<SDL_Rect>::iterator i = changed_regions.begin(); i != 
changed_regions.end(); ++i)
-      {
-        i->w = Math::clamp(0, int(i->w), Math::max(0, screen_size.width  - 
i->x));
-        i->h = Math::clamp(0, int(i->h), Math::max(0, screen_size.height - 
i->y));
+    for(std::vector<Rect>::iterator i = changed_regions.begin(); i != 
changed_regions.end(); ++i)
+      { 
+        // FIXME: It might be a good idea to remove empty rectangles here, so 
that merge_rectangles() can work smoother
+        i->left = Math::clamp(0, int(i->left), screen_size.width);
+        i->top  = Math::clamp(0, int(i->top),  screen_size.height);
 
-        i->x = Math::clamp(0, int(i->x), screen_size.width);
-        i->y = Math::clamp(0, int(i->y), screen_size.height);
+        i->right  = Math::clamp(0, int(i->right),  screen_size.width);
+        i->bottom = Math::clamp(0, int(i->bottom), screen_size.height);
       }
 
-    // Merge rectangles
-    std::vector<SDL_Rect> update_rects;
-    merge_rectangles(changed_regions, update_rects);
+    if (!changed_regions.empty())
+      {
+        // Merge rectangles
+        std::vector<Rect> update_rects;
+        merge_rectangles(changed_regions, update_rects);
+        //update_rects = changed_regions;
 
-    int area = calculate_region(update_rects);
+        int area = calculate_region(update_rects);
 
-    if (area == 0)
-      { // No screen update needed
-      }
-    else if (area < fb.get_size().get_area()*75/100) // FIXME: Random Magic 
ratio, need benchmarking to find proper value
-      { // Update all regions that need update
-        for(std::vector<SDL_Rect>::iterator i = update_rects.begin(); i != 
update_rects.end(); ++i)
-          {
-            fb.push_cliprect(Rect(Vector2i(i->x, i->y), Size(i->w, i->h)));
+        if (area < fb.get_size().get_area()*75/100) // FIXME: Random Magic 
ratio, need benchmarking to find proper value
+          { // Update all regions that need update
+            for(std::vector<Rect>::iterator i = update_rects.begin(); i != 
update_rects.end(); ++i)
+              {
+                fb.push_cliprect(*i);
+                for(DrawOps::iterator j = draw_obs.begin(); j != 
draw_obs.end(); ++j)
+                  j->render(fb);
+                fb.pop_cliprect();
+              }
+    
+            fb.update_rects(update_rects);
+          }
+        else
+          { // Update the whole screen at once, since we have to many rects
             for(DrawOps::iterator j = draw_obs.begin(); j != draw_obs.end(); 
++j)
               j->render(fb);
-            fb.pop_cliprect();
+            fb.flip();
           }
-    
-        fb.update_rects(update_rects);
       }
-    else
-      { // Update the whole screen at once, since we have to many rects
-        for(DrawOps::iterator j = draw_obs.begin(); j != draw_obs.end(); ++j)
-          j->render(fb);
-        fb.flip();
-      }
   }
  
   void add(const SurfaceDrawOp& op) {

Modified: trunk/pingus/src/display/rect_merger.cpp
===================================================================
--- trunk/pingus/src/display/rect_merger.cpp    2008-07-14 18:31:45 UTC (rev 
3822)
+++ trunk/pingus/src/display/rect_merger.cpp    2008-07-14 18:41:52 UTC (rev 
3823)
@@ -146,12 +146,13 @@
   std::vector<Rect>::const_iterator rect = rects.begin();
   for(std::vector<Row>::iterator row = rows.begin(); row != rows.end() && rect 
!= rects.end(); ++row)
     {
+      // FIXME: Crash Bug here, maybe
       for(; rect->top == row->top; ++rect)
         {
           Mark start(Mark::START_MARK, rect->left);
           Mark end  (Mark::END_MARK,   rect->right);
 
-          // Add the gives rectangle to all rows it overlaps
+          // Add the given rectangle to all rows it overlaps
           std::vector<Row>::iterator this_row = row; 
           do 
             {

Modified: trunk/pingus/src/display/sdl_framebuffer.cpp
===================================================================
--- trunk/pingus/src/display/sdl_framebuffer.cpp        2008-07-14 18:31:45 UTC 
(rev 3822)
+++ trunk/pingus/src/display/sdl_framebuffer.cpp        2008-07-14 18:41:52 UTC 
(rev 3823)
@@ -376,9 +376,21 @@
 }
 
 void
-SDLFramebuffer::update_rects(const std::vector<SDL_Rect>& rects)
+SDLFramebuffer::update_rects(const std::vector<Rect>& rects)
 {
-  SDL_UpdateRects(screen, rects.size(), 
const_cast<SDL_Rect*>(&*rects.begin()));
+  std::vector<SDL_Rect> sdl_rects;
+
+  for(std::vector<Rect>::const_iterator i = rects.begin(); i != rects.end(); 
++i)
+    {
+      SDL_Rect sdl_rect;
+      sdl_rect.x = i->left;
+      sdl_rect.y = i->top;
+      sdl_rect.w = i->get_width();
+      sdl_rect.h = i->get_height();
+      sdl_rects.push_back(sdl_rect);
+    }
+
+  SDL_UpdateRects(screen, sdl_rects.size(), 
const_cast<SDL_Rect*>(&*sdl_rects.begin()));
 }
 
 Size

Modified: trunk/pingus/src/display/sdl_framebuffer.hpp
===================================================================
--- trunk/pingus/src/display/sdl_framebuffer.hpp        2008-07-14 18:31:45 UTC 
(rev 3822)
+++ trunk/pingus/src/display/sdl_framebuffer.hpp        2008-07-14 18:41:52 UTC 
(rev 3823)
@@ -36,7 +36,7 @@
 
   void set_video_mode(const Size& size, bool fullscreen);
   void flip();
-  void update_rects(const std::vector<SDL_Rect>& rects);
+  void update_rects(const std::vector<Rect>& rects);
 
   void push_cliprect(const Rect&);
   void pop_cliprect();





reply via email to

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