With the last serie of patch I committed inside evas, evas_render
should now be working again correctly. This fixed version only give
around 7% of speedup to expedite test and some are a little bit slower
than the previous.

So after diging a little bit more the slower tests case of expedite, I
think the attached patch will make all expedite test as fast as
without the cache inside evas_render and give a global 10% speedup to
expedite without any cache.

The idea is to remove as much allocation and list manipulation as
possible by implementing a special array of Evas_Rectangle. This patch
work for me on all my application, E17 and edje old test application.

So as always have fun reviewing this patch !
-- 
Cedric BAIL
From 630b5fa441a8e75cc96b358bcf568a960ba0bdd9 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 5 Jun 2008 16:31:58 +0200
Subject: [PATCH] Remove many use of evas_list with a big array.

---
 src/lib/canvas/evas_object_gradient.c  |   12 +-
 src/lib/canvas/evas_object_image.c     |   76 ++++++-------
 src/lib/canvas/evas_object_line.c      |   18 ++--
 src/lib/canvas/evas_object_main.c      |  182 +++++++++++++++-----------------
 src/lib/canvas/evas_object_polygon.c   |   16 ++--
 src/lib/canvas/evas_object_rectangle.c |   40 +++----
 src/lib/canvas/evas_object_text.c      |   18 ++--
 src/lib/canvas/evas_object_textblock.c |   20 ++--
 src/lib/canvas/evas_rectangle.c        |   69 +++++++------
 src/lib/include/evas_inline.x          |   44 ++++++++
 src/lib/include/evas_private.h         |   18 +++-
 11 files changed, 273 insertions(+), 240 deletions(-)

diff --git a/src/lib/canvas/evas_object_gradient.c b/src/lib/canvas/evas_object_gradient.c
index a7c5605..58b736a 100644
--- a/src/lib/canvas/evas_object_gradient.c
+++ b/src/lib/canvas/evas_object_gradient.c
@@ -902,7 +902,7 @@ evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_gradient_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Gradient *o;
    int is_v, was_v;
 
@@ -993,17 +993,17 @@ evas_object_gradient_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* its not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* gradient changed */
    if (o->changed || obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry */
@@ -1012,7 +1012,7 @@ evas_object_gradient_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
@@ -1028,7 +1028,7 @@ evas_object_gradient_render_pre(Evas_Object *obj)
 							    obj->cur.cache.clip.h);
    
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c
index de34734..9941215 100644
--- a/src/lib/canvas/evas_object_image.c
+++ b/src/lib/canvas/evas_object_image.c
@@ -2074,7 +2074,7 @@ evas_object_image_render(Evas_Object *obj, void *output, void *context, void *su
 static void
 evas_object_image_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Image *o;
    int is_v, was_v;
 
@@ -2100,17 +2100,17 @@ evas_object_image_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	if (!o->pixel_updates) goto done;
      }
    /* it's not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if (obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	if (!o->pixel_updates) goto done;
      }
    /* if it changed color */
@@ -2119,19 +2119,19 @@ evas_object_image_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	if (!o->pixel_updates) goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	if (!o->pixel_updates) goto done;
      }
    /* if it changed anti_alias */
    if (obj->cur.anti_alias != obj->prev.anti_alias)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	if (!o->pixel_updates) goto done;
      }
    if (o->changed)
@@ -2142,7 +2142,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 	    ((!o->cur.key) && (o->prev.key))
 	    )
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     if (!o->pixel_updates) goto done;
 	  }
 	if ((o->cur.image.w != o->prev.image.w) ||
@@ -2151,7 +2151,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 	    (o->cur.cspace != o->prev.cspace) ||
 	    (o->cur.smooth_scale != o->prev.smooth_scale))
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     if (!o->pixel_updates) goto done;
 	  }
 	if ((o->cur.border.l != o->prev.border.l) ||
@@ -2159,12 +2159,12 @@ evas_object_image_render_pre(Evas_Object *obj)
 	    (o->cur.border.t != o->prev.border.t) ||
 	    (o->cur.border.b != o->prev.border.b))
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     if (!o->pixel_updates) goto done;
 	  }
 	if (o->dirty_pixels)
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     if (!o->pixel_updates) goto done;
 	  }
      }
@@ -2182,23 +2182,15 @@ evas_object_image_render_pre(Evas_Object *obj)
        (!o->pixel_updates)
        )
      {
-	Evas_Rectangle *r;
-	Evas_List *rl;
-
-	rl = evas_rects_return_difference_rects(obj->cur.geometry.x,
-						obj->cur.geometry.y,
-						obj->cur.geometry.w,
-						obj->cur.geometry.h,
-						obj->prev.geometry.x,
-						obj->prev.geometry.y,
-						obj->prev.geometry.w,
-						obj->prev.geometry.h);
-	while (rl)
-	  {
-	     r = rl->data;
-	     rl = evas_list_remove(rl, r);
-	     updates = evas_list_append(updates, r);
-	  }
+	evas_rects_return_difference_rects(&rects,
+					   obj->cur.geometry.x,
+					   obj->cur.geometry.y,
+					   obj->cur.geometry.w,
+					   obj->cur.geometry.h,
+					   obj->prev.geometry.x,
+					   obj->prev.geometry.y,
+					   obj->prev.geometry.w,
+					   obj->prev.geometry.h);
 	if (!o->pixel_updates) goto done;
      }
    if (((obj->cur.geometry.x != obj->prev.geometry.x) ||
@@ -2207,7 +2199,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 	(obj->cur.geometry.h != obj->prev.geometry.h))
        )
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	if (!o->pixel_updates) goto done;
      }
    if (o->changed)
@@ -2217,7 +2209,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 	    (o->cur.fill.w != o->prev.fill.w) ||
 	    (o->cur.fill.h != o->prev.fill.h))
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     if (!o->pixel_updates) goto done;
 	  }
 	if ((o->cur.border.l == 0) &&
@@ -2227,7 +2219,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 	  {
 	     while (o->pixel_updates)
 	       {
-		  Evas_Rectangle *r, *rr;
+		  Evas_Rectangle *rr;
 		  Evas_Coord idw, idh, idx, idy;
 		  int x, y, w, h;
 
@@ -2251,16 +2243,18 @@ evas_object_image_render_pre(Evas_Object *obj)
 		       w = ((int)(idx + idw)) - x;
 		       while (idy < obj->cur.geometry.h)
 			 {
+			    Evas_Rectangle r;
+
 			    y = idy;
 			    h = ((int)(idy + idh)) - y;
-			    NEW_RECT(r, x, y, w, h);
-			    r->x = ((rr->x - 1) * r->w) / o->cur.image.w;
-			    r->y = ((rr->y - 1) * r->h) / o->cur.image.h;
-			    r->w = ((rr->w + 2) * r->w) / o->cur.image.w;
-			    r->h = ((rr->h + 2) * r->h) / o->cur.image.h;
-			    r->x += obj->cur.geometry.x + x;
-			    r->y += obj->cur.geometry.y + y;
-			    if (r) updates = evas_list_append(updates, r);
+
+			    r.x = ((rr->x - 1) * w) / o->cur.image.w;
+			    r.y = ((rr->y - 1) * h) / o->cur.image.h;
+			    r.w = ((rr->w + 2) * w) / o->cur.image.w;
+			    r.h = ((rr->h + 2) * h) / o->cur.image.h;
+			    r.x += obj->cur.geometry.x + x;
+			    r.y += obj->cur.geometry.y + y;
+			    evas_add_rect(&rects, r.x, r.y, r.w, r.h);
 			    idy += h;
 			 }
 		       idx += idw;
@@ -2283,7 +2277,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 		       free(r);
 		    }
 		  obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
-		  updates = evas_object_render_pre_prev_cur_add(updates, obj);
+		  evas_object_render_pre_prev_cur_add(&rects, obj);
 		  goto done;
 	       }
 	  }
@@ -2299,7 +2293,7 @@ evas_object_image_render_pre(Evas_Object *obj)
 							    obj->cur.cache.clip.w,
 							    obj->cur.cache.clip.h);
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c
index 54466b0..15bf61c 100644
--- a/src/lib/canvas/evas_object_line.c
+++ b/src/lib/canvas/evas_object_line.c
@@ -298,7 +298,7 @@ evas_object_line_render(Evas_Object *obj, void *output, void *context, void *sur
 static void
 evas_object_line_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Line *o;
    int is_v, was_v;
 
@@ -324,29 +324,29 @@ evas_object_line_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* it's not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) */
    if (obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed anti_alias */
    if (obj->cur.anti_alias != obj->prev.anti_alias)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed color */
@@ -355,7 +355,7 @@ evas_object_line_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -372,11 +372,11 @@ evas_object_line_render_pre(Evas_Object *obj)
 	 (o->cur.y2 != o->prev.y2)))
        )
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_main.c b/src/lib/canvas/evas_object_main.c
index 5bd453d..d542a25 100644
--- a/src/lib/canvas/evas_object_main.c
+++ b/src/lib/canvas/evas_object_main.c
@@ -91,153 +91,127 @@ evas_object_change(Evas_Object *obj)
    if (obj->smart.parent) evas_object_change(obj->smart.parent);
 }
 
-Evas_List *
-evas_object_render_pre_visible_change(Evas_List *updates, Evas_Object *obj, int is_v, int was_v)
+void
+evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v)
 {
-   Evas_Rectangle *r;
-
-   if (obj->smart.smart) return updates;
-   if (is_v == was_v) return updates;
+   if (obj->smart.smart) return ;
+   if (is_v == was_v) return ;
    if (is_v)
      {
-	NEW_RECT(r,
-		 obj->cur.cache.clip.x,
-		 obj->cur.cache.clip.y,
-		 obj->cur.cache.clip.w,
-		 obj->cur.cache.clip.h);
-	if (r) updates = evas_list_append(updates, r);
+	evas_add_rect(rects,
+		      obj->cur.cache.clip.x,
+		      obj->cur.cache.clip.y,
+		      obj->cur.cache.clip.w,
+		      obj->cur.cache.clip.h);
      }
    else
      {
-	NEW_RECT(r,
-		 obj->prev.cache.clip.x,
-		 obj->prev.cache.clip.y,
-		 obj->prev.cache.clip.w,
-		 obj->prev.cache.clip.h);
-	if (r) updates = evas_list_append(updates, r);
+	evas_add_rect(rects,
+		      obj->prev.cache.clip.x,
+		      obj->prev.cache.clip.y,
+		      obj->prev.cache.clip.w,
+		      obj->prev.cache.clip.h);
      }
-   return updates;
 }
 
-Evas_List *
-evas_object_render_pre_clipper_change(Evas_List *updates, Evas_Object *obj)
+void
+evas_object_render_pre_clipper_change(Evas_Rectangles *rects, Evas_Object *obj)
 {
-   Evas_Rectangle *r;
-   Evas_List *rl;
+   unsigned int i;
 
-   if (obj->smart.smart) return updates;
-   if (obj->cur.clipper == obj->prev.clipper) return updates;
+   if (obj->smart.smart) return ;
+   if (obj->cur.clipper == obj->prev.clipper) return ;
    if ((obj->cur.clipper) && (obj->prev.clipper))
      {
 	/* get difference rects between clippers */
-	rl = evas_rects_return_difference_rects(obj->cur.clipper->cur.cache.clip.x,
-						obj->cur.clipper->cur.cache.clip.y,
-						obj->cur.clipper->cur.cache.clip.w,
-						obj->cur.clipper->cur.cache.clip.h,
-						obj->prev.clipper->prev.cache.clip.x,
-						obj->prev.clipper->prev.cache.clip.y,
-						obj->prev.clipper->prev.cache.clip.w,
-						obj->prev.clipper->prev.cache.clip.h);
-	/* go thru every difference rect */
-	while (rl)
-	  {
-	     r = rl->data;
-	     rl = evas_list_remove(rl, r);
-	     updates = evas_list_append(updates, r);
-	  }
+	evas_rects_return_difference_rects(rects,
+					   obj->cur.clipper->cur.cache.clip.x,
+					   obj->cur.clipper->cur.cache.clip.y,
+					   obj->cur.clipper->cur.cache.clip.w,
+					   obj->cur.clipper->cur.cache.clip.h,
+					   obj->prev.clipper->prev.cache.clip.x,
+					   obj->prev.clipper->prev.cache.clip.y,
+					   obj->prev.clipper->prev.cache.clip.w,
+					   obj->prev.clipper->prev.cache.clip.h);
      }
    else if (obj->cur.clipper)
      {
-	rl = evas_rects_return_difference_rects(obj->cur.geometry.x,
-						obj->cur.geometry.y,
-						obj->cur.geometry.w,
-						obj->cur.geometry.h,
+	evas_rects_return_difference_rects(rects,
+					   obj->cur.geometry.x,
+					   obj->cur.geometry.y,
+					   obj->cur.geometry.w,
+					   obj->cur.geometry.h,
 ////	rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
 ////						obj->cur.cache.geometry.y,
 ////						obj->cur.cache.geometry.w,
 ////						obj->cur.cache.geometry.h,
-						obj->cur.clipper->cur.cache.clip.x,
-						obj->cur.clipper->cur.cache.clip.y,
-						obj->cur.clipper->cur.cache.clip.w,
-						obj->cur.clipper->cur.cache.clip.h);
-	while (rl)
-	  {
-	     r = rl->data;
-	     rl = evas_list_remove(rl, r);
-	     updates = evas_list_append(updates, r);
-	  }
+					   obj->cur.clipper->cur.cache.clip.x,
+					   obj->cur.clipper->cur.cache.clip.y,
+					   obj->cur.clipper->cur.cache.clip.w,
+					   obj->cur.clipper->cur.cache.clip.h);
      }
    else if (obj->prev.clipper)
      {
-	rl = evas_rects_return_difference_rects(obj->prev.geometry.x,
-						obj->prev.geometry.y,
-						obj->prev.geometry.w,
-						obj->prev.geometry.h,
+	evas_rects_return_difference_rects(rects,
+					   obj->prev.geometry.x,
+					   obj->prev.geometry.y,
+					   obj->prev.geometry.w,
+					   obj->prev.geometry.h,
 ////	rl = evas_rects_return_difference_rects(obj->prev.cache.geometry.x,
 ////						obj->prev.cache.geometry.y,
 ////						obj->prev.cache.geometry.w,
 ////						obj->prev.cache.geometry.h,
-						obj->prev.clipper->prev.cache.clip.x,
-						obj->prev.clipper->prev.cache.clip.y,
-						obj->prev.clipper->prev.cache.clip.w,
-						obj->prev.clipper->prev.cache.clip.h);
-	while (rl)
-	  {
-	     r = rl->data;
-	     rl = evas_list_remove(rl, r);
-	     updates = evas_list_append(updates, r);
-	  }
+					   obj->prev.clipper->prev.cache.clip.x,
+					   obj->prev.clipper->prev.cache.clip.y,
+					   obj->prev.clipper->prev.cache.clip.w,
+					   obj->prev.clipper->prev.cache.clip.h);
      }
-   return updates;
 }
 
-Evas_List *
-evas_object_render_pre_prev_cur_add(Evas_List *updates, Evas_Object *obj)
+void
+evas_object_render_pre_prev_cur_add(Evas_Rectangles *rects, Evas_Object *obj)
 {
-   Evas_Rectangle *r;
-
-   NEW_RECT(r,
-	    obj->cur.geometry.x,
-	    obj->cur.geometry.y,
-	    obj->cur.geometry.w,
-	    obj->cur.geometry.h);
+   evas_add_rect(rects,
+		 obj->cur.geometry.x,
+		 obj->cur.geometry.y,
+		 obj->cur.geometry.w,
+		 obj->cur.geometry.h);
 ////	    obj->cur.cache.geometry.x,
 ////	    obj->cur.cache.geometry.y,
 ////	    obj->cur.cache.geometry.w,
 ////	    obj->cur.cache.geometry.h);
-   if (r) updates = evas_list_append(updates, r);
-   NEW_RECT(r,
-	    obj->prev.geometry.x,
-	    obj->prev.geometry.y,
-	    obj->prev.geometry.w,
-	    obj->prev.geometry.h);
+   evas_add_rect(rects,
+		 obj->prev.geometry.x,
+		 obj->prev.geometry.y,
+		 obj->prev.geometry.w,
+		 obj->prev.geometry.h);
 ////	    obj->prev.cache.geometry.x,
 ////	    obj->prev.cache.geometry.y,
 ////	    obj->prev.cache.geometry.w,
 ////	    obj->prev.cache.geometry.h);
-   if (r) updates = evas_list_append(updates, r);
-   return updates;
 }
 
 void
-evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int is_v, int was_v)
+evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v)
 {
    Evas_Rectangle *r;
-   int x, y, w, h;
    Evas_Object *clipper;
    Evas_List *l;
+   unsigned int i;
+   int x, y, w, h;
 
-   if (obj->smart.smart) return;
+   if (obj->smart.smart) goto end;
    /* FIXME: was_v isn't used... why? */
    was_v = 0;
    if (!obj->clip.clipees)
      {
-	while (updates)
+	for (i = 0; i < rects->count; ++i)
 	  {
-	     r = (Evas_Rectangle *)(updates->data);
-	     updates = evas_list_remove(updates, r);
 	     /* get updates and clip to current clip */
-	     x = r->x; y = r->y; w = r->w; h = r->h;
+	     x = rects->array[i].x;
+	     y = rects->array[i].y;
+	     w = rects->array[i].w;
+	     h = rects->array[i].h;
 	     RECTS_CLIP_TO_RECT(x, y, w, h,
 				obj->cur.cache.clip.x,
 				obj->cur.cache.clip.y,
@@ -247,7 +221,10 @@ evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int
 	       obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
 								      x, y, w, h);
 	     /* get updates and clip to previous clip */
-	     x = r->x; y = r->y; w = r->w; h = r->h;
+	     x = rects->array[i].x;
+	     y = rects->array[i].y;
+	     w = rects->array[i].w;
+	     h = rects->array[i].h;
 	     RECTS_CLIP_TO_RECT(x, y, w, h,
 				obj->prev.cache.clip.x,
 				obj->prev.cache.clip.y,
@@ -256,8 +233,6 @@ evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int
 	     if ((w > 0) && (h > 0))
 	       obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
 								      x, y, w, h);
-	     free(r);
-	     r = NULL;
 	  }
 	/* if the object is actually visible, take any parent clip changes */
 	if (is_v)
@@ -300,8 +275,21 @@ evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int
 	     free(obj->clip.changes->data);
 	     obj->clip.changes = evas_list_remove(obj->clip.changes, obj->clip.changes->data);
 	  }
-	obj->clip.changes = updates;
+	for (i = 0; i < rects->count; ++i)
+	  {
+	     r = malloc(sizeof(Evas_Rectangle));
+	     if (!r) goto end;
+
+	     *r = rects->array[i];
+	     obj->clip.changes = evas_list_append(obj->clip.changes, r);
+	  }
      }
+
+ end:
+   free(rects->array);
+   rects->array = NULL;
+   rects->count = 0;
+   rects->total = 0;
 }
 
 int
diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c
index cf106f9..d327a61 100644
--- a/src/lib/canvas/evas_object_polygon.c
+++ b/src/lib/canvas/evas_object_polygon.c
@@ -316,7 +316,7 @@ evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *
 static void
 evas_object_polygon_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Polygon *o;
    int is_v, was_v;
 
@@ -342,23 +342,23 @@ evas_object_polygon_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* it's not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) */
    if (obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed color */
@@ -367,7 +367,7 @@ evas_object_polygon_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -379,11 +379,11 @@ evas_object_polygon_render_pre(Evas_Object *obj)
        (obj->cur.geometry.h != obj->prev.geometry.h) ||
        (o->changed))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c
index 4081d73..47a006f 100644
--- a/src/lib/canvas/evas_object_rectangle.c
+++ b/src/lib/canvas/evas_object_rectangle.c
@@ -163,7 +163,7 @@ evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_rectangle_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Rectangle *o;
    int is_v, was_v;
 
@@ -189,23 +189,23 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* it's not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if ((obj->restack) && (!obj->clip.clipees))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed color */
@@ -214,7 +214,7 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -225,17 +225,15 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-	Evas_Rectangle *r;
-	Evas_List *rl;
-	
-	rl = evas_rects_return_difference_rects(obj->cur.geometry.x,
-						obj->cur.geometry.y,
-						obj->cur.geometry.w,
-						obj->cur.geometry.h,
-						obj->prev.geometry.x,
-						obj->prev.geometry.y,
-						obj->prev.geometry.w,
-						obj->prev.geometry.h);
+	evas_rects_return_difference_rects(&rects,
+					   obj->cur.geometry.x,
+					   obj->cur.geometry.y,
+					   obj->cur.geometry.w,
+					   obj->cur.geometry.h,
+					   obj->prev.geometry.x,
+					   obj->prev.geometry.y,
+					   obj->prev.geometry.w,
+					   obj->prev.geometry.h);
 ////	rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x,
 ////						obj->cur.cache.geometry.y,
 ////						obj->cur.cache.geometry.w,
@@ -244,12 +242,6 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
 ////						obj->prev.cache.geometry.y,
 ////						obj->prev.cache.geometry.w,
 ////						obj->prev.cache.geometry.h);
-	while (rl)
-	  {
-	     r = rl->data;
-	     rl = evas_list_remove(rl, r);
-	     updates = evas_list_append(updates, r);
-	  }
 	goto done;
      }
    /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
@@ -266,7 +258,7 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
 							    obj->cur.cache.clip.h);
   */
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c
index 12ed857..55a9648 100644
--- a/src/lib/canvas/evas_object_text.c
+++ b/src/lib/canvas/evas_object_text.c
@@ -1541,7 +1541,7 @@ evas_object_text_render(Evas_Object *obj, void *output, void *context, void *sur
 static void
 evas_object_text_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Text *o;
    int is_v, was_v;
 
@@ -1567,17 +1567,17 @@ evas_object_text_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* its not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) and dont clip anyone */
    if (obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed color */
@@ -1586,7 +1586,7 @@ evas_object_text_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -1597,12 +1597,12 @@ evas_object_text_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    if (obj->cur.render_op != obj->prev.render_op)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    if (o->changed)
@@ -1632,12 +1632,12 @@ evas_object_text_render_pre(Evas_Object *obj)
 	    ((o->cur.glow2.b != o->prev.glow2.b)) ||
 	    ((o->cur.glow2.a != o->prev.glow2.a)))
 	  {
-	     updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	     evas_object_render_pre_prev_cur_add(&rects, obj);
 	     goto done;
 	  }
      }
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c
index 6b1223f..446c3ce 100644
--- a/src/lib/canvas/evas_object_textblock.c
+++ b/src/lib/canvas/evas_object_textblock.c
@@ -4467,7 +4467,7 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_textblock_render_pre(Evas_Object *obj)
 {
-   Evas_List *updates = NULL;
+   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Textblock *o;
    int is_v, was_v;
 
@@ -4497,7 +4497,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
 	if (lines) _lines_clear(obj, lines);
 	o->last_w = obj->cur.geometry.w;
 	o->redraw = 0;
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	o->changed = 0;
 	is_v = evas_object_is_visible(obj);
 	was_v = evas_object_was_visible(obj);
@@ -4506,7 +4506,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
    if (o->redraw)
      {
 	o->redraw = 0;
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	o->changed = 0;
 	is_v = evas_object_is_visible(obj);
 	was_v = evas_object_was_visible(obj);
@@ -4525,17 +4525,17 @@ evas_object_textblock_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-	updates = evas_object_render_pre_visible_change(updates, obj, is_v, was_v);
+	evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
 	goto done;
      }
    /* it's not visible - we accounted for it appearing or not so just abort */
    if (!is_v) goto done;
    /* clipper changed this is in addition to anything else for obj */
-   updates = evas_object_render_pre_clipper_change(updates, obj);
+   evas_object_render_pre_clipper_change(&rects, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if (obj->restack)
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed color */
@@ -4544,7 +4544,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
        (obj->cur.color.b != obj->prev.color.b) ||
        (obj->cur.color.a != obj->prev.color.a))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -4555,7 +4555,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	goto done;
      }
    if (o->changed)
@@ -4569,11 +4569,11 @@ evas_object_textblock_render_pre(Evas_Object *obj)
 	r->h = obj->cur.geometry.h;
 	updates = evas_list_append(updates, r);
 */
-	updates = evas_object_render_pre_prev_cur_add(updates, obj);
+	evas_object_render_pre_prev_cur_add(&rects, obj);
 	o->changed = 0;
      }
    done:
-   evas_object_render_pre_effect_updates(updates, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
 }
 
 static void
diff --git a/src/lib/canvas/evas_rectangle.c b/src/lib/canvas/evas_rectangle.c
index 91efe64..023442d 100644
--- a/src/lib/canvas/evas_rectangle.c
+++ b/src/lib/canvas/evas_rectangle.c
@@ -1,23 +1,20 @@
 #include "evas_common.h"
 #include "evas_private.h"
 
-Evas_List *
-evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, int ww, int hh)
+void
+evas_rects_return_difference_rects(Evas_Rectangles *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh)
 {
-   Evas_List *rects = NULL;
-   Evas_Rectangle *r;
+   unsigned int available = 0;
 
    if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh))
      {
-	NEW_RECT(r, x, y, w, h);
-	if (r) rects = evas_list_append(rects, r);
-	NEW_RECT(r, xx, yy, ww, hh);
-	if (r) rects = evas_list_append(rects, r);
+	evas_add_rect(rects, x, y, w, h);
+	evas_add_rect(rects, xx, yy, ww, hh);
      }
    else
      {
 	int x1[4], y1[4], i, j;
-	Evas_List *rl = NULL, *rll;
+	Evas_Rectangles tmp = { 0, 0, NULL };
 
 	if (x < xx)
 	  {
@@ -63,32 +60,42 @@ evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, i
 	  {
 	     for (i = 0; i < 3; i++)
 	       {
-		  NEW_RECT(r, x1[i], y1[j], x1[i + 1] - x1[i], y1[j + 1] - y1[j]);
-		  if (r) rl = evas_list_append(rl, r);
-	       }
-	  }
-	if (rl)
-	  {
-	     for (rll = rl; rll; rll = rll->next)
-	       {
-		  r = rll->data;
-		  if ((r->w > 0) && (r->h > 0))
-		    {
-		       int intsec1, intsec2;
+		  int intsec1, intsec2;
+		  int tx, ty, tw, th;
 
-		       intsec1 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, x, y, w, h));
-		       intsec2 = (RECTS_INTERSECT(r->x, r->y, r->w, r->h, xx, yy, ww, hh));
-		       if (intsec1 ^ intsec2)
-			 rects = evas_list_append(rects, r);
-		       else
-			 free(r);
+		  tx = x1[i];
+		  ty = y1[j];
+		  tw = x1[i + 1] - x1[i];
+		  th = y1[j + 1] - y1[j];
+
+		  intsec1 = (RECTS_INTERSECT(tx, ty, tw, th, x, y, w, h));
+		  intsec2 = (RECTS_INTERSECT(tx, ty, tw, th, xx, yy, ww, hh));
+		  if (intsec1 ^ intsec2)
+		    {
+		       evas_add_rect(rects, tx, ty, tw, th);
 		    }
-		  else
-		    free(r);
 	       }
-	     rl = evas_list_free(rl);
 	  }
+/* 	if (tmp.count > 0) */
+/* 	  { */
+/* 	     unsigned int i; */
+
+/* 	     for (i = 0; i < tmp.count; ++i) */
+/* 	       { */
+/* 		  if ((tmp.array[i].w > 0) && (tmp.array[i].h > 0)) */
+/* 		    { */
+/* 		       int intsec1, intsec2; */
+
+/* 		       intsec1 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, x, y, w, h)); */
+/* 		       intsec2 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, xx, yy, ww, hh)); */
+/* 		       if (intsec1 ^ intsec2) */
+/* 			 { */
+/* 			    evas_add_rect(rects, tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h); */
+/* 			 } */
+/* 		    } */
+/* 	       } */
+/* 	     free(tmp.array); */
+/* 	  } */
 
      }
-   return rects;
 }
diff --git a/src/lib/include/evas_inline.x b/src/lib/include/evas_inline.x
index 1f2e24d..28e0a2d 100644
--- a/src/lib/include/evas_inline.x
+++ b/src/lib/include/evas_inline.x
@@ -1,6 +1,50 @@
 #ifndef EVAS_INLINE_H
 #define EVAS_INLINE_H
 
+static inline void
+evas_add_rect(Evas_Rectangles *rects, int x, int y, int w, int h)
+{
+   if ((rects->count + 1) > rects->total)
+     {
+	Evas_Rectangle *_add_rect;
+	unsigned int _tmp_total;
+
+	_tmp_total = rects->total + 32;
+	_add_rect = realloc(rects->array, sizeof(Evas_Rectangle) * _tmp_total);
+	if (!_add_rect) return ;
+
+	rects->total = _tmp_total;
+	rects->array = _add_rect;
+     }
+   rects->array[rects->count].x = x;
+   rects->array[rects->count].y = y;
+   rects->array[rects->count].w = w;
+   rects->array[rects->count].h = h;
+   rects->count += 1;
+}
+
+static inline Cutout_Rect*
+evas_common_draw_context_cutouts_add(Cutout_Rects* rects,
+                                     int x, int y, int w, int h)
+{
+   Cutout_Rect* rect;
+
+   if (rects->max < (rects->active + 1))
+     {
+	rects->max += 32;
+	rects->rects = realloc(rects->rects, sizeof(Cutout_Rect) * rects->max);
+     }
+
+   rect = rects->rects + rects->active;
+   rect->x = x;
+   rect->y = y;
+   rect->w = w;
+   rect->h = h;
+   rects->active++;
+
+   return rect;
+}
+
 static inline int
 evas_object_is_opaque(Evas_Object *obj)
 {
diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h
index 4a2a056..856781b 100644
--- a/src/lib/include/evas_private.h
+++ b/src/lib/include/evas_private.h
@@ -103,6 +103,7 @@ typedef struct _Evas_Intercept_Func_Color   Evas_Intercept_Func_Color;
 typedef struct _Evas_Key_Grab               Evas_Key_Grab;
 typedef struct _Evas_Callbacks              Evas_Callbacks;
 typedef struct _Evas_Format                 Evas_Format;
+typedef struct _Evas_Rectangles             Evas_Rectangles;
 
 #define MAGIC_EVAS          0x70777770
 #define MAGIC_OBJ           0x71777770
@@ -381,6 +382,13 @@ struct _Evas_Layer
    unsigned char     delete_me : 1;
 };
 
+struct _Evas_Rectangles
+{
+   unsigned int    total;
+   unsigned int    count;
+   Evas_Rectangle *array;
+};
+
 struct _Evas_Size
 {
    Evas_Coord w, h;
@@ -696,11 +704,11 @@ void evas_object_free(Evas_Object *obj, int clean_layer);
 void evas_object_inject(Evas_Object *obj, Evas *e);
 void evas_object_release(Evas_Object *obj, int clean_layer);
 void evas_object_change(Evas_Object *obj);
-Evas_List *evas_object_render_pre_visible_change(Evas_List *updates, Evas_Object *obj, int is_v, int was_v);
-Evas_List *evas_object_render_pre_clipper_change(Evas_List *updates, Evas_Object *obj);
-Evas_List *evas_object_render_pre_prev_cur_add(Evas_List *updates, Evas_Object *obj);
-void evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, int is_v, int was_v);
-Evas_List * evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, int ww, int hh);
+void evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_object_render_pre_clipper_change(Evas_Rectangles *rects, Evas_Object *obj);
+void evas_object_render_pre_prev_cur_add(Evas_Rectangles *rects, Evas_Object *obj);
+void evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_rects_return_difference_rects(Evas_Rectangles *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh);
 
 void evas_object_clip_dirty(Evas_Object *obj);
 void evas_object_recalc_clippees(Evas_Object *obj);
-- 
1.5.4.GIT

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to