Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_object_gradient.c evas_object_image.c evas_object_line.c evas_object_main.c evas_object_polygon.c evas_object_rectangle.c evas_object_text.c evas_object_textblock.c evas_rectangle.c Log Message: cedric rect + arrays patch for reducing allocs =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_gradient.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- evas_object_gradient.c 4 Jun 2008 16:41:16 -0000 1.22 +++ evas_object_gradient.c 7 Jul 2008 21:29:29 -0000 1.23 @@ -902,7 +902,7 @@ 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 @@ 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 @@ (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 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_image.c,v retrieving revision 1.64 retrieving revision 1.65 diff -u -3 -r1.64 -r1.65 --- evas_object_image.c 19 May 2008 03:13:16 -0000 1.64 +++ evas_object_image.c 7 Jul 2008 21:29:29 -0000 1.65 @@ -2074,7 +2074,7 @@ 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 @@ 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 @@ (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 @@ ((!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 @@ (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 @@ (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 @@ (!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 @@ (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 @@ (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 @@ { 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 @@ 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 @@ 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 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_line.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- evas_object_line.c 8 Feb 2008 22:35:19 -0000 1.24 +++ evas_object_line.c 7 Jul 2008 21:29:29 -0000 1.25 @@ -298,7 +298,7 @@ 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 @@ 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 @@ (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 @@ (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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_main.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -3 -r1.72 -r1.73 --- evas_object_main.c 19 Jun 2008 04:09:33 -0000 1.72 +++ evas_object_main.c 7 Jul 2008 21:29:29 -0000 1.73 @@ -85,153 +85,127 @@ 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, @@ -241,7 +215,10 @@ 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, @@ -250,8 +227,6 @@ 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) @@ -294,8 +269,21 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_polygon.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- evas_object_polygon.c 28 Jun 2007 23:22:20 -0000 1.22 +++ evas_object_polygon.c 7 Jul 2008 21:29:29 -0000 1.23 @@ -316,7 +316,7 @@ 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 @@ 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 @@ (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 @@ (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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_rectangle.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- evas_object_rectangle.c 4 Jun 2008 16:41:16 -0000 1.14 +++ evas_object_rectangle.c 7 Jul 2008 21:29:29 -0000 1.15 @@ -162,7 +162,7 @@ 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; @@ -188,23 +188,23 @@ 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 */ @@ -213,7 +213,7 @@ (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 */ @@ -224,17 +224,15 @@ (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, @@ -243,12 +241,6 @@ //// 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 */ @@ -265,7 +257,7 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_text.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -3 -r1.69 -r1.70 --- evas_object_text.c 1 May 2008 05:48:03 -0000 1.69 +++ evas_object_text.c 7 Jul 2008 21:29:29 -0000 1.70 @@ -1541,7 +1541,7 @@ 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 @@ 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 @@ (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 @@ (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 @@ ((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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v retrieving revision 1.151 retrieving revision 1.152 diff -u -3 -r1.151 -r1.152 --- evas_object_textblock.c 28 Jun 2008 10:55:58 -0000 1.151 +++ evas_object_textblock.c 7 Jul 2008 21:29:29 -0000 1.152 @@ -4740,7 +4740,7 @@ 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; @@ -4770,7 +4770,7 @@ 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); @@ -4779,7 +4779,7 @@ 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); @@ -4798,17 +4798,17 @@ 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 */ @@ -4817,7 +4817,7 @@ (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 */ @@ -4828,7 +4828,7 @@ (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) @@ -4842,11 +4842,11 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_rectangle.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_rectangle.c 18 Jun 2005 01:00:30 -0000 1.3 +++ evas_rectangle.c 7 Jul 2008 21:29:29 -0000 1.4 @@ -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 @@ { 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; } ------------------------------------------------------------------------- Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! Studies have shown that voting for your favorite open source project, along with a healthy diet, reduces your potential for chronic lameness and boredom. Vote Now at http://www.sourceforge.net/community/cca08 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs