From eaafb9e4c53863cfd0ae4aaf24f04d333458ff2b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sun, 10 May 2020 16:03:10 +0900 Subject: [PATCH] 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 | 81 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 30 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) - { - 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 - { - // 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"); - } + Evas_Object_Protected_Data *mask = obj->clip.mask; - /* Clipper masks */ - _evas_render_mapped_mask(evas, obj, mask, proxy_render_data, output, ctx, off_x, off_y, level, do_async); + if (obj->mask->surface != surface) + { + 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 + { + // 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); + } } #ifdef REND_DBG