jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=2b47181f4edaade0d774893d67e9707c6a8141ee
commit 2b47181f4edaade0d774893d67e9707c6a8141ee Author: Jean-Philippe Andre <[email protected]> Date: Tue Oct 6 17:36:29 2015 +0900 Evas render: Fix another bad proxy clipping issue This is an ugly hack to fix an issue reported in D3114. I don't understand how the proposed patch could even fix anything given the current situation. Test case: - Create edje object with textblock inside - Clip out edje object (--> all children become not visible) - Take textblock from edje and set it as source of a proxy - Mark proxy as source_clip Result: Nothing visible. Expected: Proxy should contain the textblock object, since source_clip means we ignore the edje object's clipper, and only care about the textblock's clipper (entire canvas). Here's what was happening: - During a first pass, textblock is not visible, cur->cache.clip is calculated, marked as clip_use=1 with geom 0,0 0x0 - In a second pass, the proxy is rendered, which needs to draw the textblock in a surface. But cache.clip was used and it was wrong. Solution: - Ignore cache.clip when rendering inside a proxy. I'm pretty sure there are other instances where cache.clip will still be a problem. Problem: textblock never called relayout since it was not visible. Conclusion: cache.clip needs to die. It's a legacy optimization that now causes more issues than it fixes. --- src/lib/evas/canvas/evas_render.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 3fe93a0..a47e550 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1234,7 +1234,7 @@ _evas_render_mapped_context_clip_set(Evas_Public_Data *evas, Evas_Object *eo_obj if (proxy_render_data) proxy_src_clip = proxy_render_data->source_clip; - if (proxy_src_clip) + if (proxy_src_clip && !evas->is_frozen) { x = obj->cur->cache.clip.x; y = obj->cur->cache.clip.y; @@ -1249,6 +1249,10 @@ _evas_render_mapped_context_clip_set(Evas_Public_Data *evas, Evas_Object *eo_obj ENFN->context_clip_set(ENDT, ctx, x + off_x, y + off_y, w, h); } + else if (evas->is_frozen) + { + /* can't trust cache.clip here - clip should be in ctx already */ + } else { //FIXME: Consider to clip by the proxy clipper. @@ -1336,14 +1340,31 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, } else if (proxy_src_clip) { - if ((!evas_object_is_visible(eo_obj, obj)) || (obj->clip.clipees) - || (obj->cur->have_clipees) || (obj->no_render)) + if (!evas->is_frozen) /* same as "if (proxy_render_data)" */ { - IFRD(obj->no_render, level, " proxy_src_clip + no_render\n"); - IFRD(obj->clip.clipees || obj->cur->have_clipees, level, " proxy_src_clip + has clippees\n"); - IFRD(!evas_object_is_visible(eo_obj, obj), level, " not visible\n"); - RD(level, "}\n"); - return clean_them; + if ((!evas_object_is_visible(eo_obj, obj)) || (obj->clip.clipees) + || (obj->cur->have_clipees) || (obj->no_render)) + { + IFRD(obj->no_render, level, " no_render\n"); + IFRD(obj->clip.clipees || obj->cur->have_clipees, level, " has clippees\n"); + IFRD(!evas_object_is_visible(eo_obj, obj), level, " not visible\n"); + RD(level, "}\n"); + return clean_them; + } + } + else + { + /* can not trust cache.clip - evas is frozen */ + if (!obj->cur->visible || obj->clip.clipees || obj->no_render || + (!obj->cur->color.a && (obj->cur->render_op == EVAS_RENDER_BLEND))) + { + IFRD(obj->no_render, level, " proxy_src_clip + no_render\n"); + IFRD(obj->clip.clipees || obj->cur->have_clipees, level, " proxy_src_clip + has clippees\n"); + IFRD(!obj->cur->visible, level, " proxy_src_clip + not visible\n"); + IFRD(!obj->cur->color.a && (obj->cur->render_op == EVAS_RENDER_BLEND), level, " proxy_src_clip + 0 alpha\n"); + RD(level, "}\n"); + return clean_them; + } } } else if (!evas_object_is_proxy_visible(eo_obj, obj) || --
