From 4e30cb241194ced22e58125dcd61c2c857776ddc Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 29 Jun 2010 13:48:03 +0000 Subject: [PATCH] * edje: move structure from Eina_List to array now that Eet support them. SVN revision: 49936 --- legacy/edje/src/bin/edje_cc_handlers.c | 10 +- legacy/edje/src/bin/edje_decc.c | 2 +- legacy/edje/src/lib/edje_calc.c | 4 +- legacy/edje/src/lib/edje_convert.c | 109 ++++++++++- legacy/edje/src/lib/edje_convert.h | 27 ++- legacy/edje/src/lib/edje_data.c | 17 +- legacy/edje/src/lib/edje_edit.c | 245 ++++++++++++------------- legacy/edje/src/lib/edje_load.c | 30 ++- legacy/edje/src/lib/edje_private.h | 20 +- 9 files changed, 291 insertions(+), 173 deletions(-) diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index 3e7d9fd441..438cf3789c 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -846,7 +846,7 @@ st_externals_external(void) check_arg_count(1); if (!edje_file->external_dir) - edje_file->external_dir = mem_alloc(SZ(Edje_External_Directory)); + edje_file->external_dir = mem_alloc(SZ(Old_Edje_External_Directory)); ex = mem_alloc(SZ(External)); ex->name = parse_str(0); @@ -934,7 +934,7 @@ st_images_image(void) int v; if (!edje_file->image_dir) - edje_file->image_dir = mem_alloc(SZ(Edje_Image_Directory)); + edje_file->image_dir = mem_alloc(SZ(Old_Edje_Image_Directory)); img = mem_alloc(SZ(Edje_Image_Directory_Entry)); img->entry = parse_str(0); { @@ -945,7 +945,7 @@ st_images_image(void) { if (!strcmp(limg->entry, img->entry)) { - free(img->entry); + free((char*) img->entry); free(img); return; } @@ -1027,7 +1027,7 @@ ob_images_set(void) Edje_Image_Directory_Set *set; if (!edje_file->image_dir) - edje_file->image_dir = mem_alloc(SZ(Edje_Image_Directory)); + edje_file->image_dir = mem_alloc(SZ(Old_Edje_Image_Directory)); set = mem_alloc(SZ(Edje_Image_Directory_Set)); set->id = eina_list_count(edje_file->image_dir->sets); edje_file->image_dir->sets = eina_list_append(edje_file->image_dir->sets, set); @@ -1163,7 +1163,7 @@ st_fonts_font(void) check_arg_count(2); if (!edje_file->font_dir) - edje_file->font_dir = mem_alloc(SZ(Edje_Font_Directory)); + edje_file->font_dir = mem_alloc(SZ(Old_Edje_Font_Directory)); fn = mem_alloc(SZ(Font)); fn->file = parse_str(0); diff --git a/legacy/edje/src/bin/edje_decc.c b/legacy/edje/src/bin/edje_decc.c index 387a8736c6..d509200e28 100644 --- a/legacy/edje/src/bin/edje_decc.c +++ b/legacy/edje/src/bin/edje_decc.c @@ -27,7 +27,7 @@ char *progname = NULL; char *file_in = NULL; char *file_out = NULL; -Edje_File *edje_file = NULL; +Old_Edje_File *edje_file = NULL; SrcFile_List *srcfiles = NULL; Font_List *fontlist = NULL; diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index d52757f2bb..f112d16ca5 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -1549,7 +1549,7 @@ _edje_image_find(Evas_Object *obj, Edje *ed, Edje_Real_Part_Set **eps, Edje_Part } if (!set) - set = eina_list_nth(ed->file->image_dir->sets, id); + set = ed->file->image_dir->sets + id; EINA_LIST_FOREACH(set->entries, l, entry) { @@ -1607,7 +1607,7 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj Edje_Image_Directory_Entry *ie; if (!ed->file->image_dir) ie = NULL; - else ie = eina_list_nth(ed->file->image_dir->entries, (-image_id) - 1); + else ie = ed->file->image_dir->entries + (-image_id) - 1; if ((ie) && (ie->source_type == EDJE_IMAGE_SOURCE_TYPE_EXTERNAL) && (ie->entry)) diff --git a/legacy/edje/src/lib/edje_convert.c b/legacy/edje/src/lib/edje_convert.c index 8a444899a9..f088675d7d 100644 --- a/legacy/edje/src/lib/edje_convert.c +++ b/legacy/edje/src/lib/edje_convert.c @@ -59,6 +59,93 @@ _edje_collection_string_free(void *data) free(ce); } +static Eina_Bool +_edje_file_convert_external(Edje_File *edf, Old_Edje_File *oedf) +{ + Edje_External_Directory_Entry *ede; + unsigned int max; + unsigned int i = 0; + + edf->external_dir = calloc(1, sizeof (Edje_External_Directory)); + if (!edf->external_dir) return EINA_FALSE; + if (!oedf->external_dir) return EINA_TRUE; + + max = eina_list_count(oedf->external_dir->entries); + edf->external_dir->entries = calloc(1, sizeof (Edje_External_Directory_Entry) * max); + edf->external_dir->entries_count = max; + + if (!edf->external_dir->entries && max) + return EINA_FALSE; + + EINA_LIST_FREE(oedf->external_dir->entries, ede) + { + edf->external_dir->entries[i++].entry = ede->entry; + free(ede); + } + + free(oedf->external_dir); + oedf->external_dir = NULL; + + return EINA_TRUE; +} + +static Eina_Bool +_edje_file_convert_images(Edje_File *edf, Old_Edje_File *oedf) +{ + Edje_Image_Directory_Entry *de; + Edje_Image_Directory_Set *ds; + Eina_List *l; + int max; + + edf->image_dir = malloc(sizeof (Edje_Image_Directory)); + if (!edf->image_dir) return EINA_FALSE; + if (!oedf->image_dir) return EINA_TRUE; + + max = -1; + EINA_LIST_FOREACH(oedf->image_dir->entries, l, de) + if (max < de->id) + max = de->id; + + edf->image_dir->entries = calloc(1, sizeof (Edje_Image_Directory_Entry) * (max + 1)); + edf->image_dir->entries_count = max + 1; + + if (!edf->image_dir->entries && edf->image_dir->entries_count) + return EINA_FALSE; + + EINA_LIST_FREE(oedf->image_dir->entries, de) + { + memcpy(edf->image_dir->entries + de->id, + de, + sizeof (Edje_Image_Directory_Entry)); + free(de); + } + + max = -1; + EINA_LIST_FOREACH(oedf->image_dir->sets, l, ds) + if (max < ds->id) + max = ds->id; + + edf->image_dir->sets = calloc(1, sizeof (Edje_Image_Directory_Set) * (max + 1)); + edf->image_dir->sets_count = max + 1; + + if (!edf->image_dir->sets && edf->image_dir->sets_count) + { + free(edf->image_dir->entries); + edf->image_dir->entries = NULL; + return EINA_FALSE; + } + + EINA_LIST_FREE(oedf->image_dir->sets, ds) + { + memcpy(edf->image_dir->sets + ds->id, + ds, + sizeof (Edje_Image_Directory_Set)); + free(ds); + } + + return EINA_TRUE; +} + Edje_File * _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) { @@ -68,7 +155,7 @@ _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) Eina_List *l; Edje_Data *ed; - edf = malloc(sizeof (Edje_File)); + edf = calloc(1, sizeof (Edje_File)); if (!edf) return NULL; edf->free_strings = eet_dictionary_get(file) ? 0 : 1; @@ -86,6 +173,9 @@ _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) edf->data = eina_hash_string_small_new(NULL); } + if (!edf->fonts || !edf->collection || !edf->data) + goto on_error; + EINA_LIST_FREE(oedf->data, ed) { eina_hash_direct_add(edf->data, ed->key, ed->value); @@ -114,9 +204,13 @@ _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) eina_hash_direct_add(edf->fonts, fnt->entry, fnt); } + if (!_edje_file_convert_images(edf, oedf)) + goto on_error; + + if (!_edje_file_convert_external(edf, oedf)) + goto on_error; + edf->oef = oedf; - edf->external_dir = oedf->external_dir; - edf->image_dir = oedf->image_dir; edf->spectrum_dir = oedf->spectrum_dir; edf->styles = oedf->styles; edf->color_classes = oedf->color_classes; @@ -133,6 +227,15 @@ _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) edf->collection_patterns = NULL; return edf; + + on_error: + eina_hash_free(edf->fonts); + eina_hash_free(edf->collection); + eina_hash_free(edf->data); + free(edf->image_dir); + free(edf->external_dir); + free(edf); + return NULL; } Edje_Part_Collection * diff --git a/legacy/edje/src/lib/edje_convert.h b/legacy/edje/src/lib/edje_convert.h index daf70f7349..494a90300b 100644 --- a/legacy/edje/src/lib/edje_convert.h +++ b/legacy/edje/src/lib/edje_convert.h @@ -1,16 +1,35 @@ #ifndef EDJE_CONVERT_H__ # define EDJE_CONVERT_H__ -typedef struct _Edje_Part_Collection Old_Edje_Part_Collection; +typedef struct _Edje_Part_Collection Old_Edje_Part_Collection; +typedef struct _Old_Edje_Image_Directory Old_Edje_Image_Directory; +typedef struct _Old_Edje_Font_Directory Old_Edje_Font_Directory; +typedef struct _Old_Edje_External_Directory Old_Edje_External_Directory; + +struct _Old_Edje_Font_Directory +{ + Eina_List *entries; /* a list of Edje_Font_Directory_Entry */ +}; + +struct _Old_Edje_Image_Directory +{ + Eina_List *entries; /* a list of Edje_Image_Directory_Entry */ + Eina_List *sets; /* a list of Edje_Image_Directory_Set */ +}; + +struct _Old_Edje_External_Directory +{ + Eina_List *entries; /* a list of Edje_External_Directory_Entry */ +}; struct _Old_Edje_File { const char *path; time_t mtime; - Edje_External_Directory *external_dir; - Edje_Font_Directory *font_dir; - Edje_Image_Directory *image_dir; + Old_Edje_External_Directory *external_dir; + Old_Edje_Font_Directory *font_dir; + Old_Edje_Image_Directory *image_dir; Edje_Spectrum_Directory *spectrum_dir; Edje_Part_Collection_Directory *collection_dir; Eina_List *data; diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index c479f7128c..a43d7a4b36 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -82,7 +82,8 @@ _edje_edd_init(void) eet_data_descriptor_file_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_directory_entry, Edje_External_Directory_Entry, "entry", entry, EET_T_STRING); - EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Directory); + eet_eina_file_data_descriptor_class_set(&eddc, "Edje_External_Directory", + sizeof (Old_Edje_External_Directory)); _edje_edd_edje_external_directory = eet_data_descriptor_file_new(&eddc); EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_external_directory, Edje_External_Directory, "entries", entries, _edje_edd_edje_external_directory_entry); @@ -94,10 +95,11 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_font_directory_entry, Edje_Font_Directory_Entry, "entry", entry, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_font_directory_entry, Edje_Font_Directory_Entry, "file", file, EET_T_STRING); - EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Font_Directory); + eet_eina_file_data_descriptor_class_set(&eddc, "Edje_Font_Directory", + sizeof (Old_Edje_Font_Directory)); _edje_edd_edje_font_directory = eet_data_descriptor_file_new(&eddc); - EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_font_directory, Edje_Font_Directory, "entries", entries, _edje_edd_edje_font_directory_entry); + EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_font_directory, Old_Edje_Font_Directory, "entries", entries, _edje_edd_edje_font_directory_entry); /* image directory */ EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Image_Directory_Entry); @@ -125,11 +127,12 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_image_directory_set, Edje_Image_Directory_Set, "id", id, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory_set, Edje_Image_Directory_Set, "entries", entries, _edje_edd_edje_image_directory_set_entry); - EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Image_Directory); + eet_eina_file_data_descriptor_class_set(&eddc, "Edje_Image_Directory", + sizeof (Old_Edje_Image_Directory)); _edje_edd_edje_image_directory = eet_data_descriptor_file_new(&eddc); - EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory, Edje_Image_Directory, "entries", entries, _edje_edd_edje_image_directory_entry); - EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory, Edje_Image_Directory, "sets", sets, _edje_edd_edje_image_directory_set); + EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory, Old_Edje_Image_Directory, "entries", entries, _edje_edd_edje_image_directory_entry); + EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory, Old_Edje_Image_Directory, "sets", sets, _edje_edd_edje_image_directory_set); /* spectrum directory */ EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Spectrum_Color); @@ -203,7 +206,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_color_class, Edje_Color_Class, "a3", a3, EET_T_UCHAR); /* the main file directory */ - EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_File); + eet_eina_file_data_descriptor_class_set(&eddc, "Edje_File", sizeof (Old_Edje_File)); _edje_edd_edje_file = eet_data_descriptor_file_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Old_Edje_File, "compiler", compiler, EET_T_STRING); diff --git a/legacy/edje/src/lib/edje_edit.c b/legacy/edje/src/lib/edje_edit.c index 21424b3220..124bfd7336 100644 --- a/legacy/edje/src/lib/edje_edit.c +++ b/legacy/edje/src/lib/edje_edit.c @@ -207,8 +207,7 @@ _edje_part_description_find_byname(Edje_Edit *eed, const char *part, const char static int _edje_image_id_find(Evas_Object *obj, const char *image_name) { - Edje_Image_Directory_Entry *i; - Eina_List *l; + unsigned int i; GET_ED_OR_RETURN(-1); @@ -217,14 +216,10 @@ _edje_image_id_find(Evas_Object *obj, const char *image_name) //printf("SEARCH IMAGE %s\n", image_name); - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) - { - if (strcmp(image_name, i->entry) == 0) - { - //printf(" Found id: %d \n", i->id); - return i->id; - } - } + for (i = 0; i < ed->file->image_dir->entries_count; ++i) + if (ed->file->image_dir->entries[i].entry + && !strcmp(image_name, ed->file->image_dir->entries[i].entry)) + return i; return -1; } @@ -232,21 +227,17 @@ _edje_image_id_find(Evas_Object *obj, const char *image_name) static const char * _edje_image_name_find(Evas_Object *obj, int image_id) { - Edje_Image_Directory_Entry *i; - Eina_List *l; - GET_ED_OR_RETURN(NULL); if (!ed->file) return NULL; if (!ed->file->image_dir) return NULL; + /* Special case for external image */ + if (image_id < 0) image_id = -image_id - 1; + //printf("SEARCH IMAGE ID %d\n", image_id); - - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) - if (image_id == i->id) - return i->entry; - - return NULL; + if ((unsigned int) image_id >= ed->file->image_dir->entries_count) return NULL; + return ed->file->image_dir->entries[image_id].entry; } static void @@ -757,15 +748,15 @@ _edje_edit_style_tag_get(Edje *ed, const char *style, const char *name) static Edje_External_Directory_Entry * _edje_edit_external_get(Edje *ed, const char *name) { - Eina_List *l; - Edje_External_Directory_Entry *e; + unsigned int i; if (!ed || !ed->file || !ed->file->external_dir || !name) return NULL; - EINA_LIST_FOREACH(ed->file->external_dir->entries, l, e) - if (e->entry && !strcmp(e->entry, name)) - return e; + for (i = 0; i < ed->file->external_dir->entries_count; ++i) + if (ed->file->external_dir->entries[i].entry + && !strcmp(ed->file->external_dir->entries[i].entry, name)) + return ed->file->external_dir->entries + i; return NULL; } @@ -1752,16 +1743,16 @@ EAPI Eina_List * edje_edit_externals_list_get(Evas_Object *obj) { Eina_List *externals = NULL; - Eina_List *l; - Edje_External_Directory_Entry *e; + unsigned int i; GET_ED_OR_RETURN(NULL); if (!ed->file || !ed->file->external_dir) return NULL; //printf("GET STYLES LIST %d\n", eina_list_count(ed->file->styles)); - EINA_LIST_FOREACH(ed->file->external_dir->entries, l, e) - externals = eina_list_append(externals, eina_stringshare_add(e->entry)); + for (i = 0; i < ed->file->external_dir->entries_count; ++i) + externals = eina_list_append(externals, + eina_stringshare_add(ed->file->external_dir->entries[i].entry)); return externals; } @@ -1770,19 +1761,41 @@ EAPI Eina_Bool edje_edit_external_add(Evas_Object *obj, const char *external) { Edje_External_Directory_Entry *e; + unsigned int freeid; + unsigned int i; + GET_ED_OR_RETURN(EINA_FALSE); e = _edje_edit_external_get(ed, external); if (e) return EINA_FALSE; - e = _alloc(sizeof(Edje_External_Directory_Entry)); - if (!e) return EINA_FALSE; - e->entry = (char*)eina_stringshare_add(external); - if (!ed->file->external_dir) ed->file->external_dir = _alloc(sizeof(Edje_External_Directory)); - ed->file->external_dir->entries = \ - eina_list_append(ed->file->external_dir->entries, e); + + for (i = 0; i < ed->file->external_dir->entries_count; ++i) + if (!ed->file->external_dir->entries[i].entry) + break ; + + if (i == ed->file->external_dir->entries_count) + { + Edje_External_Directory_Entry *tmp; + unsigned int max; + + max = ed->file->external_dir->entries_count + 1; + tmp = realloc(ed->file->external_dir->entries, + sizeof (Edje_External_Directory_Entry) * max); + + if (!tmp) return EINA_FALSE; + + ed->file->external_dir->entries = tmp; + freeid = ed->file->external_dir->entries_count; + ed->file->external_dir->entries_count = max; + } + else + freeid = i; + + ed->file->external_dir->entries[freeid].entry = (char*)eina_stringshare_add(external); + return EINA_TRUE; } @@ -1796,16 +1809,8 @@ edje_edit_external_del(Evas_Object *obj, const char *external) e = _edje_edit_external_get(ed, external); if (!e) return EINA_FALSE; - ed->file->external_dir->entries = \ - eina_list_remove(ed->file->external_dir->entries, e); - if (!ed->file->external_dir->entries) - { - free(ed->file->external_dir); - ed->file->external_dir = NULL; - } - _edje_if_string_free(ed, e->entry); - free(e); + e->entry = NULL; return EINA_TRUE; } @@ -4416,9 +4421,8 @@ edje_edit_part_effect_set(Evas_Object *obj, const char *part, Edje_Text_Effect e EAPI Eina_List * edje_edit_images_list_get(Evas_Object *obj) { - Edje_Image_Directory_Entry *i; Eina_List *images = NULL; - Eina_List *l; + unsigned int i; GET_ED_OR_RETURN(NULL); @@ -4426,13 +4430,9 @@ edje_edit_images_list_get(Evas_Object *obj) if (!ed->file->image_dir) return NULL; //printf("GET IMAGES LIST for %s\n", ed->file->path); - - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) - { - images = eina_list_append(images, eina_stringshare_add(i->entry)); - //printf(" Image: %s (type: %d param: %d id: %d) \n", - // i->entry, i->source_type, i->source_param, i->id); - } + for (i = 0; i < ed->file->image_dir->entries_count; ++i) + images = eina_list_append(images, + eina_stringshare_add(ed->file->image_dir->entries[i].entry)); return images; } @@ -4440,9 +4440,9 @@ edje_edit_images_list_get(Evas_Object *obj) EAPI Eina_Bool edje_edit_image_add(Evas_Object *obj, const char* path) { - Eina_List *l; Edje_Image_Directory_Entry *de; - int free_id = 0; + unsigned int i; + int free_id = -1; char *name; GET_ED_OR_RETURN(EINA_FALSE); @@ -4463,33 +4463,44 @@ edje_edit_image_add(Evas_Object *obj, const char* path) else name = (char *)path; /* Loop trough image directory to find if image exist */ - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, de) + for (i = 0; i < ed->file->image_dir->entries_count; ++i) { - if (!strcmp(name, de->entry)) + de = ed->file->image_dir->entries + i; + + if (!de->entry) + free_id = i; + else if (!strcmp(name, de->entry)) return EINA_FALSE; - if (de->id >= free_id) - free_id = de->id + 1; /*TODO search for free (hole) id*/ } - /* Create Image Entry */ - de = _alloc(sizeof(Edje_Image_Directory_Entry)); - if (!de) return EINA_FALSE; - de->entry = strdup(name); + if (free_id == -1) + { + Edje_Image_Directory_Entry *tmp; + unsigned int count; + + count = ed->file->image_dir->entries_count + 1; + + tmp = realloc(ed->file->image_dir->entries, + sizeof (Edje_Image_Directory_Entry) * count); + if (!tmp) return EINA_FALSE; + + ed->file->image_dir->entries = tmp; + free_id = ed->file->image_dir->entries_count; + ed->file->image_dir->entries_count = count; + } + + /* Set Image Entry */ + de = ed->file->image_dir->entries + free_id; + de->entry = eina_stringshare_add(name); de->id = free_id; de->source_type = 1; de->source_param = 1; - /* Add image to Image Directory */ - ed->file->image_dir->entries = - eina_list_append(ed->file->image_dir->entries, de); - /* Import image */ if (!_edje_import_image_file(ed, path, free_id)) { - ed->file->image_dir->entries = - eina_list_remove(ed->file->image_dir->entries, de); - free(de->entry); - free(de); + eina_stringshare_del(de->entry); + de->entry = NULL; return EINA_FALSE; } @@ -4499,8 +4510,8 @@ edje_edit_image_add(Evas_Object *obj, const char* path) EAPI Eina_Bool edje_edit_image_del(Evas_Object *obj, const char* name) { - Eina_List *l; Edje_Image_Directory_Entry *de; + unsigned int i; GET_ED_OR_RETURN(EINA_FALSE); @@ -4512,18 +4523,16 @@ edje_edit_image_del(Evas_Object *obj, const char* name) if (!ed->file->image_dir) return EINA_TRUE; - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, de) + for (i = 0; i < ed->file->image_dir->entries_count; ++i) { - if (!strcmp(name, de->entry)) - { - ed->file->image_dir->entries = eina_list_remove_list( - ed->file->image_dir->entries, l); - break; - } - de = NULL; + de = ed->file->image_dir->entries + i; + + if (de->entry + && !strcmp(name, de->entry)) + break; } - if (!de) + if (i == ed->file->image_dir->entries_count) { WRN("Unable to find image entry part \"%s\"", name); return EINA_TRUE; @@ -4538,8 +4547,6 @@ edje_edit_image_del(Evas_Object *obj, const char* name) if (!eetf) { ERR("Unable to open \"%s\" for writing output", ed->path); - ed->file->image_dir->entries = - eina_list_append(ed->file->image_dir->entries, de); return EINA_FALSE; } @@ -4549,8 +4556,6 @@ edje_edit_image_del(Evas_Object *obj, const char* name) { ERR("Unable to delete \"%s\" font entry", entry); eet_close(eetf); - ed->file->image_dir->entries = - eina_list_append(ed->file->image_dir->entries, de); return EINA_FALSE; } @@ -4558,16 +4563,14 @@ edje_edit_image_del(Evas_Object *obj, const char* name) if (!_edje_edit_edje_file_save(eetf, ed->file)) { eet_close(eetf); - ed->file->image_dir->entries = - eina_list_append(ed->file->image_dir->entries, de); return EINA_FALSE; } eet_close(eetf); } - free(de->entry); - free(de); + _edje_if_string_free(ed, de->entry); + de->entry = NULL; return EINA_TRUE; } @@ -4575,9 +4578,7 @@ edje_edit_image_del(Evas_Object *obj, const char* name) EAPI Eina_Bool edje_edit_image_data_add(Evas_Object *obj, const char *name, int id) { - Eina_List *l; Edje_Image_Directory_Entry *de; - Edje_Image_Directory_Entry *i, *t; GET_ED_OR_RETURN(EINA_FALSE); @@ -4593,34 +4594,14 @@ edje_edit_image_data_add(Evas_Object *obj, const char *name, int id) } /* Loop trough image directory to find if image exist */ - t = NULL; - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) - { - if (!i) return EINA_FALSE; - if (i->id == id) t = i; - } + if (id < 0) id = - id - 1; + if ((unsigned int) id >= ed->file->image_dir->entries_count) return EINA_FALSE; - /* Create Image Entry */ - if (!t) - { - de = _alloc(sizeof(Edje_Image_Directory_Entry)); - if (!de) return EINA_FALSE; - } - else - { - de = t; - free(de->entry); - } - de->entry = strdup(name); - de->id = id; + de = ed->file->image_dir->entries + id; + eina_stringshare_replace(&de->entry, name); de->source_type = 1; de->source_param = 1; - /* Add image to Image Directory */ - if (!t) - ed->file->image_dir->entries = - eina_list_append(ed->file->image_dir->entries, de); - return EINA_TRUE; } @@ -4633,27 +4614,29 @@ edje_edit_image_id_get(Evas_Object *obj, const char *image_name) EAPI Edje_Edit_Image_Comp edje_edit_image_compression_type_get(Evas_Object *obj, const char *image) { - Edje_Image_Directory_Entry *i = NULL; - Eina_List *l; + Edje_Image_Directory_Entry *de = NULL; + unsigned int i; GET_ED_OR_RETURN(-1); if (!ed->file) return -1; if (!ed->file->image_dir) return -1; - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) + for (i = 0; i < ed->file->image_dir->entries_count; ++i) { - if (strcmp(i->entry, image) == 0) + de = ed->file->image_dir->entries + i; + + if (de->entry + && !strcmp(image, de->entry)) break; - i = NULL; } - if (!i) return -1; + if (i == ed->file->image_dir->entries_count) return -1; - switch(i->source_type) + switch(de->source_type) { case EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT: - if (i->source_param == 0) // RAW + if (de->source_param == 0) // RAW return EDJE_EDIT_IMAGE_COMP_RAW; else // COMP return EDJE_EDIT_IMAGE_COMP_COMP; @@ -4672,22 +4655,24 @@ edje_edit_image_compression_type_get(Evas_Object *obj, const char *image) EAPI int edje_edit_image_compression_rate_get(Evas_Object *obj, const char *image) { - Eina_List *l; - Edje_Image_Directory_Entry *i; + Edje_Image_Directory_Entry *de; + unsigned int i; GET_ED_OR_RETURN(-1); // Gets the Image Entry - EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i) + for (i = 0; i < ed->file->image_dir->entries_count; ++i) { - if (strcmp(i->entry, image) == 0) break; - i = NULL; + de = ed->file->image_dir->entries + i; + if (de->entry + && !strcmp(de->entry, image)) + break; } - if (!i) return -1; - if (i->source_type != EDJE_IMAGE_SOURCE_TYPE_INLINE_LOSSY) return -2; + if (i == ed->file->image_dir->entries_count) return -1; + if (de->source_type != EDJE_IMAGE_SOURCE_TYPE_INLINE_LOSSY) return -2; - return i->source_param; + return de->source_param; } EAPI const char * diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index bb7ed86a05..0875c94455 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -323,13 +323,10 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g if (ed->file && ed->file->external_dir) { - const Edje_External_Directory_Entry *ext; - const Eina_List *n; + unsigned int i; - EINA_LIST_FOREACH(ed->file->external_dir->entries, n, ext) - { - edje_module_load(ext->entry); - } + for (i = 0; i < ed->file->external_dir->entries_count; ++i) + edje_module_load(ed->file->external_dir->entries[i].entry); } _edje_textblock_styles_add(ed); @@ -1036,13 +1033,26 @@ _edje_file_free(Edje_File *edf) if (edf->image_dir) { - Edje_Image_Directory_Entry *ie; + unsigned int i; - EINA_LIST_FREE(edf->image_dir->entries, ie) + if (edf->free_strings) { - if (edf->free_strings && ie->entry) eina_stringshare_del(ie->entry); - free(ie); + for (i = 0; i < edf->image_dir->entries_count; ++i) + eina_stringshare_del(edf->image_dir->entries[i].entry); } + + /* Sets have been added after edje received eet dictionnary support */ + for (i = 0; i < edf->image_dir->sets_count; ++i) + { + Edje_Image_Directory_Set_Entry *se; + + EINA_LIST_FREE(edf->image_dir->sets[i].entries, se) + free(se); + + } + + free(edf->image_dir->entries); + free(edf->image_dir->sets); free(edf->image_dir); } if (edf->spectrum_dir) diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 05fda4b63a..cd51e9ac7a 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -215,7 +215,6 @@ typedef struct _Edje_Style_Tag Edje_Style_Tag; typedef struct _Edje_Data Edje_Data; typedef struct _Edje_External_Directory Edje_External_Directory; typedef struct _Edje_External_Directory_Entry Edje_External_Directory_Entry; -typedef struct _Edje_Font_Directory Edje_Font_Directory; typedef struct _Edje_Font_Directory_Entry Edje_Font_Directory_Entry; typedef struct _Edje_Image_Directory Edje_Image_Directory; typedef struct _Edje_Image_Directory_Entry Edje_Image_Directory_Entry; @@ -374,11 +373,6 @@ struct _Edje_Data /*----------*/ -struct _Edje_Font_Directory -{ - Eina_List *entries; /* a list of Edje_Font_Directory_Entry */ -}; - struct _Edje_Font_Directory_Entry { const char *entry; /* the name of the font */ @@ -390,7 +384,8 @@ struct _Edje_Font_Directory_Entry struct _Edje_External_Directory { - Eina_List *entries; /* a list of Edje_External_Directory_Entry */ + Edje_External_Directory_Entry *entries; /* a list of Edje_External_Directory_Entry */ + unsigned int entries_count; }; struct _Edje_External_Directory_Entry @@ -407,13 +402,16 @@ struct _Edje_External_Directory_Entry struct _Edje_Image_Directory { - Eina_List *entries; /* a list of Edje_Image_Directory_Entry */ - Eina_List *sets; /* a list of Edje_Image_Directory_Set */ + Edje_Image_Directory_Entry *entries; /* an array of Edje_Image_Directory_Entry */ + unsigned int entries_count; + + Edje_Image_Directory_Set *sets; + unsigned int sets_count; /* an array of Edje_Image_Directory_Set */ }; struct _Edje_Image_Directory_Entry { - char *entry; /* the nominal name of the image - if any */ + const char *entry; /* the nominal name of the image - if any */ int source_type; /* alternate source mode. 0 = none */ int source_param; /* extra params on encoding */ int id; /* the id no. of the image */ @@ -429,7 +427,7 @@ struct _Edje_Image_Directory_Set struct _Edje_Image_Directory_Set_Entry { - char *name; + const char *name; int id; struct {