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);
}
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)
for (i = 0; i < (int)current_desc->map.colors_count; i++)
{
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;
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;
}

View File

@ -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);
}

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_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); \

View File

@ -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;

View File

@ -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 = {

View File

@ -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