* evas: Finally remove as much free/malloc from the render path. Will need certainly
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 15 Apr 2009 13:40:37 +0000 (13:40 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 15 Apr 2009 13:40:37 +0000 (13:40 +0000)
need some tunning on the number of Evas_Rectangle allocated in advance.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@40084 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

15 files changed:
src/lib/canvas/evas_main.c
src/lib/canvas/evas_object_gradient.c
src/lib/canvas/evas_object_gradient2_linear.c
src/lib/canvas/evas_object_gradient2_radial.c
src/lib/canvas/evas_object_image.c
src/lib/canvas/evas_object_line.c
src/lib/canvas/evas_object_main.c
src/lib/canvas/evas_object_polygon.c
src/lib/canvas/evas_object_rectangle.c
src/lib/canvas/evas_object_text.c
src/lib/canvas/evas_object_textblock.c
src/lib/canvas/evas_rectangle.c
src/lib/canvas/evas_render.c
src/lib/include/evas_inline.x
src/lib/include/evas_private.h

index 6c9e57a..873403d 100644 (file)
@@ -94,6 +94,7 @@ evas_new(void)
    eina_array_step_set(&e->obscuring_objects, 16);
    eina_array_step_set(&e->temporary_objects, 16);
    eina_array_step_set(&e->calculate_objects, 16);
+   eina_array_step_set(&e->clip_changes, 16);
 
    return e;
 }
@@ -194,6 +195,7 @@ evas_free(Evas *e)
    eina_array_flush(&e->obscuring_objects);
    eina_array_flush(&e->temporary_objects);
    eina_array_flush(&e->calculate_objects);
+   eina_array_flush(&e->clip_changes);
 
    e->magic = 0;
    free(e);
index 0971457..44b9031 100644 (file)
@@ -901,7 +901,6 @@ evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_gradient_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Gradient *o;
    int is_v, was_v;
 
@@ -992,17 +991,17 @@ evas_object_gradient_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* gradient changed */
    if (o->changed || obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry */
@@ -1011,7 +1010,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
@@ -1027,7 +1026,7 @@ evas_object_gradient_render_pre(Evas_Object *obj)
                                                            obj->cur.cache.clip.h);
    
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 3100556..eb21c7f 100644 (file)
@@ -269,7 +269,6 @@ evas_object_gradient2_linear_render(Evas_Object *obj, void *output, void *contex
 static void
 evas_object_gradient2_linear_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Gradient2_Linear *o;
    Evas_Object_Gradient2 *og;
    int is_v, was_v;
@@ -348,17 +347,17 @@ evas_object_gradient2_linear_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* gradient changed */
    if (o->changed || obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry */
@@ -367,7 +366,7 @@ evas_object_gradient2_linear_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
@@ -383,7 +382,7 @@ evas_object_gradient2_linear_render_pre(Evas_Object *obj)
                                                            obj->cur.cache.clip.h);
    
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 9ca682d..7bdd48c 100644 (file)
@@ -268,7 +268,6 @@ evas_object_gradient2_radial_render(Evas_Object *obj, void *output, void *contex
 static void
 evas_object_gradient2_radial_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Gradient2_Radial *o;
    Evas_Object_Gradient2 *og;
    int is_v, was_v;
@@ -346,17 +345,17 @@ evas_object_gradient2_radial_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* gradient changed */
    if (o->changed || obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry */
@@ -365,7 +364,7 @@ evas_object_gradient2_radial_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* it obviously didn't change - add a NO obscure - this "unupdates"  this */
@@ -381,7 +380,7 @@ evas_object_gradient2_radial_render_pre(Evas_Object *obj)
                                                            obj->cur.cache.clip.h);
    
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 3c588b1..214d388 100644 (file)
@@ -2300,7 +2300,6 @@ evas_object_image_render(Evas_Object *obj, void *output, void *context, void *su
 static void
 evas_object_image_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Image *o;
    int is_v, was_v;
 
@@ -2335,17 +2334,17 @@ evas_object_image_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if (obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        if (!o->pixel_updates) goto done;
      }
    /* if it changed color */
@@ -2354,19 +2353,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        if (!o->pixel_updates) goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        if (!o->pixel_updates) goto done;
      }
    /* if it changed anti_alias */
    if (obj->cur.anti_alias != obj->prev.anti_alias)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        if (!o->pixel_updates) goto done;
      }
    if (o->changed)
@@ -2377,7 +2376,7 @@ evas_object_image_render_pre(Evas_Object *obj)
            ((!o->cur.key) && (o->prev.key))
            )
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             if (!o->pixel_updates) goto done;
          }
        if ((o->cur.image.w != o->prev.image.w) ||
@@ -2386,7 +2385,7 @@ evas_object_image_render_pre(Evas_Object *obj)
            (o->cur.cspace != o->prev.cspace) ||
            (o->cur.smooth_scale != o->prev.smooth_scale))
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             if (!o->pixel_updates) goto done;
          }
        if ((o->cur.border.l != o->prev.border.l) ||
@@ -2394,12 +2393,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))
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             if (!o->pixel_updates) goto done;
          }
        if (o->dirty_pixels)
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             if (!o->pixel_updates) goto done;
          }
      }
@@ -2417,7 +2416,7 @@ evas_object_image_render_pre(Evas_Object *obj)
        (!o->pixel_updates)
        )
      {
-       evas_rects_return_difference_rects(&rects,
+       evas_rects_return_difference_rects(&obj->layer->evas->clip_changes,
                                           obj->cur.geometry.x,
                                           obj->cur.geometry.y,
                                           obj->cur.geometry.w,
@@ -2434,7 +2433,7 @@ evas_object_image_render_pre(Evas_Object *obj)
        (obj->cur.geometry.h != obj->prev.geometry.h))
        )
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        if (!o->pixel_updates) goto done;
      }
    if (o->changed)
@@ -2444,7 +2443,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))
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             if (!o->pixel_updates) goto done;
          }
        if ((o->cur.border.l == 0) &&
@@ -2488,7 +2487,7 @@ evas_object_image_render_pre(Evas_Object *obj)
                            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);
+                           evas_add_rect(&obj->layer->evas->clip_changes, r.x, r.y, r.w, r.h);
                            idy += h;
                         }
                       idx += idw;
@@ -2507,7 +2506,7 @@ evas_object_image_render_pre(Evas_Object *obj)
                  EINA_LIST_FREE(o->pixel_updates, r)
                    eina_mempool_free(_evas_rectangle_mp, 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);
-                 evas_object_render_pre_prev_cur_add(&rects, obj);
+                 evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
                  goto done;
               }
          }
@@ -2523,7 +2522,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(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index d8e810a..b2a1716 100644 (file)
@@ -314,7 +314,6 @@ evas_object_line_render(Evas_Object *obj, void *output, void *context, void *sur
 static void
 evas_object_line_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Line *o;
    int is_v, was_v;
 
@@ -340,29 +339,29 @@ evas_object_line_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) */
    if (obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed anti_alias */
    if (obj->cur.anti_alias != obj->prev.anti_alias)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed color */
@@ -371,7 +370,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -388,11 +387,11 @@ evas_object_line_render_pre(Evas_Object *obj)
         (o->cur.y2 != o->prev.y2)))
        )
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 755672e..07ed7c5 100644 (file)
@@ -94,7 +94,7 @@ evas_object_change(Evas_Object *obj)
 }
 
 void
-evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v)
+evas_object_render_pre_visible_change(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v)
 {
    if (obj->smart.smart) return ;
    if (is_v == was_v) return ;
@@ -117,7 +117,7 @@ evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj,
 }
 
 void
-evas_object_render_pre_clipper_change(Evas_Rectangles *rects, Evas_Object *obj)
+evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj)
 {
    if (obj->smart.smart) return ;
    if (obj->cur.clipper == obj->prev.clipper) return ;
@@ -169,7 +169,7 @@ 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)
+evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj)
 {
    evas_add_rect(rects,
                 obj->cur.geometry.x,
@@ -202,12 +202,13 @@ evas_object_clip_changes_clean(Evas_Object *obj)
 
 
 void
-evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v)
+evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v)
 {
    Evas_Rectangle *r;
    Evas_Object *clipper;
    Eina_List *l;
    unsigned int i;
+   Eina_Array_Iterator it;
    int x, y, w, h;
 
    if (obj->smart.smart) goto end;
@@ -215,13 +216,13 @@ evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj,
    was_v = 0;
    if (!obj->clip.clipees)
      {
-       for (i = 0; i < rects->count; ++i)
+       EINA_ARRAY_ITER_NEXT(rects, i, r, it)
          {
             /* get updates and clip to current clip */
-            x = rects->array[i].x;
-            y = rects->array[i].y;
-            w = rects->array[i].w;
-            h = rects->array[i].h;
+            x = r->x;
+            y = r->y;
+            w = r->w;
+            h = r->h;
             RECTS_CLIP_TO_RECT(x, y, w, h,
                                obj->cur.cache.clip.x,
                                obj->cur.cache.clip.y,
@@ -231,10 +232,10 @@ evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj,
               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 = rects->array[i].x;
-            y = rects->array[i].y;
-            w = rects->array[i].w;
-            h = rects->array[i].h;
+            x = r->x;
+            y = r->y;
+            w = r->w;
+            h = r->h;
             RECTS_CLIP_TO_RECT(x, y, w, h,
                                obj->prev.cache.clip.x,
                                obj->prev.cache.clip.y,
@@ -280,21 +281,15 @@ evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj,
    else
      {
        evas_object_clip_changes_clean(obj);
-       for (i = 0; i < rects->count; ++i)
-         {
-            r = eina_mempool_alloc(_evas_rectangle_mp, sizeof (Evas_Rectangle));
-            if (!r) goto end;
-
-            *r = rects->array[i];
-            obj->clip.changes = eina_list_append(obj->clip.changes, r);
-         }
+       EINA_ARRAY_ITER_NEXT(rects, i, r, it)
+         obj->clip.changes = eina_list_append(obj->clip.changes, r);
+       eina_array_clean(rects);
      }
 
  end:
-   free(rects->array);
-   rects->array = NULL;
-   rects->count = 0;
-   rects->total = 0;
+   EINA_ARRAY_ITER_NEXT(rects, i, r, it)
+     eina_mempool_free(_evas_rectangle_mp, r);
+   eina_array_clean(rects);
 }
 
 int
index a323054..f57b615 100644 (file)
@@ -329,7 +329,6 @@ evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *
 static void
 evas_object_polygon_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Polygon *o;
    int is_v, was_v;
 
@@ -355,23 +354,23 @@ evas_object_polygon_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) */
    if (obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed color */
@@ -380,7 +379,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -392,11 +391,11 @@ evas_object_polygon_render_pre(Evas_Object *obj)
        (obj->cur.geometry.h != obj->prev.geometry.h) ||
        (o->changed))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 7594d80..c95d3e1 100644 (file)
@@ -183,7 +183,6 @@ evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_rectangle_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Rectangle *o;
    int is_v, was_v;
 
@@ -209,23 +208,23 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if ((obj->restack) && (!obj->clip.clipees))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed render op */
    if (obj->cur.render_op != obj->prev.render_op)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed color */
@@ -234,7 +233,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -245,7 +244,7 @@ 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_rects_return_difference_rects(&rects,
+       evas_rects_return_difference_rects(&obj->layer->evas->clip_changes,
                                           obj->cur.geometry.x,
                                           obj->cur.geometry.y,
                                           obj->cur.geometry.w,
@@ -278,7 +277,7 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
                                                            obj->cur.cache.clip.h);
   */
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index d303e8c..1f6d5cb 100644 (file)
@@ -1571,7 +1571,6 @@ evas_object_text_render(Evas_Object *obj, void *output, void *context, void *sur
 static void
 evas_object_text_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Text *o;
    int is_v, was_v;
 
@@ -1597,17 +1596,17 @@ evas_object_text_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) and dont clip anyone */
    if (obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed color */
@@ -1616,7 +1615,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -1627,17 +1626,17 @@ evas_object_text_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    if (obj->cur.render_op != obj->prev.render_op)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    if (obj->cur.scale != obj->prev.scale)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    if (o->changed)
@@ -1667,12 +1666,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)))
          {
-            evas_object_render_pre_prev_cur_add(&rects, obj);
+            evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
             goto done;
          }
      }
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
index 494379c..d98dacc 100644 (file)
@@ -5429,7 +5429,6 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_textblock_render_pre(Evas_Object *obj)
 {
-   Evas_Rectangles rects = { 0, 0, NULL };
    Evas_Object_Textblock *o;
    int is_v, was_v;
 
@@ -5459,7 +5458,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;
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        o->changed = 0;
        is_v = evas_object_is_visible(obj);
        was_v = evas_object_was_visible(obj);
@@ -5468,7 +5467,7 @@ evas_object_textblock_render_pre(Evas_Object *obj)
    if (o->redraw)
      {
        o->redraw = 0;
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        o->changed = 0;
        is_v = evas_object_is_visible(obj);
        was_v = evas_object_was_visible(obj);
@@ -5487,17 +5486,17 @@ evas_object_textblock_render_pre(Evas_Object *obj)
    was_v = evas_object_was_visible(obj);
    if (is_v != was_v)
      {
-       evas_object_render_pre_visible_change(&rects, obj, is_v, was_v);
+       evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, 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 */
-   evas_object_render_pre_clipper_change(&rects, obj);
+   evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, obj);
    /* if we restacked (layer or just within a layer) and don't clip anyone */
    if (obj->restack)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed color */
@@ -5506,7 +5505,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))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    /* if it changed geometry - and obviously not visibility or color */
@@ -5517,23 +5516,22 @@ evas_object_textblock_render_pre(Evas_Object *obj)
        (obj->cur.geometry.w != obj->prev.geometry.w) ||
        (obj->cur.geometry.h != obj->prev.geometry.h))
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        goto done;
      }
    if (o->changed)
      {
-       evas_object_render_pre_prev_cur_add(&rects, obj);
+       evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj);
        o->changed = 0;
      }
    done:
-   evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v);
+   evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, obj, is_v, was_v);
 }
 
 static void
 evas_object_textblock_render_post(Evas_Object *obj)
 {
    Evas_Object_Textblock *o;
-   Evas_Rectangle *r;
 
    /* this moves the current data to the previous state parts of the object */
    /* in whatever way is safest for the object. also if we don't need object */
index 57f2456..d4d986f 100644 (file)
@@ -2,7 +2,7 @@
 #include "evas_private.h"
 
 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_rects_return_difference_rects(Eina_Array *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh)
 {
    if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh))
      {
index 645ad7c..2e4e7ad 100644 (file)
@@ -675,6 +675,7 @@ evas_render_idle_flush(Evas *e)
    eina_array_flush(&e->active_objects);
    eina_array_flush(&e->restack_objects);
    eina_array_flush(&e->render_objects);
+   eina_array_flush(&e->clip_changes);
 
    e->invalidate = 1;
 }
index 410567f..41b7d7b 100644 (file)
@@ -17,25 +17,12 @@ evas_object_was_visible(Evas_Object *obj)
 }
 
 static inline void
-evas_add_rect(Evas_Rectangles *rects, int x, int y, int w, int h)
+evas_add_rect(Eina_Array *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 = (Evas_Rectangle *)realloc(rects->array, sizeof(Evas_Rectangle) * _tmp_total);
-       if (!_add_rect) return ;
+   Evas_Rectangle *r;
 
-       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;
+   NEW_RECT(r, x, y, w, h);
+   if (r) eina_array_push(rects, r);
 }
 
 static inline Cutout_Rect*
index 126b551..efff051 100644 (file)
@@ -299,6 +299,7 @@ struct _Evas
    Eina_Array     obscuring_objects;
    Eina_Array     temporary_objects;
    Eina_Array     calculate_objects;
+   Eina_Array     clip_changes;
 
    int            delete_grabs;
    int            walking_grabs;
@@ -704,11 +705,11 @@ 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);
 void evas_object_clip_changes_clean(Evas_Object *obj);
-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_render_pre_visible_change(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj);
+void evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj);
+void evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v);
+void evas_rects_return_difference_rects(Eina_Array *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);