From: Jean-Philippe Andre Date: Fri, 16 Dec 2016 03:16:01 +0000 (+0900) Subject: evas: Fix masks of masks X-Git-Tag: upstream/1.20.0~2837 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b0c67adb101d7cab029be0b3c3a400c8d95a4aae;p=platform%2Fupstream%2Fefl.git evas: Fix masks of masks Don't ask. This is a world of magic. --- diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index a4b67d8836..795ac3f98e 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -298,6 +298,7 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) { Evas_Object_Protected_Data *parent = efl_data_scope_get(obj->smart.parent, EFL_CANVAS_OBJECT_CLASS); + evas_object_clip_recalc(parent); if (parent->clip.mask) { if (parent->clip.mask != obj->clip.mask) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 85acd3f754..a3b4a14d8f 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -894,10 +894,8 @@ _evas_render_phase1_object_changed_normal(Phase1_Context *p1ctx, RD(level, " skip - not smart, not active or clippees or not relevant\n"); } } - else if (is_active && - _evas_render_object_is_mask(obj) && - (evas_object_is_visible(eo_obj, obj) || - evas_object_was_visible(eo_obj, obj))) + else if (is_active && _evas_render_object_is_mask(obj) && + (obj->cur->visible || obj->prev->visible)) { if (EINA_UNLIKELY(obj->restack)) OBJ_ARRAY_PUSH(p1ctx->restack_objects, obj); @@ -1137,7 +1135,7 @@ _evas_render_phase1_object_process(Phase1_Context *p1ctx, } else if (EINA_UNLIKELY(is_active && _evas_render_object_is_mask(obj) && - evas_object_is_visible(eo_obj, obj))) + obj->cur->visible)) { RD(level, " visible clipper image\n"); OBJ_ARRAY_PUSH(p1ctx->render_objects, obj); @@ -2812,8 +2810,7 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *evas, x = cx; y = cy; w = cw; h = ch; if (((w > 0) && (h > 0)) || (obj->is_smart)) { - Evas_Object_Protected_Data *prev_mask = NULL; - Evas_Object_Protected_Data *mask = NULL; + Evas_Object_Protected_Data *mask; if (!obj->is_smart) { @@ -2835,15 +2832,11 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *evas, ENFN->context_clip_set(ENDT, context, x, y, w, h); - /* Clipper masks */ - if (_evas_render_object_is_mask(obj->cur->clipper)) - mask = obj->cur->clipper; // main object clipped by this mask - else if (obj->clip.mask) - mask = obj->clip.mask; // propagated clip - prev_mask = obj->clip.prev_mask; - + mask = obj->clip.mask; if (mask) { + Evas_Object_Protected_Data *prev_mask = obj->clip.prev_mask; + if (mask->mask->redraw || !mask->mask->surface) evas_render_mask_subrender(obj->layer->evas, mask, prev_mask, 4, do_async); diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index d56d365374..fdf91ddcac 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -245,6 +245,8 @@ evas_object_is_active(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) need to be smarter and only do that when really needed. */ if (obj->proxy->proxies && obj->changed) return 1; + if (obj->mask->is_mask && obj->clip.clipees) + return 1; return 0; }