jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=bff8dcfe213d6a78b3ba0a5eab47c83d6701e30f
commit bff8dcfe213d6a78b3ba0a5eab47c83d6701e30f Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Tue Nov 8 16:22:22 2016 +0900 evas: Fix clipping of masks and masks of masks When an object inside a genlist is masked, scrolling would cause render issues as the mask is not redrawn on move (only the clip geometry is marked as dirty and recalculated, the mask pixels are assumed to be well prepared already). As a result, masked objects in a genlist would not show up properly once you start scrolling. This fixes that by hacking into evas a safety test to avoid unnecessary clipping, and by using parent masks even if they are not the direct clipper. Note that no_render is still quite broken (eg. a no_render mask may cause major issues, even crashes). This reverts 5917b49f594089a3ebc4586d41c29e --- src/lib/evas/canvas/evas_render.c | 44 ++++++++++++++++++++++++-------------- src/lib/evas/include/evas_inline.x | 2 -- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index e4c5533..285a2b9 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1624,6 +1624,8 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, if (obj->map->surface) { + Evas_Object_Protected_Data *mask = obj->clip.mask; + if (obj->cur->clipper) { evas_object_clip_recalc(obj); @@ -1641,10 +1643,9 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, off_y); /* Clipper masks */ - if (_evas_render_object_is_mask(obj->cur->clipper)) + if (mask) { // This path can be hit when we're multiplying masks on top of each other... - Evas_Object_Protected_Data *mask = obj->cur->clipper; RD(level, " has mask: [%p%s%s] redraw:%d sfc:%p\n", mask, mask->name?":":"", mask->name?mask->name:"", mask->mask->redraw, mask->mask->surface); @@ -1769,29 +1770,40 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, if (obj->cur->clipper && (mapped > 1)) { - 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_context_clip(evas, ctx, proxy_render_data, obj, off_x, off_y)) + { + eina_evlog("-render_object", eo_obj, 0.0, NULL); + return clean_them; + } + } } else { - if (!_proxy_context_clip(evas, ctx, proxy_render_data, obj, off_x, off_y)) - { - eina_evlog("-render_object", eo_obj, 0.0, NULL); - return clean_them; - } + // 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 */ - if (_evas_render_object_is_mask(obj->cur->clipper)) + if (mask) { // This path can be hit when we're multiplying masks on top of each other... - Evas_Object_Protected_Data *mask = obj->cur->clipper; RD(level, " has mask: [%p%s%s] redraw:%d sfc:%p\n", mask, mask->name?":":"", mask->name?mask->name:"", mask->mask->redraw, mask->mask->surface); diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index 0fcf8a4..e60431a 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -140,8 +140,6 @@ evas_object_is_source_invisible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro { if (obj->parent_cache.src_invisible_valid) return obj->parent_cache.src_invisible; - if (obj->no_render) - return EINA_TRUE; if ((obj->proxy->proxies || obj->proxy->proxy_textures) && obj->proxy->src_invisible) return 1; if (!obj->smart.parent) return 0; if (obj->mask->is_mask) return 0; --