ulisses pushed a commit to branch master.

commit 31b1cc6e3e158e9f47c4395888be9b227e172807
Author: Ulisses Furquim <[email protected]>
Date:   Mon Sep 2 19:38:52 2013 -0300

    evas/render: introduce evas_render_sync().
    
    evas_render_sync() will loop through all canvases and wait for their
    rendering to finish. Since this function will execute from the main
    thread that will sync all of them.
---
 src/lib/evas/canvas/evas_main.c            | 10 ++++++++++
 src/lib/evas/canvas/evas_render.c          | 15 +++++++++++++++
 src/lib/evas/include/evas_common_private.h |  1 +
 src/lib/evas/include/evas_private.h        |  2 ++
 4 files changed, 28 insertions(+)

diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 0d13a27..23d8f32 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -16,8 +16,11 @@ EAPI Eina_Bool lockdebug = EINA_FALSE;
 EAPI int lockmax = 0;
 #endif
 
+Eina_List *all_evases = NULL;
+
 static int _evas_init_count = 0;
 int _evas_log_dom_global = -1;
+
 EAPI int
 evas_init(void)
 {
@@ -108,6 +111,9 @@ evas_shutdown(void)
    evas_object_image_load_opts_cow = NULL;
    evas_object_image_state_cow = NULL;
 
+   eina_list_free(all_evases);
+   all_evases = NULL;
+
    evas_thread_shutdown();
    _evas_preload_thread_shutdown();
    evas_async_events_shutdown();
@@ -171,6 +177,8 @@ _constructor(Eo *eo_obj, void *class_data, va_list *list 
EINA_UNUSED)
    EVAS_ARRAY_SET(e, texts_unref_queue);
 
 #undef EVAS_ARRAY_SET
+
+   all_evases = eina_list_append(all_evases, e);
 }
 
 EAPI void
@@ -266,6 +274,8 @@ _destructor(Eo *eo_e, void *_pd, va_list *list EINA_UNUSED)
 
    if (e->engine.module) evas_module_unref(e->engine.module);
 
+   all_evases = eina_list_remove(all_evases, e);
+
    eina_array_flush(&e->delete_objects);
    eina_array_flush(&e->active_objects);
    eina_array_flush(&e->restack_objects);
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index bd0c715..10b81a1 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -1473,6 +1473,21 @@ evas_render_rendering_wait(Evas_Public_Data *evas)
    while (evas->rendering) evas_async_events_process_blocking();
 }
 
+/* syncs ALL async rendering canvases */
+void
+evas_render_sync(void)
+{
+   Eina_List *l;
+   void *d;
+
+   EINA_LIST_FOREACH(all_evases, l, d)
+     {
+        Evas_Public_Data *e = d;
+        if (!e->rendering) continue;
+        evas_render_rendering_wait(e);
+     }
+}
+
 static Eina_Bool
 _drop_scie_ref(const void *container EINA_UNUSED, void *data, void *fdata 
EINA_UNUSED)
 {
diff --git a/src/lib/evas/include/evas_common_private.h 
b/src/lib/evas/include/evas_common_private.h
index 24c9d87..c4728bd 100644
--- a/src/lib/evas/include/evas_common_private.h
+++ b/src/lib/evas/include/evas_common_private.h
@@ -1248,6 +1248,7 @@ void              evas_font_dir_cache_free(void);
 
 EAPI int          evas_async_events_process_blocking(void);
 void             evas_render_rendering_wait(Evas_Public_Data *evas);
+void              evas_render_sync(void);
 
 void              evas_thread_init(void);
 void              evas_thread_shutdown(void);
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 5a9867b..f8daeaf 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -443,6 +443,8 @@ struct _Evas_Public_Data
    Eina_Bool      rendering : 1;
 };
 
+extern Eina_List *all_evases;
+
 struct _Evas_Layer
 {
    EINA_INLIST;

-- 

------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk

Reply via email to