diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index b6ecc6acdf..ad645fa2f6 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) + 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; } diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index a3b8475380..b5824487f4 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 954958c1f7..da990e8797 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 dccb4dbfc1..4f45e61fa7 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 038d5a3381..93f3c3eec5 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 b0865c5514..3ecd20fe09 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