* 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:
parent
ce6094df3f
commit
10a15524cc
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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*
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue