edje/map - changed data structure from list to array to improve color data memory access

This commit is contained in:
ChunEon Park 2013-07-18 20:08:56 +09:00
parent 382f3d5d60
commit 8cec34d1d4
6 changed files with 79 additions and 39 deletions

View File

@ -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); 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) _copied_map_colors_get(Edje_Part_Description_Common *parent)
{ {
Eina_List *colors = NULL; Edje_Map_Color **colors;
Eina_List *l;
Edje_Map_Color *color; 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)); Edje_Map_Color *c = mem_alloc(SZ(Edje_Map_Color));
if (!color) if (!color)
{ {
@ -4831,7 +4838,7 @@ _copied_map_colors_get(Edje_Part_Description_Common *parent)
return NULL; return NULL;
} }
memcpy(c, color, sizeof(Edje_Map_Color)); memcpy(c, color, sizeof(Edje_Map_Color));
colors = eina_list_append(colors, c); colors[i] = c;
} }
return colors; return colors;
} }
@ -8306,6 +8313,7 @@ st_collections_group_parts_part_description_map_color(void)
{ {
Edje_Map_Color *color; Edje_Map_Color *color;
Edje_Map_Color tmp; Edje_Map_Color tmp;
int i;
check_arg_count(5); 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.b = parse_int_range(3, 0, 255);
tmp.a = parse_int_range(4, 0, 255); tmp.a = parse_int_range(4, 0, 255);
Eina_List *l; for (i = 0; i < (int)current_desc->map.colors_count; i++)
Edje_Map_Color *ex_color;
EINA_LIST_FOREACH(current_desc->map.colors, l, ex_color)
{ {
if (ex_color->idx != tmp.idx) continue; color = current_desc->map.colors[i];
ex_color->r = tmp.r; if (color->idx != tmp.idx) continue;
ex_color->g = tmp.g; color->r = tmp.r;
ex_color->b = tmp.b; color->g = tmp.g;
ex_color->a = tmp.a; color->b = tmp.b;
color->a = tmp.a;
return; return;
} }
color = mem_alloc(SZ(Edje_Map_Color)); color = mem_alloc(SZ(Edje_Map_Color));
if (!color) if (!color)
{ {
@ -8336,8 +8342,11 @@ st_collections_group_parts_part_description_map_color(void)
} }
*color = tmp; *color = tmp;
current_desc->map.colors_count++;
current_desc->map.colors = eina_list_append(current_desc->map.colors, color); 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;
} }

View File

@ -2165,6 +2165,7 @@ _edje_part_recalc_single_map(Edje *ed,
} }
} }
params_write->colors = desc->map.colors; params_write->colors = desc->map.colors;
params_write->colors_count = desc->map.colors_count;
} }
EINA_COW_CALC_MAP_END(params, params_write); 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, map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
Edje_Calc_Params_Map *pmap, FLOAT_T pos) Edje_Calc_Params_Map *pmap, FLOAT_T pos)
{ {
Eina_List *l, *l2;
Edje_Map_Color *col, *col2, *col3; Edje_Map_Color *col, *col2, *col3;
int i, j, idx = 0;
Eina_Bool matched = EINA_FALSE; 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; 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; if (col->idx != col2->idx) continue;
col3->r = INTP(col->r, col2->r, pos); col3->r = INTP(col->r, col2->r, pos);
col3->g = INTP(col->g, col2->g, pos); col3->g = INTP(col->g, col2->g, pos);
col3->b = INTP(col->b, col2->b, pos); col3->b = INTP(col->b, col2->b, pos);
col3->a = INTP(col->a, col2->a, pos); col3->a = INTP(col->a, col2->a, pos);
pmap->colors = eina_list_append(pmap->colors, col3); pmap->colors[idx] = col3;
matched = EINA_TRUE; matched = EINA_TRUE;
break; break;
} }
@ -2801,28 +2808,33 @@ map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
col3->g = INTP(col->g, 255, pos); col3->g = INTP(col->g, 255, pos);
col3->b = INTP(col->b, 255, pos); col3->b = INTP(col->b, 255, pos);
col3->a = INTP(col->a, 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; 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; if (col->idx != col2->idx) continue;
matched = EINA_TRUE; matched = EINA_TRUE;
break; break;
} }
if (!matched) if (!matched)
{ {
col3 = calloc(1, sizeof(Edje_Map_Color)); col3 = malloc(sizeof(Edje_Map_Color));
col3->idx = col->idx; col3->idx = col->idx;
col3->r = INTP(255, col->r, pos); col3->r = INTP(255, col->r, pos);
col3->g = INTP(255, col->g, pos); col3->g = INTP(255, col->g, pos);
col3->b = INTP(255, col->b, pos); col3->b = INTP(255, col->b, pos);
col3->a = INTP(255, col->a, pos); col3->a = INTP(255, col->a, pos);
pmap->colors = eina_list_append(pmap->colors, col3); pmap->colors[idx] = col3;
} }
idx++;
matched = EINA_FALSE; matched = EINA_FALSE;
} }
return EINA_TRUE; 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, Edje_Real_Part *ep, Evas_Object *mo,
Eina_Bool map_colors_free) 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; Edje_Map_Color *color;
Eina_List *l;
evas_map_util_points_populate_from_object(map, ep->object); 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 //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, 0, 255, 255, 255, 255);
evas_map_point_color_set(map, 1, 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) 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, evas_map_point_color_set(map, color->idx, color->r, color->g,
color->b, color->a); color->b, color->a);
free(color); free(colors[i]);
} }
free (colors);
} }
else 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, evas_map_point_color_set(map, color->idx, color->r, color->g,
color->b, color->a); color->b, color->a);
} }

View File

@ -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_part_limit = NULL;
Eet_Data_Descriptor *_edje_edd_edje_physics_face = 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 = NULL;
Eet_Data_Descriptor *_edje_edd_edje_map_colors_pointer = NULL;
#define EMP(Type, Minus) \ #define EMP(Type, Minus) \
EAPI Eina_Mempool *_emp_##Type = NULL; \ EAPI Eina_Mempool *_emp_##Type = NULL; \
@ -224,6 +225,7 @@ _edje_edd_shutdown(void)
FREED(_edje_edd_edje_part_limit); FREED(_edje_edd_edje_part_limit);
FREED(_edje_edd_edje_physics_face); FREED(_edje_edd_edje_physics_face);
FREED(_edje_edd_edje_map_colors); FREED(_edje_edd_edje_map_colors);
FREED(_edje_edd_edje_map_colors_pointer);
} }
#define EDJE_DEFINE_POINTER_TYPE(Type, Name) \ #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.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.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_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.zplane", persp.zplane, EET_T_INT); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", persp.focal, 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.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.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_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.zplane", Dec.persp.zplane, EET_T_INT); \
EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", Dec.persp.focal, EET_T_INT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "persp.focal", Dec.persp.focal, EET_T_INT); \

View File

@ -1629,14 +1629,22 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec, Edje_Part_Collec
void void
_edje_collection_free_part_description_clean(int type, Edje_Part_Description_Common *desc, Eina_Bool free_strings) _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); 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) switch (type)
{ {
case EDJE_PART_TYPE_IMAGE: case EDJE_PART_TYPE_IMAGE:
{ {
Edje_Part_Description_Image *img; Edje_Part_Description_Image *img;
unsigned int i;
img = (Edje_Part_Description_Image *) desc; img = (Edje_Part_Description_Image *) desc;

View File

@ -14,7 +14,7 @@ Eina_Cow *_edje_calc_params_map_cow = NULL;
Eina_Cow *_edje_calc_params_physics_cow = NULL; Eina_Cow *_edje_calc_params_physics_cow = NULL;
static const Edje_Calc_Params_Map default_calc_map = { 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 = { static const Edje_Calc_Params_Physics default_calc_physics = {

View File

@ -1047,7 +1047,8 @@ struct _Edje_Part_Description_Common
int id_center; int id_center;
FLOAT_T x, y, z; FLOAT_T x, y, z;
} rot; } 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 backcull;
Eina_Bool on; Eina_Bool on;
Eina_Bool persp_on; Eina_Bool persp_on;
@ -1372,7 +1373,8 @@ struct _Edje_Calc_Params_Map
int x, y, z; int x, y, z;
int focal; int focal;
} persp; // 16 } persp; // 16
Eina_List *colors; Edje_Map_Color **colors;
unsigned int colors_count;
}; };
struct _Edje_Calc_Params_Physics struct _Edje_Calc_Params_Physics