* 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.


SVN revision: 40084
This commit is contained in:
Cedric BAIL 2009-04-15 13:40:37 +00:00
parent ce6094df3f
commit 10a15524cc
15 changed files with 105 additions and 129 deletions

View 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);

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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 */

View 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))
{

View 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;
}

View 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;
Evas_Rectangle *r;
_tmp_total = rects->total + 32;
_add_rect = (Evas_Rectangle *)realloc(rects->array, sizeof(Evas_Rectangle) * _tmp_total);
if (!_add_rect) return ;
rects->total = _tmp_total;
rects->array = _add_rect;
}
rects->array[rects->count].x = x;
rects->array[rects->count].y = y;
rects->array[rects->count].w = w;
rects->array[rects->count].h = h;
rects->count += 1;
NEW_RECT(r, x, y, w, h);
if (r) eina_array_push(rects, r);
}
static inline Cutout_Rect*

View 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);