forked from enlightenment/efl
edje/map - changed data structure from list to array to improve color data memory access
This commit is contained in:
parent
382f3d5d60
commit
8cec34d1d4
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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); \
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue