jypark pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=7ce79be1a1748c32c4d0e58358ce2242902cf89b
commit 7ce79be1a1748c32c4d0e58358ce2242902cf89b Author: Ji-Youn Park <jy0703.p...@samsung.com> Date: Thu Sep 8 09:56:30 2016 +0830 evas_render: fix clipping the whole area in each rendering. evas_render should not be going and doing evas_object_clip_set () at all. The framespace clip should be enforced at RENDER time. --- src/lib/evas/canvas/evas_render.c | 84 +++++++++++++------------------------ src/lib/evas/include/evas_private.h | 1 - 2 files changed, 28 insertions(+), 57 deletions(-) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 496c4b2..ff34281 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -184,6 +184,25 @@ _accumulate_time(double before, Eina_Bool async) static int _render_busy = 0; +static inline Eina_Bool +_is_obj_in_framespace(Evas_Object_Protected_Data *obj) +{ + return obj->is_frame; +} + +static inline void +_evas_render_framespace_context_clip_clip(Evas_Public_Data *evas, void *ctx) +{ + int fx, fy, fw, fh; + + fx = evas->framespace.x; + fy = evas->framespace.y; + fw = evas->viewport.w - evas->framespace.w; + fh = evas->viewport.h - evas->framespace.h; + + ENFN->context_clip_clip(ENDT, ctx, fx, fy, fw, fh); +} + static void _evas_render_cleanup(void) { @@ -1620,6 +1639,9 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, } } ENFN->context_clip_clip(ENDT, ctx, ecx, ecy, ecw, ech); + if (!_is_obj_in_framespace(obj)) + _evas_render_framespace_context_clip_clip(evas, ctx); + if (obj->cur->cache.clip.visible || !proxy_src_clip) { ENFN->context_multiplier_unset(ENDT, ctx); @@ -1793,6 +1815,9 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, clipper->cur->cache.clip.w, clipper->cur->cache.clip.h); ENFN->context_clip_set(ENDT, ctx, x + off_x, y + off_y, w, h); + if (!_is_obj_in_framespace(obj)) + _evas_render_framespace_context_clip_clip(evas, ctx); + if (proxy_src_clip) ENFN->context_clip_clip(ENDT, ctx, ecx, ecy, ecw, ech); } @@ -2359,6 +2384,9 @@ evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *e, context, x, y, w, h); + if (!_is_obj_in_framespace(obj)) + _evas_render_framespace_context_clip_clip(e, context); + /* Clipper masks */ if (_evas_render_object_is_mask(obj->cur->clipper)) mask = obj->cur->clipper; // main object clipped by this mask @@ -2458,7 +2486,6 @@ evas_render_updates_internal(Evas *eo_e, Evas_Render_Mode render_mode = !do_async ? EVAS_RENDER_MODE_SYNC : EVAS_RENDER_MODE_ASYNC_INIT; - Eina_Rectangle clip_rect; MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); return EINA_FALSE; @@ -2520,57 +2547,6 @@ evas_render_updates_internal(Evas *eo_e, eina_evlog("-render_phase1", eo_e, 0.0, NULL); } - if (!strncmp(e->engine.module->definition->name, "wayland", 7)) - { - evas_event_freeze(eo_e); - /* check for master clip */ - if (!e->framespace.clip) - { - e->framespace.clip = evas_object_rectangle_add(eo_e); - evas_object_color_set(e->framespace.clip, 255, 255, 255, 255); - evas_object_move(e->framespace.clip, 0, 0); - evas_object_resize(e->framespace.clip, - e->viewport.w - e->framespace.w, - e->viewport.h - e->framespace.h); - evas_object_pass_events_set(e->framespace.clip, EINA_TRUE); - evas_object_layer_set(e->framespace.clip, EVAS_LAYER_MIN); - evas_object_show(e->framespace.clip); - } - - /* setup master clip rectangle for comparison to objects */ - EINA_RECTANGLE_SET(&clip_rect, e->framespace.x, e->framespace.y, - e->viewport.w - e->framespace.w, - e->viewport.h - e->framespace.h); - - for (i = 0; i < e->render_objects.count; ++i) - { - Eina_Rectangle obj_rect; - - obj = eina_array_data_get(&e->render_objects, i); - if (obj->delete_me) continue; - if (obj->is_frame) continue; - if (obj->object == e->framespace.clip) continue; - - /* setup object rectangle for comparison to clip rectangle */ - EINA_RECTANGLE_SET(&obj_rect, - obj->cur->geometry.x, obj->cur->geometry.y, - obj->cur->geometry.w, obj->cur->geometry.h); - - /* check if this object intersects with the master clip */ - if (!eina_rectangles_intersect(&clip_rect, &obj_rect)) - continue; - - if ((!evas_object_clip_get(obj->object)) && (!obj->smart.parent)) - { - /* clip this object to the master clip */ - evas_object_clip_set(obj->object, e->framespace.clip); - } - } - if (!evas_object_clipees_has(e->framespace.clip)) - evas_object_hide(e->framespace.clip); - evas_event_thaw(eo_e); - } - /* phase 1.5. check if the video should be inlined or stay in their overlay */ alpha = e->engine.func->canvas_alpha_get(e->engine.data.output, e->engine.data.context); @@ -2633,10 +2609,6 @@ evas_render_updates_internal(Evas *eo_e, ERR("viewport size != output size!"); } - if (e->framespace.clip && (e->framespace.changed || e->viewport.changed)) - evas_object_resize(e->framespace.clip, - e->viewport.w - e->framespace.w, - e->viewport.h - e->framespace.h); if (e->framespace.changed) { /* NB: If the framespace changes, we need to add a redraw rectangle diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 2b6c8df..dfa0488 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -820,7 +820,6 @@ struct _Evas_Public_Data { Evas_Coord x, y, w, h; Eina_Bool changed : 1; - Evas_Object *clip; } framespace; Eina_List *damages; --