raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=8767a80b0dbda4e2c3a6b2a41a04bf35f43a3ed1
commit 8767a80b0dbda4e2c3a6b2a41a04bf35f43a3ed1 Author: Carsten Haitzler (Rasterman) <[email protected]> Date: Wed Apr 16 16:14:16 2014 +0900 fix overdraw issue in evas when clips change the comments say it all. this stops adding massive full window updates when clippers lose all children (and are visible) or gain a first child while visible as all code hides these clip rects (or shows them) in these cases and other usages just make no sense. --- src/lib/evas/canvas/evas_clip.c | 14 ++++++++++++-- src/lib/evas/canvas/evas_object_rectangle.c | 13 +++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c index 33c2d6f..20c302c 100644 --- a/src/lib/evas/canvas/evas_clip.c +++ b/src/lib/evas/canvas/evas_clip.c @@ -264,7 +264,9 @@ _evas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object * state_write->have_clipees = 0; } EINA_COW_STATE_WRITE_END(obj->cur->clipper, state_write, cur); - +/* i know this was to handle a case where a clip stops having children and + * becomes a solid colored box - no one ever does that... they hide the clip + * so dont add damages if ((obj->cur->clipper->cur) && (obj->cur->clipper->cur->visible)) { if (obj->cur->clipper->layer) @@ -277,6 +279,7 @@ _evas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object * obj->cur->clipper->cur->geometry.h); } } + */ } evas_object_change(obj->cur->clipper->object, obj->cur->clipper); evas_object_change(eo_obj, obj); @@ -294,10 +297,14 @@ _evas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object * clip->changed = 1; e = clip->layer->evas; e->changed = 1; +/* i know this was to handle a case where a clip starts having children and + * stops being a solid colored box - no one ever does that... they hide the clp + * so dont add damages evas_damage_rectangle_add(e->evas, clip->cur->geometry.x + e->framespace.x, clip->cur->geometry.y + e->framespace.y, clip->cur->geometry.w, clip->cur->geometry.h); + */ } EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) { @@ -376,7 +383,9 @@ _evas_object_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj) state_write->have_clipees = 0; } EINA_COW_STATE_WRITE_END(obj->cur->clipper, state_write, cur); - +/* i know this was to handle a case where a clip stops having children and + * becomes a solid colored box - no one ever does that... they hide the clip + * so dont add damages if ((obj->cur->clipper->cur) && (obj->cur->clipper->cur->visible)) { if (obj->cur->clipper->layer) @@ -389,6 +398,7 @@ _evas_object_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj) obj->cur->clipper->cur->geometry.h); } } + */ } evas_object_change(obj->cur->clipper->object, obj->cur->clipper); } diff --git a/src/lib/evas/canvas/evas_object_rectangle.c b/src/lib/evas/canvas/evas_object_rectangle.c index 192895f..6903b3a 100644 --- a/src/lib/evas/canvas/evas_object_rectangle.c +++ b/src/lib/evas/canvas/evas_object_rectangle.c @@ -242,8 +242,8 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, /* it obviously didn't change - add a NO obscure - this "unupdates" this */ /* area so if there were updates for it they get wiped. don't do it if we */ /* arent fully opaque and we are visible */ - if (evas_object_is_visible(eo_obj) && - evas_object_is_opaque(eo_obj) && + if (evas_object_is_visible(eo_obj, obj) && + evas_object_is_opaque(eo_obj, obj) && (!obj->clip.clipees)) { Evas_Coord x, y, w, h; @@ -260,10 +260,11 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, obj->cur->clipper->cur->cache.clip.w, obj->cur->clipper->cur->cache.clip.h); } - e->engine.func->output_redraws_rect_del(e->engine.data.output, - x + e->framespace.x, - y + e->framespace.y, - w, h); + obj->layer->evas->engine.func->output_redraws_rect_del + (obj->layer->evas->engine.data.output, + x + obj->layer->evas->framespace.x, + y + obj->layer->evas->framespace.y, + w, h); } done: evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v); --
