hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=eaafb9e4c53863cfd0ae4aaf24f04d333458ff2b
commit eaafb9e4c53863cfd0ae4aaf24f04d333458ff2b Author: Hermet Park <[email protected]> Date: Sun May 10 16:03:10 2020 +0900 canvas render: don't apply mask if the objects in the map. Current mask is shared across the objects hierarchy, children would try to apply this mask on the rendering when it's enabled by the parent. but if the map is enabled from one of parents, children should not apply the parents mask but leaves it to the parent's job. @fix --- src/lib/evas/canvas/evas_render.c | 73 +++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 1d47ba06af..3e71e40af1 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -438,6 +438,18 @@ _evas_render_object_is_mask(Evas_Object_Protected_Data *obj) return EINA_FALSE; } +static inline Evas_Object_Protected_Data * +_evas_mask_owner_get(Evas_Object_Protected_Data *obj) +{ + Evas_Object_Protected_Data *parent = NULL; + + if (!obj->smart.parent) return obj; + parent = efl_data_scope_get(obj->smart.parent, EFL_CANVAS_OBJECT_CLASS); + if (parent->clip.mask != obj->clip.mask) return obj; + + return _evas_mask_owner_get(parent); +} + static void _evas_render_phase1_direct(Evas_Public_Data *e, Eina_Inarray *active_objects, @@ -2145,9 +2157,13 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, if (obj->is_smart) { /* Clipper masks */ - if (obj->cur->clipper && (mapped > 1) && - _evas_render_object_is_mask(obj->cur->clipper)) - _evas_render_mapped_mask(evas, obj, obj->cur->clipper, proxy_render_data, output, ctx, off_x, off_y, level, do_async); + if (obj->cur->clipper && (mapped > 1) && _evas_render_object_is_mask(obj->cur->clipper)) + { + //Apply only owner mask in the map + Evas_Object_Protected_Data *owner = _evas_mask_owner_get(obj); + if (owner == obj || (_evas_render_has_map(owner) && !_evas_render_can_map(owner))) + _evas_render_mapped_mask(evas, obj, obj->cur->clipper, proxy_render_data, output, ctx, off_x, off_y, level, do_async); + } else if (!proxy_src_clip && proxy_render_data) { if (!_proxy_context_clip(evas, ctx, proxy_render_data, obj, off_x, off_y)) @@ -2194,35 +2210,40 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, if (obj->cur->clipper && (mapped > 1)) { - Evas_Object_Protected_Data *mask = obj->clip.mask; - - if (obj->mask->surface != surface) + //Apply only owner mask in the map + Evas_Object_Protected_Data *owner = _evas_mask_owner_get(obj); + if (owner == obj || (_evas_render_has_map(owner) && !_evas_render_can_map(owner))) { - if (proxy_src_clip) + Evas_Object_Protected_Data *mask = obj->clip.mask; + + if (obj->mask->surface != surface) { - if ((_evas_render_has_map(obj) && !_evas_render_can_map(obj)) || - _evas_render_object_is_mask(obj->cur->clipper)) - evas_object_clip_recalc(obj); - _evas_render_mapped_context_clip_set(evas, eo_obj, obj, ctx, - proxy_render_data, - off_x, off_y); + if (proxy_src_clip) + { + if ((_evas_render_has_map(obj) && !_evas_render_can_map(obj)) || + _evas_render_object_is_mask(obj->cur->clipper)) + evas_object_clip_recalc(obj); + _evas_render_mapped_context_clip_set(evas, eo_obj, obj, ctx, + proxy_render_data, + off_x, off_y); + } + else if (proxy_render_data) + { + if (!_proxy_context_clip(evas, ctx, proxy_render_data, obj, off_x, off_y)) + goto on_empty_clip; + } } - else if (proxy_render_data) + else { - if (!_proxy_context_clip(evas, ctx, proxy_render_data, obj, off_x, off_y)) - goto on_empty_clip; + // rendering a mask in its own surface: + // we want to render it fully and clip only at + // clippee (maskee) render time + RD(level, " draw mask\n"); } - } - else - { - // rendering a mask in its own surface: - // we want to render it fully and clip only at - // clippee (maskee) render time - RD(level, " draw mask\n"); - } - /* Clipper masks */ - _evas_render_mapped_mask(evas, obj, mask, proxy_render_data, output, ctx, off_x, off_y, level, do_async); + /* Clipper masks */ + _evas_render_mapped_mask(evas, obj, mask, proxy_render_data, output, ctx, off_x, off_y, level, do_async); + } } #ifdef REND_DBG --
