From: cedric Date: Wed, 15 Apr 2009 13:40:37 +0000 (+0000) Subject: * evas: Finally remove as much free/malloc from the render path. Will need certainly X-Git-Tag: accepted/2.0/20130306.225542~242^2~2490 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56173a60cde8f47071eac0d66ad59fdaacf2e462;p=profile%2Fivi%2Fevas.git * evas: Finally remove as much free/malloc from the render path. Will need certainly 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 --- diff --git a/src/lib/canvas/evas_main.c b/src/lib/canvas/evas_main.c index 6c9e57a..873403d 100644 --- a/src/lib/canvas/evas_main.c +++ b/src/lib/canvas/evas_main.c @@ -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); diff --git a/src/lib/canvas/evas_object_gradient.c b/src/lib/canvas/evas_object_gradient.c index 0971457..44b9031 100644 --- a/src/lib/canvas/evas_object_gradient.c +++ b/src/lib/canvas/evas_object_gradient.c @@ -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 diff --git a/src/lib/canvas/evas_object_gradient2_linear.c b/src/lib/canvas/evas_object_gradient2_linear.c index 3100556..eb21c7f 100644 --- a/src/lib/canvas/evas_object_gradient2_linear.c +++ b/src/lib/canvas/evas_object_gradient2_linear.c @@ -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 diff --git a/src/lib/canvas/evas_object_gradient2_radial.c b/src/lib/canvas/evas_object_gradient2_radial.c index 9ca682d..7bdd48c 100644 --- a/src/lib/canvas/evas_object_gradient2_radial.c +++ b/src/lib/canvas/evas_object_gradient2_radial.c @@ -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 diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c index 3c588b1..214d388 100644 --- a/src/lib/canvas/evas_object_image.c +++ b/src/lib/canvas/evas_object_image.c @@ -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 diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c index d8e810a..b2a1716 100644 --- a/src/lib/canvas/evas_object_line.c +++ b/src/lib/canvas/evas_object_line.c @@ -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 diff --git a/src/lib/canvas/evas_object_main.c b/src/lib/canvas/evas_object_main.c index 755672e..07ed7c5 100644 --- a/src/lib/canvas/evas_object_main.c +++ b/src/lib/canvas/evas_object_main.c @@ -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 diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c index a323054..f57b615 100644 --- a/src/lib/canvas/evas_object_polygon.c +++ b/src/lib/canvas/evas_object_polygon.c @@ -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 diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c index 7594d80..c95d3e1 100644 --- a/src/lib/canvas/evas_object_rectangle.c +++ b/src/lib/canvas/evas_object_rectangle.c @@ -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 diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c index d303e8c..1f6d5cb 100644 --- a/src/lib/canvas/evas_object_text.c +++ b/src/lib/canvas/evas_object_text.c @@ -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 diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c index 494379c..d98dacc 100644 --- a/src/lib/canvas/evas_object_textblock.c +++ b/src/lib/canvas/evas_object_textblock.c @@ -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 */ diff --git a/src/lib/canvas/evas_rectangle.c b/src/lib/canvas/evas_rectangle.c index 57f2456..d4d986f 100644 --- a/src/lib/canvas/evas_rectangle.c +++ b/src/lib/canvas/evas_rectangle.c @@ -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)) { diff --git a/src/lib/canvas/evas_render.c b/src/lib/canvas/evas_render.c index 645ad7c..2e4e7ad 100644 --- a/src/lib/canvas/evas_render.c +++ b/src/lib/canvas/evas_render.c @@ -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; } diff --git a/src/lib/include/evas_inline.x b/src/lib/include/evas_inline.x index 410567f..41b7d7b 100644 --- a/src/lib/include/evas_inline.x +++ b/src/lib/include/evas_inline.x @@ -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* diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h index 126b551..efff051 100644 --- a/src/lib/include/evas_private.h +++ b/src/lib/include/evas_private.h @@ -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);