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);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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); \
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue