From 59cb177b4bcc5eae7290ce6c7e39081c6c925a32 Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Mon, 25 Nov 2013 10:09:34 +0900 Subject: [PATCH] evas - fix proxy render to update the proxies recursively. If a proxy has proxies, all the chained proxies should be updated recursively. --- ChangeLog | 5 +++ NEWS | 2 ++ src/lib/evas/canvas/evas_render.c | 66 +++++++++++++++++++++------------------ 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index de43e9e..1763750 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-11-25 ChunEon Park (Hermet) + + * Evas: Fix proxy render to update the proxies recursively. If a proxy + has proxies, all the chainged proxies should be updated recursively. + 2013-11-21 ChunEon Park (Hermet) * Edje: Fix to update map-enabled part when the edje object is moved. diff --git a/NEWS b/NEWS index cdb7d7d..9660f57 100644 --- a/NEWS +++ b/NEWS @@ -362,6 +362,8 @@ Fixes: - Fixed the textblock format to be drawn according to the glyph's horizontal advance width. - Fixed the textblock set to context with the textblock object's render operation. - Evas textblock: Fixed order of tags inserted with markup_app/prepend. + - Fix proxy render to update the proxies recursively. If a proxy has proxies, all the chainged proxies should be updated recursively. + * Ecore: - Don't leak fd on exec. - Fix fd handler increase issue when ecore_pipe_add/del is called repeatedly. diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 4a3a4e1..18d196f 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -284,6 +284,35 @@ _evas_render_cur_clip_cache_del(Evas_Public_Data *e, Evas_Object_Protected_Data } static void +_evas_proxy_redraw_set(Evas_Public_Data *e, Evas_Object_Protected_Data *obj, + Eina_Bool render) +{ + Evas_Object *eo_proxy; + Evas_Object_Protected_Data *proxy; + Eina_List *l; + + EINA_LIST_FOREACH(obj->proxy->proxies, l, eo_proxy) + { + proxy = eo_data_scope_get(eo_proxy, EVAS_OBJ_CLASS); + + /* Flag need redraw on proxy too */ + EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, proxy->proxy, + Evas_Object_Proxy_Data, proxy_write) + proxy_write->redraw = EINA_TRUE; + EINA_COW_WRITE_END(evas_object_proxy_cow, proxy->proxy, proxy_write); + + if (render) + { + proxy->func->render_pre(eo_proxy, proxy, proxy->private_data); + _evas_render_prev_cur_clip_cache_add(e, proxy); + } + + //Update the proxies recursively. + _evas_proxy_redraw_set(e, proxy, render); + } +} + +static void _evas_render_phase1_direct(Evas_Public_Data *e, Eina_Array *active_objects, Eina_Array *restack_objects EINA_UNUSED, @@ -291,8 +320,7 @@ _evas_render_phase1_direct(Evas_Public_Data *e, Eina_Array *render_objects) { unsigned int i; - Eina_List *l; - Evas_Object *eo_proxy; + Evas_Object *eo_obj; Eina_Bool changed; RD(" [--- PHASE 1 DIRECT\n"); @@ -308,37 +336,23 @@ _evas_render_phase1_direct(Evas_Public_Data *e, changed = evas_object_smart_changed_get(obj->object); else changed = obj->changed; - if (changed) - { - /* Flag need redraw on proxy too */ - EINA_LIST_FOREACH(obj->proxy->proxies, l, eo_proxy) - { - Evas_Object_Protected_Data *proxy; - proxy = eo_data_scope_get(eo_proxy, EVAS_OBJ_CLASS); - - EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, proxy->proxy, - Evas_Object_Proxy_Data, proxy_write) - proxy_write->redraw = EINA_TRUE; - EINA_COW_WRITE_END(evas_object_proxy_cow, proxy->proxy, - proxy_write); - } - } + if (changed) _evas_proxy_redraw_set(e, obj, EINA_FALSE); } for (i = 0; i < render_objects->count; i++) { - Evas_Object *eo_obj; - - Evas_Object_Protected_Data *obj = eina_array_data_get(render_objects, i); + Evas_Object_Protected_Data *obj = + eina_array_data_get(render_objects, i); eo_obj = obj->object; + RD(" OBJ [%p", obj); if (obj->name) { RD(":%s", obj->name); } RD("] changed %i\n", obj->changed); + if (obj->changed) { - /* Flag need redraw on proxy too */ evas_object_clip_recalc(obj); obj->func->render_pre(eo_obj, obj, obj->private_data); if (obj->proxy->redraw) @@ -352,15 +366,7 @@ _evas_render_phase1_direct(Evas_Public_Data *e, proxy_write->redraw = EINA_TRUE; EINA_COW_WRITE_END(evas_object_proxy_cow, obj->proxy, proxy_write); - - EINA_LIST_FOREACH(obj->proxy->proxies, l, eo_proxy) - { - Evas_Object_Protected_Data *proxy = - eo_data_scope_get(eo_proxy, EVAS_OBJ_CLASS); - proxy->func->render_pre(eo_proxy, - proxy, proxy->private_data); - _evas_render_prev_cur_clip_cache_add(e, proxy); - } + _evas_proxy_redraw_set(e, obj, EINA_TRUE); } } -- 2.7.4