hermet pushed a commit to branch master.

commit 8cec34d1d45dcbbfc12e04e74760cc995965040d
Author: ChunEon Park <[email protected]>
Date:   Thu Jul 18 20:08:56 2013 +0900

    edje/map - changed data structure from list to array to improve color data 
memory access
---
 src/bin/edje/edje_cc_handlers.c | 43 ++++++++++++++++++++--------------
 src/lib/edje/edje_calc.c        | 51 +++++++++++++++++++++++++++--------------
 src/lib/edje/edje_data.c        |  8 +++++--
 src/lib/edje/edje_load.c        | 10 +++++++-
 src/lib/edje/edje_main.c        |  2 +-
 src/lib/edje/edje_private.h     |  6 +++--
 6 files changed, 80 insertions(+), 40 deletions(-)

diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index b6ecc6a..ad645fa 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -4815,14 +4815,21 @@ static void 
st_collections_group_parts_part_table_items_item_span(void)
    current_item->rowspan = parse_int_range(1, 1, 0xffff);
 }
 
-static Eina_List *
+static Edje_Map_Color **
 _copied_map_colors_get(Edje_Part_Description_Common *parent)
 {
-   Eina_List *colors = NULL;
-   Eina_List *l;
+   Edje_Map_Color **colors;
    Edje_Map_Color *color;
-   EINA_LIST_FOREACH(parent->map.colors, l, color)
+   int i;
+
+   if (parent->map.colors_count == 0) return NULL;
+   colors = (Edje_Map_Color **) malloc(sizeof(Edje_Map_Color **) *
+                                       parent->map.colors_count);
+
+   for (i = 0; i < (int)parent->map.colors_count; i++)
      {
+        color = parent->map.colors[i];
+
         Edje_Map_Color *c = mem_alloc(SZ(Edje_Map_Color));
         if (!color)
           {
@@ -4831,7 +4838,7 @@ _copied_map_colors_get(Edje_Part_Description_Common 
*parent)
              return NULL;
           }
         memcpy(c, color, sizeof(Edje_Map_Color));
-        colors = eina_list_append(colors, c);
+        colors[i] = c;
      }
    return colors;
 }
@@ -8306,6 +8313,7 @@ 
st_collections_group_parts_part_description_map_color(void)
 {
    Edje_Map_Color *color;
    Edje_Map_Color tmp;
+   int i;
 
    check_arg_count(5);
 
@@ -8315,18 +8323,16 @@ 
st_collections_group_parts_part_description_map_color(void)
    tmp.b = parse_int_range(3, 0, 255);
    tmp.a = parse_int_range(4, 0, 255);
 
-   Eina_List *l;
-   Edje_Map_Color *ex_color;
-   EINA_LIST_FOREACH(current_desc->map.colors, l, ex_color)
-     {
-        if (ex_color->idx != tmp.idx) continue;
-        ex_color->r = tmp.r;
-        ex_color->g = tmp.g;
-        ex_color->b = tmp.b;
-        ex_color->a = tmp.a;
+   for (i = 0; i < (int)current_desc->map.colors_count; i++)
+     {
+        color = current_desc->map.colors[i];
+        if (color->idx != tmp.idx) continue;
+        color->r = tmp.r;
+        color->g = tmp.g;
+        color->b = tmp.b;
+        color->a = tmp.a;
         return;
      }
-
    color = mem_alloc(SZ(Edje_Map_Color));
    if (!color)
      {
@@ -8336,8 +8342,11 @@ 
st_collections_group_parts_part_description_map_color(void)
      }
 
    *color = tmp;
-
-   current_desc->map.colors = eina_list_append(current_desc->map.colors, 
color);
+   current_desc->map.colors_count++;
+   current_desc->map.colors =
+      realloc(current_desc->map.colors,
+              sizeof(Edje_Map_Color*) * current_desc->map.colors_count);
+   current_desc->map.colors[current_desc->map.colors_count - 1] = color;
 }
 
 
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index a3b8475..b582448 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -2165,6 +2165,7 @@ _edje_part_recalc_single_map(Edje *ed,
                }
           }
         params_write->colors = desc->map.colors;
+        params_write->colors_count = desc->map.colors_count;
      }
    EINA_COW_CALC_MAP_END(params, params_write);
 }
@@ -2773,25 +2774,31 @@ static Eina_Bool
 map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
                   Edje_Calc_Params_Map *pmap, FLOAT_T pos)
 {
-   Eina_List *l, *l2;
    Edje_Map_Color *col, *col2, *col3;
+   int i, j, idx = 0;
    Eina_Bool matched = EINA_FALSE;
 
-   if (p1->map->colors || p2->map->colors)
+   if ((p1->map->colors_count > 0) || (p2->map->colors_count > 0))
      {
-        EINA_LIST_FOREACH(p1->map->colors, l, col)
+        pmap->colors_count = (p1->map->colors_count > p2->map->colors_count ? 
p1->map->colors_count : p2->map->colors_count);
+
+        pmap->colors = (Edje_Map_Color **) malloc(sizeof(Edje_Map_Color *) * 
(int) pmap->colors_count);
+
+        for (i = 0; i < (int)p1->map->colors_count; i++)
           {
-             col3 = calloc(1, sizeof(Edje_Map_Color));
+             col = p1->map->colors[i];
+             col3 = malloc(sizeof(Edje_Map_Color));
              col3->idx = col->idx;
 
-             EINA_LIST_FOREACH(p2->map->colors, l2, col2)
+             for (j = 0; j < (int)p2->map->colors_count; j++)
                {
+                  col2 = p2->map->colors[j];
                   if (col->idx != col2->idx) continue;
                   col3->r = INTP(col->r, col2->r, pos);
                   col3->g = INTP(col->g, col2->g, pos);
                   col3->b = INTP(col->b, col2->b, pos);
                   col3->a = INTP(col->a, col2->a, pos);
-                  pmap->colors = eina_list_append(pmap->colors, col3);
+                  pmap->colors[idx] = col3;
                   matched = EINA_TRUE;
                   break;
                }
@@ -2801,28 +2808,33 @@ map_colors_interp(Edje_Calc_Params *p1, 
Edje_Calc_Params *p2,
                   col3->g = INTP(col->g, 255, pos);
                   col3->b = INTP(col->b, 255, pos);
                   col3->a = INTP(col->a, 255, pos);
-                  pmap->colors = eina_list_append(pmap->colors, col3);
+                  pmap->colors[idx] = col3;
                }
+             idx++;
              matched = EINA_FALSE;
           }
-        EINA_LIST_FOREACH(p2->map->colors, l, col)
+        for (i = 0; i < (int)p2->map->colors_count; i++)
           {
-             EINA_LIST_FOREACH(p1->map->colors, l2, col2)
+             col = p2->map->colors[i];
+
+             for (j = 0; j < (int)p1->map->colors_count; j++)
                {
+                  col2 = p1->map->colors[j];
                   if (col->idx != col2->idx) continue;
                   matched = EINA_TRUE;
                   break;
                }
              if (!matched)
                {
-                  col3 = calloc(1, sizeof(Edje_Map_Color));
+                  col3 = malloc(sizeof(Edje_Map_Color));
                   col3->idx = col->idx;
                   col3->r = INTP(255, col->r, pos);
                   col3->g = INTP(255, col->g, pos);
                   col3->b = INTP(255, col->b, pos);
                   col3->a = INTP(255, col->a, pos);
-                  pmap->colors = eina_list_append(pmap->colors, col3);
+                  pmap->colors[idx] = col3;
                }
+             idx++;
              matched = EINA_FALSE;
           }
         return EINA_TRUE;
@@ -2837,9 +2849,11 @@ _edje_map_prop_set(Evas_Map *map, const  
Edje_Calc_Params *pf,
                    Edje_Real_Part *ep, Evas_Object *mo,
                    Eina_Bool map_colors_free)
 {
-   Eina_List *colors = pf->map->colors;
+   Edje_Map_Color **colors = pf->map->colors;
+   int colors_cnt = pf->map->colors_count;
+   int i;
+
    Edje_Map_Color *color;
-   Eina_List *l;
 
    evas_map_util_points_populate_from_object(map, ep->object);
 
@@ -2859,7 +2873,7 @@ _edje_map_prop_set(Evas_Map *map, const  Edje_Calc_Params 
*pf,
      }
 
    //map color
-   if (!colors)
+   if (colors_cnt == 0)
      {
         evas_map_point_color_set(map, 0, 255, 255, 255, 255);
         evas_map_point_color_set(map, 1, 255, 255, 255, 255);
@@ -2870,17 +2884,20 @@ _edje_map_prop_set(Evas_Map *map, const  
Edje_Calc_Params *pf,
      {
         if (map_colors_free)
           {
-             EINA_LIST_FREE(colors, color)
+             for (i = 0; i < colors_cnt; i++)
                {
+                  color = (Edje_Map_Color*) colors[i];
                   evas_map_point_color_set(map, color->idx, color->r, color->g,
                                            color->b, color->a);
-                  free(color);
+                  free(colors[i]);
                }
+             free (colors);
           }
         else
           {
-             EINA_LIST_FOREACH(colors, l, color)
+             for (i = 0; i < colors_cnt; i++)
                {
+                  color = (Edje_Map_Color*) colors[i];
                   evas_map_point_color_set(map, color->idx, color->r, color->g,
                                            color->b, color->a);
                }
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index 954958c..da990e8 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -58,6 +58,7 @@ Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_part_limit = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_physics_face = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_map_colors = NULL;
+Eet_Data_Descriptor *_edje_edd_edje_map_colors_pointer = NULL;
 
 #define EMP(Type, Minus)                               \
   EAPI Eina_Mempool *_emp_##Type = NULL;               \
@@ -224,6 +225,7 @@ _edje_edd_shutdown(void)
    FREED(_edje_edd_edje_part_limit);
    FREED(_edje_edd_edje_physics_face);
    FREED(_edje_edd_edje_map_colors);
+   FREED(_edje_edd_edje_map_colors_pointer);
 }
 
 #define EDJE_DEFINE_POINTER_TYPE(Type, Name)                           \
@@ -535,7 +537,8 @@ _edje_edd_init(void)
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.alpha", map.alpha, 
EET_T_UCHAR); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.persp_on", map.persp_on, 
EET_T_UCHAR); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.backcull", map.backcull, 
EET_T_UCHAR); \
-      EET_DATA_DESCRIPTOR_ADD_LIST(Edd, Type, "map.color", map.colors, 
_edje_edd_edje_map_colors); \
+      EDJE_DEFINE_POINTER_TYPE(Map_Color, map_colors); \
+      EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(Edd, Type, "map.color", map.colors, 
_edje_edd_edje_map_colors_pointer); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.zplane", persp.zplane, 
EET_T_INT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", persp.focal, 
EET_T_INT);
 
@@ -622,7 +625,8 @@ _edje_edd_init(void)
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.alpha", Dec.map.alpha, 
EET_T_UCHAR); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.persp_on", 
Dec.map.persp_on, EET_T_UCHAR); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "map.backcull", 
Dec.map.backcull, EET_T_UCHAR); \
-      EET_DATA_DESCRIPTOR_ADD_LIST(Edd, Type, "map.color", Dec.map.colors, 
_edje_edd_edje_map_colors); \
+      EDJE_DEFINE_POINTER_TYPE(Map_Color, map_colors); \
+      EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(Edd, Type, "map.color", 
Dec.map.colors, _edje_edd_edje_map_colors_pointer); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.zplane", 
Dec.persp.zplane, EET_T_INT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", Dec.persp.focal, 
EET_T_INT); \
 
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index dccb4db..4f45e61 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -1629,14 +1629,22 @@ _edje_collection_free(Edje_File *edf, 
Edje_Part_Collection *ec, Edje_Part_Collec
 void
 _edje_collection_free_part_description_clean(int type, 
Edje_Part_Description_Common *desc, Eina_Bool free_strings)
 {
+   unsigned int i;
+
    if (free_strings && desc->color_class) 
eina_stringshare_del(desc->color_class);
+   //clean the map colors
+   if (desc->map.colors)
+     {
+        for (i = 0; i < (int)desc->map.colors_count; i++)
+          free(desc->map.colors[i]);
+        free(desc->map.colors);
+     }
 
    switch (type)
      {
       case EDJE_PART_TYPE_IMAGE:
            {
               Edje_Part_Description_Image *img;
-              unsigned int i;
 
               img = (Edje_Part_Description_Image *) desc;
 
diff --git a/src/lib/edje/edje_main.c b/src/lib/edje/edje_main.c
index 038d5a3..93f3c3e 100644
--- a/src/lib/edje/edje_main.c
+++ b/src/lib/edje/edje_main.c
@@ -14,7 +14,7 @@ Eina_Cow *_edje_calc_params_map_cow = NULL;
 Eina_Cow *_edje_calc_params_physics_cow = NULL;
 
 static const Edje_Calc_Params_Map default_calc_map = {
-  { 0, 0, 0 }, { 0.0, 0.0, 0.0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0 }
+  { 0, 0, 0 }, { 0.0, 0.0, 0.0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0 
}, NULL, 0
 };
 
 static const Edje_Calc_Params_Physics default_calc_physics = {
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index b0865c5..3ecd20f 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -1047,7 +1047,8 @@ struct _Edje_Part_Description_Common
          int id_center;
          FLOAT_T x, y, z;
       } rot;
-      Eina_List *colors;    //Edje_Map_Color, consider to apply Eina_Hash
+      Edje_Map_Color **colors;    /* List of the Edje_Map_Color */
+      unsigned int colors_count;
       Eina_Bool backcull;
       Eina_Bool on;
       Eina_Bool persp_on;
@@ -1372,7 +1373,8 @@ struct _Edje_Calc_Params_Map
       int x, y, z;
       int focal;
    } persp; // 16
-   Eina_List *colors;
+   Edje_Map_Color **colors;
+   unsigned int colors_count;
 };
 
 struct _Edje_Calc_Params_Physics

-- 

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk

Reply via email to