raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b7d2f4f81468b90a09c977dbefd6f75908719ab9

commit b7d2f4f81468b90a09c977dbefd6f75908719ab9
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Wed Oct 21 20:01:26 2015 +0900

    efl - edje - fix edje calc to avoid eo calls when object doesnt change
    
    in many cases edje dumbly calls eo_do() or evas_object_xxxx on objects
    to set up their porperties when the part never uses that thing at al -
    eg filters. the obnject never had filters and will not have them n3ext
    - why always set filter to null every time? skip when not needed for
    speedups.
    
    so this fixes over-zealous calling whihc adds overhead that is not
    needed causing battery drain and cpu usage, heat creation etc. etc.
    
    @fix
---
 src/lib/edje/edje_calc.c | 41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index 817677c..763c67b 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -2454,7 +2454,7 @@ _edje_part_recalc_single_filter(Edje *ed,
                                 Edje_Part_Description_Common *chosen_desc,
                                 double pos)
 {
-   Edje_Part_Description_Spec_Filter *filter;
+   Edje_Part_Description_Spec_Filter *filter, *prevfilter;
    Eina_List *filter_sources = NULL, *prev_sources = NULL;
    const char *src1, *src2, *part, *code;
    Evas_Object *obj = ep->object;
@@ -2468,6 +2468,7 @@ _edje_part_recalc_single_filter(Edje *ed,
         filter = &chosen_edt->filter;
         prev_sources = edt->filter.sources;
         filter_sources = chosen_edt->filter.sources;
+        prevfilter = &(edt->filter);
      }
    else if (ep->part->type == EDJE_PART_TYPE_IMAGE)
      {
@@ -2476,6 +2477,7 @@ _edje_part_recalc_single_filter(Edje *ed,
         filter = &chosen_edi->filter;
         prev_sources = edi->filter.sources;
         filter_sources = chosen_edi->filter.sources;
+        prevfilter = &(edi->filter);
      }
    else if (ep->part->type == EDJE_PART_TYPE_PROXY)
      {
@@ -2484,6 +2486,7 @@ _edje_part_recalc_single_filter(Edje *ed,
         filter = &chosen_edp->filter;
         prev_sources = edp->filter.sources;
         filter_sources = chosen_edp->filter.sources;
+        prevfilter = &(edp->filter);
      }
    else if (ep->part->type == EDJE_PART_TYPE_SNAPSHOT)
      {
@@ -2492,6 +2495,7 @@ _edje_part_recalc_single_filter(Edje *ed,
         filter = &chosen_eds->filter;
         prev_sources = eds->filter.sources;
         filter_sources = chosen_eds->filter.sources;
+        prevfilter = &(eds->filter);
      }
    else
      {
@@ -2499,6 +2503,8 @@ _edje_part_recalc_single_filter(Edje *ed,
         return;
      }
 
+   if ((!filter->code) && (!prevfilter->code)) return;
+
    /* common code below */
    code = _edje_filter_get(ed, filter);
    if (!code)
@@ -4700,25 +4706,30 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int 
flags, Edje_Calc_Params *sta
           }
         else
           {
-             if (ep->nested_smart) /* Cancel map of smart obj holding nested 
parts */
+             if ((ep->param1.p.mapped) ||
+                 ((ep->param2) && (ep->param2->p.mapped)) ||
+                 ((ep->custom) && (ep->custom->p.mapped)))
                {
-                  eo_do(ep->nested_smart,
-                        evas_obj_map_enable_set(EINA_FALSE),
-                        evas_obj_map_set(NULL));
-               }
-             else
-               {
-#ifdef HAVE_EPHYSICS
-                  if (!ep->body)
+                  if (ep->nested_smart) /* Cancel map of smart obj holding 
nested parts */
+                    {
+                       eo_do(ep->nested_smart,
+                             evas_obj_map_enable_set(EINA_FALSE),
+                             evas_obj_map_set(NULL));
+                    }
+                  else
                     {
+#ifdef HAVE_EPHYSICS
+                       if (!ep->body)
+                         {
 #endif
-                  if (mo)
-                    eo_do(mo,
-                          evas_obj_map_enable_set(0),
-                          evas_obj_map_set(NULL));
+                            if (mo)
+                              eo_do(mo,
+                                    evas_obj_map_enable_set(0),
+                                    evas_obj_map_set(NULL));
 #ifdef HAVE_EPHYSICS
-               }
+                         }
 #endif
+                    }
                }
           }
      }

-- 


Reply via email to