fix freeze/thaw to use less ... cpu.
authorraster <raster>
Mon, 15 Feb 2010 06:40:58 +0000 (06:40 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 15 Feb 2010 06:40:58 +0000 (06:40 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@46181 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/edje_calc.c
src/lib/edje_load.c
src/lib/edje_private.h
src/lib/edje_util.c

index 05f4946..1402355 100644 (file)
@@ -197,7 +197,15 @@ _edje_recalc(Edje *ed)
        ed->recalc = 1;
        if (!ed->calc_only)
          {
-            if (_edje_freeze_val > 0) _edje_freeze_calc_count++;
+            if (_edje_freeze_val > 0)
+               {
+                  if (!ed->freeze_calc)
+                    {
+                       _edje_freeze_calc_count++;
+                       _edje_freeze_calc_list = eina_list_append(_edje_freeze_calc_list, ed);
+                       ed->freeze_calc = 1;
+                    }
+               }
             return;
          }
      }
index 3fdda4b..6022b79 100644 (file)
@@ -828,6 +828,12 @@ _edje_swallows_collect(Edje *ed)
 void
 _edje_file_del(Edje *ed)
 {
+   if (ed->freeze_calc)
+     {
+        _edje_freeze_calc_list = eina_list_remove(_edje_freeze_calc_list, ed);
+        ed->freeze_calc = 0;
+        _edje_freeze_calc_count--;
+     }
    _edje_message_del(ed);
    _edje_block_violate(ed);
    _edje_var_shutdown(ed);
index 137d9e3..2e6b414 100644 (file)
@@ -778,22 +778,23 @@ struct _Edje
 
    int                  preload_count;
 
-   unsigned short        dirty : 1;
-   unsigned short        recalc : 1;
-   unsigned short        walking_callbacks : 1;
-   unsigned short        delete_callbacks : 1;
-   unsigned short        just_added_callbacks : 1;
-   unsigned short        have_objects : 1;
-   unsigned short        paused : 1;
-   unsigned short        no_anim : 1;
-   unsigned short        calc_only : 1;
-   unsigned short        walking_actions : 1;
-   unsigned short        block_break : 1;
-   unsigned short        delete_me : 1;
-   unsigned short        postponed : 1;
+   unsigned int          dirty : 1;
+   unsigned int          recalc : 1;
+   unsigned int          walking_callbacks : 1;
+   unsigned int          delete_callbacks : 1;
+   unsigned int          just_added_callbacks : 1;
+   unsigned int          have_objects : 1;
+   unsigned int          paused : 1;
+   unsigned int          no_anim : 1;
+   unsigned int          calc_only : 1;
+   unsigned int          walking_actions : 1;
+   unsigned int          block_break : 1;
+   unsigned int          delete_me : 1;
+   unsigned int          postponed : 1;
+   unsigned int          freeze_calc : 1;
 #ifdef EDJE_CALC_CACHE
-   unsigned short        text_part_change : 1;
-   unsigned short        all_part_change : 1;
+   unsigned int          text_part_change : 1;
+   unsigned int          all_part_change : 1;
 #endif
    lua_State *L;
 };
@@ -1169,6 +1170,7 @@ extern char            *_edje_fontset_append;
 extern FLOAT_T          _edje_scale;
 extern int              _edje_freeze_val;
 extern int              _edje_freeze_calc_count;
+extern Eina_List       *_edje_freeze_calc_list;
 
 extern Eina_Mempool *_edje_real_part_mp;
 extern Eina_Mempool *_edje_real_part_state_mp;
index d30ca6d..5aa4578 100644 (file)
@@ -30,6 +30,7 @@ char *_edje_fontset_append = NULL;
 FLOAT_T _edje_scale = ZERO;
 int _edje_freeze_val = 0;
 int _edje_freeze_calc_count = 0;
+Eina_List *_edje_freeze_calc_list = NULL;
 
 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
 struct _Edje_List_Foreach_Data
@@ -46,7 +47,7 @@ Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
 
 /************************** API Routines **************************/
 
-//#define FASTFREEZE 1
+#define FASTFREEZE 1
 
 /**
  * @brief Freeze Edje objects.
@@ -114,15 +115,13 @@ edje_thaw(void)
    INF("fr -- ->%i", _edje_freeze_val);
    if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
      {
-       Eina_List *l;
+        Edje *ed;
 
        _edje_freeze_calc_count = 0;
-       EINA_LIST_FOREACH(_edje_edjes, l, data)
+       EINA_LIST_FREE(_edje_freeze_calc_list, ed)
          {
-            Edje *ed;
-
-            ed = _edje_fetch(data);
-            if (ed) _edje_thaw_edje(ed);
+            _edje_thaw_edje(ed);
+             ed->freeze_calc = 0;
          }
      }
 #else