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