From d673cbc3982399a11be74a42f909e68b0f380dea Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Wed, 11 Sep 2013 13:00:23 +0100 Subject: [PATCH] Readd the master clip for rendering of wayland engines. NB: Master clip is needed so that things don't draw outside the client area. NB: This is a partial fix. Still a work in progress. Some remaining issues with some various elm_tests that use evas_map. Signed-off-by: Chris Michael --- src/lib/evas/canvas/evas_render.c | 67 +++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 3f8d942aa7..bdf147af1f 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1538,6 +1538,7 @@ evas_render_updates_internal(Evas *eo_e, #ifdef EVAS_RENDER_DEBUG_TIMING double start_time = _time_get(); #endif + Eina_Rectangle clip_rect; MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); return EINA_FALSE; @@ -1582,6 +1583,51 @@ evas_render_updates_internal(Evas *eo_e, &e->render_objects, &redraw_all); + if (!strncmp(e->engine.module->definition->name, "wayland", 7)) + { + /* 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_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)) + { + /* clip this object to the master clip */ + evas_object_clip_set(obj->object, e->framespace.clip); + } + } + } + /* 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); @@ -1914,6 +1960,27 @@ evas_render_updates_internal(Evas *eo_e, } } + if (!strncmp(e->engine.module->definition->name, "wayland", 7)) + { + /* unclip objects from master clip */ + for (i = 0; i < e->render_objects.count; ++i) + { + obj = eina_array_data_get(&e->render_objects, i); + if (obj->is_frame) continue; + if (obj->object == e->framespace.clip) continue; + + if (evas_object_clip_get(obj->object) == e->framespace.clip) + { + /* unclip this object from the master clip */ + evas_object_clip_unset(obj->object); + } + } + + /* delete master clip */ + evas_object_del(e->framespace.clip); + e->framespace.clip = NULL; + } + e->changed = EINA_FALSE; e->viewport.changed = EINA_FALSE; e->output.changed = EINA_FALSE;