* edje: change memory layout that will become the new file format.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 29 Jul 2010 12:02:36 +0000 (12:02 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 29 Jul 2010 12:02:36 +0000 (12:02 +0000)
NOTE: I tried this change with all the apps and theme I had, but maybe
i missed some bug. Please report any strange behaviour.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@50641 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

17 files changed:
src/bin/edje_cc.h
src/bin/edje_cc_handlers.c
src/bin/edje_cc_out.c
src/lib/edje_cache.c
src/lib/edje_calc.c
src/lib/edje_convert.c
src/lib/edje_convert.h
src/lib/edje_data.c
src/lib/edje_edit.c
src/lib/edje_embryo.c
src/lib/edje_entry.c
src/lib/edje_external.c
src/lib/edje_load.c
src/lib/edje_private.h
src/lib/edje_program.c
src/lib/edje_text.c
src/lib/edje_util.c

index 99bd589..81b79de 100644 (file)
@@ -103,8 +103,8 @@ struct _SrcFile_List
 /* global fn calls */
 void    data_setup(void);
 void    data_write(void);
-void    data_queue_part_lookup(Edje_Part_Collection *pc, char *name, int *dest);
-void    data_queue_program_lookup(Edje_Part_Collection *pc, char *name, int *dest);
+void    data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest);
+void    data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest);
 void    data_queue_image_lookup(char *name, int *dest, Eina_Bool *set);
 void    data_queue_part_slave_lookup(int *master, int *slave);
 void    data_queue_image_slave_lookup(int *master, int *slave);
index 24ed3ef..27ac9f9 100644 (file)
@@ -1597,14 +1597,14 @@ static void
 ob_collections_group(void)
 {
    Edje_Part_Collection_Directory_Entry *de;
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Code *cd;
    
    de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
    edje_file->collection_dir->entries = eina_list_append(edje_file->collection_dir->entries, de);
    de->id = eina_list_count(edje_file->collection_dir->entries) - 1;
 
-   pc = mem_alloc(SZ(Edje_Part_Collection));
+   pc = mem_alloc(SZ(Old_Edje_Part_Collection));
    edje_collections = eina_list_append(edje_collections, pc);
    pc->id = eina_list_count(edje_collections) - 1;
 
@@ -1640,7 +1640,7 @@ st_collections_group_name(void)
        if ((de_other != de) && (de_other->entry) && 
            (!strcmp(de->entry, de_other->entry)))
          {
-            Edje_Part_Collection *pc;
+            Old_Edje_Part_Collection *pc;
             Code *cd;
             int i;
             
@@ -1689,7 +1689,7 @@ st_collections_group_name(void)
 static void
 st_collections_group_script_only(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
@@ -1700,7 +1700,7 @@ st_collections_group_script_only(void)
 static void
 st_collections_group_lua_script_only(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    check_arg_count(1);
 
@@ -1748,7 +1748,7 @@ st_collections_group_alias(void)
 static void
 st_collections_group_min(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1771,7 +1771,7 @@ st_collections_group_min(void)
 static void
 st_collections_group_max(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1871,7 +1871,7 @@ ob_collections_group_lua_script(void)
 static void
 st_collections_group_data_item(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Data *di;
 
    check_arg_count(2);
@@ -1902,7 +1902,7 @@ st_collections_group_data_item(void)
 static void
 st_collections_group_parts_alias(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    check_arg_count(2);
 
@@ -1948,10 +1948,10 @@ st_collections_group_parts_alias(void)
 static void
 ob_collections_group_parts_part(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
-   ep = mem_alloc(SZ(Edje_Part));
+   ep = mem_alloc(SZ(Old_Edje_Part));
    pc = eina_list_data_get(eina_list_last(edje_collections));
    pc->parts = eina_list_append(pc->parts, ep);
    ep->id = eina_list_count(pc->parts) - 1;
@@ -1984,8 +1984,8 @@ ob_collections_group_parts_part(void)
 static void
 st_collections_group_parts_part_name(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -1995,7 +1995,7 @@ st_collections_group_parts_part_name(void)
 
    {
        Eina_List *l;
-       Edje_Part *lep;
+       Old_Edje_Part *lep;
 
        EINA_LIST_FOREACH(pc->parts, l, lep)
          {
@@ -2032,8 +2032,8 @@ st_collections_group_parts_part_name(void)
 static void
 st_collections_group_parts_part_type(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2068,8 +2068,8 @@ st_collections_group_parts_part_type(void)
 static void
 st_collections_group_parts_part_mouse_events(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2092,8 +2092,8 @@ st_collections_group_parts_part_mouse_events(void)
 static void
 st_collections_group_parts_part_repeat_events(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2120,8 +2120,8 @@ st_collections_group_parts_part_repeat_events(void)
 static void
 st_collections_group_parts_part_ignore_flags(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_min_arg_count(1);
 
@@ -2152,8 +2152,8 @@ st_collections_group_parts_part_ignore_flags(void)
 static void
 st_collections_group_parts_part_scale(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2181,8 +2181,8 @@ st_collections_group_parts_part_scale(void)
 static void
 st_collections_group_parts_part_pointer_mode(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2208,8 +2208,8 @@ st_collections_group_parts_part_pointer_mode(void)
 static void
 st_collections_group_parts_part_precise_is_inside(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2233,8 +2233,8 @@ st_collections_group_parts_part_precise_is_inside(void)
 static void
 st_collections_group_parts_part_use_alternate_font_metrics(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2257,8 +2257,8 @@ st_collections_group_parts_part_use_alternate_font_metrics(void)
 static void
 st_collections_group_parts_part_clip_to_id(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2290,8 +2290,8 @@ st_collections_group_parts_part_clip_to_id(void)
 static void
 st_collections_group_parts_part_source(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2317,8 +2317,8 @@ st_collections_group_parts_part_source(void)
 static void
 st_collections_group_parts_part_source2(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2344,8 +2344,8 @@ st_collections_group_parts_part_source2(void)
 static void
 st_collections_group_parts_part_source3(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2371,8 +2371,8 @@ st_collections_group_parts_part_source3(void)
 static void
 st_collections_group_parts_part_source4(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2398,8 +2398,8 @@ st_collections_group_parts_part_source4(void)
 static void
 st_collections_group_parts_part_source5(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2425,8 +2425,8 @@ st_collections_group_parts_part_source5(void)
 static void
 st_collections_group_parts_part_source6(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2461,8 +2461,8 @@ st_collections_group_parts_part_source6(void)
 static void
 st_collections_group_parts_part_effect(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2505,8 +2505,8 @@ st_collections_group_parts_part_effect(void)
 static void
 st_collections_group_parts_part_entry_mode(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2539,8 +2539,8 @@ st_collections_group_parts_part_entry_mode(void)
 static void
 st_collections_group_parts_part_select_mode(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2566,8 +2566,8 @@ st_collections_group_parts_part_select_mode(void)
 static void
 st_collections_group_parts_part_multiline(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2616,8 +2616,8 @@ st_collections_group_parts_part_multiline(void)
 static void
 st_collections_group_parts_part_dragable_x(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(3);
 
@@ -2646,8 +2646,8 @@ st_collections_group_parts_part_dragable_x(void)
 static void
 st_collections_group_parts_part_dragable_y(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(3);
 
@@ -2673,8 +2673,8 @@ st_collections_group_parts_part_dragable_y(void)
 static void
 st_collections_group_parts_part_dragable_confine(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2703,8 +2703,8 @@ st_collections_group_parts_part_dragable_confine(void)
 static void
 st_collections_group_parts_part_dragable_events(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_arg_count(1);
 
@@ -2754,8 +2754,8 @@ st_collections_group_parts_part_dragable_events(void)
 */
 static void ob_collections_group_parts_part_box_items_item(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
@@ -2810,8 +2810,8 @@ static void ob_collections_group_parts_part_box_items_item(void)
 */
 static void st_collections_group_parts_part_box_items_item_type(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
@@ -2849,8 +2849,8 @@ static void st_collections_group_parts_part_box_items_item_type(void)
 */
 static void st_collections_group_parts_part_box_items_item_name(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
@@ -2874,8 +2874,8 @@ static void st_collections_group_parts_part_box_items_item_name(void)
 */
 static void st_collections_group_parts_part_box_items_item_source(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
@@ -2899,8 +2899,8 @@ static void st_collections_group_parts_part_box_items_item_source(void)
 */
 static void st_collections_group_parts_part_box_items_item_min(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -2925,8 +2925,8 @@ static void st_collections_group_parts_part_box_items_item_min(void)
 */
 static void st_collections_group_parts_part_box_items_item_prefer(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -2950,8 +2950,8 @@ static void st_collections_group_parts_part_box_items_item_prefer(void)
 */
 static void st_collections_group_parts_part_box_items_item_max(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -2976,8 +2976,8 @@ static void st_collections_group_parts_part_box_items_item_max(void)
 */
 static void st_collections_group_parts_part_box_items_item_padding(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(4);
@@ -3004,8 +3004,8 @@ static void st_collections_group_parts_part_box_items_item_padding(void)
 */
 static void st_collections_group_parts_part_box_items_item_align(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -3030,8 +3030,8 @@ static void st_collections_group_parts_part_box_items_item_align(void)
 */
 static void st_collections_group_parts_part_box_items_item_weight(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -3056,8 +3056,8 @@ static void st_collections_group_parts_part_box_items_item_weight(void)
 */
 static void st_collections_group_parts_part_box_items_item_aspect(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -3082,8 +3082,8 @@ static void st_collections_group_parts_part_box_items_item_aspect(void)
 */
 static void st_collections_group_parts_part_box_items_item_aspect_mode(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
@@ -3113,8 +3113,8 @@ static void st_collections_group_parts_part_box_items_item_aspect_mode(void)
 */
 static void st_collections_group_parts_part_box_items_item_options(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(1);
@@ -3139,8 +3139,8 @@ static void st_collections_group_parts_part_box_items_item_options(void)
 */
 static void st_collections_group_parts_part_table_items_item_position(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -3174,8 +3174,8 @@ static void st_collections_group_parts_part_table_items_item_position(void)
 */
 static void st_collections_group_parts_part_table_items_item_span(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
    Edje_Pack_Element *item;
 
    check_arg_count(2);
@@ -3233,13 +3233,13 @@ static void st_collections_group_parts_part_table_items_item_span(void)
 static void
 ob_collections_group_parts_part_description(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
    ep = eina_list_data_get(eina_list_last(pc->parts));
-   ed = mem_alloc(SZ(Edje_Part_Description));
+   ed = mem_alloc(SZ(Old_Edje_Part_Description));
    if (!ep->default_desc)
      ep->default_desc = ed;
    else
@@ -3338,9 +3338,9 @@ ob_collections_group_parts_part_description(void)
 static void
 st_collections_group_parts_part_description_inherit(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed, *parent = NULL;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed, *parent = NULL;
    Eina_List *l;
    Edje_Part_Image_Id *iid;
    char *parent_name;
@@ -3380,7 +3380,7 @@ st_collections_group_parts_part_description_inherit(void)
    else
      {
        double min_dst = 999.0;
-       Edje_Part_Description *d;
+       Old_Edje_Part_Description *d;
 
        if (!strcmp(parent_name, "default"))
          {
@@ -3486,9 +3486,9 @@ st_collections_group_parts_part_description_inherit(void)
 static void
 st_collections_group_parts_part_description_state(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
    char *s;
 
    check_arg_count(2);
@@ -3525,9 +3525,9 @@ st_collections_group_parts_part_description_state(void)
 static void
 st_collections_group_parts_part_description_visible(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -3553,9 +3553,9 @@ st_collections_group_parts_part_description_visible(void)
 static void
 st_collections_group_parts_part_description_align(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3584,9 +3584,9 @@ st_collections_group_parts_part_description_align(void)
 static void
 st_collections_group_parts_part_description_fixed(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3611,9 +3611,9 @@ st_collections_group_parts_part_description_fixed(void)
 static void
 st_collections_group_parts_part_description_min(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3638,9 +3638,9 @@ st_collections_group_parts_part_description_min(void)
 static void
 st_collections_group_parts_part_description_max(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3667,9 +3667,9 @@ st_collections_group_parts_part_description_max(void)
 static void
 st_collections_group_parts_part_description_step(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3698,9 +3698,9 @@ st_collections_group_parts_part_description_step(void)
 static void
 st_collections_group_parts_part_description_aspect(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3726,9 +3726,9 @@ st_collections_group_parts_part_description_aspect(void)
 static void
 st_collections_group_parts_part_description_aspect_preference(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -3759,9 +3759,9 @@ st_collections_group_parts_part_description_aspect_preference(void)
 static void
 st_collections_group_parts_part_description_color_class(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -3785,9 +3785,9 @@ st_collections_group_parts_part_description_color_class(void)
 static void
 st_collections_group_parts_part_description_color(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(4);
 
@@ -3814,9 +3814,9 @@ st_collections_group_parts_part_description_color(void)
 static void
 st_collections_group_parts_part_description_color2(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(4);
 
@@ -3843,9 +3843,9 @@ st_collections_group_parts_part_description_color2(void)
 static void
 st_collections_group_parts_part_description_color3(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(4);
 
@@ -3896,9 +3896,9 @@ st_collections_group_parts_part_description_color3(void)
 static void
 st_collections_group_parts_part_description_rel1_relative(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3923,9 +3923,9 @@ st_collections_group_parts_part_description_rel1_relative(void)
 static void
 st_collections_group_parts_part_description_rel1_offset(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -3951,9 +3951,9 @@ st_collections_group_parts_part_description_rel1_offset(void)
 static void
 st_collections_group_parts_part_description_rel1_to(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -3985,9 +3985,9 @@ st_collections_group_parts_part_description_rel1_to(void)
 static void
 st_collections_group_parts_part_description_rel1_to_x(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4019,9 +4019,9 @@ st_collections_group_parts_part_description_rel1_to_x(void)
 static void
 st_collections_group_parts_part_description_rel1_to_y(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4041,9 +4041,9 @@ st_collections_group_parts_part_description_rel1_to_y(void)
 static void
 st_collections_group_parts_part_description_rel2_relative(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4058,9 +4058,9 @@ st_collections_group_parts_part_description_rel2_relative(void)
 static void
 st_collections_group_parts_part_description_rel2_offset(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4075,9 +4075,9 @@ st_collections_group_parts_part_description_rel2_offset(void)
 static void
 st_collections_group_parts_part_description_rel2_to(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4098,9 +4098,9 @@ st_collections_group_parts_part_description_rel2_to(void)
 static void
 st_collections_group_parts_part_description_rel2_to_x(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4120,9 +4120,9 @@ st_collections_group_parts_part_description_rel2_to_x(void)
 static void
 st_collections_group_parts_part_description_rel2_to_y(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4176,9 +4176,9 @@ st_collections_group_parts_part_description_rel2_to_y(void)
 static void
 st_collections_group_parts_part_description_image_normal(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4219,9 +4219,9 @@ st_collections_group_parts_part_description_image_normal(void)
 static void
 st_collections_group_parts_part_description_image_tween(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4265,9 +4265,9 @@ st_collections_group_parts_part_description_image_tween(void)
 static void
 st_collections_group_parts_part_description_image_border(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(4);
 
@@ -4305,9 +4305,9 @@ st_collections_group_parts_part_description_image_border(void)
 static void
 st_collections_group_parts_part_description_image_middle(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4347,9 +4347,9 @@ st_collections_group_parts_part_description_image_middle(void)
 static void
 st_collections_group_parts_part_description_image_border_scale(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4386,9 +4386,9 @@ st_collections_group_parts_part_description_image_border_scale(void)
 static void
 st_collections_group_parts_part_description_image_scale_hint(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4450,9 +4450,9 @@ st_collections_group_parts_part_description_image_scale_hint(void)
 static void
 st_collections_group_parts_part_description_fill_smooth(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4486,9 +4486,9 @@ st_collections_group_parts_part_description_fill_smooth(void)
 static void
 st_collections_group_parts_part_description_fill_spread(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4523,9 +4523,9 @@ st_collections_group_parts_part_description_fill_spread(void)
 static void
 st_collections_group_parts_part_description_fill_type(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4582,9 +4582,9 @@ st_collections_group_parts_part_description_fill_type(void)
 static void
 st_collections_group_parts_part_description_fill_origin_relative(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4618,9 +4618,9 @@ st_collections_group_parts_part_description_fill_origin_relative(void)
 static void
 st_collections_group_parts_part_description_fill_origin_offset(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4677,9 +4677,9 @@ st_collections_group_parts_part_description_fill_origin_offset(void)
 static void
 st_collections_group_parts_part_description_fill_size_relative(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4713,9 +4713,9 @@ st_collections_group_parts_part_description_fill_size_relative(void)
 static void
 st_collections_group_parts_part_description_fill_size_offset(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -4782,9 +4782,9 @@ st_collections_group_parts_part_description_fill_size_offset(void)
 static void
 st_collections_group_parts_part_description_text_text(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
    char *str = NULL;
    int i;
 
@@ -4834,9 +4834,9 @@ st_collections_group_parts_part_description_text_text(void)
 static void
 st_collections_group_parts_part_description_text_text_class(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4872,9 +4872,9 @@ st_collections_group_parts_part_description_text_text_class(void)
 static void
 st_collections_group_parts_part_description_text_font(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4909,9 +4909,9 @@ st_collections_group_parts_part_description_text_font(void)
 static void
 st_collections_group_parts_part_description_text_style(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4947,9 +4947,9 @@ st_collections_group_parts_part_description_text_style(void)
 static void
 st_collections_group_parts_part_description_text_repch(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -4984,9 +4984,9 @@ st_collections_group_parts_part_description_text_repch(void)
 static void
 st_collections_group_parts_part_description_text_size(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -5021,9 +5021,9 @@ st_collections_group_parts_part_description_text_size(void)
 static void
 st_collections_group_parts_part_description_text_fit(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5060,9 +5060,9 @@ st_collections_group_parts_part_description_text_fit(void)
 static void
 st_collections_group_parts_part_description_text_min(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5100,9 +5100,9 @@ st_collections_group_parts_part_description_text_min(void)
 static void
 st_collections_group_parts_part_description_text_max(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5139,9 +5139,9 @@ st_collections_group_parts_part_description_text_max(void)
 static void
 st_collections_group_parts_part_description_text_align(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5177,9 +5177,9 @@ st_collections_group_parts_part_description_text_align(void)
 static void
 st_collections_group_parts_part_description_text_source(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -5221,9 +5221,9 @@ st_collections_group_parts_part_description_text_source(void)
 static void
 st_collections_group_parts_part_description_text_text_source(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -5266,9 +5266,9 @@ st_collections_group_parts_part_description_text_text_source(void)
 static void
 st_collections_group_parts_part_description_text_elipsis(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
 
@@ -5367,9 +5367,9 @@ st_collections_group_parts_part_description_text_elipsis(void)
 */
 static void st_collections_group_parts_part_description_box_layout(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_min_arg_count(1);
 
@@ -5393,9 +5393,9 @@ static void st_collections_group_parts_part_description_box_layout(void)
 
 static void st_collections_group_parts_part_description_box_align(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5418,9 +5418,9 @@ static void st_collections_group_parts_part_description_box_align(void)
 
 static void st_collections_group_parts_part_description_box_padding(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5444,9 +5444,9 @@ static void st_collections_group_parts_part_description_box_padding(void)
 static void
 st_collections_group_parts_part_description_box_min(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5525,9 +5525,9 @@ st_collections_group_parts_part_description_box_min(void)
 */
 static void st_collections_group_parts_part_description_table_homogeneous(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_min_arg_count(1);
 
@@ -5553,9 +5553,9 @@ static void st_collections_group_parts_part_description_table_homogeneous(void)
 
 static void st_collections_group_parts_part_description_table_align(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5578,9 +5578,9 @@ static void st_collections_group_parts_part_description_table_align(void)
 
 static void st_collections_group_parts_part_description_table_padding(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(2);
 
@@ -5649,9 +5649,9 @@ static void st_collections_group_parts_part_description_table_padding(void)
 static void
 st_collections_group_parts_part_description_map_perspective(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5691,9 +5691,9 @@ st_collections_group_parts_part_description_map_perspective(void)
 static void
 st_collections_group_parts_part_description_map_light(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5724,9 +5724,9 @@ st_collections_group_parts_part_description_map_light(void)
 static void
 st_collections_group_parts_part_description_map_on(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5754,9 +5754,9 @@ st_collections_group_parts_part_description_map_on(void)
 static void
 st_collections_group_parts_part_description_map_smooth(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5781,9 +5781,9 @@ st_collections_group_parts_part_description_map_smooth(void)
 static void
 st_collections_group_parts_part_description_map_alpha(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5810,9 +5810,9 @@ st_collections_group_parts_part_description_map_alpha(void)
 static void
 st_collections_group_parts_part_description_map_backface_cull(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5840,9 +5840,9 @@ st_collections_group_parts_part_description_map_backface_cull(void)
 static void
 st_collections_group_parts_part_description_map_perspective_on(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5887,9 +5887,9 @@ st_collections_group_parts_part_description_map_perspective_on(void)
 static void
 st_collections_group_parts_part_description_map_rotation_center(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5921,9 +5921,9 @@ st_collections_group_parts_part_description_map_rotation_center(void)
 static void
 st_collections_group_parts_part_description_map_rotation_x(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5949,9 +5949,9 @@ st_collections_group_parts_part_description_map_rotation_x(void)
 static void
 st_collections_group_parts_part_description_map_rotation_y(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -5977,9 +5977,9 @@ st_collections_group_parts_part_description_map_rotation_y(void)
 static void
 st_collections_group_parts_part_description_map_rotation_z(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -6021,9 +6021,9 @@ st_collections_group_parts_part_description_map_rotation_z(void)
 static void
 st_collections_group_parts_part_description_perspective_zplane(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -6050,9 +6050,9 @@ st_collections_group_parts_part_description_perspective_zplane(void)
 static void
 st_collections_group_parts_part_description_perspective_focal(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
 
    check_arg_count(1);
    
@@ -6093,9 +6093,9 @@ st_collections_group_parts_part_description_perspective_focal(void)
 static void
 _st_collections_group_parts_part_description_params(Edje_External_Param_Type type)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
-   Edje_Part_Description *ed;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
+   Old_Edje_Part_Description *ed;
    Edje_External_Param *param;
    Eina_List *l;
    const char *name;
@@ -6283,7 +6283,7 @@ st_collections_group_parts_part_description_params_choice(void)
 static void
 ob_collections_group_programs_program(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
@@ -6307,7 +6307,7 @@ ob_collections_group_programs_program(void)
 static void
 st_collections_group_programs_program_name(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
@@ -6348,7 +6348,7 @@ st_collections_group_programs_program_name(void)
 static void
 st_collections_group_programs_program_signal(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
@@ -6373,7 +6373,7 @@ st_collections_group_programs_program_signal(void)
 static void
 st_collections_group_programs_program_source(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
@@ -6398,7 +6398,7 @@ st_collections_group_programs_program_source(void)
 static void
 st_collections_group_programs_program_filter(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_min_arg_count(1);
@@ -6428,7 +6428,7 @@ st_collections_group_programs_program_filter(void)
 static void
 st_collections_group_programs_program_in(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(2);
@@ -6465,7 +6465,7 @@ st_collections_group_programs_program_in(void)
 static void
 st_collections_group_programs_program_action(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    pc = eina_list_data_get(eina_list_last(edje_collections));
@@ -6580,7 +6580,7 @@ st_collections_group_programs_program_action(void)
 static void
 st_collections_group_programs_program_transition(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(2);
@@ -6611,7 +6611,7 @@ st_collections_group_programs_program_transition(void)
 static void
 st_collections_group_programs_program_target(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
@@ -6664,7 +6664,7 @@ st_collections_group_programs_program_target(void)
 static void
 st_collections_group_programs_program_after(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_arg_count(1);
@@ -6702,7 +6702,7 @@ st_collections_group_programs_program_after(void)
 static void
 st_collections_group_programs_program_api(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
 
    check_min_arg_count(1);
@@ -6721,8 +6721,8 @@ st_collections_group_programs_program_api(void)
 static void
 st_collections_group_parts_part_api(void)
 {
-   Edje_Part_Collection *pc;
-   Edje_Part *ep;
+   Old_Edje_Part_Collection *pc;
+   Old_Edje_Part *ep;
 
    check_min_arg_count(1);
 
@@ -6739,7 +6739,7 @@ st_collections_group_parts_part_api(void)
 static void
 ob_collections_group_programs_program_script(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
    Code *cd;
 
@@ -6779,7 +6779,7 @@ ob_collections_group_programs_program_script(void)
 static void
 ob_collections_group_programs_program_lua_script(void)
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    Edje_Program *ep;
    Code *cd;
 
index dcd90ac..a46ed50 100644 (file)
@@ -52,14 +52,14 @@ struct _External_Lookup
 
 struct _Part_Lookup
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    char *name;
    int *dest;
 };
 
 struct _Program_Lookup
 {
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    char *name;
    int *dest;
 };
@@ -96,7 +96,7 @@ struct _Code_Lookup
    Eina_Bool set;
 };
 
-static void data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Edje_Part_Collection *pc, char *name, char *ptr, int len));
+static void data_process_string(Old_Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len));
 
 Old_Edje_File *edje_file = NULL;
 Eina_List *edje_collections = NULL;
@@ -160,8 +160,8 @@ data_setup(void)
 }
 
 static void
-check_image_part_desc (Edje_Part_Collection *pc, Edje_Part *ep,
-                       Edje_Part_Description *epd, Eet_File *ef)
+check_image_part_desc (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep,
+                       Old_Edje_Part_Description *epd, Eet_File *ef)
 {
    Eina_List *l;
    Edje_Part_Image_Id *iid;
@@ -182,7 +182,7 @@ check_image_part_desc (Edje_Part_Collection *pc, Edje_Part *ep,
 }
 
 static void
-check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
+check_packed_items(Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef)
 {
    Eina_List *l;
    Edje_Pack_Element *it;
@@ -201,11 +201,11 @@ check_packed_items(Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 }
 
 static void
-check_part (Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
+check_part (Old_Edje_Part_Collection *pc, Old_Edje_Part *ep, Eet_File *ef)
 {
-   Edje_Part_Description *epd = ep->default_desc;
+   Old_Edje_Part_Description *epd = ep->default_desc;
    Eina_List *l;
-   Edje_Part_Description *data;
+   Old_Edje_Part_Description *data;
 
    /* FIXME: check image set and sort them. */
    if (!epd)
@@ -225,7 +225,7 @@ check_part (Edje_Part_Collection *pc, Edje_Part *ep, Eet_File *ef)
 }
 
 static void
-check_program (Edje_Part_Collection *pc, Edje_Program *ep, Eet_File *ef)
+check_program (Old_Edje_Part_Collection *pc, Edje_Program *ep, Eet_File *ef)
 {
    switch (ep->action)
      {
@@ -649,13 +649,13 @@ static void
 check_groups(Eet_File *ef)
 {
    Eina_List *l;
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
 
    /* sanity checks for parts and programs */
    EINA_LIST_FOREACH(edje_collections, l, pc)
      {
        Eina_List *ll;
-       Edje_Part *part;
+       Old_Edje_Part *part;
        Edje_Program *prog;
 
        EINA_LIST_FOREACH(pc->parts, ll, part)
@@ -669,7 +669,7 @@ static int
 data_write_groups(Eet_File *ef, int *collection_num)
 {
    Eina_List *l;
-   Edje_Part_Collection *pc;
+   Old_Edje_Part_Collection *pc;
    int bytes = 0;
    int total_bytes = 0;
 
@@ -1111,7 +1111,7 @@ data_queue_group_lookup(char *name)
 }
 
 void
-data_queue_part_lookup(Edje_Part_Collection *pc, char *name, int *dest)
+data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest)
 {
    Part_Lookup *pl;
 
@@ -1123,7 +1123,7 @@ data_queue_part_lookup(Edje_Part_Collection *pc, char *name, int *dest)
 }
 
 void
-data_queue_program_lookup(Edje_Part_Collection *pc, char *name, int *dest)
+data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, int *dest)
 {
    Program_Lookup *pl;
 
@@ -1187,7 +1187,7 @@ data_process_lookups(void)
    while (part_lookups)
      {
        Part_Lookup *pl;
-       Edje_Part *ep;
+       Old_Edje_Part *ep;
 
        pl = eina_list_data_get(part_lookups);
 
@@ -1329,7 +1329,7 @@ data_process_lookups(void)
 }
 
 static void
-data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Edje_Part_Collection *pc, char *name, char* ptr, int len))
+data_process_string(Old_Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Old_Edje_Part_Collection *pc, char *name, char* ptr, int len))
 {
    char *p;
    char *key;
@@ -1440,7 +1440,7 @@ data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void
 }
 
 static void
-_data_queue_part_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_part_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
    cl = mem_alloc(SZ(Code_Lookup));
@@ -1452,7 +1452,7 @@ _data_queue_part_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len
    code_lookups = eina_list_append(code_lookups, cl);
 }
 static void
-_data_queue_program_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_program_lookup(Old_Edje_Part_Collection *pc, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
 
@@ -1465,12 +1465,12 @@ _data_queue_program_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int
    code_lookups = eina_list_append(code_lookups, cl);
 }
 static void
-_data_queue_group_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr __UNUSED__, int len __UNUSED__)
+_data_queue_group_lookup(Old_Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr __UNUSED__, int len __UNUSED__)
 {
-   data_queue_group_lookup(name);      
+   data_queue_group_lookup(name);
 }
 static void
-_data_queue_image_pc_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr, int len)
+_data_queue_image_pc_lookup(Old_Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
 
@@ -1491,7 +1491,7 @@ data_process_scripts(void)
    for (l = codes, l2 = edje_collections; (l) && (l2); l = eina_list_next(l), l2 = eina_list_next(l2))
      {
        Code *cd;
-       Edje_Part_Collection *pc;
+       Old_Edje_Part_Collection *pc;
 
        cd = eina_list_data_get(l);
        pc = eina_list_data_get(l2);
index fcb7c5b..36b0310 100644 (file)
@@ -70,7 +70,6 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    void *data;
 
    ce = eina_hash_find(edf->collection, coll);
-
    if (!ce) return NULL;
 
    if (ce->ref)
@@ -98,13 +97,20 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    oedc = eet_data_read(edf->ef, _edje_edd_edje_part_collection, buf);
    if (!oedc) return NULL;
 
+   oedc->part = ce->entry;
+
+   edc = _edje_collection_convert(edf, oedc);
+   oedc = NULL;
+
+   edc->references = 1;
+
    snprintf(buf, sizeof(buf), "scripts/%i", id);
    data = eet_read(edf->ef, buf, &size);
 
    if (data)
      {
-       oedc->script = embryo_program_new(data, size);
-        _edje_embryo_script_init(oedc);
+       edc->script = embryo_program_new(data, size);
+       _edje_embryo_script_init(edc);
        free(data);
      }
 
@@ -114,12 +120,12 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    if (data)
      {
 #ifdef LUA2
-        _edje_lua2_script_load(oedc, data, size);
-#else        
+        _edje_lua2_script_load(edc, data, size);
+#else
        int err_code;
 
        //printf("lua chunk size: %d\n", size);
-       _edje_lua_new_reg(_edje_lua_state_get(), -1, oedc); // gets freed in 'edje_load::_edje_collectoin_free'
+       _edje_lua_new_reg(_edje_lua_state_get(), -1, edc); // gets freed in 'edje_load::_edje_collectoin_free'
 
        if ((err_code = luaL_loadbuffer(_edje_lua_state_get(), data, size, "edje_lua_script")))
          {
@@ -130,15 +136,10 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
          }
        if (lua_pcall(_edje_lua_state_get(), 0, 0, 0))
          ERR("lua call error: %s", lua_tostring(_edje_lua_state_get(), -1));
-#endif        
+#endif
        free(data);
      }
 
-   oedc->part = ce->entry;
-   oedc->references = 1;
-
-   edc = _edje_collection_convert(edf, oedc);
-
    return edc;
 }
 
@@ -300,17 +301,28 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
      {
        if (!edc->checked)
          {
-           EINA_LIST_FOREACH(edc->parts, l, ep)
+            unsigned int j;
+
+            for (j = 0; j < edc->parts_count; ++j)
               {
                  Edje_Part *ep2;
 
+                 ep = edc->parts[j];
+
                  /* Register any color classes in this parts descriptions. */
                  hist = NULL;
                  hist = eina_list_append(hist, ep);
                  ep2 = ep;
                  while (ep2->dragable.confine_id >= 0)
                    {
-                      ep2 = eina_list_nth(edc->parts, ep2->dragable.confine_id);
+                      if (ep2->dragable.confine_id >= (int) edc->parts_count)
+                        {
+                           ERR("confine_to above limit. invalidating it.");
+                           ep2->dragable.confine_id = -1;
+                           break;
+                        }
+
+                      ep2 = edc->parts[ep2->dragable.confine_id];
                       if (eina_list_data_find(hist, ep2))
                         {
                            ERR("confine_to loops. invalidating loop.");
@@ -327,9 +339,15 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
                    {
                       Edje_Part* prev;
 
+                      if (ep2->dragable.event_id >= (int) edc->parts_count)
+                        {
+                           ERR("event_id above limit. invalidating it.");
+                           ep2->dragable.event_id = -1;
+                           break;
+                        }
                       prev = ep2;
 
-                      ep2 = eina_list_nth(edc->parts, ep2->dragable.event_id);
+                      ep2 = edc->parts[ep2->dragable.event_id];
                       if (!ep2->dragable.x && !ep2->dragable.y)
                         {
                            prev->dragable.event_id = -1;
@@ -350,7 +368,14 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
                  ep2 = ep;
                  while (ep2->clip_to_id >= 0)
                    {
-                      ep2 = eina_list_nth(edc->parts, ep2->clip_to_id);
+                      if (ep2->clip_to_id >= (int) edc->parts_count)
+                        {
+                           ERR("clip_to_id above limit. invalidating it.");
+                           ep2->clip_to_id = -1;
+                           break;
+                        }
+
+                      ep2 = edc->parts[ep2->clip_to_id];
                       if (eina_list_data_find(hist, ep2))
                         {
                            ERR("clip_to loops. invalidating loop.");
@@ -378,11 +403,15 @@ _edje_cache_coll_clean(Edje_File *edf)
    count = eina_list_count(edf->collection_cache);
    while ((edf->collection_cache) && (count > _edje_collection_cache_size))
      {
+       Edje_Part_Collection_Directory_Entry *ce;
        Edje_Part_Collection *edc;
 
        edc = eina_list_data_get(eina_list_last(edf->collection_cache));
        edf->collection_cache = eina_list_remove_list(edf->collection_cache, eina_list_last(edf->collection_cache));
-       _edje_collection_free(edf, edc);
+
+       ce = eina_hash_find(edf->collection, edc->part);
+       _edje_collection_free(edf, edc, ce);
+
        count = eina_list_count(edf->collection_cache);
      }
 }
@@ -392,11 +421,14 @@ _edje_cache_coll_flush(Edje_File *edf)
 {
    while (edf->collection_cache)
      {
+       Edje_Part_Collection_Directory_Entry *ce;
        Edje_Part_Collection *edc;
 
        edc = eina_list_data_get(eina_list_last(edf->collection_cache));
        edf->collection_cache = eina_list_remove_list(edf->collection_cache, eina_list_last(edf->collection_cache));
-       _edje_collection_free(edf, edc);
+
+       ce = eina_hash_find(edf->collection, edc->part);
+       _edje_collection_free(edf, edc, ce);
      }
 }
 
index 27b9efc..985da10 100644 (file)
 #define FLAG_Y    0x02
 #define FLAG_XY   (FLAG_X | FLAG_Y)
 
-static void _edje_part_recalc_single(Edje *ed, Edje_Real_Part *ep, Edje_Part_Description *desc, Edje_Part_Description *chosen_desc, Edje_Real_Part *rel1_to_x, Edje_Real_Part *rel1_to_y, Edje_Real_Part *rel2_to_x, Edje_Real_Part *rel2_to_y, Edje_Real_Part *confine_to, Edje_Calc_Params *params, int flags);
+static void _edje_part_recalc_single(Edje *ed, Edje_Real_Part *ep,
+                                    Edje_Part_Description_Common *desc, Edje_Part_Description_Common *chosen_desc,
+                                    Edje_Real_Part *rel1_to_x, Edje_Real_Part *rel1_to_y,
+                                    Edje_Real_Part *rel2_to_x, Edje_Real_Part *rel2_to_y,
+                                    Edje_Real_Part *confine_to, Edje_Calc_Params *params, int flags);
 static void _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags);
 
 void
@@ -63,15 +67,15 @@ _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos)
 #endif
 }
 
-Edje_Part_Description *
+Edje_Part_Description_Common *
 _edje_part_description_find(Edje *ed __UNUSED__, Edje_Real_Part *rp, const char *name,
                             double val)
 {
    Edje_Part *ep = rp->part;
-   Edje_Part_Description *ret = NULL;
-   Edje_Part_Description *d;
-   Eina_List *l;
+   Edje_Part_Description_Common *ret = NULL;
+   Edje_Part_Description_Common *d;
    double min_dst = 99999.0;
+   unsigned int i;
 
    if (!strcmp(name, "default") && val == 0.0)
      return ep->default_desc;
@@ -82,15 +86,17 @@ _edje_part_description_find(Edje *ed __UNUSED__, Edje_Real_Part *rp, const char
    if (!strcmp(name, "default"))
      {
        ret = ep->default_desc;
-       min_dst = ABS(ep->default_desc->common.state.value - val);
+       min_dst = ABS(ep->default_desc->state.value - val);
      }
-   EINA_LIST_FOREACH(ep->other_desc, l, d)
+   for (i = 0; i < ep->other_count; ++i)
      {
-       if (!strcmp(d->common.state.name, name))
+       d = ep->other_desc[i];
+
+       if (!strcmp(d->state.name, name))
          {
             double dst;
 
-            dst = ABS(d->common.state.value - val);
+            dst = ABS(d->state.value - val);
             if (dst < min_dst)
               {
                  ret = d;
@@ -105,9 +111,11 @@ _edje_part_description_find(Edje *ed __UNUSED__, Edje_Real_Part *rp, const char
 void
 _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, double v1, const char *d2, double v2)
 {
-   Edje_Part_Description *epd1;
-   Edje_Part_Description *epd2 = NULL;
-   Edje_Part_Description *chosen_desc;
+   Edje_Part_Description_Common *epd1;
+   Edje_Part_Description_Common *epd2 = NULL;
+   Edje_Part_Description_Common *chosen_desc;
+
+   Edje_Part_Description_Image *epdi;
 
    if (!d1) d1 = "default";
 
@@ -118,8 +126,10 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
    if (d2)
      epd2 = _edje_part_description_find(ed, ep, d2, v2);
 
+   epdi = (Edje_Part_Description_Image*) epd2;
+
    /* There is an animation if both description are different or if description is an image with tweens */
-   if (epd2 != NULL && (epd1 != epd2 || (ep->part->type == EDJE_PART_TYPE_IMAGE && epd2->image.tween_list)))
+   if (epd2 != NULL && (epd1 != epd2 || (ep->part->type == EDJE_PART_TYPE_IMAGE && epdi->image.tween_list)))
      {
        if (!ep->param2)
          {
@@ -148,20 +158,24 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
    ep->param1.rel1_to_x = ep->param1.rel1_to_y = NULL;
    ep->param1.rel2_to_x = ep->param1.rel2_to_y = NULL;
 
-   if (ep->param1.description->common.rel1.id_x >= 0)
-     ep->param1.rel1_to_x = ed->table_parts[ep->param1.description->common.rel1.id_x % ed->table_parts_size];
-   if (ep->param1.description->common.rel1.id_y >= 0)
-     ep->param1.rel1_to_y = ed->table_parts[ep->param1.description->common.rel1.id_y % ed->table_parts_size];
-   if (ep->param1.description->common.rel2.id_x >= 0)
-     ep->param1.rel2_to_x = ed->table_parts[ep->param1.description->common.rel2.id_x % ed->table_parts_size];
-   if (ep->param1.description->common.rel2.id_y >= 0)
-     ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->common.rel2.id_y % ed->table_parts_size];
+   if (ep->param1.description->rel1.id_x >= 0)
+     ep->param1.rel1_to_x = ed->table_parts[ep->param1.description->rel1.id_x % ed->table_parts_size];
+   if (ep->param1.description->rel1.id_y >= 0)
+     ep->param1.rel1_to_y = ed->table_parts[ep->param1.description->rel1.id_y % ed->table_parts_size];
+   if (ep->param1.description->rel2.id_x >= 0)
+     ep->param1.rel2_to_x = ed->table_parts[ep->param1.description->rel2.id_x % ed->table_parts_size];
+   if (ep->param1.description->rel2.id_y >= 0)
+     ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
 
    if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
      {
+       Edje_Part_Description_External *external;
+
+       external = (Edje_Part_Description_External*) ep->param1.description;
+
        if (ep->param1.external_params)
          _edje_external_parsed_params_free(ep->swallowed_object, ep->param1.external_params);
-       ep->param1.external_params = _edje_external_params_parse(ep->swallowed_object, ep->param1.description->external_params);
+       ep->param1.external_params = _edje_external_params_parse(ep->swallowed_object, external->external_params);
      }
 
    if (ep->param2)
@@ -173,17 +187,25 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
 
        if (ep->param2->description)
          {
-            if (ep->param2->description->common.rel1.id_x >= 0)
-              ep->param2->rel1_to_x = ed->table_parts[ep->param2->description->common.rel1.id_x % ed->table_parts_size];
-            if (ep->param2->description->common.rel1.id_y >= 0)
-              ep->param2->rel1_to_y = ed->table_parts[ep->param2->description->common.rel1.id_y % ed->table_parts_size];
-            if (ep->param2->description->common.rel2.id_x >= 0)
-              ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->common.rel2.id_x % ed->table_parts_size];
-            if (ep->param2->description->common.rel2.id_y >= 0)
-              ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->common.rel2.id_y % ed->table_parts_size];
+            if (ep->param2->description->rel1.id_x >= 0)
+              ep->param2->rel1_to_x = ed->table_parts[ep->param2->description->rel1.id_x % ed->table_parts_size];
+            if (ep->param2->description->rel1.id_y >= 0)
+              ep->param2->rel1_to_y = ed->table_parts[ep->param2->description->rel1.id_y % ed->table_parts_size];
+            if (ep->param2->description->rel2.id_x >= 0)
+              ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->rel2.id_x % ed->table_parts_size];
+            if (ep->param2->description->rel2.id_y >= 0)
+              ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->rel2.id_y % ed->table_parts_size];
 
             if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
-              ep->param2->external_params = _edje_external_params_parse(ep->swallowed_object, ep->param2->description->external_params);
+              {
+                 Edje_Part_Description_External *external;
+
+                 external = (Edje_Part_Description_External*) ep->param2->description;
+
+                 if (ep->param2->external_params)
+                   _edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params);
+                 ep->param2->external_params = _edje_external_params_parse(ep->swallowed_object, external->external_params);
+              }
          }
 
        if (ep->description_pos != 0.0)
@@ -644,7 +666,7 @@ static void
 _edje_part_recalc_single_textblock(FLOAT_T sc,
                                   Edje *ed,
                                   Edje_Real_Part *ep,
-                                  Edje_Part_Description *chosen_desc,
+                                  Edje_Part_Description_Text *chosen_desc,
                                   Edje_Calc_Params *params,
                                   int *minw, int *minh,
                                   int *maxw, int *maxh)
@@ -660,8 +682,8 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
        if (chosen_desc->text.id_source >= 0)
          {
             ep->text.source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size];
-            if (ep->text.source->chosen_description->text.style)
-              style = ep->text.source->chosen_description->text.style;
+            if (((Edje_Part_Description_Text *)ep->text.source->chosen_description)->text.style)
+              style = ((Edje_Part_Description_Text *)ep->text.source->chosen_description)->text.style;
          }
        else
          {
@@ -673,7 +695,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
        if (chosen_desc->text.id_text_source >= 0)
          {
             ep->text.text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size];
-            text = ep->text.text_source->chosen_description->text.text;
+            text = ((Edje_Part_Description_Text*)ep->text.text_source->chosen_description)->text.text;
             if (ep->text.text_source->text.text) text = ep->text.text_source->text.text;
          }
        else
@@ -767,8 +789,8 @@ static void
 _edje_part_recalc_single_text(FLOAT_T sc,
                              Edje *ed,
                              Edje_Real_Part *ep,
-                             Edje_Part_Description *desc,
-                             Edje_Part_Description *chosen_desc,
+                             Edje_Part_Description_Text *desc,
+                             Edje_Part_Description_Text *chosen_desc,
                              Edje_Calc_Params *params,
                              int *minw, int *minh,
                              int *maxw, int *maxh)
@@ -797,12 +819,12 @@ _edje_part_recalc_single_text(FLOAT_T sc,
          ep->text.text_source = NULL;
 
        if (ep->text.text_source)
-         text = ep->text.text_source->chosen_description->text.text;
+         text = ((Edje_Part_Description_Text*)ep->text.text_source->chosen_description)->text.text;
        else
          text = chosen_desc->text.text;
 
        if (ep->text.source)
-         font = _edje_text_class_font_get(ed, ep->text.source->chosen_description, &size, &sfont);
+         font = _edje_text_class_font_get(ed, ((Edje_Part_Description_Text*)ep->text.source->chosen_description), &size, &sfont);
        else
          font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
 
@@ -1227,8 +1249,8 @@ _edje_part_recalc_single_min_max(FLOAT_T sc,
 static void
 _edje_part_recalc_single(Edje *ed,
                         Edje_Real_Part *ep,
-                        Edje_Part_Description *desc,
-                        Edje_Part_Description *chosen_desc,
+                        Edje_Part_Description_Common *desc,
+                        Edje_Part_Description_Common *chosen_desc,
                         Edje_Real_Part *rel1_to_x,
                         Edje_Real_Part *rel1_to_y,
                         Edje_Real_Part *rel2_to_x,
@@ -1245,23 +1267,23 @@ _edje_part_recalc_single(Edje *ed,
 
    sc = ed->scale;
    if (sc == 0.0) sc = _edje_scale;
-   _edje_part_recalc_single_min_max(sc, ep, &desc->common, &minw, &minh, &maxw, &maxh, flags);
+   _edje_part_recalc_single_min_max(sc, ep, desc, &minw, &minh, &maxw, &maxh, flags);
 
    /* relative coords of top left & bottom right */
-   _edje_part_recalc_single_rel(ed, ep, &desc->common, rel1_to_x, rel1_to_y, rel2_to_x, rel2_to_y, params, flags);
+   _edje_part_recalc_single_rel(ed, ep, desc, rel1_to_x, rel1_to_y, rel2_to_x, rel2_to_y, params, flags);
 
    /* aspect */
    if (((flags | ep->calculated) & FLAG_XY) == FLAG_XY)
-     _edje_part_recalc_single_aspect(ep, &desc->common, params, &minw, &minh, &maxw, &maxh);
+     _edje_part_recalc_single_aspect(ep, desc, params, &minw, &minh, &maxw, &maxh);
 
    /* size step */
-   _edje_part_recalc_single_step(&desc->common, params, flags);
+   _edje_part_recalc_single_step(desc, params, flags);
 
    /* if we have text that wants to make the min size the text size... */
    if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
-     _edje_part_recalc_single_textblock(sc, ed, ep, chosen_desc, params, &minw, &minh, &maxw, &maxh);
+     _edje_part_recalc_single_textblock(sc, ed, ep, (Edje_Part_Description_Text*) chosen_desc, params, &minw, &minh, &maxw, &maxh);
    else if (ep->part->type == EDJE_PART_TYPE_TEXT)
-     _edje_part_recalc_single_text(sc, ed, ep, desc, chosen_desc, params, &minw, &minh, &maxw, &maxh);
+     _edje_part_recalc_single_text(sc, ed, ep, (Edje_Part_Description_Text*) desc, (Edje_Part_Description_Text*) chosen_desc, params, &minw, &minh, &maxw, &maxh);
 
    /* remember what our size is BEFORE we go limit it */
    params->req.x = params->x;
@@ -1270,10 +1292,10 @@ _edje_part_recalc_single(Edje *ed,
    params->req.h = params->h;
 
    /* adjust for min size */
-   _edje_part_recalc_single_min(&desc->common, params, minw, minh, flags);
+   _edje_part_recalc_single_min(desc, params, minw, minh, flags);
 
    /* adjust for max size */
-   _edje_part_recalc_single_max(&desc->common, params, maxw, maxh, flags);
+   _edje_part_recalc_single_max(desc, params, maxw, maxh, flags);
 
    /* take care of dragable part */
    if (ep->drag)
@@ -1281,82 +1303,90 @@ _edje_part_recalc_single(Edje *ed,
 
    /* fill */
    if (ep->part->type == EDJE_PART_TYPE_IMAGE)
-     _edje_part_recalc_single_fill(ep, &desc->image, params, flags);
+     _edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Image *)desc)->image, params, flags);
 
    /* colors */
-   if ((desc->common.color_class) && (*desc->common.color_class))
-     cc = _edje_color_class_find(ed, desc->common.color_class);
+   if ((desc->color_class) && (*desc->color_class))
+     cc = _edje_color_class_find(ed, desc->color_class);
 
    if (cc)
      {
-       params->color.r = (((int)cc->r + 1) * desc->common.color.r) >> 8;
-       params->color.g = (((int)cc->g + 1) * desc->common.color.g) >> 8;
-       params->color.b = (((int)cc->b + 1) * desc->common.color.b) >> 8;
-       params->color.a = (((int)cc->a + 1) * desc->common.color.a) >> 8;
+       params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
+       params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8;
+       params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8;
+       params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8;
      }
    else
      {
-       params->color.r = desc->common.color.r;
-       params->color.g = desc->common.color.g;
-       params->color.b = desc->common.color.b;
-       params->color.a = desc->common.color.a;
+       params->color.r = desc->color.r;
+       params->color.g = desc->color.g;
+       params->color.b = desc->color.b;
+       params->color.a = desc->color.a;
      }
 
    /* visible */
-   params->visible = desc->common.visible;
+   params->visible = desc->visible;
 
    switch (ep->part->type)
      {
       case EDJE_PART_TYPE_IMAGE:
-        /* border */
-        if (flags & FLAG_X)
-          {
-             params->type.common.spec.image.l = desc->image.border.l;
-             params->type.common.spec.image.r = desc->image.border.r;
-          }
-        if (flags & FLAG_Y)
-          {
-             params->type.common.spec.image.t = desc->image.border.t;
-             params->type.common.spec.image.b = desc->image.border.b;
-          }
-        break;
+       {
+          Edje_Part_Description_Image *img_desc = (Edje_Part_Description_Image*) desc;
+
+          /* border */
+          if (flags & FLAG_X)
+            {
+               params->type.common.spec.image.l = img_desc->image.border.l;
+               params->type.common.spec.image.r = img_desc->image.border.r;
+            }
+          if (flags & FLAG_Y)
+            {
+               params->type.common.spec.image.t = img_desc->image.border.t;
+               params->type.common.spec.image.b = img_desc->image.border.b;
+            }
+          break;
+       }
       case EDJE_PART_TYPE_TEXT:
       case EDJE_PART_TYPE_TEXTBLOCK:
-        /* text.align */
-        if (flags & FLAG_X)
-          {
-             params->type.text.align.x = desc->text.align.x;
-          }
-        if (flags & FLAG_Y)
-          {
-             params->type.text.align.y = desc->text.align.y;
-          }
-        params->type.text.elipsis = desc->text.elipsis;
-
-        /* text colors */
-        if (cc)
-          {
-            params->type.text.color2.r = (((int)cc->r2 + 1) * desc->common.color2.r) >> 8;
-            params->type.text.color2.g = (((int)cc->g2 + 1) * desc->common.color2.g) >> 8;
-            params->type.text.color2.b = (((int)cc->b2 + 1) * desc->common.color2.b) >> 8;
-            params->type.text.color2.a = (((int)cc->a2 + 1) * desc->common.color2.a) >> 8;
-            params->type.text.color3.r = (((int)cc->r3 + 1) * desc->text.color3.r) >> 8;
-            params->type.text.color3.g = (((int)cc->g3 + 1) * desc->text.color3.g) >> 8;
-            params->type.text.color3.b = (((int)cc->b3 + 1) * desc->text.color3.b) >> 8;
-            params->type.text.color3.a = (((int)cc->a3 + 1) * desc->text.color3.a) >> 8;
-          }
-        else
-          {
-             params->type.text.color2.r = desc->common.color2.r;
-             params->type.text.color2.g = desc->common.color2.g;
-             params->type.text.color2.b = desc->common.color2.b;
-             params->type.text.color2.a = desc->common.color2.a;
-             params->type.text.color3.r = desc->text.color3.r;
-             params->type.text.color3.g = desc->text.color3.g;
-             params->type.text.color3.b = desc->text.color3.b;
-             params->type.text.color3.a = desc->text.color3.a;
-          }
-        break;
+       {
+          Edje_Part_Description_Text *text_desc = (Edje_Part_Description_Text*) chosen_desc;
+
+          /* text.align */
+          if (flags & FLAG_X)
+            {
+               params->type.text.align.x = text_desc->text.align.x;
+            }
+          if (flags & FLAG_Y)
+            {
+               params->type.text.align.y = text_desc->text.align.y;
+            }
+          params->type.text.elipsis = text_desc->text.elipsis;
+
+          /* text colors */
+          if (cc)
+            {
+               params->type.text.color2.r = (((int)cc->r2 + 1) * text_desc->common.color2.r) >> 8;
+               params->type.text.color2.g = (((int)cc->g2 + 1) * text_desc->common.color2.g) >> 8;
+               params->type.text.color2.b = (((int)cc->b2 + 1) * text_desc->common.color2.b) >> 8;
+               params->type.text.color2.a = (((int)cc->a2 + 1) * text_desc->common.color2.a) >> 8;
+               params->type.text.color3.r = (((int)cc->r3 + 1) * text_desc->text.color3.r) >> 8;
+               params->type.text.color3.g = (((int)cc->g3 + 1) * text_desc->text.color3.g) >> 8;
+               params->type.text.color3.b = (((int)cc->b3 + 1) * text_desc->text.color3.b) >> 8;
+               params->type.text.color3.a = (((int)cc->a3 + 1) * text_desc->text.color3.a) >> 8;
+            }
+          else
+            {
+               params->type.text.color2.r = text_desc->common.color2.r;
+               params->type.text.color2.g = text_desc->common.color2.g;
+               params->type.text.color2.b = text_desc->common.color2.b;
+               params->type.text.color2.a = text_desc->common.color2.a;
+               params->type.text.color3.r = text_desc->text.color3.r;
+               params->type.text.color3.g = text_desc->text.color3.g;
+               params->type.text.color3.b = text_desc->text.color3.b;
+               params->type.text.color3.a = text_desc->text.color3.a;
+            }
+          break;
+       }
       case EDJE_PART_TYPE_RECTANGLE:
       case EDJE_PART_TYPE_BOX:
       case EDJE_PART_TYPE_TABLE:
@@ -1371,7 +1401,7 @@ _edje_part_recalc_single(Edje *ed,
 }
 
 static void
-_edje_box_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
+_edje_box_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description_Box *chosen_desc)
 {
    Evas_Object_Box_Layout layout;
    void (*free_data)(void *data);
@@ -1408,7 +1438,10 @@ _edje_box_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params
 }
 
 static void
-_edje_table_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params *p3 __UNUSED__, Edje_Part_Description *chosen_desc)
+_edje_table_recalc_apply(Edje *ed __UNUSED__,
+                        Edje_Real_Part *ep,
+                        Edje_Calc_Params *p3 __UNUSED__,
+                        Edje_Part_Description_Table *chosen_desc)
 {
    evas_object_table_homogeneous_set(ep->object, chosen_desc->table.homogeneous);
    evas_object_table_align_set(ep->object, TO_DOUBLE(chosen_desc->table.align.x), TO_DOUBLE(chosen_desc->table.align.y));
@@ -1421,7 +1454,7 @@ _edje_table_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Para
 }
 
 static int
-_edje_image_find(Evas_Object *obj, Edje *ed, Edje_Real_Part_Set **eps, Edje_Part_Description *st, Edje_Part_Image_Id *imid)
+_edje_image_find(Evas_Object *obj, Edje *ed, Edje_Real_Part_Set **eps, Edje_Part_Description_Image *st, Edje_Part_Image_Id *imid)
 {
   Edje_Image_Directory_Set_Entry *entry;
   Edje_Image_Directory_Set *set = NULL;
@@ -1485,7 +1518,7 @@ _edje_image_find(Evas_Object *obj, Edje *ed, Edje_Real_Part_Set **eps, Edje_Part
 }
 
 static void
-_edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc, FLOAT_T pos)
+_edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description_Image *chosen_desc, FLOAT_T pos)
 {
    int image_id;
    int image_count, image_num;
@@ -1510,7 +1543,9 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
      evas_object_image_border_center_fill_set(ep->object, EVAS_BORDER_FILL_SOLID);
 
    image_id = _edje_image_find(ep->object, ed,
-                              &ep->param1.set, ep->param1.description, NULL);
+                              &ep->param1.set,
+                              (Edje_Part_Description_Image*) ep->param1.description,
+                              NULL);
    if (image_id < 0)
      {
        Edje_Image_Directory_Entry *ie;
@@ -1528,7 +1563,7 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
      {
        image_count = 2;
        if (ep->param2)
-         image_count += eina_list_count(ep->param2->description->image.tween_list);
+         image_count += eina_list_count(((Edje_Part_Description_Image*) ep->param2->description)->image.tween_list);
        image_num = TO_INT(MUL(pos, SUB(FROM_INT(image_count),
                                        FROM_DOUBLE(0.5))));
        if (image_num > (image_count - 1))
@@ -1536,7 +1571,8 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
        if (image_num == 0)
          {
            image_id = _edje_image_find(ep->object, ed,
-                                       &ep->param1.set, ep->param1.description, 
+                                       &ep->param1.set,
+                                       (Edje_Part_Description_Image*) ep->param1.description,
                                        NULL);
          }
        else
@@ -1545,14 +1581,15 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
               if (image_num == (image_count - 1))
                 {
                   image_id = _edje_image_find(ep->object, ed,
-                                              &ep->param2->set, ep->param2->description,
+                                              &ep->param2->set,
+                                              (Edje_Part_Description_Image*) ep->param2->description,
                                               NULL);
                 }
               else
                 {
                    Edje_Part_Image_Id *imid;
 
-                   imid = eina_list_nth(ep->param2->description->image.tween_list,
+                   imid = eina_list_nth(((Edje_Part_Description_Image*) ep->param2->description)->image.tween_list,
                                         image_num - 1);
                    image_id = _edje_image_find(ep->object, ed, NULL, NULL, imid);
                 }
@@ -1562,8 +1599,8 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
             ERR("¨Part \"%s\" has description, "
                 "\"%s\" %3.3f with a missing image id!!!",
                 ep->part->name,
-                ep->param1.description->common.state.name,
-                ep->param1.description->common.state.value);
+                ep->param1.description->state.name,
+                ep->param1.description->state.value);
          }
        else
          {
@@ -1618,14 +1655,17 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
    Edje_Calc_Params lp1, lp2;
 #endif
    Edje_Calc_Params *p1, *pf;
-   Edje_Part_Description *chosen_desc;
+   Edje_Part_Description_Common *chosen_desc;
    Edje_Real_Part *confine_to = NULL;
    FLOAT_T pos = ZERO;
    Edje_Calc_Params lp3;
 
    /* GRADIENT ARE GONE, WE MUST IGNORE IT FROM OLD FILE. */
    if (ep->part->type == EDJE_PART_TYPE_GRADIENT)
-     return;
+     {
+       ERR("GRADIENT spotted during recalc ! That should never happen ! Send your edje file to devel ml.");
+       return;
+     }
 
    if ((ep->calculated & FLAG_XY) == FLAG_XY)
      {
@@ -1932,8 +1972,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        switch (ep->part->type)
          {
           case EDJE_PART_TYPE_IMAGE:
-             evas_object_image_scale_hint_set(ep->object, 
-                                              chosen_desc->image.scale_hint);
+            {
+               Edje_Part_Description_Image *img_desc = (Edje_Part_Description_Image*) chosen_desc;
+
+               evas_object_image_scale_hint_set(ep->object,
+                                                img_desc->image.scale_hint);
+            }
           case EDJE_PART_TYPE_RECTANGLE:
           case EDJE_PART_TYPE_TEXTBLOCK:
           case EDJE_PART_TYPE_BOX:
@@ -1972,16 +2016,16 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        switch (ep->part->type)
          {
           case EDJE_PART_TYPE_TEXT:
-             _edje_text_recalc_apply(ed, ep, pf, chosen_desc);
+             _edje_text_recalc_apply(ed, ep, pf, (Edje_Part_Description_Text*) chosen_desc);
              break;
           case EDJE_PART_TYPE_IMAGE:
-             _edje_image_recalc_apply(ed, ep, pf, chosen_desc, pos);
+             _edje_image_recalc_apply(ed, ep, pf, (Edje_Part_Description_Image*) chosen_desc, pos);
              break;
           case EDJE_PART_TYPE_BOX:
-             _edje_box_recalc_apply(ed, ep, pf, chosen_desc);
+             _edje_box_recalc_apply(ed, ep, pf, (Edje_Part_Description_Box*) chosen_desc);
              break;
           case EDJE_PART_TYPE_TABLE:
-             _edje_table_recalc_apply(ed, ep, pf, chosen_desc);
+             _edje_table_recalc_apply(ed, ep, pf, (Edje_Part_Description_Table*) chosen_desc);
              break;
           case EDJE_PART_TYPE_EXTERNAL:
           case EDJE_PART_TYPE_RECTANGLE:
@@ -2017,12 +2061,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
              mo = ep->swallowed_object;
          }
         else mo = ep->object;
-        if (chosen_desc->common.map.on)
+        if (chosen_desc->map.on)
           {
              Evas_Map *map;
              Evas_Coord cx, cy, cz;
              double rx, ry, rz;
-             Edje_Part_Description *desc1, *desc2;
+             Edje_Part_Description_Common *desc1, *desc2;
 
              desc1 = ep->param1.description;
              desc2 = NULL;
@@ -2051,12 +2095,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 
              // if another center is specified - find it and caculate it
              if ((desc1) &&
-                 (desc1->common.map.rot.id_center >= 0) &&
-                 (desc1->common.map.rot.id_center != ep->part->id))
+                 (desc1->map.rot.id_center >= 0) &&
+                 (desc1->map.rot.id_center != ep->part->id))
                {
                   Evas_Coord cx1, cy1, cz1, cx2, cy2, cz2;
                   Edje_Real_Part *ep2 =
-                    ed->table_parts[desc1->common.map.rot.id_center %
+                    ed->table_parts[desc1->map.rot.id_center %
                                     ed->table_parts_size];
                   // get center for desc1
                   if (ep2)
@@ -2068,10 +2112,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                     }
                   // if we have a desc2 and are on a partiual position to it
                   if ((pos != ZERO) && (desc2) &&
-                      (desc2->common.map.rot.id_center >= 0) &&
-                      (desc2->common.map.rot.id_center != ep->part->id))
+                      (desc2->map.rot.id_center >= 0) &&
+                      (desc2->map.rot.id_center != ep->part->id))
                     {
-                       ep2 = ed->table_parts[desc2->common.map.rot.id_center %
+                       ep2 = ed->table_parts[desc2->map.rot.id_center %
                                              ed->table_parts_size];
                        // get 2nd center & merge with pos with center 1
                        if (ep2)
@@ -2093,32 +2137,32 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
              // rotation - interpolate wit pos, if appropriate
              if ((pos != ZERO) && (desc2))
                {
-                  rx = TO_DOUBLE(ADD(desc1->common.map.rot.x,
-                                     MUL(pos, SUB(desc2->common.map.rot.x,
-                                                  desc1->common.map.rot.x))));
-                  ry = TO_DOUBLE(ADD(desc1->common.map.rot.y,
-                                    MUL(pos, SUB(desc2->common.map.rot.y,
-                                                  desc1->common.map.rot.y))));
-                  rz = TO_DOUBLE(ADD(desc1->common.map.rot.z,
-                                    MUL(pos, SUB(desc2->common.map.rot.z,
-                                                  desc1->common.map.rot.z))));
+                  rx = TO_DOUBLE(ADD(desc1->map.rot.x,
+                                     MUL(pos, SUB(desc2->map.rot.x,
+                                                  desc1->map.rot.x))));
+                  ry = TO_DOUBLE(ADD(desc1->map.rot.y,
+                                    MUL(pos, SUB(desc2->map.rot.y,
+                                                  desc1->map.rot.y))));
+                  rz = TO_DOUBLE(ADD(desc1->map.rot.z,
+                                    MUL(pos, SUB(desc2->map.rot.z,
+                                                  desc1->map.rot.z))));
                }
              else
                {
                   // no 2 descriptions - just use rot
-                  rx = TO_DOUBLE(desc1->common.map.rot.x);
-                  ry = TO_DOUBLE(desc1->common.map.rot.y);
-                  rz = TO_DOUBLE(desc1->common.map.rot.z);
+                  rx = TO_DOUBLE(desc1->map.rot.x);
+                  ry = TO_DOUBLE(desc1->map.rot.y);
+                  rz = TO_DOUBLE(desc1->map.rot.z);
                }
              evas_map_util_3d_rotate(map, rx, ry, rz, cx, cy, cz);
 
              // calculate light color & position etc. if there is one
              if (((desc1) &&
-                  (desc1->common.map.id_light >= 0) &&
-                  (desc1->common.map.id_light != ep->part->id)) ||
+                  (desc1->map.id_light >= 0) &&
+                  (desc1->map.id_light != ep->part->id)) ||
                  ((desc2) &&
-                  (desc2->common.map.id_light >= 0) &&
-                  (desc2->common.map.id_light != ep->part->id)))
+                  (desc2->map.id_light >= 0) &&
+                  (desc2->map.id_light != ep->part->id)))
                {
                   Evas_Coord lx, ly, lz;
                   int lr, lg, lb, lar, lag, lab;
@@ -2130,16 +2174,16 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                   do1 = do2 = 0;
 
                   if ((desc1) &&
-                      (desc1->common.map.id_light >= 0) &&
-                      (desc1->common.map.id_light != ep->part->id))
+                      (desc1->map.id_light >= 0) &&
+                      (desc1->map.id_light != ep->part->id))
                     {
                        Edje_Real_Part *ep2 =
-                         ed->table_parts[desc1->common.map.id_light %
+                         ed->table_parts[desc1->map.id_light %
                                          ed->table_parts_size];
                        // get light part
                        if (ep2)
                          {
-                            Edje_Part_Description *ep2desc1, *ep2desc2;
+                            Edje_Part_Description_Common *ep2desc1, *ep2desc2;
                             FLOAT_T ep2pos;
 
                             do1 = 1;
@@ -2156,51 +2200,51 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                             // if light is transitioning - interpolate it
                             if ((ep2pos != ZERO) && (ep2desc2))
                               {
-                                 lz1 = ep2desc1->common.persp.zplane +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.zplane -
-                                                ep2desc1->common.persp.zplane));
-                                 lr1 = ep2desc1->common.color.r +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.r -
-                                                ep2desc1->common.color.r));
-                                 lg1 = ep2desc1->common.color.g +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.g -
-                                                ep2desc1->common.color.b));
-                                 lb1 = ep2desc1->common.color.b +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.g -
-                                                ep2desc1->common.color.b));
-                                 lar1 = ep2desc1->common.color2.r +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.r -
-                                                ep2desc1->common.color2.r));
-                                 lag1 = ep2desc1->common.color2.g +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.g -
-                                                ep2desc1->common.color2.b));
-                                 lab1 = ep2desc1->common.color2.b +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.g -
-                                                ep2desc1->common.color2.b));
+                                 lz1 = ep2desc1->persp.zplane +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.zplane -
+                                                ep2desc1->persp.zplane));
+                                 lr1 = ep2desc1->color.r +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.r -
+                                                ep2desc1->color.r));
+                                 lg1 = ep2desc1->color.g +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.g -
+                                                ep2desc1->color.b));
+                                 lb1 = ep2desc1->color.b +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.g -
+                                                ep2desc1->color.b));
+                                 lar1 = ep2desc1->color2.r +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.r -
+                                                ep2desc1->color2.r));
+                                 lag1 = ep2desc1->color2.g +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.g -
+                                                ep2desc1->color2.b));
+                                 lab1 = ep2desc1->color2.b +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.g -
+                                                ep2desc1->color2.b));
                               }
                             else
                               {
-                                 lz1 = ep2desc1->common.persp.zplane;
-                                 lr1 = ep2desc1->common.color.r;
-                                 lg1 = ep2desc1->common.color.g;
-                                 lb1 = ep2desc1->common.color.b;
-                                 lar1 = ep2desc1->common.color2.r;
-                                 lag1 = ep2desc1->common.color2.g;
-                                 lab1 = ep2desc1->common.color2.b;
+                                 lz1 = ep2desc1->persp.zplane;
+                                 lr1 = ep2desc1->color.r;
+                                 lg1 = ep2desc1->color.g;
+                                 lb1 = ep2desc1->color.b;
+                                 lar1 = ep2desc1->color2.r;
+                                 lag1 = ep2desc1->color2.g;
+                                 lab1 = ep2desc1->color2.b;
                               }
                          }
                     }
                   if ((desc2) &&
-                      (desc2->common.map.id_light >= 0) &&
-                      (desc2->common.map.id_light != ep->part->id))
+                      (desc2->map.id_light >= 0) &&
+                      (desc2->map.id_light != ep->part->id))
                     {
                        Edje_Real_Part *ep2 =
-                         ed->table_parts[desc2->common.map.id_light %
+                         ed->table_parts[desc2->map.id_light %
                                          ed->table_parts_size];
                        // get light part
                        if (ep2)
                          {
-                            Edje_Part_Description *ep2desc1, *ep2desc2;
+                            Edje_Part_Description_Common *ep2desc1, *ep2desc2;
                             FLOAT_T ep2pos;
 
                             do2 = 1;
@@ -2217,37 +2261,37 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                             // if light is transitioning - interpolate it
                             if ((ep2pos != ZERO) && (ep2desc2))
                               {
-                                 lz2 = ep2desc1->common.persp.zplane +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.zplane -
-                                                ep2desc1->common.persp.zplane));
-                                 lr2 = ep2desc1->common.color.r +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.r -
-                                                ep2desc1->common.color.r));
-                                 lg2 = ep2desc1->common.color.g +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.g -
-                                                ep2desc1->common.color.b));
-                                 lb2 = ep2desc1->common.color.b +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color.g -
-                                                ep2desc1->common.color.b));
-                                 lar2 = ep2desc1->common.color2.r +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.r -
-                                                ep2desc1->common.color2.r));
-                                 lag2 = ep2desc1->common.color2.g +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.g -
-                                                ep2desc1->common.color2.b));
-                                 lab2 = ep2desc1->common.color2.b +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.color2.g -
-                                                ep2desc1->common.color2.b));
+                                 lz2 = ep2desc1->persp.zplane +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.zplane -
+                                                ep2desc1->persp.zplane));
+                                 lr2 = ep2desc1->color.r +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.r -
+                                                ep2desc1->color.r));
+                                 lg2 = ep2desc1->color.g +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.g -
+                                                ep2desc1->color.b));
+                                 lb2 = ep2desc1->color.b +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color.g -
+                                                ep2desc1->color.b));
+                                 lar2 = ep2desc1->color2.r +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.r -
+                                                ep2desc1->color2.r));
+                                 lag2 = ep2desc1->color2.g +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.g -
+                                                ep2desc1->color2.b));
+                                 lab2 = ep2desc1->color2.b +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->color2.g -
+                                                ep2desc1->color2.b));
                               }
                             else
                               {
-                                 lz2 = ep2desc1->common.persp.zplane;
-                                 lr2 = ep2desc1->common.color.r;
-                                 lg2 = ep2desc1->common.color.g;
-                                 lb2 = ep2desc1->common.color.b;
-                                 lar2 = ep2desc1->common.color2.r;
-                                 lag2 = ep2desc1->common.color2.g;
-                                 lab2 = ep2desc1->common.color2.b;
+                                 lz2 = ep2desc1->persp.zplane;
+                                 lr2 = ep2desc1->color.r;
+                                 lg2 = ep2desc1->color.g;
+                                 lb2 = ep2desc1->color.b;
+                                 lar2 = ep2desc1->color2.r;
+                                 lag2 = ep2desc1->color2.g;
+                                 lab2 = ep2desc1->color2.b;
                               }
                          }
                     }
@@ -2282,7 +2326,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                }
 
              // calculate perspective point
-             if (chosen_desc->common.map.persp_on)
+             if (chosen_desc->map.persp_on)
                {
                   Evas_Coord px, py, zplane, foc;
                   Evas_Coord px1, py1, zplane1, foc1;
@@ -2298,14 +2342,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                   foc = 1000;
 
                   if ((desc1) &&
-                      (desc1->common.map.id_persp >= 0) &&
-                      (desc1->common.map.id_persp != ep->part->id))
+                      (desc1->map.id_persp >= 0) &&
+                      (desc1->map.id_persp != ep->part->id))
                     {
-                       Edje_Real_Part *ep2 = ed->table_parts[desc1->common.map.id_persp %
+                       Edje_Real_Part *ep2 = ed->table_parts[desc1->map.id_persp %
                                                              ed->table_parts_size];
                        if (ep2)
                          {
-                            Edje_Part_Description *ep2desc1, *ep2desc2;
+                            Edje_Part_Description_Common *ep2desc1, *ep2desc2;
                             FLOAT_T ep2pos;
 
                             do1 = 1;
@@ -2320,30 +2364,30 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                             py1 = ed->y + ep2->y + (ep2->h / 2);
                             if ((ep2pos != ZERO) && (ep2desc2))
                               {
-                                 zplane1 = ep2desc1->common.persp.zplane +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.zplane -
-                                                ep2desc1->common.persp.zplane));
-                                 foc1 = ep2desc1->common.persp.focal +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.focal -
-                                                ep2desc1->common.persp.focal));
+                                 zplane1 = ep2desc1->persp.zplane +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.zplane -
+                                                ep2desc1->persp.zplane));
+                                 foc1 = ep2desc1->persp.focal +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.focal -
+                                                ep2desc1->persp.focal));
                               }
                             else
                               {
-                                 zplane1 = ep2desc1->common.persp.zplane;
-                                 foc1 = ep2desc1->common.persp.focal;
+                                 zplane1 = ep2desc1->persp.zplane;
+                                 foc1 = ep2desc1->persp.focal;
                               }
                          }
                     }
 
                   if ((desc2) &&
-                      (desc2->common.map.id_persp >= 0) &&
-                      (desc2->common.map.id_persp != ep->part->id))
+                      (desc2->map.id_persp >= 0) &&
+                      (desc2->map.id_persp != ep->part->id))
                     {
-                       Edje_Real_Part *ep2 = ed->table_parts[desc2->common.map.id_persp %
+                       Edje_Real_Part *ep2 = ed->table_parts[desc2->map.id_persp %
                                                              ed->table_parts_size];
                        if (ep2)
                          {
-                            Edje_Part_Description *ep2desc1, *ep2desc2;
+                            Edje_Part_Description_Common *ep2desc1, *ep2desc2;
                             FLOAT_T ep2pos;
 
                             do2 = 1;
@@ -2358,17 +2402,17 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                             py2 = ed->y + ep2->y + (ep2->h / 2);
                             if ((ep2pos != ZERO) && (ep2desc2))
                               {
-                                 zplane2 = ep2desc1->common.persp.zplane +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.zplane -
-                                                ep2desc1->common.persp.zplane));
-                                 foc2 = ep2desc1->common.persp.focal +
-                                   TO_INT(SCALE(ep2pos, ep2desc2->common.persp.focal -
-                                                ep2desc1->common.persp.focal));
+                                 zplane2 = ep2desc1->persp.zplane +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.zplane -
+                                                ep2desc1->persp.zplane));
+                                 foc2 = ep2desc1->persp.focal +
+                                   TO_INT(SCALE(ep2pos, ep2desc2->persp.focal -
+                                                ep2desc1->persp.focal));
                               }
                             else
                               {
-                                 zplane2 = ep2desc1->common.persp.zplane;
-                                 foc2 = ep2desc1->common.persp.focal;
+                                 zplane2 = ep2desc1->persp.zplane;
+                                 foc2 = ep2desc1->persp.focal;
                               }
                          }
                     }
@@ -2412,7 +2456,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                }
 
              // handle backface culling (object is facing away from view
-             if (chosen_desc->common.map.backcull)
+             if (chosen_desc->map.backcull)
                {
                   if (pf->visible)
                     {
@@ -2423,10 +2467,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
                }
 
              // handle smooth
-             if (chosen_desc->common.map.smooth) evas_map_smooth_set(map, 1);
+             if (chosen_desc->map.smooth) evas_map_smooth_set(map, 1);
              else evas_map_smooth_set(map, 0);
              // handle alpha
-             if (chosen_desc->common.map.alpha) evas_map_alpha_set(map, 1);
+             if (chosen_desc->map.alpha) evas_map_alpha_set(map, 1);
              else evas_map_alpha_set(map, 0);
 
              evas_object_map_set(mo, map);
index b3efb54..237c668 100644 (file)
@@ -53,7 +53,7 @@ _edje_collection_string_free(void *data)
            edf->path, edf->references,
            ce->ref->part, ce->ref->references);
 
-       _edje_collection_free(edf, ce->ref);
+       _edje_collection_free(edf, ce->ref, ce);
      }
 
    free(ce);
@@ -242,15 +242,13 @@ _edje_collection_convert(Edje_File *file, Old_Edje_Part_Collection *oedc)
 {
    Edje_Part_Collection_Directory_Entry *ce;
    Edje_Part_Collection *edc;
-   Edje_Part *part;
+   Old_Edje_Part *part;
+   Edje_Data *di;
    Eina_List *l;
-
-   edc = oedc;
+   unsigned int k;
 
    ce = eina_hash_find(file->collection, oedc->part);
 
-   ce->ref = edc;
-
    /* Count each type part and their respective state */
    EINA_LIST_FOREACH(oedc->parts, l, part)
      {
@@ -281,7 +279,150 @@ _edje_collection_convert(Edje_File *file, Old_Edje_Part_Collection *oedc)
 
        *count += eina_list_count(part->other_desc) + 1;
      }
+   ce->count.part = eina_list_count(oedc->parts);
+
+#define EMN(Tp, Sz, Ce)                                                        \
+   Ce->mp.Tp = eina_mempool_add("one_big", #Tp, NULL, sizeof (Sz), Ce->count.Tp);
+
+   EMN(RECTANGLE, Edje_Part_Description_Common, ce);
+   EMN(TEXT, Edje_Part_Description_Text, ce);
+   EMN(IMAGE, Edje_Part_Description_Image, ce);
+   EMN(SWALLOW, Edje_Part_Description_Common, ce);
+   EMN(TEXTBLOCK, Edje_Part_Description_Text, ce);
+   EMN(GROUP, Edje_Part_Description_Common, ce);
+   EMN(BOX, Edje_Part_Description_Box, ce);
+   EMN(TABLE, Edje_Part_Description_Table, ce);
+   EMN(EXTERNAL, Edje_Part_Description_External, ce);
+   EMN(part, Edje_Part, ce);
+
+   /* Change structure layout */
+   edc = calloc(1, sizeof (Edje_Part_Collection));
+   if (!edc) return NULL;
+   ce->ref = edc;
+
+   edc->programs = oedc->programs;
+   oedc->programs = NULL;
+
+   edc->data = eina_hash_string_small_new(NULL);
+   EINA_LIST_FREE(oedc->data, di)
+     {
+       eina_hash_direct_add(edc->data, di->key, di->value);
+       free(di);
+     }
+
+   edc->parts_count = eina_list_count(oedc->parts);
+   edc->parts = calloc(edc->parts_count, sizeof (Edje_Part *));
+   k = 0;
+
+   EINA_LIST_FREE(oedc->parts, part)
+     {
+       Old_Edje_Part_Description *oepd;
+       Edje_Pack_Element *elm;
+       Edje_Part *replacement;
+       unsigned int i;
+
+       replacement = eina_mempool_malloc(ce->mp.part, sizeof (Edje_Part));
+
+       replacement->name = part->name;
+       replacement->default_desc = _edje_description_convert(part->type, ce, part->default_desc);
+
+       replacement->other_count = eina_list_count(part->other_desc);
+       replacement->other_desc = calloc(replacement->other_count, sizeof (Edje_Part_Description_Common*));
+
+       i = 0;
+       EINA_LIST_FREE(part->other_desc, oepd)
+         replacement->other_desc[i++] = _edje_description_convert(part->type, ce, oepd);
+
+       replacement->source = part->source;
+       replacement->source2 = part->source2;
+       replacement->source3 = part->source3;
+       replacement->source4 = part->source4;
+       replacement->source5 = part->source5;
+       replacement->source6 = part->source6;
+       replacement->id = part->id;
+       replacement->clip_to_id = part->clip_to_id;
+       replacement->dragable = part->dragable;
+       replacement->items_count = eina_list_count(part->items);
+       replacement->items = calloc(replacement->items_count, sizeof (Edje_Pack_Element*));
+
+       i = 0;
+       EINA_LIST_FREE(part->items, elm)
+         replacement->items[i++] = elm;
+
+       replacement->type = part->type;
+       replacement->effect = part->effect;
+       replacement->mouse_events = part->mouse_events;
+       replacement->repeat_events = part->repeat_events;
+       replacement->ignore_flags = part->ignore_flags;
+       replacement->scale = part->scale;
+       replacement->precise_is_inside = part->precise_is_inside;
+       replacement->use_alternate_font_metrics = part->use_alternate_font_metrics;
+       replacement->pointer_mode = part->pointer_mode;
+       replacement->entry_mode = part->entry_mode;
+       replacement->select_mode = part->select_mode;
+       replacement->multiline = part->multiline;
+       replacement->api = part->api;
+
+       edc->parts[k++] = replacement;
+
+       free(part);
+     }
+
+   edc->id = oedc->id;
+   edc->alias = oedc->alias;
+   edc->prop.min = oedc->prop.min;
+   edc->prop.max = oedc->prop.max;
+   edc->script = oedc->script;
+   edc->part = oedc->part;
+   edc->script_only = oedc->script_only;
+   edc->lua_script_only = oedc->lua_script_only;
+   edc->checked = oedc->checked;
+
+   free(oedc);
 
-   /* FIXME : change structure layout */
    return edc;
 }
+
+Edje_Part_Description_Common*
+_edje_description_convert(int type,
+                         Edje_Part_Collection_Directory_Entry *ce,
+                         Old_Edje_Part_Description *oed)
+{
+   Edje_Part_Description_Common *result = NULL;
+
+   switch (type)
+     {
+      case EDJE_PART_TYPE_RECTANGLE:
+        result = eina_mempool_malloc(ce->mp.RECTANGLE, sizeof (Edje_Part_Description_Common));
+        break;
+      case EDJE_PART_TYPE_SWALLOW:
+        result = eina_mempool_malloc(ce->mp.SWALLOW, sizeof (Edje_Part_Description_Common));
+        break;
+      case EDJE_PART_TYPE_GROUP:
+        result = eina_mempool_malloc(ce->mp.GROUP, sizeof (Edje_Part_Description_Common));
+        break;
+
+#define ALLOC_POOL(Short, Type, Name)                                  \
+        case EDJE_PART_TYPE_##Short:                                   \
+          {                                                            \
+             Edje_Part_Description_##Type *Name;                       \
+                                                                       \
+             Name = eina_mempool_malloc(ce->mp.Short, sizeof (Edje_Part_Description_##Type)); \
+             Name->Name = oed->Name;                                   \
+             result = &Name->common;                                   \
+             break;                                                    \
+          }
+
+        ALLOC_POOL(IMAGE, Image, image);
+        ALLOC_POOL(TEXT, Text, text);
+        ALLOC_POOL(TEXTBLOCK, Text, text);
+        ALLOC_POOL(BOX, Box, box);
+        ALLOC_POOL(TABLE, Table, table);
+        ALLOC_POOL(EXTERNAL, External, external_params);
+     }
+
+   *result = oed->common;
+
+   free(oed);
+   return result;
+}
index 7cddb1b..966f588 100644 (file)
@@ -1,10 +1,21 @@
 #ifndef EDJE_CONVERT_H__
 # define EDJE_CONVERT_H__
 
-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;
+typedef struct _Old_Edje_Part                  Old_Edje_Part;
+typedef struct _Old_Edje_Part_Collection       Old_Edje_Part_Collection;
+typedef struct _Old_Edje_Part_Description       Old_Edje_Part_Description;
+typedef struct _Edje_Data                            Edje_Data;
+
+struct _Edje_Data
+{
+   const char *key;
+   char *value;
+};
+
+/*----------*/
 
 struct _Old_Edje_Font_Directory
 {
@@ -40,9 +51,80 @@ struct _Old_Edje_File
    int                             feature_ver;
 };
 
+struct _Old_Edje_Part_Collection
+{
+   Eina_List *programs; /* a list of Edje_Program */
+   Eina_List *parts; /* a list of Edje_Part */
+   Eina_List *data;
+
+   int        id; /* the collection id */
+
+   Eina_Hash *alias; /* aliasing part*/
+
+   struct {
+      Edje_Size min, max;
+   } prop;
+
+   int        references;
+#ifdef EDJE_PROGRAM_CACHE
+   struct {
+      Eina_Hash                   *no_matches;
+      Eina_Hash                   *matches;
+   } prog_cache;
+#endif
+
+   Embryo_Program   *script; /* all the embryo script code for this group */
+   const char       *part;
+
+   unsigned char    script_only;
+
+   unsigned char    lua_script_only;
+
+   unsigned char    checked : 1;
+};
+
+struct _Old_Edje_Part
+{
+   const char            *name; /* the name if any of the part */
+   Old_Edje_Part_Description *default_desc; /* the part descriptor for default */
+   Eina_List             *other_desc; /* other possible descriptors */
+   const char            *source, *source2, *source3, *source4, *source5, *source6;
+   int                    id; /* its id number */
+   int                    clip_to_id; /* the part id to clip this one to */
+   Edje_Part_Dragable     dragable;
+   Eina_List             *items; /* packed items for box and table */
+   unsigned char          type; /* what type (image, rect, text) */
+   unsigned char          effect; /* 0 = plain... */
+   unsigned char          mouse_events; /* it will affect/respond to mouse events */
+   unsigned char          repeat_events; /* it will repeat events to objects below */
+   Evas_Event_Flags       ignore_flags;
+   unsigned char          scale; /* should certain properties scale with edje scale factor? */
+   unsigned char          precise_is_inside;
+   unsigned char          use_alternate_font_metrics;
+   unsigned char          pointer_mode;
+   unsigned char          entry_mode;
+   unsigned char          select_mode;
+   unsigned char          multiline;
+   Edje_Part_Api         api;
+};
+
+struct _Old_Edje_Part_Description
+{
+   Edje_Part_Description_Common common;
+   Edje_Part_Description_Spec_Image image;
+   Edje_Part_Description_Spec_Text text;
+   Edje_Part_Description_Spec_Box box;
+   Edje_Part_Description_Spec_Table table;
+
+   Eina_List *external_params; /* parameters for external objects */
+};
+
 Edje_File *_edje_file_convert(Eet_File *file, Old_Edje_File *oedf);
 Edje_Part_Collection *_edje_collection_convert(Edje_File *file,
                                               Old_Edje_Part_Collection *oedc);
+Edje_Part_Description_Common *_edje_description_convert(int type,
+                                                       Edje_Part_Collection_Directory_Entry *ce,
+                                                       Old_Edje_Part_Description *oed);
 const Edje_File *_edje_file_get(void);
 void _edje_file_set(const Edje_File *edf);
 
index faf8abd..424c090 100644 (file)
@@ -244,116 +244,116 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "d", d, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "s", s, EET_T_STRING);
 
-   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description);
+   eet_eina_file_data_descriptor_class_set(&eddc, "Edje_Part_Description", sizeof (Old_Edje_Part_Description));
    _edje_edd_edje_part_description =
      eet_data_descriptor_file_new(&eddc);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "state.name", common.state.name, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "state.value", common.state.value, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "visible", common.visible, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "align.x", common.align.x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "align.y", common.align.y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fixed.w", common.fixed.w, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fixed.h", common.fixed.h, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "min.w", common.min.w, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "min.h", common.min.h, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "max.w", common.max.w, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "max.h", common.max.h, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "step.x", common.step.x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "step.y", common.step.y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "aspect.min", common.aspect.min, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "aspect.max", common.aspect.max, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "aspect.prefer", common.aspect.prefer, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.relative_x", common.rel1.relative_x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.relative_y", common.rel1.relative_y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.offset_x", common.rel1.offset_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.offset_y", common.rel1.offset_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.id_x", common.rel1.id_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel1.id_y", common.rel1.id_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.relative_x", common.rel2.relative_x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.relative_y", common.rel2.relative_y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.offset_x", common.rel2.offset_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.offset_y", common.rel2.offset_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.id_x", common.rel2.id_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "rel2.id_y", common.rel2.id_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "image.id", image.id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "image.set", image.set, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Edje_Part_Description, "image.tween_list", image.tween_list, _edje_edd_edje_part_image_id);
-
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.l", image.border.l, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.r", image.border.r, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.t", image.border.t, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.b", image.border.b, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.no_fill", image.border.no_fill, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "border.scale", image.border.scale, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.smooth", image.fill.smooth, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.pos_rel_x", image.fill.pos_rel_x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.pos_abs_x", image.fill.pos_abs_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.rel_x", image.fill.rel_x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.abs_x", image.fill.abs_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.pos_rel_y", image.fill.pos_rel_y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.pos_abs_y", image.fill.pos_abs_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.rel_y", image.fill.rel_y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.abs_y", image.fill.abs_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.angle", image.fill.angle, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.spread", image.fill.spread, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "fill.type", image.fill.type, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color_class", common.color_class, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color.r", common.color.r, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color.g", common.color.g, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color.b", common.color.b, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color.a", common.color.a, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color2.r", common.color2.r, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color2.g", common.color2.g, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color2.b", common.color2.b, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color2.a", common.color2.a, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color3.r", text.color3.r, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color3.g", text.color3.g, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color3.b", text.color3.b, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "color3.a", text.color3.a, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.text", text.text, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.text_class", text.text_class, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.style", text.style, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.font", text.font, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.repch", text.repch, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.size", text.size, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.fit_x", text.fit_x, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.fit_y", text.fit_y, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.min_x", text.min_x, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.min_y", text.min_y, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.max_x", text.max_x, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.max_y", text.max_y, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.align.x", text.align.x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.align.y", text.align.y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.id_source", text.id_source, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.id_text_source", text.id_text_source, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "text.elipsis", text.elipsis, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.layout", box.layout, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.alt_layout", box.alt_layout, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.align.x", box.align.x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.align.y", box.align.y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.padding.x", box.padding.x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.padding.y", box.padding.y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.min.h", box.min.h, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "box.min.v", box.min.v, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.homogeneous", table.homogeneous, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.x", table.align.x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.y", table.align.y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.id_persp", common.map.id_persp, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.id_light", common.map.id_light, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.rot.id_center", common.map.rot.id_center, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.rot.x", common.map.rot.x, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.rot.y", common.map.rot.y, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.rot.z", common.map.rot.z, EDJE_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.on", common.map.on, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.smooth", common.map.smooth, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.alpha", common.map.alpha, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.persp_on", common.map.persp_on, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "map.backcull", common.map.backcull, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "persp.zplane", common.persp.zplane, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "persp.focal", common.persp.focal, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Edje_Part_Description, "external_params", external_params, _edje_edd_edje_external_param);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "state.name", common.state.name, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "state.value", common.state.value, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "visible", common.visible, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "align.x", common.align.x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "align.y", common.align.y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fixed.w", common.fixed.w, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fixed.h", common.fixed.h, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "min.w", common.min.w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "min.h", common.min.h, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "max.w", common.max.w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "max.h", common.max.h, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "step.x", common.step.x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "step.y", common.step.y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "aspect.min", common.aspect.min, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "aspect.max", common.aspect.max, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "aspect.prefer", common.aspect.prefer, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.relative_x", common.rel1.relative_x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.relative_y", common.rel1.relative_y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.offset_x", common.rel1.offset_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.offset_y", common.rel1.offset_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.id_x", common.rel1.id_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel1.id_y", common.rel1.id_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.relative_x", common.rel2.relative_x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.relative_y", common.rel2.relative_y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.offset_x", common.rel2.offset_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.offset_y", common.rel2.offset_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.id_x", common.rel2.id_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "rel2.id_y", common.rel2.id_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "image.id", image.id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "image.set", image.set, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Old_Edje_Part_Description, "image.tween_list", image.tween_list, _edje_edd_edje_part_image_id);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.l", image.border.l, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.r", image.border.r, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.t", image.border.t, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.b", image.border.b, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.no_fill", image.border.no_fill, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "border.scale", image.border.scale, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.smooth", image.fill.smooth, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.pos_rel_x", image.fill.pos_rel_x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.pos_abs_x", image.fill.pos_abs_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.rel_x", image.fill.rel_x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.abs_x", image.fill.abs_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.pos_rel_y", image.fill.pos_rel_y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.pos_abs_y", image.fill.pos_abs_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.rel_y", image.fill.rel_y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.abs_y", image.fill.abs_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.angle", image.fill.angle, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.spread", image.fill.spread, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "fill.type", image.fill.type, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color_class", common.color_class, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color.r", common.color.r, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color.g", common.color.g, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color.b", common.color.b, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color.a", common.color.a, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color2.r", common.color2.r, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color2.g", common.color2.g, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color2.b", common.color2.b, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color2.a", common.color2.a, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color3.r", text.color3.r, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color3.g", text.color3.g, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color3.b", text.color3.b, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "color3.a", text.color3.a, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.text", text.text, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.text_class", text.text_class, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.style", text.style, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.font", text.font, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.repch", text.repch, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.size", text.size, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.fit_x", text.fit_x, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.fit_y", text.fit_y, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.min_x", text.min_x, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.min_y", text.min_y, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.max_x", text.max_x, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.max_y", text.max_y, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.align.x", text.align.x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.align.y", text.align.y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.id_source", text.id_source, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.id_text_source", text.id_text_source, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "text.elipsis", text.elipsis, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.layout", box.layout, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.alt_layout", box.alt_layout, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.align.x", box.align.x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.align.y", box.align.y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.padding.x", box.padding.x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.padding.y", box.padding.y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.min.h", box.min.h, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "box.min.v", box.min.v, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "table.homogeneous", table.homogeneous, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "table.align.x", table.align.x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "table.align.y", table.align.y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.id_persp", common.map.id_persp, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.id_light", common.map.id_light, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.rot.id_center", common.map.rot.id_center, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.rot.x", common.map.rot.x, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.rot.y", common.map.rot.y, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.rot.z", common.map.rot.z, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.on", common.map.on, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.smooth", common.map.smooth, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.alpha", common.map.alpha, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.persp_on", common.map.persp_on, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "map.backcull", common.map.backcull, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "persp.zplane", common.persp.zplane, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Old_Edje_Part_Description, "persp.focal", common.persp.focal, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Old_Edje_Part_Description, "external_params", external_params, _edje_edd_edje_external_param);
 
    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Pack_Element);
    _edje_edd_edje_pack_element =
@@ -384,60 +384,60 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "colspan", colspan, EET_T_USHORT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "rowspan", rowspan, EET_T_USHORT);
 
-   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part);
+   eet_eina_file_data_descriptor_class_set(&eddc, "Edje_Part", sizeof (Old_Edje_Part));
    _edje_edd_edje_part =
      eet_data_descriptor_file_new(&eddc);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "name", name, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "id", id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "ignore_flags", ignore_flags, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "scale", scale, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "use_alternate_font_metrics", use_alternate_font_metrics, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_part, Edje_Part, "default_desc", default_desc, _edje_edd_edje_part_description);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part, Edje_Part, "other_desc", other_desc, _edje_edd_edje_part_description);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.x", dragable.x, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.step_x", dragable.step_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.count_x", dragable.count_x, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.y", dragable.y, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.step_y", dragable.step_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.count_y", dragable.count_y, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.counfine_id", dragable.confine_id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.events_id", dragable.event_id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "entry_mode", entry_mode, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "select_mode", select_mode, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "multiline", multiline, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source", source, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source2", source2, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source3", source3, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source4", source4, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source5", source5, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source6", source6, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part, Edje_Part, "items", items, _edje_edd_edje_pack_element);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.name", api.name, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.description", api.description, EET_T_STRING);
-
-   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "name", name, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "id", id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "type", type, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "effect", effect, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "mouse_events", mouse_events, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "repeat_events", repeat_events, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "ignore_flags", ignore_flags, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "scale", scale, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "pointer_mode", pointer_mode, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "precise_is_inside", precise_is_inside, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "clip_to_id", clip_to_id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "use_alternate_font_metrics", use_alternate_font_metrics, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_part, Old_Edje_Part, "default_desc", default_desc, _edje_edd_edje_part_description);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part, Old_Edje_Part, "other_desc", other_desc, _edje_edd_edje_part_description);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.x", dragable.x, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.step_x", dragable.step_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.count_x", dragable.count_x, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.y", dragable.y, EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.step_y", dragable.step_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.count_y", dragable.count_y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.counfine_id", dragable.confine_id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "dragable.events_id", dragable.event_id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "entry_mode", entry_mode, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "select_mode", select_mode, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "multiline", multiline, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source", source, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source2", source2, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source3", source3, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source4", source4, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source5", source5, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "source6", source6, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part, Old_Edje_Part, "items", items, _edje_edd_edje_pack_element);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "api.name", api.name, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Old_Edje_Part, "api.description", api.description, EET_T_STRING);
+
+   eet_eina_file_data_descriptor_class_set(&eddc, "Edje_Part_Collection", sizeof (Old_Edje_Part_Collection));
    _edje_edd_edje_part_collection  =
      eet_data_descriptor_file_new(&eddc);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "programs", programs, _edje_edd_edje_program);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "parts", parts, _edje_edd_edje_part);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_data);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.w", prop.min.w, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.min.h", prop.min.h, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.max.w", prop.max.w, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.max.h", prop.max.h, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "script_only", script_only, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "lua_script_only", lua_script_only, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "programs", programs, _edje_edd_edje_program);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "parts", parts, _edje_edd_edje_part);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "data", data, _edje_edd_edje_data);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "prop.min.w", prop.min.w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "prop.min.h", prop.min.h, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "prop.max.w", prop.max.w, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "prop.max.h", prop.max.h, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "id", id, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "script_only", script_only, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Old_Edje_Part_Collection, "lua_script_only", lua_script_only, EET_T_UCHAR);
 
    {
-      Edje_Part_Collection epc;
+      Old_Edje_Part_Collection epc;
 
       eet_data_descriptor_element_add(_edje_edd_edje_part_collection,
                                      "alias", EET_T_STRING, EET_G_HASH,
index ab8782d..9d53367 100644 (file)
@@ -62,7 +62,7 @@
 #define GET_PD_OR_RETURN(RET) \
    Edje *ed; \
    Edje_Edit *eed; \
-   Edje_Part_Description *pd; \
+   Edje_Part_Description_Common *pd; \
    if (!evas_object_smart_type_check_ptr(obj, _edje_edit_type)) \
      return RET; \
    eed = evas_object_smart_data_get(obj); \
@@ -184,15 +184,11 @@ edje_edit_object_add(Evas *e)
 }
 /* End of Edje_Edit smart stuff */
 
-
-
-
-
-static Edje_Part_Description *
+static Edje_Part_Description_Common *
 _edje_part_description_find_byname(Edje_Edit *eed, const char *part, const char *state, double value)
 {
    Edje_Real_Part *rp;
-   Edje_Part_Description *pd;
+   Edje_Part_Description_Common *pd;
 
    if (!eed || !part || !state) return NULL;
 
@@ -275,7 +271,11 @@ _edje_real_part_free(Edje_Real_Part *rp)
    if (rp->text.cache.out_str) eina_stringshare_del(rp->text.cache.out_str);
 
    if (rp->custom)
-     _edje_collection_free_part_description_free(rp->custom->description, 0);
+     {
+       _edje_collection_free_part_description_clean(rp->part->type, rp->custom->description, 0);
+       free(rp->custom);
+       rp->custom = NULL;
+     }
 
    free(rp->drag);
 
@@ -453,6 +453,26 @@ _edje_part_id_find(Edje *ed, const char *part)
 }
 
 static void
+_edje_part_description_id_set(int type, Edje_Part_Description_Common *c, int old_id, int new_id)
+{
+   if (c->rel1.id_x == old_id) c->rel1.id_x = new_id;
+   if (c->rel1.id_y == old_id) c->rel1.id_y = new_id;
+   if (c->rel2.id_x == old_id) c->rel2.id_x = new_id;
+   if (c->rel2.id_y == old_id) c->rel2.id_y = new_id;
+
+   if (type == EDJE_PART_TYPE_TEXT
+       || type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       Edje_Part_Description_Text *t;
+
+       t = (Edje_Part_Description_Text *) c;
+
+       if (t->text.id_source == old_id) t->text.id_source = new_id;
+       if (t->text.id_text_source == old_id) t->text.id_text_source = new_id;
+     }
+}
+
+static void
 _edje_part_id_set(Edje *ed, Edje_Real_Part *rp, int new_id)
 {
    /* This function change the id of a given real_part.
@@ -464,8 +484,8 @@ _edje_part_id_set(Edje *ed, Edje_Real_Part *rp, int new_id)
    int old_id;
    Edje_Part *part;
    Eina_List *l, *ll, *l_next;
-   Edje_Part *p;
    Edje_Program *epr;
+   unsigned int j;
 
    part = rp->part;
 
@@ -480,38 +500,23 @@ _edje_part_id_set(Edje *ed, Edje_Real_Part *rp, int new_id)
    part->id = new_id;
 
    /* Fix all the dependecies in all parts... */
-   EINA_LIST_FOREACH(ed->collection->parts, l, p)
+   for (j = 0; j < ed->collection->parts_count; ++j)
      {
-       Edje_Part_Description *d;
-       Edje_Part_Description_Common *c;
+       Edje_Part *p;
+       unsigned int k;
+
+       p = ed->collection->parts[j];
 
        //printf("   search id: %d in %s\n", old_id, p->name);
        if (p->clip_to_id == old_id) p->clip_to_id = new_id;
        if (p->dragable.confine_id == old_id) p->dragable.confine_id = new_id;
 
        /* ...in default description */
-       d = p->default_desc;
-       c = &d->common;
-       //printf("      search in %s (%s)\n", p->name, d->state.name);
-       if (c->rel1.id_x == old_id) c->rel1.id_x = new_id;
-       if (c->rel1.id_y == old_id) c->rel1.id_y = new_id;
-       if (c->rel2.id_x == old_id) c->rel2.id_x = new_id;
-       if (c->rel2.id_y == old_id) c->rel2.id_y = new_id;
-       if (d->text.id_source == old_id) d->text.id_source = new_id;
-       if (d->text.id_text_source == old_id) d->text.id_text_source = new_id;
+       _edje_part_description_id_set(p->type, p->default_desc, old_id, new_id);
+
        /* ...and in all other descriptions */
-       EINA_LIST_FOREACH(p->other_desc, ll, d)
-         {
-            c = &d->common;
-
-            //printf("      search in %s (%s)\n", p->name, d->state.name);
-            if (c->rel1.id_x == old_id) c->rel1.id_x = new_id;
-            if (c->rel1.id_y == old_id) c->rel1.id_y = new_id;
-            if (c->rel2.id_x == old_id) c->rel2.id_x = new_id;
-            if (c->rel2.id_y == old_id) c->rel2.id_y = new_id;
-            if (d->text.id_source == old_id) d->text.id_source = new_id;
-            if (d->text.id_text_source == old_id) d->text.id_text_source = new_id;
-         }
+       for (k = 0; k < p->other_count; ++k)
+         _edje_part_description_id_set(p->type, p->other_desc[k], old_id, new_id);
      }
 
    /*...and also in programs targets */
@@ -540,6 +545,32 @@ _edje_part_id_set(Edje *ed, Edje_Real_Part *rp, int new_id)
 }
 
 static void
+_edje_part_description_id_switch(int type, Edje_Part_Description_Common *c, int id1, int id2)
+{
+   if (c->rel1.id_x == id1) c->rel1.id_x = id2;
+   else if (c->rel1.id_x == id2) c->rel1.id_x = id1;
+   if (c->rel1.id_y == id1) c->rel1.id_y = id2;
+   else if (c->rel1.id_y == id2) c->rel1.id_y = id1;
+   if (c->rel2.id_x == id1) c->rel2.id_x = id2;
+   else if (c->rel2.id_x == id2) c->rel2.id_x = id1;
+   if (c->rel2.id_y == id1) c->rel2.id_y = id2;
+   else if (c->rel2.id_y == id2) c->rel2.id_y = id1;
+
+   if (type == EDJE_PART_TYPE_TEXT
+       || type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       Edje_Part_Description_Text *t;
+
+       t = (Edje_Part_Description_Text *) c;
+
+       if (t->text.id_source == id1) t->text.id_source = id2;
+       else if (t->text.id_source == id2) t->text.id_source = id1;
+       if (t->text.id_text_source == id1) t->text.id_text_source = id2;
+       else if (t->text.id_text_source == id2) t->text.id_text_source = id2;
+     }
+}
+
+static void
 _edje_parts_id_switch(Edje *ed, Edje_Real_Part *rp1, Edje_Real_Part *rp2)
 {
    /* This function switch the id of two parts.
@@ -550,8 +581,8 @@ _edje_parts_id_switch(Edje *ed, Edje_Real_Part *rp1, Edje_Real_Part *rp2)
    int id1;
    int id2;
    Eina_List *l, *ll;
-   Edje_Part *p;
    Edje_Program *epr;
+   unsigned int i;
 
    //printf("SWITCH ID OF PART %d AND %d\n", rp1->part->id, rp2->part->id);
 
@@ -570,11 +601,12 @@ _edje_parts_id_switch(Edje *ed, Edje_Real_Part *rp1, Edje_Real_Part *rp2)
    ed->table_parts[id2] = rp1;
 
    // Fix all the dependecies in all parts...
-   EINA_LIST_FOREACH(ed->collection->parts, l, p)
+   for (i = 0; i < ed->collection->parts_count; ++i)
      {
-       Eina_List *ll;
-       Edje_Part_Description *d;
-       Edje_Part_Description_Common *c;
+       unsigned int j;
+       Edje_Part *p;
+
+       p = ed->collection->parts[i];
 
        //printf("   search id: %d in %s\n", old_id, p->name);
        if (p->clip_to_id == id1) p->clip_to_id = id2;
@@ -583,40 +615,13 @@ _edje_parts_id_switch(Edje *ed, Edje_Real_Part *rp1, Edje_Real_Part *rp2)
        else if (p->dragable.confine_id == id2) p->dragable.confine_id = id1;
 
        // ...in default description
-       d = p->default_desc;
-       c = &d->common;
-       // printf("      search in %s (%s)\n", p->name, d->state.name);
-       if (c->rel1.id_x == id1) c->rel1.id_x = id2;
-       else if (c->rel1.id_x == id2) c->rel1.id_x = id1;
-       if (c->rel1.id_y == id1) c->rel1.id_y = id2;
-       else if (c->rel1.id_y == id2) c->rel1.id_y = id1;
-       if (c->rel2.id_x == id1) c->rel2.id_x = id2;
-       else if (c->rel2.id_x == id2) c->rel2.id_x = id1;
-       if (c->rel2.id_y == id1) c->rel2.id_y = id2;
-       else if (c->rel2.id_y == id2) c->rel2.id_y = id1;
-       if (d->text.id_source == id1) d->text.id_source = id2;
-       else if (d->text.id_source == id2) d->text.id_source = id1;
-       if (d->text.id_text_source == id1) d->text.id_text_source = id2;
-       else if (d->text.id_text_source == id2) d->text.id_text_source = id2;
+       _edje_part_description_id_switch(p->type, p->default_desc, id1, id2);
+
        // ...and in all other descriptions
-       EINA_LIST_FOREACH(p->other_desc, ll, d)
-         {
-            c = &d->common;
-            //printf("      search in %s (%s)\n", p->name, d->state.name);
-            if (c->rel1.id_x == id1) c->rel1.id_x = id2;
-            else if (c->rel1.id_x == id2) c->rel1.id_x = id1;
-            if (c->rel1.id_y == id1) c->rel1.id_y = id2;
-            else if (c->rel1.id_y == id2) c->rel1.id_y = id1;
-            if (c->rel2.id_x == id1) c->rel2.id_x = id2;
-            else if (c->rel2.id_x == id2) c->rel2.id_x = id1;
-            if (c->rel2.id_y == id1) c->rel2.id_y = id2;
-            else if (c->rel2.id_y == id2) c->rel2.id_y = id1;
-            if (d->text.id_source == id1) d->text.id_source = id2;
-            else if (d->text.id_source == id2) d->text.id_source = id1;
-            if (d->text.id_text_source == id1) d->text.id_text_source = id2;
-            else if (d->text.id_text_source == id2) d->text.id_text_source = id2;
-         }
+       for (j = 0; j < p->other_count; ++j)
+         _edje_part_description_id_switch(p->type, p->other_desc[j], id1, id2);
      }
+
    //...and also in programs targets
    EINA_LIST_FOREACH(ed->collection->programs, l, epr)
      {
@@ -641,8 +646,7 @@ _edje_fix_parts_id(Edje *ed)
     * After the execution of this function all parts will have a right
     * (uniqe & ordered) id. The table_parts is also updated.
     */
-   Eina_List *l;
-   Edje_Part *p;
+   unsigned int i;
    int correct_id;
    int count;
 
@@ -652,8 +656,12 @@ _edje_fix_parts_id(Edje *ed)
 
    /* Give a correct id to all the parts */
    correct_id = 0;
-   EINA_LIST_FOREACH(ed->collection->parts, l, p)
+   for (i = 0; i < ed->collection->parts_count; ++i)
      {
+       Edje_Part *p;
+
+       p = ed->collection->parts[i];
+
        //printf(" [%d]Checking part: %s id: %d\n", correct_id, p->name, p->id);
        if (p->id != correct_id)
          _edje_part_id_set(ed, ed->table_parts[p->id], correct_id);
@@ -662,7 +670,7 @@ _edje_fix_parts_id(Edje *ed)
      }
 
    /* If we have removed some parts realloc table_parts */
-   count = eina_list_count(ed->collection->parts);
+   count = ed->collection->parts_count;
    if (count != ed->table_parts_size)
      {
        ed->table_parts = realloc(ed->table_parts, sizeof(Edje_Real_Part *) * count);
@@ -980,7 +988,7 @@ edje_edit_group_del(Evas_Object *obj, const char *group_name)
    eet_close(eetf);
 
    /* Free Group */
-   if (die) _edje_collection_free(ed->file, die);
+   if (die) _edje_collection_free(ed->file, die, e);
 
    /* we need to save everything to make sure the file won't have broken
     * references the next time is loaded */
@@ -1060,9 +1068,9 @@ FUNC_GROUP_ACCESSOR(max, h);
 EAPI Eina_List *
 edje_edit_group_data_list_get(Evas_Object * obj)
 {
+   Eina_Iterator *it;
    Eina_List *datas;
-   Eina_List *l;
-   Edje_Data *d;
+   const char *key;
 
    GET_ED_OR_RETURN(NULL);
 
@@ -1070,8 +1078,12 @@ edje_edit_group_data_list_get(Evas_Object * obj)
      return NULL;
 
    datas = NULL;
-   EINA_LIST_FOREACH(ed->collection->data, l, d)
-     datas = eina_list_append(datas, eina_stringshare_add(d->key));
+   it = eina_hash_iterator_key_new(ed->collection->data);
+
+   EINA_ITERATOR_FOREACH(it, key)
+     datas = eina_list_append(datas, eina_stringshare_add(key));
+
+   eina_iterator_free(it);
 
    return datas;
 }
@@ -1101,31 +1113,18 @@ edje_edit_data_list_get(Evas_Object * obj)
 EAPI Eina_Bool
 edje_edit_group_data_add(Evas_Object *obj, const char *key, const char *value)
 {
-   Edje_Data *new;
-   Edje_Data *d;
-   Eina_List *l;
-   int len;
-
    GET_ED_OR_RETURN(EINA_FALSE);
 
    if (!key || !ed->file || !ed->collection)
      return EINA_FALSE;
 
-   len = strlen(key);
-   EINA_LIST_FOREACH(ed->collection->data, l, d)
-     if ((d->key) && (!strncmp(d->key, key, len)))
-       return EINA_FALSE;
-
-   new = _alloc(sizeof(Edje_Data));
-   if (!new) return EINA_FALSE;
-
-   new->key = (char*)eina_stringshare_add(key);
-   if (value) new->value = (char*)eina_stringshare_add(value);
-   else new->value = NULL;
+   if (!ed->collection->data)
+     ed->collection->data = eina_hash_string_small_new(NULL);
 
-   ed->collection->data = eina_list_append(ed->collection->data, new);
+   if (eina_hash_find(ed->collection->data, key))
+     return EINA_FALSE;
 
-   return EINA_TRUE;
+   return eina_hash_add(ed->collection->data, key, eina_stringshare_add(value));
 }
 
 EAPI Eina_Bool
@@ -1147,29 +1146,18 @@ edje_edit_data_add(Evas_Object *obj, const char *itemname, const char *value)
 EAPI Eina_Bool
 edje_edit_group_data_del(Evas_Object *obj, const char *key)
 {
-   Eina_List *l;
-   Edje_Data *d;
-   int len;
+   const char *value;
 
    GET_ED_OR_RETURN(EINA_FALSE);
 
    if (!key || !ed->file || !ed->collection)
      return EINA_FALSE;
 
-   len = strlen(key);
-   EINA_LIST_FOREACH(ed->collection->data, l, d)
-     {
-       if (strncmp(d->key, key, len) == 0)
-          {
-             _edje_if_string_free(ed, d->key);
-             _edje_if_string_free(ed, d->value);
-             ed->collection->data = eina_list_remove(ed->collection->data, d);
-             free(d);
-             return EINA_TRUE;
-          }
-     }
+   value = eina_hash_find(ed->collection->data, key);
+   if (!value) return EINA_FALSE;
 
-   return EINA_FALSE;
+   _edje_if_string_free(ed, value);
+   return eina_hash_del(ed->collection->data, key, value);
 }
 
 EAPI Eina_Bool
@@ -1186,21 +1174,16 @@ edje_edit_data_del(Evas_Object *obj, const char *itemname)
 EAPI const char *
 edje_edit_group_data_value_get(Evas_Object * obj, char *key)
 {
-   Eina_List *l;
-   Edje_Data *d;
-   int len;
+   const char *value;
 
    GET_ED_OR_RETURN(NULL);
 
    if (!key || !ed->file || !ed->collection)
      return NULL;
 
-   len = strlen(key);
-   EINA_LIST_FOREACH(ed->collection->data, l, d)
-     if (strncmp(d->key, key, len) == 0)
-       return eina_stringshare_add(d->value);
-
-   return NULL;
+   value = eina_hash_find(ed->collection->data, key);
+   if (value) value = eina_stringshare_add(value);
+   return value;
 }
 
 EAPI const char *
@@ -1217,23 +1200,20 @@ edje_edit_data_value_get(Evas_Object * obj, char *itemname)
 EAPI Eina_Bool
 edje_edit_group_data_value_set(Evas_Object *obj, const char *key, const char *value)
 {
-   Eina_List *l;
-   Edje_Data *d;
-   int len;
+   const char *old_value;
 
    GET_ED_OR_RETURN(EINA_FALSE);
 
    if (!key || !value || !ed->file || !ed->collection)
      return EINA_FALSE;
 
-   len = strlen(key);
-   EINA_LIST_FOREACH(ed->collection->data, l, d)
-     if (strncmp(d->key, key, len) == 0)
-       {
-         _edje_if_string_free(ed, d->value);
-         d->value = (char*)eina_stringshare_add(value);
-         return EINA_TRUE;
-       }
+   old_value = eina_hash_find(ed->collection->data, key);
+   if (old_value)
+     {
+       eina_hash_modify(ed->collection->data, key, value);
+       _edje_if_string_free(ed, old_value);
+       return EINA_TRUE;
+     }
 
    return EINA_FALSE;
 }
@@ -1257,9 +1237,7 @@ edje_edit_data_value_set(Evas_Object *obj, const char *itemname, const char *val
 EAPI Eina_Bool
 edje_edit_group_data_name_set(Evas_Object *obj, const char *key,  const char *new_key)
 {
-   Eina_List *l;
-   Edje_Data *d;
-   int len;
+   const char *value;
 
    GET_ED_OR_RETURN(EINA_FALSE);
 
@@ -1267,15 +1245,12 @@ edje_edit_group_data_name_set(Evas_Object *obj, const char *key,  const char *ne
       return EINA_FALSE;
    }
 
-   len = strlen(key);
-   EINA_LIST_FOREACH(ed->collection->data, l, d) {
-      if (strncmp(d->key, key, len) == 0)
-       {
-          _edje_if_string_free(ed, d->key);
-          d->key = (char*)eina_stringshare_add(new_key);
-          return EINA_TRUE;
-       }
-   }
+   value = eina_hash_find(ed->collection->data, key);
+   if (value)
+     {
+       eina_hash_del(ed->collection->data, key, value);
+       return eina_hash_add(ed->collection->data, new_key, value);
+     }
 
    return EINA_FALSE;
 }
@@ -1808,8 +1783,10 @@ Eina_Bool
 _edje_edit_real_part_add(Evas_Object *obj, const char *name, Edje_Part_Type type, const char *source)
 {
    Edje_Part_Collection *pc;
+   Edje_Part **tmp;
    Edje_Part *ep;
    Edje_Real_Part *rp;
+   int id;
 
    GET_ED_OR_RETURN(EINA_FALSE);
 
@@ -1833,9 +1810,21 @@ _edje_edit_real_part_add(Evas_Object *obj, const char *name, Edje_Part_Type type
 
    /* Init Edje_Part */
    pc = ed->collection;
-   pc->parts = eina_list_append(pc->parts, ep);
 
-   ep->id = eina_list_count(pc->parts) - 1;
+   tmp = realloc(pc->parts, (pc->parts_count + 1) * sizeof (Edje_Part *));
+   if (!tmp)
+     {
+       free(ep);
+       free(rp);
+       return EINA_FALSE;
+     }
+
+   id = pc->parts_count++;
+
+   pc->parts = tmp;
+   pc->parts[id] = ep;
+
+   ep->id = id;
    ep->type = type;
    ep->name = eina_stringshare_add(name);
    ep->mouse_events = 1;
@@ -1950,9 +1939,12 @@ edje_edit_part_external_add(Evas_Object *obj, const char *name, const char *sour
 EAPI Eina_Bool
 edje_edit_part_del(Evas_Object *obj, const char* part)
 {
-   Edje_Part *ep;
+   Edje_Part_Collection_Directory_Entry *ce;
    Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   unsigned int k;
    int id;
+   int i;
 
    GET_RP_OR_RETURN(EINA_FALSE);
 
@@ -1964,7 +1956,6 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
    //if (ed->table_parts_size <= 1) return EINA_FALSE; //don't remove the last part
 
    /* Unlik Edje_Real_Parts that link to the removed one */
-   int i;
    for (i = 0; i < ed->table_parts_size; i++)
      {
        Edje_Real_Part *real;
@@ -2010,24 +2001,23 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
 
    /* Remove part from parts list */
    pc = ed->collection;
-   pc->parts = eina_list_remove(pc->parts, ep);
+   pc->parts[ep->id] = NULL; /* During save stage we need to garbage collect this empty id. */
    _edje_fix_parts_id(ed);
 
    /* Free Edje_Part and all descriptions */
+   ce = eina_hash_find(ed->file->collection, ep->name);
+
    _edje_if_string_free(ed, ep->name);
    if (ep->default_desc)
      {
-       _edje_collection_free_part_description_free(ep->default_desc, 0);
+       _edje_collection_free_part_description_free(ep->type, ep->default_desc, ce, 0);
        ep->default_desc = NULL;
      }
-   while (ep->other_desc)
-     {
-       Edje_Part_Description *desc;
 
-       desc = eina_list_data_get(ep->other_desc);
-       ep->other_desc = eina_list_remove(ep->other_desc, desc);
-       _edje_collection_free_part_description_free(desc, 0);
-     }
+   for (k = 0; k < ep->other_count; ++k)
+     _edje_collection_free_part_description_free(ep->type, ep->other_desc[k], ce, 0);
+
+   free(ep->other_desc);
    free(ep);
 
    /* Free Edje_Real_Part */
@@ -2081,6 +2071,7 @@ edje_edit_part_restack_below(Evas_Object *obj, const char* part)
 {
    Edje_Part_Collection *group;
    Edje_Real_Part *prev;
+   Edje_Part *swap;
 
    GET_RP_OR_RETURN(EINA_FALSE);
 
@@ -2091,8 +2082,10 @@ edje_edit_part_restack_below(Evas_Object *obj, const char* part)
 
    /* update parts list */
    prev = ed->table_parts[(rp->part->id - 1) % ed->table_parts_size];
-   group->parts = eina_list_remove(group->parts, rp->part);
-   group->parts = eina_list_prepend_relative(group->parts, rp->part, prev->part);
+
+   swap = group->parts[rp->part->id];
+   group->parts[rp->part->id] = group->parts[prev->part->id];
+   group->parts[prev->part->id] = swap;
 
    _edje_parts_id_switch(ed, rp, prev);
 
@@ -2108,6 +2101,7 @@ edje_edit_part_restack_above(Evas_Object *obj, const char* part)
 {
    Edje_Part_Collection *group;
    Edje_Real_Part *next;
+   Edje_Part *swap;
 
    GET_RP_OR_RETURN(EINA_FALSE);
 
@@ -2119,8 +2113,10 @@ edje_edit_part_restack_above(Evas_Object *obj, const char* part)
 
    /* update parts list */
    next = ed->table_parts[(rp->part->id + 1) % ed->table_parts_size];
-   group->parts = eina_list_remove(group->parts, rp->part);
-   group->parts = eina_list_append_relative(group->parts, rp->part, next->part);
+
+   swap = group->parts[rp->part->id];
+   group->parts[rp->part->id] = group->parts[next->part->id];
+   group->parts[next->part->id] = swap;
 
    /* update ids */
    _edje_parts_id_switch(ed, rp, next);
@@ -2151,14 +2147,14 @@ edje_edit_part_selected_state_get(Evas_Object *obj, const char *part, double *va
        return eina_stringshare_add("default");
      }
 
-   if (value) *value = rp->chosen_description->common.state.value;
-   return eina_stringshare_add(rp->chosen_description->common.state.name);
+   if (value) *value = rp->chosen_description->state.value;
+   return eina_stringshare_add(rp->chosen_description->state.name);
 }
 
 EAPI Eina_Bool
 edje_edit_part_selected_state_set(Evas_Object *obj, const char *part, const char *state, double value)
 {
-   Edje_Part_Description *pd;
+   Edje_Part_Description_Common *pd;
 
    GET_RP_OR_RETURN(EINA_FALSE);
 
@@ -2166,7 +2162,7 @@ edje_edit_part_selected_state_set(Evas_Object *obj, const char *part, const char
    if (!pd) return EINA_FALSE;
 
    //printf("EDJE: Set state: %s %f\n", pd->state.name, pd->state.value);
-   _edje_part_description_apply(ed, rp, pd->common.state.name, pd->common.state.value, NULL, 0.0);
+   _edje_part_description_apply(ed, rp, pd->state.name, pd->state.value, NULL, 0.0);
 
    edje_object_calc_force(obj);
    return EINA_TRUE;
@@ -2505,8 +2501,7 @@ edje_edit_part_states_list_get(Evas_Object *obj, const char *part)
 {
    char state_name[PATH_MAX];
    Eina_List *states = NULL;
-   Eina_List *l;
-   Edje_Part_Description *state;
+   unsigned int i;
 
    GET_RP_OR_RETURN(NULL);
 
@@ -2518,17 +2513,20 @@ edje_edit_part_states_list_get(Evas_Object *obj, const char *part)
    states = NULL;
 
    //append default state
-   state = rp->part->default_desc;
    snprintf(state_name, PATH_MAX,
-            "%s %.2f", state->common.state.name, state->common.state.value);
+            "%s %.2f",
+           rp->part->default_desc->state.name,
+           rp->part->default_desc->state.value);
    states = eina_list_append(states, eina_stringshare_add(state_name));
    //printf("NEW STATE def: %s\n", state->state.name);
 
    //append other states
-   EINA_LIST_FOREACH(rp->part->other_desc, l, state)
+   for (i = 0; i < rp->part->other_count; ++i)
      {
        snprintf(state_name, sizeof(state_name),
-                "%s %.2f", state->common.state.name, state->common.state.value);
+                "%s %.2f",
+                rp->part->other_desc[i]->state.name,
+                rp->part->other_desc[i]->state.value);
        states = eina_list_append(states, eina_stringshare_add(state_name));
        //printf("NEW STATE: %s\n", state_name);
      }
@@ -2560,8 +2558,8 @@ edje_edit_state_name_set(Evas_Object *obj, const char *part, const char *state,
             Edje_Program_Target *t = eina_list_data_get(epr->targets);
 
             if (t->id == part_id &&
-                !strcmp(epr->state, pd->common.state.name) &&
-                pd->common.state.value == epr->value)
+                !strcmp(epr->state, pd->state.name) &&
+                pd->state.value == epr->value)
               {
                  _edje_if_string_free(ed, epr->state);
                  epr->state = eina_stringshare_add(new_name);
@@ -2571,10 +2569,10 @@ edje_edit_state_name_set(Evas_Object *obj, const char *part, const char *state,
      }
 
    /* set name */
-   _edje_if_string_free(ed, pd->common.state.name);
-   pd->common.state.name = (char *)eina_stringshare_add(new_name);
+   _edje_if_string_free(ed, pd->state.name);
+   pd->state.name = (char *)eina_stringshare_add(new_name);
    /* set value */
-   pd->common.state.value = new_value;
+   pd->state.value = new_value;
 
    return EINA_TRUE;
 }
@@ -2582,7 +2580,9 @@ edje_edit_state_name_set(Evas_Object *obj, const char *part, const char *state,
 EAPI void
 edje_edit_state_del(Evas_Object *obj, const char *part, const char *state, double value)
 {
-   Edje_Part_Description *pd;
+   Edje_Part_Collection_Directory_Entry *ce;
+   Edje_Part_Description_Common *pd;
+   unsigned int i;
 
    GET_RP_OR_RETURN();
 
@@ -2597,86 +2597,165 @@ edje_edit_state_del(Evas_Object *obj, const char *part, const char *state, doubl
    if (pd == rp->chosen_description)
      _edje_part_description_apply(ed, rp, "default", 0.0, NULL, 0.0);
 
-   rp->part->other_desc = eina_list_remove(rp->part->other_desc, pd);
+   ce = eina_hash_find(ed->file->collection, part);
 
-   _edje_collection_free_part_description_free(pd, 0);
+   for (i = 0; i < rp->part->other_count; ++i)
+     if (pd == rp->part->other_desc[i])
+       {
+         memmove(rp->part->other_desc + i,
+                 rp->part->other_desc + i + 1,
+                 sizeof (Edje_Part_Description_Common*) * (rp->part->other_count - i - 1));
+         rp->part->other_count--;
+         break;
+       }
+
+   _edje_collection_free_part_description_free(rp->part->type, pd, ce, 0);
+}
+
+static Edje_Part_Description_Common *
+_edje_edit_state_alloc(int type, Edje *ed)
+{
+   Edje_Part_Collection_Directory_Entry *ce;
+   Edje_Part_Description_Common *pd = NULL;
+
+   ce = eina_hash_find(ed->file->collection, ed->group);
+
+   switch (type)
+     {
+      case EDJE_PART_TYPE_RECTANGLE:
+        pd = eina_mempool_malloc(ce->mp.RECTANGLE, sizeof (Edje_Part_Description_Common));
+        memset(pd, 0, sizeof (pd));
+        break;
+      case EDJE_PART_TYPE_SWALLOW:
+        pd = eina_mempool_malloc(ce->mp.SWALLOW, sizeof (Edje_Part_Description_Common));
+        memset(pd, 0, sizeof (pd));
+        break;
+      case EDJE_PART_TYPE_GROUP:
+        pd = eina_mempool_malloc(ce->mp.GROUP, sizeof (Edje_Part_Description_Common));
+        memset(pd, 0, sizeof (pd));
+        break;
+
+#define ALLOC_POOL(Short, Type, Name)                                  \
+        case EDJE_PART_TYPE_##Short:                                   \
+          {                                                            \
+             Edje_Part_Description_##Type *Name;                       \
+                                                                       \
+             Name = eina_mempool_malloc(ce->mp.Short, sizeof (Edje_Part_Description_##Type)); \
+             memset(Name, 0, sizeof (Name));                           \
+             pd = &Name->common;                                       \
+             break;                                                    \
+          }
+
+        ALLOC_POOL(IMAGE, Image, image);
+        ALLOC_POOL(TEXT, Text, text);
+        ALLOC_POOL(TEXTBLOCK, Text, text);
+        ALLOC_POOL(BOX, Box, box);
+        ALLOC_POOL(TABLE, Table, table);
+        ALLOC_POOL(EXTERNAL, External, external);
+     }
+
+   return pd;
 }
 
 EAPI void
 edje_edit_state_add(Evas_Object *obj, const char *part, const char *name, double value)
 {
-   Edje_Part_Description *pd;
+   Edje_Part_Description_Common *pd;
 
    GET_RP_OR_RETURN();
 
    //printf("ADD STATE: %s TO PART: %s\n", name , part);
-
-   pd = _alloc(sizeof(Edje_Part_Description));
+   pd = _edje_edit_state_alloc(rp->part->type, ed);
    if (!pd) return;
 
    if (!rp->part->default_desc)
-     rp->part->default_desc = pd;
+     {
+       rp->part->default_desc = pd;
+     }
    else
-     rp->part->other_desc = eina_list_append(rp->part->other_desc, pd);
-
-   pd->common.state.name = eina_stringshare_add(name);
-   pd->common.state.value = value;
-   pd->common.visible = 1;
-   pd->common.align.x = 0.5;
-   pd->common.align.y = 0.5;
-   pd->common.min.w = 0;
-   pd->common.min.h = 0;
-   pd->common.fixed.w = 0;
-   pd->common.fixed.h = 0;
-   pd->common.max.w = -1;
-   pd->common.max.h = -1;
-   pd->common.rel1.relative_x = 0.0;
-   pd->common.rel1.relative_y = 0.0;
-   pd->common.rel1.offset_x = 0;
-   pd->common.rel1.offset_y = 0;
-   pd->common.rel1.id_x = -1;
-   pd->common.rel1.id_y = -1;
-   pd->common.rel2.relative_x = 1.0;
-   pd->common.rel2.relative_y = 1.0;
-   pd->common.rel2.offset_x = -1;
-   pd->common.rel2.offset_y = -1;
-   pd->common.rel2.id_x = -1;
-   pd->common.rel2.id_y = -1;
-   pd->image.id = -1;
-   pd->image.fill.smooth = 1;
-   pd->image.fill.pos_rel_x = 0.0;
-   pd->image.fill.pos_abs_x = 0;
-   pd->image.fill.rel_x = 1.0;
-   pd->image.fill.abs_x = 0;
-   pd->image.fill.pos_rel_y = 0.0;
-   pd->image.fill.pos_abs_y = 0;
-   pd->image.fill.rel_y = 1.0;
-   pd->image.fill.abs_y = 0;
-   pd->image.fill.angle = 0;
-   pd->image.fill.spread = 0;
-   pd->image.fill.type = EDJE_FILL_TYPE_SCALE;
-   pd->common.color_class = NULL;
-   pd->common.color.r = 255;
-   pd->common.color.g = 255;
-   pd->common.color.b = 255;
-   pd->common.color.a = 255;
-   pd->common.color2.r = 0;
-   pd->common.color2.g = 0;
-   pd->common.color2.b = 0;
-   pd->common.color2.a = 255;
-   pd->text.color3.r = 0;
-   pd->text.color3.g = 0;
-   pd->text.color3.b = 0;
-   pd->text.color3.a = 128;
-   pd->text.align.x = 0.5;
-   pd->text.align.y = 0.5;
-   pd->text.id_source = -1;
-   pd->text.id_text_source = -1;
-
-   if ((rp->part->type == EDJE_PART_TYPE_EXTERNAL) && (rp->part->source))
      {
+       Edje_Part_Description_Common **tmp;
+
+       tmp = realloc(rp->part->other_desc,
+                     sizeof (Edje_Part_Description_Common *) * (rp->part->other_count + 1));
+       rp->part->other_desc[rp->part->other_count++] = pd;
+     }
+
+   pd->state.name = eina_stringshare_add(name);
+   pd->state.value = value;
+   pd->visible = 1;
+   pd->align.x = 0.5;
+   pd->align.y = 0.5;
+   pd->min.w = 0;
+   pd->min.h = 0;
+   pd->fixed.w = 0;
+   pd->fixed.h = 0;
+   pd->max.w = -1;
+   pd->max.h = -1;
+   pd->rel1.relative_x = 0.0;
+   pd->rel1.relative_y = 0.0;
+   pd->rel1.offset_x = 0;
+   pd->rel1.offset_y = 0;
+   pd->rel1.id_x = -1;
+   pd->rel1.id_y = -1;
+   pd->rel2.relative_x = 1.0;
+   pd->rel2.relative_y = 1.0;
+   pd->rel2.offset_x = -1;
+   pd->rel2.offset_y = -1;
+   pd->rel2.id_x = -1;
+   pd->rel2.id_y = -1;
+   pd->color_class = NULL;
+   pd->color.r = 255;
+   pd->color.g = 255;
+   pd->color.b = 255;
+   pd->color.a = 255;
+   pd->color2.r = 0;
+   pd->color2.g = 0;
+   pd->color2.b = 0;
+   pd->color2.a = 255;
+
+   if (rp->part->type == EDJE_PART_TYPE_TEXT
+       || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       Edje_Part_Description_Text *text;
+
+       text = (Edje_Part_Description_Text*) pd;
+
+       text->text.color3.r = 0;
+       text->text.color3.g = 0;
+       text->text.color3.b = 0;
+       text->text.color3.a = 128;
+       text->text.align.x = 0.5;
+       text->text.align.y = 0.5;
+       text->text.id_source = -1;
+       text->text.id_text_source = -1;
+     }
+   else if (rp->part->type == EDJE_PART_TYPE_IMAGE)
+     {
+       Edje_Part_Description_Image *img;
+
+       img = (Edje_Part_Description_Image*) pd;
+
+       img->image.id = -1;
+       img->image.fill.smooth = 1;
+       img->image.fill.pos_rel_x = 0.0;
+       img->image.fill.pos_abs_x = 0;
+       img->image.fill.rel_x = 1.0;
+       img->image.fill.abs_x = 0;
+       img->image.fill.pos_rel_y = 0.0;
+       img->image.fill.pos_abs_y = 0;
+       img->image.fill.rel_y = 1.0;
+       img->image.fill.abs_y = 0;
+       img->image.fill.angle = 0;
+       img->image.fill.spread = 0;
+       img->image.fill.type = EDJE_FILL_TYPE_SCALE;
+     }
+   else if ((rp->part->type == EDJE_PART_TYPE_EXTERNAL) && (rp->part->source))
+     {
+       Edje_Part_Description_External *external;
        Edje_External_Param_Info *pi;
 
+       external = (Edje_Part_Description_External*) pd;
        pi = (Edje_External_Param_Info *)edje_external_param_info_get(rp->part->source);
        while (pi && pi->name)
          {
@@ -2707,11 +2786,11 @@ edje_edit_state_add(Evas_Object *obj, const char *part, const char *name, double
                default:
                   ERR("unknown external parameter type '%d'", p->type);
               }
-            pd->external_params = eina_list_append(pd->external_params, p);
+            external->external_params = eina_list_append(external->external_params, p);
             pi++;
          }
-       if (pd->external_params)
-         rp->param1.external_params = _edje_external_params_parse(rp->swallowed_object, pd->external_params);
+       if (external->external_params)
+         rp->param1.external_params = _edje_external_params_parse(rp->swallowed_object, external->external_params);
      }
 }
 
@@ -2725,7 +2804,7 @@ edje_edit_state_exist(Evas_Object *obj, const char *part, const char *state, dou
 EAPI Eina_Bool
 edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, double val_from, const char *to, double val_to)
 {
-   Edje_Part_Description *pdfrom, *pdto;
+   Edje_Part_Description_Common *pdfrom, *pdto;
    Edje_Part_Image_Id *i;
    Edje_External_Param *p;
    Eina_List *l;
@@ -2738,144 +2817,122 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, doubl
    pdto = _edje_part_description_find_byname(eed, part, to, val_to);
    if (!pdto)
      {
-       pdto = _alloc(sizeof(Edje_Part_Description));
-       if (!pdto)
-         return EINA_FALSE;
+       Edje_Part_Description_Common **tmp;
+
+       pdto = _edje_edit_state_alloc(rp->part->type, ed);
+       if (!pdto) return EINA_FALSE;
        /* No need to check for default desc, at this point it must exist */
-       rp->part->other_desc = eina_list_append(rp->part->other_desc, pdto);
-       pdto->common.state.name = eina_stringshare_add(to);
-       pdto->common.state.value = val_to;
-     }
-
-#define PD_COPY(_x) pdto->_x = pdfrom->_x
-#define PD_STRING_COPY(_x) _edje_if_string_free(ed, pdto->_x); \
-                          pdto->_x = (char *)eina_stringshare_add(pdfrom->_x)
-   PD_COPY(common.align.x);
-   PD_COPY(common.align.y);
-   PD_COPY(common.fixed.w);
-   PD_COPY(common.fixed.h);
-   PD_COPY(common.min.w);
-   PD_COPY(common.min.h);
-   PD_COPY(common.max.w);
-   PD_COPY(common.max.h);
-   PD_COPY(common.aspect.min);
-   PD_COPY(common.aspect.max);
-   PD_COPY(common.aspect.prefer);
-   PD_COPY(common.rel1.relative_x);
-   PD_COPY(common.rel1.relative_y);
-   PD_COPY(common.rel1.offset_x);
-   PD_COPY(common.rel1.offset_y);
-   PD_COPY(common.rel1.id_x);
-   PD_COPY(common.rel1.id_y);
-   PD_COPY(common.rel2.relative_x);
-   PD_COPY(common.rel2.relative_y);
-   PD_COPY(common.rel2.offset_x);
-   PD_COPY(common.rel2.offset_y);
-   PD_COPY(common.rel2.id_x);
-   PD_COPY(common.rel2.id_y);
-   PD_COPY(image.id);
-   EINA_LIST_FREE(pdto->image.tween_list, i)
-      free(i);
-   EINA_LIST_FOREACH(pdfrom->image.tween_list, l, i)
-     {
-       Edje_Part_Image_Id *new_i;
-       new_i = _alloc(sizeof(Edje_Part_Image_Id));
-       /* error checking? What to do if failed? Rollback, abort? */
-       new_i->id = i->id;
-       pdto->image.tween_list = eina_list_append(pdto->image.tween_list, new_i);
-     }
-   PD_COPY(image.border.l);
-   PD_COPY(image.border.r);
-   PD_COPY(image.border.t);
-   PD_COPY(image.border.b);
-   PD_COPY(image.border.no_fill);
-   PD_COPY(image.fill.pos_rel_x);
-   PD_COPY(image.fill.rel_x);
-   PD_COPY(image.fill.pos_rel_y);
-   PD_COPY(image.fill.rel_y);
-   PD_COPY(image.fill.pos_abs_x);
-   PD_COPY(image.fill.abs_x);
-   PD_COPY(image.fill.pos_abs_y);
-   PD_COPY(image.fill.abs_y);
-   PD_COPY(image.fill.angle);
-   PD_COPY(image.fill.spread);
-   PD_COPY(image.fill.smooth);
-   PD_COPY(image.fill.type);
-   PD_STRING_COPY(common.color_class);
-   PD_STRING_COPY(text.text);
-   PD_STRING_COPY(text.text_class);
-   PD_STRING_COPY(text.style);
-   PD_STRING_COPY(text.font);
-   PD_STRING_COPY(text.repch);
-   PD_COPY(text.align.x);
-   PD_COPY(text.align.y);
-   PD_COPY(text.elipsis);
-   PD_COPY(text.size);
-   PD_COPY(text.id_source);
-   PD_COPY(text.id_text_source);
-   PD_COPY(text.fit_x);
-   PD_COPY(text.fit_y);
-   PD_COPY(text.min_x);
-   PD_COPY(text.min_y);
-   PD_COPY(text.max_x);
-   PD_COPY(text.max_y);
-   PD_STRING_COPY(box.layout);
-   PD_STRING_COPY(box.alt_layout);
-   PD_COPY(box.align.x);
-   PD_COPY(box.align.y);
-   PD_COPY(box.padding.x);
-   PD_COPY(box.padding.y);
-   PD_COPY(box.min.h);
-   PD_COPY(box.min.v);
-   PD_COPY(table.homogeneous);
-   PD_COPY(table.align.x);
-   PD_COPY(table.align.y);
-   PD_COPY(table.padding.x);
-   PD_COPY(table.padding.y);
-   PD_COPY(common.color.r);
-   PD_COPY(common.color.g);
-   PD_COPY(common.color.b);
-   PD_COPY(common.color.a);
-   PD_COPY(common.color2.r);
-   PD_COPY(common.color2.g);
-   PD_COPY(common.color2.b);
-   PD_COPY(common.color2.a);
-   PD_COPY(text.color3.r);
-   PD_COPY(text.color3.g);
-   PD_COPY(text.color3.b);
-   PD_COPY(text.color3.a);
-   /* XXX: optimize this, most likely we don't need to remove and add */
-   EINA_LIST_FREE(pdto->external_params, p)
-     {
-       _edje_if_string_free(ed, p->name);
-       if (p->s)
-         _edje_if_string_free(ed, p->s);
-       free(p);
-     }
-   EINA_LIST_FOREACH(pdfrom->external_params, l, p)
-     {
-       Edje_External_Param *new_p;
-       new_p = _alloc(sizeof(Edje_External_Param));
-       new_p->name = eina_stringshare_add(p->name);
-       new_p->type = p->type;
-       switch (p->type)
-         {
-          case EDJE_EXTERNAL_PARAM_TYPE_INT:
-             new_p->i = p->i;
-             break;
-          case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
-             new_p->d = p->d;
-             break;
-          case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
-          case EDJE_EXTERNAL_PARAM_TYPE_STRING:
-             new_p->s = eina_stringshare_add(p->s);
-             break;
-          default:
-             break;
-         }
-       pdto->external_params = eina_list_append(pdto->external_params, new_p);
+
+       tmp = realloc(rp->part->other_desc,
+                     sizeof (Edje_Part_Description_Common *) * (rp->part->other_count + 1));
+       rp->part->other_desc[rp->part->other_count++] = pdto;
+
+       pdto->state.name = eina_stringshare_add(to);
+       pdto->state.value = val_to;
+     }
+
+#define PD_STRING_COPY(To, From, _x)                   \
+   _edje_if_string_free(ed, To->_x);                   \
+   To->_x = (char *)eina_stringshare_add(From->_x);
+
+   /* Copy all value */
+   *pdto = *pdfrom;
+   /* Update pointer. */
+   PD_STRING_COPY(pdto, pdfrom, color_class);
+
+   switch (rp->part->type)
+     {
+      case EDJE_PART_TYPE_IMAGE:
+       {
+          Edje_Part_Description_Image *img_to = (Edje_Part_Description_Image*) pdto;
+          Edje_Part_Description_Image *img_from = (Edje_Part_Description_Image*) pdfrom;
+
+          img_to->image = img_from->image;
+
+          /* Update pointers. */
+          EINA_LIST_FREE(img_to->image.tween_list, i)
+            free(i);
+
+          EINA_LIST_FOREACH(img_from->image.tween_list, l, i)
+            {
+               Edje_Part_Image_Id *new_i;
+               new_i = _alloc(sizeof(Edje_Part_Image_Id));
+               /* error checking? What to do if failed? Rollbacgk, abort? */
+               new_i->id = i->id;
+               img_to->image.tween_list = eina_list_append(img_to->image.tween_list, new_i);
+            }
+       }
+      case EDJE_PART_TYPE_TEXT:
+      case EDJE_PART_TYPE_TEXTBLOCK:
+       {
+          Edje_Part_Description_Text *text_to = (Edje_Part_Description_Text*) pdto;
+          Edje_Part_Description_Text *text_from = (Edje_Part_Description_Text*) pdfrom;
+
+          text_to->text = text_from->text;
+
+          /* Update pointers. */
+          PD_STRING_COPY(text_to, text_from, text.text);
+          PD_STRING_COPY(text_to, text_from, text.text_class);
+          PD_STRING_COPY(text_to, text_from, text.style);
+          PD_STRING_COPY(text_to, text_from, text.font);
+          PD_STRING_COPY(text_to, text_from, text.repch);
+       }
+      case EDJE_PART_TYPE_BOX:
+       {
+          Edje_Part_Description_Box *box_to = (Edje_Part_Description_Box*) pdto;
+          Edje_Part_Description_Box *box_from = (Edje_Part_Description_Box*) pdfrom;
+
+          box_to->box = box_from->box;
+
+          PD_STRING_COPY(box_to, box_from, box.layout);
+          PD_STRING_COPY(box_to, box_from, box.alt_layout);
+       }
+      case EDJE_PART_TYPE_TABLE:
+       {
+          Edje_Part_Description_Table *table_to = (Edje_Part_Description_Table*) pdto;
+          Edje_Part_Description_Table *table_from = (Edje_Part_Description_Table*) pdfrom;
+
+          table_to->table = table_from->table;
+       }
+      case EDJE_PART_TYPE_EXTERNAL:
+       {
+          Edje_Part_Description_External *ext_to = (Edje_Part_Description_External*) pdto;
+          Edje_Part_Description_External *ext_from = (Edje_Part_Description_External*) pdfrom;
+
+          /* XXX: optimize this, most likely we don't need to remove and add */
+          EINA_LIST_FREE(ext_to->external_params, p)
+            {
+               _edje_if_string_free(ed, p->name);
+               if (p->s)
+                 _edje_if_string_free(ed, p->s);
+               free(p);
+            }
+          EINA_LIST_FOREACH(ext_from->external_params, l, p)
+            {
+               Edje_External_Param *new_p;
+               new_p = _alloc(sizeof(Edje_External_Param));
+               new_p->name = eina_stringshare_add(p->name);
+               new_p->type = p->type;
+               switch (p->type)
+                 {
+                  case EDJE_EXTERNAL_PARAM_TYPE_INT:
+                     new_p->i = p->i;
+                     break;
+                  case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+                     new_p->d = p->d;
+                     break;
+                  case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
+                  case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+                     new_p->s = eina_stringshare_add(p->s);
+                     break;
+                  default:
+                     break;
+                 }
+               ext_to->external_params = eina_list_append(ext_to->external_params, new_p);
+            }
+       }
      }
-   PD_COPY(common.visible);
+
 #undef PD_STRING_COPY
 #undef PD_COPY
 
@@ -2887,13 +2944,13 @@ edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, doubl
   edje_edit_state_##Sub##_relative_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
      GET_PD_OR_RETURN(0);                                              \
-     return TO_DOUBLE(pd->common.Sub.relative_##Value);                        \
+     return TO_DOUBLE(pd->Sub.relative_##Value);                       \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_##Sub##_relative_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
-     pd->common.Sub.relative_##Value = FROM_DOUBLE(v);                 \
+     pd->Sub.relative_##Value = FROM_DOUBLE(v);                        \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -2907,13 +2964,13 @@ FUNC_STATE_RELATIVE_DOUBLE(rel2, y);
   edje_edit_state_##Sub##_offset_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
      GET_PD_OR_RETURN(0);                                              \
-     return pd->common.Sub.offset_##Value;                             \
+     return pd->Sub.offset_##Value;                            \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_##Sub##_offset_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
-     pd->common.Sub.offset_##Value = TO_INT(FROM_DOUBLE(v));           \
+     pd->Sub.offset_##Value = TO_INT(FROM_DOUBLE(v));          \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -2930,9 +2987,9 @@ FUNC_STATE_OFFSET_INT(rel2, y);
                                                                        \
      GET_PD_OR_RETURN(NULL);                                           \
                                                                        \
-     if (pd->common.Sub.id_##Value == -1) return NULL;                 \
+     if (pd->Sub.id_##Value == -1) return NULL;                        \
                                                                        \
-     rel = ed->table_parts[pd->common.Sub.id_##Value % ed->table_parts_size]; \
+     rel = ed->table_parts[pd->Sub.id_##Value % ed->table_parts_size]; \
                                                                        \
      if (rel->part->name) return eina_stringshare_add(rel->part->name);        \
      return NULL;                                                      \
@@ -2948,10 +3005,10 @@ FUNC_STATE_OFFSET_INT(rel2, y);
        {                                                               \
          relp = _edje_real_part_get(ed, to);                           \
          if (!relp) return;                                            \
-         pd->common.Sub.id_##Value = relp->part->id;                   \
+         pd->Sub.id_##Value = relp->part->id;                  \
        }                                                               \
      else                                                              \
-       pd->common.Sub.id_##Value = -1;                                 \
+       pd->Sub.id_##Value = -1;                                        \
                                                                        \
   }
 //note after this call edje_edit_part_selected_state_set() to update !! need to fix this
@@ -2964,46 +3021,77 @@ FUNC_STATE_REL(rel2, x);
 FUNC_STATE_REL(rel2, y);
 
 //colors
-#define FUNC_COLOR(Class, Code)                                                \
+#define FUNC_COLOR(Code)                                               \
   EAPI void                                                            \
-  edje_edit_state_color##Code##_get(Evas_Object *obj, const char *part, const char *state, double value, int *r, int *g, int *b, int *a) \
+  edje_edit_state_##Code##_get(Evas_Object *obj, const char *part, const char *state, double value, int *r, int *g, int *b, int *a) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
                                                                        \
-     if (r) *r = pd->Class.color##Code.r;                              \
-     if (g) *g = pd->Class.color##Code.g;                              \
-     if (b) *b = pd->Class.color##Code.b;                              \
-     if (a) *a = pd->Class.color##Code.a;                              \
+     if (r) *r = pd->Code.r;                                           \
+     if (g) *g = pd->Code.g;                                           \
+     if (b) *b = pd->Code.b;                                           \
+     if (a) *a = pd->Code.a;                                           \
   }                                                                    \
   EAPI void                                                            \
-  edje_edit_state_color##Code##_set(Evas_Object *obj, const char *part, const char *state, double value, int r, int g, int b, int a) \
+  edje_edit_state_##Code##_set(Evas_Object *obj, const char *part, const char *state, double value, int r, int g, int b, int a) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
                                                                        \
-     if (r > -1 && r < 256) pd->Class.color##Code.r = r;               \
-     if (g > -1 && g < 256) pd->Class.color##Code.g = g;               \
-     if (b > -1 && b < 256) pd->Class.color##Code.b = b;               \
-     if (a > -1 && a < 256) pd->Class.color##Code.a = a;               \
-                                                                       \
+     if (r > -1 && r < 256) pd->Code.r = r;                            \
+     if (g > -1 && g < 256) pd->Code.g = g;                            \
+     if (b > -1 && b < 256) pd->Code.b = b;                            \
+     if (a > -1 && a < 256) pd->Code.a = a;                            \
+                                                                       \
      edje_object_calc_force(obj);                                      \
   }
 
-FUNC_COLOR(common, );
-FUNC_COLOR(common, 2);
-FUNC_COLOR(text, 3);
+FUNC_COLOR(color);
+FUNC_COLOR(color2);
+
+EAPI void
+edje_edit_state_color3_get(Evas_Object *obj, const char *part, const char *state, double value, int *r, int *g, int *b, int *a)
+{
+   Edje_Part_Description_Text *txt;
+
+   GET_PD_OR_RETURN();
+
+   txt = (Edje_Part_Description_Text*) pd;
+
+   if (r) *r = txt->text.color3.r;
+   if (g) *g = txt->text.color3.g;
+   if (b) *b = txt->text.color3.b;
+   if (a) *a = txt->text.color3.a;
+}
+
+EAPI void
+edje_edit_state_color3_set(Evas_Object *obj, const char *part, const char *state, double value, int r, int g, int b, int a)
+{
+   Edje_Part_Description_Text *txt;
+
+   GET_PD_OR_RETURN();
+
+   txt = (Edje_Part_Description_Text*) pd;
+
+   if (r > -1 && r < 256) txt->text.color3.r = r;
+   if (g > -1 && g < 256) txt->text.color3.g = g;
+   if (b > -1 && b < 256) txt->text.color3.b = b;
+   if (a > -1 && a < 256) txt->text.color3.a = a;
+
+   edje_object_calc_force(obj);
+}
 
 #define FUNC_STATE_DOUBLE(Class, Value)                                        \
   EAPI double                                                          \
   edje_edit_state_##Class##_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
      GET_PD_OR_RETURN(0);                                              \
-     return TO_DOUBLE(pd->common.Class.Value);                         \
+     return TO_DOUBLE(pd->Class.Value);                                \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_##Class##_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
-     pd->common.Class.Value = FROM_DOUBLE(v);                          \
+     pd->Class.Value = FROM_DOUBLE(v);                         \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -3012,13 +3100,13 @@ FUNC_COLOR(text, 3);
   edje_edit_state_##Class##_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
      GET_PD_OR_RETURN(0);                                              \
-     return pd->common.Class.Value;                                    \
+     return pd->Class.Value;                                   \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_##Class##_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, int v) \
   {                                                                    \
      GET_PD_OR_RETURN();                                               \
-     pd->common.Class.Value = v;                                       \
+     pd->Class.Value = v;                                      \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -3035,14 +3123,24 @@ FUNC_STATE_DOUBLE(aspect, max);
   EAPI double                                                          \
   edje_edit_state_fill_##Type##_relative_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
+     Edje_Part_Description_Image *img;                                 \
+                                                                       \
      GET_PD_OR_RETURN(0);                                              \
-     return TO_DOUBLE(pd->image.fill.Class##rel_##Value);              \
+                                                                       \
+     img = (Edje_Part_Description_Image*) pd;                          \
+                                                                       \
+     return TO_DOUBLE(img->image.fill.Class##rel_##Value);             \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_fill_##Type##_relative_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
+     Edje_Part_Description_Image *img;                                 \
+                                                                       \
      GET_PD_OR_RETURN();                                               \
-     pd->image.fill.Class##rel_##Value = FROM_DOUBLE(v);               \
+                                                                       \
+     img = (Edje_Part_Description_Image*) pd;                          \
+                                                                       \
+     img->image.fill.Class##rel_##Value = FROM_DOUBLE(v);              \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -3050,14 +3148,24 @@ FUNC_STATE_DOUBLE(aspect, max);
   EAPI int                                                             \
   edje_edit_state_fill_##Type##_offset_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
+     Edje_Part_Description_Image *img;                                 \
+                                                                       \
      GET_PD_OR_RETURN(0);                                              \
-     return pd->image.fill.Class##abs_##Value;                         \
+                                                                       \
+     img = (Edje_Part_Description_Image*) pd;                          \
+                                                                       \
+     return img->image.fill.Class##abs_##Value;                                \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_fill_##Type##_offset_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
+     Edje_Part_Description_Image *img;                                 \
+                                                                       \
      GET_PD_OR_RETURN();                                               \
-     pd->image.fill.Class##abs_##Value = FROM_DOUBLE(v);               \
+                                                                       \
+     img = (Edje_Part_Description_Image*) pd;                          \
+                                                                       \
+     img->image.fill.Class##abs_##Value = FROM_DOUBLE(v);              \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -3076,7 +3184,7 @@ edje_edit_state_visible_get(Evas_Object *obj, const char *part, const char *stat
 {
    GET_PD_OR_RETURN(EINA_FALSE);
    //printf("Get state visible flag of part: %s state: %s\n", part, state);
-   return pd->common.visible;
+   return pd->visible;
 }
 
 EAPI void
@@ -3084,8 +3192,8 @@ edje_edit_state_visible_set(Evas_Object *obj, const char *part, const char *stat
 {
    GET_PD_OR_RETURN();
    //printf("Set state visible flag of part: %s state: %s to: %d\n", part, state, visible);
-   if (visible) pd->common.visible = 1;
-   else         pd->common.visible = 0;
+   if (visible) pd->visible = 1;
+   else         pd->visible = 0;
    edje_object_calc_force(obj);
 }
 
@@ -3095,7 +3203,7 @@ edje_edit_state_aspect_pref_get(Evas_Object *obj, const char *part, const char *
    GET_PD_OR_RETURN(0);
 
    //printf("GET ASPECT_PREF of state '%s' [%d]\n", state, pd->aspect.prefer);
-   return pd->common.aspect.prefer;
+   return pd->aspect.prefer;
 }
 
 EAPI void
@@ -3104,7 +3212,7 @@ edje_edit_state_aspect_pref_set(Evas_Object *obj, const char *part, const char *
    GET_PD_OR_RETURN();
 
    //printf("SET ASPECT_PREF of state '%s' [to: %d]\n", state, pref);
-   pd->common.aspect.prefer = pref;
+   pd->aspect.prefer = pref;
 }
 
 EAPI const char*
@@ -3112,7 +3220,7 @@ edje_edit_state_color_class_get(Evas_Object *obj, const char *part, const char *
 {
    GET_PD_OR_RETURN(NULL);
    //printf("Get ColorClass of part: %s state: %s\n", part, state);
-   return eina_stringshare_add(pd->common.color_class);
+   return eina_stringshare_add(pd->color_class);
 }
 
 EAPI void
@@ -3120,25 +3228,34 @@ edje_edit_state_color_class_set(Evas_Object *obj, const char *part, const char *
 {
    GET_PD_OR_RETURN();
    //printf("Set ColorClass of part: %s state: %s [to: %s]\n", part, state, color_class);
-   _edje_if_string_free(ed, pd->common.color_class);
-   pd->common.color_class = (char*)eina_stringshare_add(color_class);
+   _edje_if_string_free(ed, pd->color_class);
+   pd->color_class = (char*)eina_stringshare_add(color_class);
 }
 
 EAPI const Eina_List *
 edje_edit_state_external_params_list_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_External *external;
+
    GET_PD_OR_RETURN(NULL);
-   return pd->external_params;
+
+   external = (Edje_Part_Description_External *) pd;
+
+   return external->external_params;
 }
 
 EAPI Eina_Bool
 edje_edit_state_external_param_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, Edje_External_Param_Type *type, void **val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (type) *type = p->type;
@@ -3168,11 +3285,15 @@ edje_edit_state_external_param_get(Evas_Object *obj, const char *part, const cha
 EAPI Eina_Bool
 edje_edit_state_external_param_int_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, int *val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (p->type != EDJE_EXTERNAL_PARAM_TYPE_INT)
@@ -3188,11 +3309,15 @@ edje_edit_state_external_param_int_get(Evas_Object *obj, const char *part, const
 EAPI Eina_Bool
 edje_edit_state_external_param_bool_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, Eina_Bool *val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (p->type != EDJE_EXTERNAL_PARAM_TYPE_BOOL)
@@ -3208,11 +3333,15 @@ edje_edit_state_external_param_bool_get(Evas_Object *obj, const char *part, cons
 EAPI Eina_Bool
 edje_edit_state_external_param_double_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, double *val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (p->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
@@ -3228,11 +3357,15 @@ edje_edit_state_external_param_double_get(Evas_Object *obj, const char *part, co
 EAPI Eina_Bool
 edje_edit_state_external_param_string_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, const char **val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
@@ -3248,11 +3381,15 @@ edje_edit_state_external_param_string_get(Evas_Object *obj, const char *part, co
 EAPI Eina_Bool
 edje_edit_state_external_param_choice_get(Evas_Object *obj, const char *part, const char *state, double value, const char *param, const char **val)
 {
-   Eina_List *l;
+   Edje_Part_Description_External *external;
    Edje_External_Param *p;
+   Eina_List *l;
+
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   external = (Edje_Part_Description_External *) pd;
+
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           if (p->type != EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
@@ -3281,17 +3418,20 @@ edje_edit_state_external_param_set(Evas_Object *obj, const char *part, const cha
 {
    va_list ap;
    Eina_List *l;
-   Edje_External_Param *p, old_p;
+   Edje_Part_Description_External *external;
+   Edje_External_Param *p = NULL, old_p = { 0, 0, 0, 0, 0 };
    Edje_Real_Part *rp;
    int found = 0;
 
    GET_PD_OR_RETURN(EINA_FALSE);
 
+   external = (Edje_Part_Description_External *) pd;
+
    rp = _edje_real_part_get(ed, part);
 
    va_start(ap, type);
 
-   EINA_LIST_FOREACH(pd->external_params, l, p)
+   EINA_LIST_FOREACH(external->external_params, l, p)
       if (!strcmp(p->name, param))
        {
           found = 1;
@@ -3361,13 +3501,13 @@ edje_edit_state_external_param_set(Evas_Object *obj, const char *part, const cha
      }
 
    if (!found)
-     pd->external_params = eina_list_append(pd->external_params, p);
+     external->external_params = eina_list_append(external->external_params, p);
 
    _edje_external_parsed_params_free(rp->swallowed_object,
                                     rp->param1.external_params);
    rp->param1.external_params = \
                             _edje_external_params_parse(rp->swallowed_object,
-                                                        pd->external_params);
+                                                        external->external_params);
 
 
    return EINA_TRUE;
@@ -3410,12 +3550,15 @@ edje_edit_state_external_param_choice_set(Evas_Object *obj, const char *part, co
 EAPI const char *
 edje_edit_state_text_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN(NULL);
 
+   txt = (Edje_Part_Description_Text *) pd;
    //printf("GET TEXT of state: %s\n", state);
 
-   if (pd->text.text)
-     return eina_stringshare_add(pd->text.text);
+   if (txt->text.text)
+     return eina_stringshare_add(txt->text.text);
 
    return NULL;
 }
@@ -3423,14 +3566,18 @@ edje_edit_state_text_get(Evas_Object *obj, const char *part, const char *state,
 EAPI void
 edje_edit_state_text_set(Evas_Object *obj, const char *part, const char *state, double value, const char *text)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN();
 
    //printf("SET TEXT of state: %s\n", state);
 
    if (!text) return;
 
-   _edje_if_string_free(ed, pd->text.text);
-   pd->text.text = (char *)eina_stringshare_add(text);
+   txt = (Edje_Part_Description_Text *) pd;
+
+   _edje_if_string_free(ed, txt->text.text);
+   txt->text.text = (char *)eina_stringshare_add(text);
 
    edje_object_calc_force(obj);
 }
@@ -3438,22 +3585,29 @@ edje_edit_state_text_set(Evas_Object *obj, const char *part, const char *state,
 EAPI int
 edje_edit_state_text_size_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN(-1);
 
+   txt = (Edje_Part_Description_Text *) pd;
    //printf("GET TEXT_SIZE of state: %s [%d]\n", state, pd->text.size);
-   return pd->text.size;
+   return txt->text.size;
 }
 
 EAPI void
 edje_edit_state_text_size_set(Evas_Object *obj, const char *part, const char *state, double value, int size)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN();
 
    //printf("SET TEXT_SIZE of state: %s [%d]\n", state, size);
 
    if (size < 0) return;
 
-   pd->text.size = size;
+   txt = (Edje_Part_Description_Text *) pd;
+
+   txt->text.size = size;
 
    edje_object_calc_force(obj);
 }
@@ -3462,14 +3616,22 @@ edje_edit_state_text_size_set(Evas_Object *obj, const char *part, const char *st
   EAPI double                                                          \
   edje_edit_state_text_##Name##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
+     Edje_Part_Description_Text *txt;                                  \
+                                                                       \
      GET_PD_OR_RETURN(0);                                              \
-     return TO_DOUBLE(pd->text.Value);                                 \
+                                                                       \
+     txt = (Edje_Part_Description_Text *) pd;                          \
+     return TO_DOUBLE(txt->text.Value);                                        \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_text_##Name##_set(Evas_Object *obj, const char *part, const char *state, double value, double v) \
   {                                                                    \
+     Edje_Part_Description_Text *txt;                                  \
+                                                                       \
      GET_PD_OR_RETURN();                                               \
-     pd->text.Value = FROM_DOUBLE(v);                                  \
+                                                                       \
+     txt = (Edje_Part_Description_Text *) pd;                          \
+     txt->text.Value = FROM_DOUBLE(v);                                 \
      edje_object_calc_force(obj);                                      \
   }                                                                    \
 
@@ -3481,14 +3643,22 @@ FUNC_TEXT_DOUBLE(elipsis, elipsis);
   EAPI Eina_Bool                                                       \
   edje_edit_state_text_fit_##Value##_get(Evas_Object *obj, const char *part, const char *state, double value) \
   {                                                                    \
+     Edje_Part_Description_Text *txt;                                  \
+                                                                       \
      GET_PD_OR_RETURN(EINA_FALSE);                                     \
-     return pd->text.fit_##Value;                                      \
+                                                                       \
+     txt = (Edje_Part_Description_Text *) pd;                          \
+     return txt->text.fit_##Value;                                     \
   }                                                                    \
   EAPI void                                                            \
   edje_edit_state_text_fit_##Value##_set(Evas_Object *obj, const char *part, const char *state, double value, Eina_Bool fit) \
   {                                                                    \
+     Edje_Part_Description_Text *txt;                                  \
+                                                                       \
      GET_PD_OR_RETURN();                                               \
-     pd->text.fit_##Value = fit ? 1 : 0;                               \
+                                                                       \
+     txt = (Edje_Part_Description_Text *) pd;                          \
+     txt->text.fit_##Value = fit ? 1 : 0;                              \
      edje_object_calc_force(obj);                                      \
   }
 
@@ -3625,22 +3795,29 @@ edje_edit_font_del(Evas_Object *obj, const char* alias)
 EAPI const char *
 edje_edit_state_font_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN(NULL);
 
    //printf("GET FONT of state: %s [%s]\n", state, pd->text.font);
-   if (!pd->text.font) return NULL;
-   return eina_stringshare_add(pd->text.font);
+   txt = (Edje_Part_Description_Text*) pd;
+
+   if (!txt->text.font) return NULL;
+   return eina_stringshare_add(txt->text.font);
 }
 
 EAPI void
 edje_edit_state_font_set(Evas_Object *obj, const char *part, const char *state, double value, const char *font)
 {
+   Edje_Part_Description_Text *txt;
+
    GET_PD_OR_RETURN();
 
    //printf("SET FONT of state: %s [%s]\n", state, font);
+   txt = (Edje_Part_Description_Text*) pd;
 
-   _edje_if_string_free(ed, pd->text.font);
-   pd->text.font = (char *)eina_stringshare_add(font);
+   _edje_if_string_free(ed, txt->text.font);
+   txt->text.font = (char *)eina_stringshare_add(font);
 
    edje_object_calc_force(obj);
 }
@@ -3929,11 +4106,14 @@ edje_edit_image_compression_rate_get(Evas_Object *obj, const char *image)
 EAPI const char *
 edje_edit_state_image_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Image *img;
    char *image;
 
    GET_PD_OR_RETURN(NULL);
 
-   image = (char *)_edje_image_name_find(obj, pd->image.id);
+   img = (Edje_Part_Description_Image *) pd;
+
+   image = (char *)_edje_image_name_find(obj, img->image.id);
    if (!image) return NULL;
 
    //printf("GET IMAGE for %s [%s]\n", state, image);
@@ -3943,6 +4123,7 @@ edje_edit_state_image_get(Evas_Object *obj, const char *part, const char *state,
 EAPI void
 edje_edit_state_image_set(Evas_Object *obj, const char *part, const char *state, double value, const char *image)
 {
+   Edje_Part_Description_Image *img;
    int id;
 
    GET_PD_OR_RETURN();
@@ -3952,7 +4133,9 @@ edje_edit_state_image_set(Evas_Object *obj, const char *part, const char *state,
    id = _edje_image_id_find(obj, image);
    //printf("SET IMAGE for %s [%s]\n", state, image);
 
-   if (id > -1) pd->image.id = id;
+   img = (Edje_Part_Description_Image *) pd;
+
+   if (id > -1) img->image.id = id;
 
    edje_object_calc_force(obj);
 }
@@ -3960,6 +4143,7 @@ edje_edit_state_image_set(Evas_Object *obj, const char *part, const char *state,
 EAPI Eina_List *
 edje_edit_state_tweens_list_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Image *img;
    Edje_Part_Image_Id *i;
    Eina_List *tweens = NULL, *l;
    const char *name;
@@ -3968,7 +4152,9 @@ edje_edit_state_tweens_list_get(Evas_Object *obj, const char *part, const char *
 
    //printf("GET TWEEN LIST for %s\n", state);
 
-   EINA_LIST_FOREACH(pd->image.tween_list, l, i)
+   img = (Edje_Part_Description_Image *) pd;
+
+   EINA_LIST_FOREACH(img->image.tween_list, l, i)
      {
        name = _edje_image_name_find(obj, i->id);
        //printf("   t: %s\n", name);
@@ -3981,6 +4167,7 @@ edje_edit_state_tweens_list_get(Evas_Object *obj, const char *part, const char *
 EAPI Eina_Bool
 edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state, double value, const char *tween)
 {
+   Edje_Part_Description_Image *img;
    Edje_Part_Image_Id *i;
    int id;
 
@@ -3994,8 +4181,10 @@ edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state,
    if (!i) return EINA_FALSE;
    i->id = id;
 
+   img = (Edje_Part_Description_Image *) pd;
+
    /* add to tween list */
-   pd->image.tween_list = eina_list_append(pd->image.tween_list, i);
+   img->image.tween_list = eina_list_append(img->image.tween_list, i);
 
    return EINA_TRUE;
 }
@@ -4003,22 +4192,25 @@ edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state,
 EAPI Eina_Bool
 edje_edit_state_tween_del(Evas_Object *obj, const char *part, const char *state, double value, const char *tween)
 {
-   Eina_List *l;
+   Edje_Part_Description_Image *img;
    Edje_Part_Image_Id *i;
+   Eina_List *l;
    int id;
 
    GET_PD_OR_RETURN(EINA_FALSE);
 
-   if (!pd->image.tween_list) return EINA_FALSE;
+   img = (Edje_Part_Description_Image *) pd;
+
+   if (!img->image.tween_list) return EINA_FALSE;
 
    id = _edje_image_id_find(obj, tween);
    if (id < 0) return EINA_FALSE;
 
-   EINA_LIST_FOREACH(pd->image.tween_list, l, i)
+   EINA_LIST_FOREACH(img->image.tween_list, l, i)
      {
        if (i->id == id)
          {
-            pd->image.tween_list = eina_list_remove_list(pd->image.tween_list, l);
+            img->image.tween_list = eina_list_remove_list(img->image.tween_list, l);
             return EINA_TRUE;
          }
      }
@@ -4028,27 +4220,35 @@ edje_edit_state_tween_del(Evas_Object *obj, const char *part, const char *state,
 EAPI void
 edje_edit_state_image_border_get(Evas_Object *obj, const char *part, const char *state, double value, int *l, int *r, int *t, int *b)
 {
+   Edje_Part_Description_Image *img;
+
    GET_PD_OR_RETURN();
 
+   img = (Edje_Part_Description_Image *) pd;
+
    //printf("GET IMAGE_BORDER of state '%s'\n", state);
 
-   if (l) *l = pd->image.border.l;
-   if (r) *r = pd->image.border.r;
-   if (t) *t = pd->image.border.t;
-   if (b) *b = pd->image.border.b;
+   if (l) *l = img->image.border.l;
+   if (r) *r = img->image.border.r;
+   if (t) *t = img->image.border.t;
+   if (b) *b = img->image.border.b;
 }
 
 EAPI void
 edje_edit_state_image_border_set(Evas_Object *obj, const char *part, const char *state, double value, int l, int r, int t, int b)
 {
+   Edje_Part_Description_Image *img;
+
    GET_PD_OR_RETURN();
 
+   img = (Edje_Part_Description_Image *) pd;
+
    //printf("SET IMAGE_BORDER of state '%s'\n", state);
 
-   if (l > -1) pd->image.border.l = l;
-   if (r > -1) pd->image.border.r = r;
-   if (t > -1) pd->image.border.t = t;
-   if (b > -1) pd->image.border.b = b;
+   if (l > -1) img->image.border.l = l;
+   if (r > -1) img->image.border.r = r;
+   if (t > -1) img->image.border.t = t;
+   if (b > -1) img->image.border.b = b;
 
    edje_object_calc_force(obj);
 }
@@ -4056,20 +4256,30 @@ edje_edit_state_image_border_set(Evas_Object *obj, const char *part, const char
 EAPI unsigned char
 edje_edit_state_image_border_fill_get(Evas_Object *obj, const char *part, const char *state, double value)
 {
+   Edje_Part_Description_Image *img;
+
    GET_PD_OR_RETURN(0);
-   if (pd->image.border.no_fill == 0) return 1;
-   else if (pd->image.border.no_fill == 1) return 0;
-   else if (pd->image.border.no_fill == 2) return 2;
+
+   img = (Edje_Part_Description_Image *) pd;
+
+   if (img->image.border.no_fill == 0) return 1;
+   else if (img->image.border.no_fill == 1) return 0;
+   else if (img->image.border.no_fill == 2) return 2;
    return 0;
 }
 
 EAPI void
 edje_edit_state_image_border_fill_set(Evas_Object *obj, const char *part, const char *state, double value, unsigned char fill)
 {
+   Edje_Part_Description_Image *img;
+
    GET_PD_OR_RETURN();
-   if (fill == 0) pd->image.border.no_fill = 1;
-   else if (fill == 1) pd->image.border.no_fill = 0;
-   else if (fill == 2) pd->image.border.no_fill = 2;
+
+   img = (Edje_Part_Description_Image *) pd;
+
+   if (fill == 0) img->image.border.no_fill = 1;
+   else if (fill == 1) img->image.border.no_fill = 0;
+   else if (fill == 2) img->image.border.no_fill = 2;
 
    edje_object_calc_force(obj);
 }
@@ -5083,7 +5293,6 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s
 {
    Eina_List *l, *ll;
    Edje_Real_Part *rp;
-   const char *str;
    Eina_Bool ret = EINA_TRUE;
 
    GET_PD_OR_RETURN(EINA_FALSE);
@@ -5091,84 +5300,93 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s
    rp = _edje_real_part_get(ed, part);
    if (!rp) return EINA_FALSE;
 
-   BUF_APPENDF(I4"description { state: \"%s\" %g;\n", pd->common.state.name, pd->common.state.value);
+   BUF_APPENDF(I4"description { state: \"%s\" %g;\n", pd->state.name, pd->state.value);
    //TODO Support inherit
 
-   if (!pd->common.visible)
+   if (!pd->visible)
      BUF_APPEND(I5"visible: 0;\n");
 
-   if (pd->common.align.x != 0.5 || pd->common.align.y != 0.5)
-     BUF_APPENDF(I5"align: %g %g;\n", TO_DOUBLE(pd->common.align.x), TO_DOUBLE(pd->common.align.y));
+   if (pd->align.x != 0.5 || pd->align.y != 0.5)
+     BUF_APPENDF(I5"align: %g %g;\n", TO_DOUBLE(pd->align.x), TO_DOUBLE(pd->align.y));
 
    //TODO Support fixed
 
-   if (pd->common.min.w || pd->common.min.h)
-     BUF_APPENDF(I5"min: %d %d;\n", pd->common.min.w, pd->common.min.h);
-   if (pd->common.max.w != -1 || pd->common.max.h != -1)
-     BUF_APPENDF(I5"max: %d %d;\n", pd->common.max.w, pd->common.max.h);
+   if (pd->min.w || pd->min.h)
+     BUF_APPENDF(I5"min: %d %d;\n", pd->min.w, pd->min.h);
+   if (pd->max.w != -1 || pd->max.h != -1)
+     BUF_APPENDF(I5"max: %d %d;\n", pd->max.w, pd->max.h);
 
    //TODO Support step
 
-   if (pd->common.aspect.min || pd->common.aspect.max)
-      BUF_APPENDF(I5"aspect: %g %g;\n", TO_DOUBLE(pd->common.aspect.min), TO_DOUBLE(pd->common.aspect.max));
-   if (pd->common.aspect.prefer)
-      BUF_APPENDF(I5"aspect_preference: %s;\n", prefers[pd->common.aspect.prefer]);
+   if (pd->aspect.min || pd->aspect.max)
+      BUF_APPENDF(I5"aspect: %g %g;\n", TO_DOUBLE(pd->aspect.min), TO_DOUBLE(pd->aspect.max));
+   if (pd->aspect.prefer)
+      BUF_APPENDF(I5"aspect_preference: %s;\n", prefers[pd->aspect.prefer]);
 
-   if (pd->common.color_class)
-     BUF_APPENDF(I5"color_class: \"%s\";\n", pd->common.color_class);
+   if (pd->color_class)
+     BUF_APPENDF(I5"color_class: \"%s\";\n", pd->color_class);
 
-   if (pd->common.color.r != 255 || pd->common.color.g != 255 ||
-       pd->common.color.b != 255 || pd->common.color.a != 255)
+   if (pd->color.r != 255 || pd->color.g != 255 ||
+       pd->color.b != 255 || pd->color.a != 255)
      BUF_APPENDF(I5"color: %d %d %d %d;\n",
-                pd->common.color.r, pd->common.color.g, pd->common.color.b, pd->common.color.a);
-   if (pd->common.color2.r != 0 || pd->common.color2.g != 0 ||
-       pd->common.color2.b != 0 || pd->common.color2.a != 255)
+                pd->color.r, pd->color.g, pd->color.b, pd->color.a);
+   if (pd->color2.r != 0 || pd->color2.g != 0 ||
+       pd->color2.b != 0 || pd->color2.a != 255)
      BUF_APPENDF(I5"color2: %d %d %d %d;\n",
-                pd->common.color2.r, pd->common.color2.g, pd->common.color2.b, pd->common.color2.a);
-   if (pd->text.color3.r != 0 || pd->text.color3.g != 0 ||
-       pd->text.color3.b != 0 || pd->text.color3.a != 128)
-     BUF_APPENDF(I5"color3: %d %d %d %d;\n",
-                pd->text.color3.r, pd->text.color3.g, pd->text.color3.b, pd->text.color3.a);
+                pd->color2.r, pd->color2.g, pd->color2.b, pd->color2.a);
+
+   if (rp->part->type == EDJE_PART_TYPE_TEXT
+       || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       Edje_Part_Description_Text *txt;
+
+       txt = (Edje_Part_Description_Text *) pd;
+
+       if (txt->text.color3.r != 0 || txt->text.color3.g != 0 ||
+           txt->text.color3.b != 0 || txt->text.color3.a != 128)
+         BUF_APPENDF(I5"color3: %d %d %d %d;\n",
+                     txt->text.color3.r, txt->text.color3.g, txt->text.color3.b, txt->text.color3.a);
+     }
 
    //Rel1
-   if (pd->common.rel1.relative_x || pd->common.rel1.relative_y || pd->common.rel1.offset_x ||
-       pd->common.rel1.offset_y || pd->common.rel1.id_x != -1 || pd->common.rel1.id_y != -1)
+   if (pd->rel1.relative_x || pd->rel1.relative_y || pd->rel1.offset_x ||
+       pd->rel1.offset_y || pd->rel1.id_x != -1 || pd->rel1.id_y != -1)
      {
        BUF_APPEND(I5"rel1 {\n");
-       if (pd->common.rel1.relative_x || pd->common.rel1.relative_y)
-         BUF_APPENDF(I6"relative: %g %g;\n", TO_DOUBLE(pd->common.rel1.relative_x), TO_DOUBLE(pd->common.rel1.relative_y));
-       if (pd->common.rel1.offset_x || pd->common.rel1.offset_y)
-         BUF_APPENDF(I6"offset: %d %d;\n", pd->common.rel1.offset_x, pd->common.rel1.offset_y);
-       if (pd->common.rel1.id_x != -1 && pd->common.rel1.id_x == pd->common.rel1.id_y)
-         BUF_APPENDF(I6"to: \"%s\";\n", ed->table_parts[pd->common.rel1.id_x]->part->name);
+       if (pd->rel1.relative_x || pd->rel1.relative_y)
+         BUF_APPENDF(I6"relative: %g %g;\n", TO_DOUBLE(pd->rel1.relative_x), TO_DOUBLE(pd->rel1.relative_y));
+       if (pd->rel1.offset_x || pd->rel1.offset_y)
+         BUF_APPENDF(I6"offset: %d %d;\n", pd->rel1.offset_x, pd->rel1.offset_y);
+       if (pd->rel1.id_x != -1 && pd->rel1.id_x == pd->rel1.id_y)
+         BUF_APPENDF(I6"to: \"%s\";\n", ed->table_parts[pd->rel1.id_x]->part->name);
        else
          {
-               if (pd->common.rel1.id_x != -1)
-                 BUF_APPENDF(I6"to_x: \"%s\";\n", ed->table_parts[pd->common.rel1.id_x]->part->name);
-               if (pd->common.rel1.id_y != -1)
-                 BUF_APPENDF(I6"to_y: \"%s\";\n", ed->table_parts[pd->common.rel1.id_y]->part->name);
+               if (pd->rel1.id_x != -1)
+                 BUF_APPENDF(I6"to_x: \"%s\";\n", ed->table_parts[pd->rel1.id_x]->part->name);
+               if (pd->rel1.id_y != -1)
+                 BUF_APPENDF(I6"to_y: \"%s\";\n", ed->table_parts[pd->rel1.id_y]->part->name);
          }
        BUF_APPEND(I5"}\n");//rel1
      }
 
    //Rel2
-   if (pd->common.rel2.relative_x != 1.0 || pd->common.rel2.relative_y != 1.0 ||
-       pd->common.rel2.offset_x != -1 || pd->common.rel2.offset_y != -1 ||
-       pd->common.rel2.id_x != -1 || pd->common.rel2.id_y != -1)
+   if (pd->rel2.relative_x != 1.0 || pd->rel2.relative_y != 1.0 ||
+       pd->rel2.offset_x != -1 || pd->rel2.offset_y != -1 ||
+       pd->rel2.id_x != -1 || pd->rel2.id_y != -1)
      {
        BUF_APPEND(I5"rel2 {\n");
-       if (TO_DOUBLE(pd->common.rel2.relative_x) != 1.0 || TO_DOUBLE(pd->common.rel2.relative_y) != 1.0)
-         BUF_APPENDF(I6"relative: %g %g;\n", TO_DOUBLE(pd->common.rel2.relative_x), TO_DOUBLE(pd->common.rel2.relative_y));
-       if (pd->common.rel2.offset_x != -1 || pd->common.rel2.offset_y != -1)
-         BUF_APPENDF(I6"offset: %d %d;\n", pd->common.rel2.offset_x, pd->common.rel2.offset_y);
-       if (pd->common.rel2.id_x != -1 && pd->common.rel2.id_x == pd->common.rel2.id_y)
-         BUF_APPENDF(I6"to: \"%s\";\n", ed->table_parts[pd->common.rel2.id_x]->part->name);
+       if (TO_DOUBLE(pd->rel2.relative_x) != 1.0 || TO_DOUBLE(pd->rel2.relative_y) != 1.0)
+         BUF_APPENDF(I6"relative: %g %g;\n", TO_DOUBLE(pd->rel2.relative_x), TO_DOUBLE(pd->rel2.relative_y));
+       if (pd->rel2.offset_x != -1 || pd->rel2.offset_y != -1)
+         BUF_APPENDF(I6"offset: %d %d;\n", pd->rel2.offset_x, pd->rel2.offset_y);
+       if (pd->rel2.id_x != -1 && pd->rel2.id_x == pd->rel2.id_y)
+         BUF_APPENDF(I6"to: \"%s\";\n", ed->table_parts[pd->rel2.id_x]->part->name);
        else
          {
-               if (pd->common.rel2.id_x != -1)
-                 BUF_APPENDF(I6"to_x: \"%s\";\n", ed->table_parts[pd->common.rel2.id_x]->part->name);
-               if (pd->common.rel2.id_y != -1)
-                 BUF_APPENDF(I6"to_y: \"%s\";\n", ed->table_parts[pd->common.rel2.id_y]->part->name);
+               if (pd->rel2.id_x != -1)
+                 BUF_APPENDF(I6"to_x: \"%s\";\n", ed->table_parts[pd->rel2.id_x]->part->name);
+               if (pd->rel2.id_y != -1)
+                 BUF_APPENDF(I6"to_y: \"%s\";\n", ed->table_parts[pd->rel2.id_y]->part->name);
          }
        BUF_APPEND(I5"}\n");//rel2
      }
@@ -5178,53 +5396,55 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s
      {
         char *data;
 
+       Edje_Part_Description_Image *img;
+
+       img = (Edje_Part_Description_Image *) pd;
+
        BUF_APPEND(I5"image {\n");
-       BUF_APPENDF(I6"normal: \"%s\";\n", _edje_image_name_find(obj, pd->image.id));
+       BUF_APPENDF(I6"normal: \"%s\";\n", _edje_image_name_find(obj, img->image.id));
 
        ll = edje_edit_state_tweens_list_get(obj, part, state, value);
        EINA_LIST_FOREACH(ll, l, data)
          BUF_APPENDF(I6"tween: \"%s\";\n", data);
        edje_edit_string_list_free(ll);
 
-       if (pd->image.border.l || pd->image.border.r || pd->image.border.t || pd->image.border.b)
-         BUF_APPENDF(I6"border: %d %d %d %d;\n", pd->image.border.l, pd->image.border.r, pd->image.border.t, pd->image.border.b);
-       if (pd->image.border.no_fill == 1)
+       if (img->image.border.l || img->image.border.r || img->image.border.t || img->image.border.b)
+         BUF_APPENDF(I6"border: %d %d %d %d;\n", img->image.border.l, img->image.border.r, img->image.border.t, img->image.border.b);
+       if (img->image.border.no_fill == 1)
          BUF_APPEND(I6"middle: NONE;\n");
-       else if (pd->image.border.no_fill == 0)
+       else if (img->image.border.no_fill == 0)
          BUF_APPEND(I6"middle: DEFAULT;\n");
-       else if (pd->image.border.no_fill == 2)
+       else if (img->image.border.no_fill == 2)
          BUF_APPEND(I6"middle: SOLID;\n");
 
        BUF_APPEND(I5"}\n");//image
-     }
 
-   //Fill
-   if (rp->part->type == EDJE_PART_TYPE_IMAGE)
-     {
+       //Fill
+
        BUF_APPEND(I5"fill {\n");
-       if (rp->part->type == EDJE_PART_TYPE_IMAGE && !pd->image.fill.smooth)
+       if (rp->part->type == EDJE_PART_TYPE_IMAGE && !img->image.fill.smooth)
          BUF_APPEND(I6"smooth: 0;\n");
         //TODO Support spread
 
-       if (pd->image.fill.pos_rel_x || pd->image.fill.pos_rel_y ||
-            pd->image.fill.pos_abs_x || pd->image.fill.pos_abs_y)
+       if (img->image.fill.pos_rel_x || img->image.fill.pos_rel_y ||
+            img->image.fill.pos_abs_x || img->image.fill.pos_abs_y)
          {
                BUF_APPEND(I6"origin {\n");
-               if (pd->image.fill.pos_rel_x || pd->image.fill.pos_rel_y)
-                 BUF_APPENDF(I7"relative: %g %g;\n", TO_DOUBLE(pd->image.fill.pos_rel_x), TO_DOUBLE(pd->image.fill.pos_rel_y));
-               if (pd->image.fill.pos_abs_x || pd->image.fill.pos_abs_y)
-                 BUF_APPENDF(I7"offset: %d %d;\n", pd->image.fill.pos_abs_x, pd->image.fill.pos_abs_y);
+               if (img->image.fill.pos_rel_x || img->image.fill.pos_rel_y)
+                 BUF_APPENDF(I7"relative: %g %g;\n", TO_DOUBLE(img->image.fill.pos_rel_x), TO_DOUBLE(img->image.fill.pos_rel_y));
+               if (img->image.fill.pos_abs_x || img->image.fill.pos_abs_y)
+                 BUF_APPENDF(I7"offset: %d %d;\n", img->image.fill.pos_abs_x, img->image.fill.pos_abs_y);
                BUF_APPEND(I6"}\n");
           }
 
-       if (TO_DOUBLE(pd->image.fill.rel_x) != 1.0 || TO_DOUBLE(pd->image.fill.rel_y) != 1.0 ||
-            pd->image.fill.abs_x || pd->image.fill.abs_y)
+       if (TO_DOUBLE(img->image.fill.rel_x) != 1.0 || TO_DOUBLE(img->image.fill.rel_y) != 1.0 ||
+            img->image.fill.abs_x || img->image.fill.abs_y)
          {
                BUF_APPEND(I6"size {\n");
-               if (pd->image.fill.rel_x != 1.0 || pd->image.fill.rel_y != 1.0)
-                 BUF_APPENDF(I7"relative: %g %g;\n", TO_DOUBLE(pd->image.fill.rel_x), TO_DOUBLE(pd->image.fill.rel_y));
-               if (pd->image.fill.abs_x || pd->image.fill.abs_y)
-                 BUF_APPENDF(I7"offset: %d %d;\n", pd->image.fill.abs_x, pd->image.fill.abs_y);
+               if (img->image.fill.rel_x != 1.0 || img->image.fill.rel_y != 1.0)
+                 BUF_APPENDF(I7"relative: %g %g;\n", TO_DOUBLE(img->image.fill.rel_x), TO_DOUBLE(img->image.fill.rel_y));
+               if (img->image.fill.abs_x || img->image.fill.abs_y)
+                 BUF_APPENDF(I7"offset: %d %d;\n", img->image.fill.abs_x, img->image.fill.abs_y);
                BUF_APPEND(I6"}\n");
           }
 
@@ -5234,22 +5454,26 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s
    //Text
    if (rp->part->type == EDJE_PART_TYPE_TEXT)
      {
+       Edje_Part_Description_Text *txt;
+
+       txt = (Edje_Part_Description_Text *) pd;
+
        BUF_APPEND(I5"text {\n");
-       if (pd->text.text)
-         BUF_APPENDF(I6"text: \"%s\";\n", pd->text.text);
-       BUF_APPENDF(I6"font: \"%s\";\n", pd->text.font);
-       BUF_APPENDF(I6"size: %d;\n", pd->text.size);
-       if (pd->text.text_class)
-         BUF_APPENDF(I6"text_class: \"%s\";\n", pd->text.text_class);
-       if (pd->text.fit_x || pd->text.fit_y)
-         BUF_APPENDF(I6"fit: %d %d;\n", pd->text.fit_x, pd->text.fit_y);
+       if (txt->text.text)
+         BUF_APPENDF(I6"text: \"%s\";\n", txt->text.text);
+       BUF_APPENDF(I6"font: \"%s\";\n", txt->text.font);
+       BUF_APPENDF(I6"size: %d;\n", txt->text.size);
+       if (txt->text.text_class)
+         BUF_APPENDF(I6"text_class: \"%s\";\n", txt->text.text_class);
+       if (txt->text.fit_x || txt->text.fit_y)
+         BUF_APPENDF(I6"fit: %d %d;\n", txt->text.fit_x, txt->text.fit_y);
         //TODO Support min & max
-       if (TO_DOUBLE(pd->text.align.x) != 0.5 || TO_DOUBLE(pd->text.align.y) != 0.5)
-         BUF_APPENDF(I6"align: %g %g;\n", TO_DOUBLE(pd->text.align.x), TO_DOUBLE(pd->text.align.y));
+       if (TO_DOUBLE(txt->text.align.x) != 0.5 || TO_DOUBLE(txt->text.align.y) != 0.5)
+         BUF_APPENDF(I6"align: %g %g;\n", TO_DOUBLE(txt->text.align.x), TO_DOUBLE(txt->text.align.y));
         //TODO Support source
         //TODO Support text_source
-       if (pd->text.elipsis)
-         BUF_APPENDF(I6"elipsis: %g;\n", pd->text.elipsis);
+       if (txt->text.elipsis)
+         BUF_APPENDF(I6"elipsis: %g;\n", txt->text.elipsis);
        BUF_APPEND(I5"}\n");
      }
 
@@ -5695,7 +5919,7 @@ _edje_edit_convert_to_old(Edje_File *ef)
 {
    Eina_Iterator *itr;
    Eina_Hash_Tuple *tpl;
-   int i;
+   unsigned int i;
 
    itr = eina_hash_iterator_tuple_new(ef->data);
    EINA_ITERATOR_FOREACH(itr, tpl)
@@ -5795,19 +6019,145 @@ _edje_edit_edje_file_save(Eet_File *eetf, Edje_File *ef)
    return EINA_TRUE;
 }
 
+static Old_Edje_Part_Description *
+_edje_edit_description_save(int type, Edje_Part_Description_Common *desc)
+{
+   Old_Edje_Part_Description *result;
+
+   result = calloc(1, sizeof (Old_Edje_Part_Description));
+   if (!result) return NULL;
+
+   result->common = *desc;
+
+   switch (type)
+     {
+#define COPY_OLD(Short, Type, Name)                                    \
+       case EDJE_PART_TYPE_##Short:                                    \
+         {                                                             \
+            Edje_Part_Description_##Type *Name = (Edje_Part_Description_##Type *) desc; \
+                                                                       \
+            result->Name = Name->Name;                                 \
+            break;                                                     \
+         }
+
+       COPY_OLD(IMAGE, Image, image);
+       COPY_OLD(TEXT, Text, text);
+       COPY_OLD(TEXTBLOCK, Text, text);
+       COPY_OLD(BOX, Box, box);
+       COPY_OLD(TABLE, Table, table);
+       COPY_OLD(EXTERNAL, External, external_params);
+     }
+
+   return result;
+}
+
+static Old_Edje_Part *
+_edje_edit_part_save(Edje_Part *ep)
+{
+   Old_Edje_Part *oep;
+   unsigned int i;
+
+   oep = calloc(1, sizeof (oep));
+   if (!oep) return NULL;
+
+   oep->name = ep->name;
+   oep->default_desc = _edje_edit_description_save(ep->type, ep->default_desc);
+
+   for (i = 0; i < ep->other_count; ++i)
+     oep->other_desc = eina_list_append(oep->other_desc, _edje_edit_description_save(ep->type, ep->other_desc[i]));
+
+   oep->source = ep->source;
+   oep->source2 = ep->source2;
+   oep->source3 = ep->source3;
+   oep->source4 = ep->source4;
+   oep->source5 = ep->source5;
+   oep->source6 = ep->source6;
+   oep->id = ep->id;
+   oep->clip_to_id = ep->clip_to_id;
+   oep->dragable = ep->dragable;
+
+   for (i = 0; i < ep->items_count; ++i)
+     oep->items = eina_list_append(oep->items, ep->items[i]);
+
+   oep->type = ep->type;
+   oep->effect = ep->effect;
+   oep->mouse_events = ep->mouse_events;
+   oep->repeat_events = ep->repeat_events;
+   oep->ignore_flags = ep->ignore_flags;
+   oep->scale = ep->scale;
+   oep->precise_is_inside = ep->precise_is_inside;
+   oep->use_alternate_font_metrics = ep->use_alternate_font_metrics;
+   oep->pointer_mode = ep->pointer_mode;
+   oep->entry_mode = ep->entry_mode;
+   oep->select_mode = ep->select_mode;
+   oep->multiline = ep->multiline;
+   oep->api = ep->api;
+
+   return oep;
+}
+
 static Eina_Bool
 _edje_edit_collection_save(Eet_File *eetf, Edje_Part_Collection *epc)
 {
+   Old_Edje_Part_Description *oepd;
+   Old_Edje_Part_Collection oepc;
+   Old_Edje_Part *oep;
+   Eina_Iterator *it;
+   Eina_Hash_Tuple *tu;
+   Edje_Data *di;
    char buf[256];
+   unsigned int i;
+   Eina_Bool err = EINA_TRUE;
+
+   memset(&oepc, 0, sizeof(oepc));
 
    snprintf(buf, sizeof(buf), "collections/%i", epc->id);
 
-   if (eet_data_write(eetf, _edje_edd_edje_part_collection, buf, epc, 1) <= 0)
+   oepc.programs = epc->programs;
+
+   it = eina_hash_iterator_tuple_new(epc->data);
+   EINA_ITERATOR_FOREACH(it, tu)
+     {
+       di = malloc(sizeof (di));
+       if (!di) return EINA_FALSE;
+
+       di->key = tu->key;
+       di->value = tu->data;
+
+       oepc.data = eina_list_append(oepc.data, di);
+     }
+   eina_iterator_free(it);
+
+   for (i = 0; i < epc->parts_count; ++i)
+     oepc.parts = eina_list_append(oepc.parts, _edje_edit_part_save(epc->parts[i]));
+
+   oepc.id = epc->id;
+   oepc.alias = epc->alias;
+   oepc.prop.min = epc->prop.min;
+   oepc.prop.max = epc->prop.max;
+   oepc.script = epc->script;
+   oepc.script_only = epc->script_only;
+   oepc.lua_script_only = epc->lua_script_only;
+   oepc.checked = epc->checked;
+
+   if (eet_data_write(eetf, _edje_edd_edje_part_collection, buf, &oepc, 1) <= 0)
      {
        ERR("Error. unable to write \"%s\" part entry", buf);
-       return EINA_FALSE;
+       err = EINA_FALSE;
      }
-   return EINA_TRUE;
+
+   // FIXME
+   EINA_LIST_FREE(oepc.data, di)
+     free(di);
+   EINA_LIST_FREE(oepc.parts, oep)
+     {
+       EINA_LIST_FREE(oep->other_desc, oepd)
+         free(oepd);
+       eina_list_free(oep->items);
+       free(oep);
+     }
+
+   return err;
 }
 
 static Eina_Bool
@@ -6002,9 +6352,9 @@ edje_edit_save_all(Evas_Object *obj)
 EAPI void
 edje_edit_print_internal_status(Evas_Object *obj)
 {
-   Eina_List *l;
-   Edje_Part *p;
    Edje_Program *epr;
+   Eina_List *l;
+   unsigned int i;
 
    GET_ED_OR_RETURN();
 
@@ -6019,10 +6369,13 @@ edje_edit_print_internal_status(Evas_Object *obj)
    INF("    parent: '%s'", ed->parent);
 
    INF("*** Parts [table:%d list:%d]", ed->table_parts_size,
-       eina_list_count(ed->collection->parts));
-   EINA_LIST_FOREACH(ed->collection->parts, l, p)
+       ed->collection->parts_count);
+   for (i = 0; i < ed->collection->parts_count; ++i)
      {
        Edje_Real_Part *rp;
+       Edje_Part *p;
+
+       p = ed->collection->parts[i];
 
        rp = ed->table_parts[p->id % ed->table_parts_size];
        printf("    [%d]%s ", p->id, p->name);
index b691551..4a7f19b 100644 (file)
@@ -871,8 +871,8 @@ _edje_embryo_fn_get_state(Embryo_Program *ep, Embryo_Cell *params)
    rp = ed->table_parts[part_id % ed->table_parts_size];
    if (rp->chosen_description)
      {
-       SETFLOAT(rp->chosen_description->common.state.value, params[4]);
-       s = rp->chosen_description->common.state.name;
+       SETFLOAT(rp->chosen_description->state.value, params[4]);
+       s = rp->chosen_description->state.name;
        if (s)
          {
             if ((int) strlen(s) < params[3])
@@ -1557,7 +1557,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
 {
    Edje *ed = embryo_program_data_get(ep);
    Edje_Real_Part *rp;
-   Edje_Part_Description *parent, *d;
+   Edje_Part_Description_Common *parent, *d = NULL;
    Edje_Part_Image_Id *iid;
    Eina_List *l;
    char *name;
@@ -1585,8 +1585,38 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
      return 0;
 
    /* now create the custom state */
-   if (!(d = calloc(1, sizeof(Edje_Part_Description))))
-     return 0;
+   switch (rp->part->type)
+     {
+#define ALLOC_DESC(Short, Type, To)                                    \
+       case EDJE_PART_TYPE_##Short: To = calloc(1, sizeof (Edje_Part_Description_##Type)); break;
+
+#define ALLOC_COPY_DESC(Short, Type, To, Spec)                         \
+       case EDJE_PART_TYPE_##Short:                                    \
+         {                                                             \
+            Edje_Part_Description_##Type *tmp;                         \
+            Edje_Part_Description_##Type *new;                         \
+                                                                       \
+            tmp = (Edje_Part_Description_##Type *) parent;             \
+                                                                       \
+            new = calloc(1, sizeof (Edje_Part_Description_##Type));    \
+            new->Spec = tmp->Spec;                                     \
+            d = &new->common;                                          \
+            break;                                                     \
+         }
+
+       ALLOC_DESC(RECTANGLE, Common, d);
+       ALLOC_DESC(SWALLOW, Common, d);
+       ALLOC_DESC(GROUP, Common, d);
+
+       ALLOC_COPY_DESC(IMAGE, Image, d, image);
+       ALLOC_COPY_DESC(TEXT, Text, d, text);
+       ALLOC_COPY_DESC(TEXTBLOCK, Text, d, text);
+       ALLOC_COPY_DESC(BOX, Box, d, box);
+       ALLOC_COPY_DESC(TABLE, Table, d, table);
+       ALLOC_COPY_DESC(EXTERNAL, External, d, external_params);
+     }
+
+   if (!d) return 0;
 
    rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
    if (!rp->custom)
@@ -1599,32 +1629,50 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
 
    *d = *parent;
 
-   d->common.state.name = (char *)eina_stringshare_add("custom");
-   d->common.state.value = 0.0;
+   d->state.name = (char *)eina_stringshare_add("custom");
+   d->state.value = 0.0;
 
    /* make sure all the allocated memory is getting copied,
     * not just referenced
     */
-   d->image.tween_list = NULL;
-
-   EINA_LIST_FOREACH(parent->image.tween_list, l, iid)
+   if (rp->part->type == EDJE_PART_TYPE_IMAGE)
      {
-        Edje_Part_Image_Id *iid_new;
+       Edje_Part_Description_Image *img_desc;
+       Edje_Part_Description_Image *parent_img_desc;
+
+       img_desc = (Edje_Part_Description_Image*) d;
+       parent_img_desc = (Edje_Part_Description_Image*) parent;
+
+       img_desc->image.tween_list = NULL;
 
-       iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
-       if (!iid_new) continue;
+       EINA_LIST_FOREACH(parent_img_desc->image.tween_list, l, iid)
+         {
+            Edje_Part_Image_Id *iid_new;
+
+            iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
+            if (!iid_new) continue;
 
-       iid_new->id = iid->id;
+            iid_new->id = iid->id;
 
-       d->image.tween_list = eina_list_append(d->image.tween_list, iid_new);
+            img_desc->image.tween_list = eina_list_append(img_desc->image.tween_list, iid_new);
+         }
      }
 
 #define DUP(x) x ? (char *)eina_stringshare_add(x) : NULL
-   d->common.color_class = DUP(d->common.color_class);
-   d->text.text = DUP(d->text.text);
-   d->text.text_class = DUP(d->text.text_class);
-   d->text.font = DUP(d->text.font);
-   d->text.style = DUP(d->text.style);
+   d->color_class = DUP(d->color_class);
+
+   if (rp->part->type == EDJE_PART_TYPE_TEXT
+       || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+     {
+       Edje_Part_Description_Text *text_desc;
+
+       text_desc = (Edje_Part_Description_Text*) d;
+
+       text_desc->text.text = DUP(text_desc->text.text);
+       text_desc->text.text_class = DUP(text_desc->text.text_class);
+       text_desc->text.font = DUP(text_desc->text.font);
+       text_desc->text.style = DUP(text_desc->text.style);
+     }
 #undef DUP
 
    rp->custom->description = d;
@@ -1659,323 +1707,414 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_ALIGNMENT:
         CHKPARAM(4);
 
-        GETFLOAT_T(rp->custom->description->common.align.x, params[3]);
-        GETFLOAT_T(rp->custom->description->common.align.y, params[4]);
+        GETFLOAT_T(rp->custom->description->align.x, params[3]);
+        GETFLOAT_T(rp->custom->description->align.y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_MIN:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.min.w, params[3]);
-        GETINT(rp->custom->description->common.min.h, params[4]);
+        GETINT(rp->custom->description->min.w, params[3]);
+        GETINT(rp->custom->description->min.h, params[4]);
 
         break;
       case EDJE_STATE_PARAM_MAX:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.max.w, params[3]);
-        GETINT(rp->custom->description->common.max.h, params[4]);
+        GETINT(rp->custom->description->max.w, params[3]);
+        GETINT(rp->custom->description->max.h, params[4]);
 
         break;
       case EDJE_STATE_PARAM_STEP:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.step.x, params[3]);
-        GETINT(rp->custom->description->common.step.y, params[4]);
+        GETINT(rp->custom->description->step.x, params[3]);
+        GETINT(rp->custom->description->step.y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_ASPECT:
         CHKPARAM(4);
 
-        GETFLOAT_T(rp->custom->description->common.aspect.min, params[3]);
-        GETFLOAT_T(rp->custom->description->common.aspect.max, params[4]);
+        GETFLOAT_T(rp->custom->description->aspect.min, params[3]);
+        GETFLOAT_T(rp->custom->description->aspect.max, params[4]);
 
         break;
       case EDJE_STATE_PARAM_ASPECT_PREF:
         CHKPARAM(3);
 
-        GETINT(rp->custom->description->common.aspect.prefer, params[3]);
+        GETINT(rp->custom->description->aspect.prefer, params[3]);
 
         break;
       case EDJE_STATE_PARAM_COLOR:
         CHKPARAM(6);
 
-        GETINT(rp->custom->description->common.color.r, params[3]);
-        GETINT(rp->custom->description->common.color.g, params[4]);
-        GETINT(rp->custom->description->common.color.b, params[5]);
-        GETINT(rp->custom->description->common.color.a, params[6]);
+        GETINT(rp->custom->description->color.r, params[3]);
+        GETINT(rp->custom->description->color.g, params[4]);
+        GETINT(rp->custom->description->color.b, params[5]);
+        GETINT(rp->custom->description->color.a, params[6]);
 
         break;
       case EDJE_STATE_PARAM_COLOR2:
         CHKPARAM(6);
 
-        GETINT(rp->custom->description->common.color2.r, params[3]);
-        GETINT(rp->custom->description->common.color2.g, params[4]);
-        GETINT(rp->custom->description->common.color2.b, params[5]);
-        GETINT(rp->custom->description->common.color2.a, params[6]);
+        GETINT(rp->custom->description->color2.r, params[3]);
+        GETINT(rp->custom->description->color2.g, params[4]);
+        GETINT(rp->custom->description->color2.b, params[5]);
+        GETINT(rp->custom->description->color2.a, params[6]);
 
         break;
       case EDJE_STATE_PARAM_COLOR3:
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETINT(rp->custom->description->text.color3.r, params[3]);
-        GETINT(rp->custom->description->text.color3.g, params[4]);
-        GETINT(rp->custom->description->text.color3.b, params[5]);
-        GETINT(rp->custom->description->text.color3.a, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
 
-        break;
+          CHKPARAM(6);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          GETINT(text->text.color3.r, params[3]);
+          GETINT(text->text.color3.g, params[4]);
+          GETINT(text->text.color3.b, params[5]);
+          GETINT(text->text.color3.a, params[6]);
+          break;
+       }
       case EDJE_STATE_PARAM_COLOR_CLASS:
         CHKPARAM(3);
 
         GETSTR(s, params[3]);
-        GETSTREVAS(s, rp->custom->description->common.color_class);
+        GETSTREVAS(s, rp->custom->description->color_class);
 
         break;
       case EDJE_STATE_PARAM_REL1:
         CHKPARAM(4);
 
-        GETFLOAT_T(rp->custom->description->common.rel1.relative_x, params[3]);
-        GETFLOAT_T(rp->custom->description->common.rel1.relative_y, params[4]);
+        GETFLOAT_T(rp->custom->description->rel1.relative_x, params[3]);
+        GETFLOAT_T(rp->custom->description->rel1.relative_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL1_TO:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.rel1.id_x, params[3]);
-        GETINT(rp->custom->description->common.rel1.id_y, params[4]);
+        GETINT(rp->custom->description->rel1.id_x, params[3]);
+        GETINT(rp->custom->description->rel1.id_y, params[4]);
 
-        if (rp->param1.description->common.rel1.id_x >= 0)
-          rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->common.rel1.id_x % ed->table_parts_size];
-        if (rp->param1.description->common.rel1.id_y >= 0)
-          rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->common.rel1.id_y % ed->table_parts_size];
+        if (rp->param1.description->rel1.id_x >= 0)
+          rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size];
+        if (rp->param1.description->rel1.id_y >= 0)
+          rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->rel1.id_y % ed->table_parts_size];
 
         break;
       case EDJE_STATE_PARAM_REL1_OFFSET:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.rel1.offset_x, params[3]);
-        GETINT(rp->custom->description->common.rel1.offset_y, params[4]);
+        GETINT(rp->custom->description->rel1.offset_x, params[3]);
+        GETINT(rp->custom->description->rel1.offset_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL2:
         CHKPARAM(4);
 
-        GETFLOAT_T(rp->custom->description->common.rel2.relative_x, params[3]);
-        GETFLOAT_T(rp->custom->description->common.rel2.relative_y, params[4]);
+        GETFLOAT_T(rp->custom->description->rel2.relative_x, params[3]);
+        GETFLOAT_T(rp->custom->description->rel2.relative_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL2_TO:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.rel2.id_x, params[3]);
-        GETINT(rp->custom->description->common.rel2.id_y, params[4]);
+        GETINT(rp->custom->description->rel2.id_x, params[3]);
+        GETINT(rp->custom->description->rel2.id_y, params[4]);
 
-        if (rp->param1.description->common.rel2.id_x >= 0)
-          rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->common.rel2.id_x % ed->table_parts_size];
-        if (rp->param1.description->common.rel2.id_y >= 0)
-          rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->common.rel2.id_y % ed->table_parts_size];
+        if (rp->param1.description->rel2.id_x >= 0)
+          rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
+        if (rp->param1.description->rel2.id_y >= 0)
+          rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->rel2.id_y % ed->table_parts_size];
 
         break;
       case EDJE_STATE_PARAM_REL2_OFFSET:
         CHKPARAM(4);
 
-        GETINT(rp->custom->description->common.rel2.offset_x, params[3]);
-        GETINT(rp->custom->description->common.rel2.offset_y, params[4]);
+        GETINT(rp->custom->description->rel2.offset_x, params[3]);
+        GETINT(rp->custom->description->rel2.offset_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_IMAGE:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Image *img;
 
-        GETINT(rp->custom->description->image.id, params[3]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(3);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+          GETINT(img->image.id, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_BORDER:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        GETINT(rp->custom->description->image.border.l, params[3]);
-        GETINT(rp->custom->description->image.border.r, params[4]);
-        GETINT(rp->custom->description->image.border.t, params[5]);
-        GETINT(rp->custom->description->image.border.b, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          GETINT(img->image.border.l, params[3]);
+          GETINT(img->image.border.r, params[4]);
+          GETINT(img->image.border.t, params[5]);
+          GETINT(img->image.border.b, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_SMOOTH:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Image *img;
 
-        GETINT(rp->custom->description->image.fill.smooth, params[3]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(3);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          GETINT(img->image.fill.smooth, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_POS:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        GETFLOAT_T(rp->custom->description->image.fill.pos_rel_x, params[3]);
-        GETFLOAT_T(rp->custom->description->image.fill.pos_rel_y, params[4]);
-        GETINT(rp->custom->description->image.fill.pos_abs_x, params[5]);
-        GETINT(rp->custom->description->image.fill.pos_abs_y, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          GETFLOAT_T(img->image.fill.pos_rel_x, params[3]);
+          GETFLOAT_T(img->image.fill.pos_rel_y, params[4]);
+          GETINT(img->image.fill.pos_abs_x, params[5]);
+          GETINT(img->image.fill.pos_abs_y, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_SIZE:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        GETFLOAT_T(rp->custom->description->image.fill.rel_x, params[3]);
-        GETFLOAT_T(rp->custom->description->image.fill.rel_y, params[4]);
-        GETINT(rp->custom->description->image.fill.abs_x, params[5]);
-        GETINT(rp->custom->description->image.fill.abs_y, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          GETFLOAT_T(img->image.fill.rel_x, params[3]);
+          GETFLOAT_T(img->image.fill.rel_y, params[4]);
+          GETINT(img->image.fill.abs_x, params[5]);
+          GETINT(img->image.fill.abs_y, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-             (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETSTR(s, params[3]);
-        GETSTREVAS(s, rp->custom->description->text.text);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
+          CHKPARAM(3);
 
-        break;
+          GETSTR(s, params[3]);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+          GETSTREVAS(s, text->text.text);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_CLASS:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETSTR(s, params[3]);
-        GETSTREVAS(s, rp->custom->description->text.text_class);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
+          CHKPARAM(3);
 
-        break;
+          GETSTR(s, params[3]);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+          GETSTREVAS(s, text->text.text_class);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_FONT:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETSTR(s, params[3]);
-        GETSTREVAS(s, rp->custom->description->text.font);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
+          CHKPARAM(3);
 
-        break;
+          GETSTR(s, params[3]);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+          GETSTREVAS(s, text->text.font);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_STYLE:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETSTR(s, params[3]);
-        GETSTREVAS(s, rp->custom->description->text.style);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
+          CHKPARAM(3);
 
-        break;
+          GETSTR(s, params[3]);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+          GETSTREVAS(s, text->text.style);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_SIZE:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETINT(rp->custom->description->text.size, params[3]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
+          CHKPARAM(3);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+          GETINT(text->text.size, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_FIT:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETINT(rp->custom->description->text.fit_x, params[3]);
-        GETINT(rp->custom->description->text.fit_y, params[4]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          GETINT(text->text.fit_x, params[3]);
+          GETINT(text->text.fit_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_MIN:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETINT(rp->custom->description->text.min_x, params[3]);
-        GETINT(rp->custom->description->text.min_y, params[4]);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          GETINT(text->text.min_x, params[3]);
+          GETINT(text->text.min_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_MAX:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETINT(rp->custom->description->text.max_x, params[3]);
-        GETINT(rp->custom->description->text.max_y, params[4]);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          GETINT(text->text.max_x, params[3]);
+          GETINT(text->text.max_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_ALIGN:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        GETFLOAT_T(rp->custom->description->text.align.x, params[3]);
-        GETFLOAT_T(rp->custom->description->text.align.y, params[4]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          GETFLOAT_T(text->text.align.x, params[3]);
+          GETFLOAT_T(text->text.align.y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_VISIBLE:
         CHKPARAM(3);
 
-        GETINT(rp->custom->description->common.visible, params[3]);
+        GETINT(rp->custom->description->visible, params[3]);
 
         break;
       case EDJE_STATE_PARAM_MAP_OM:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.on, params[3]);
+        GETINT(rp->custom->description->map.on, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_PERSP:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.id_persp, params[3]);
+        GETINT(rp->custom->description->map.id_persp, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_LIGNT:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.id_light, params[3]);
+        GETINT(rp->custom->description->map.id_light, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_ROT_CENTER:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.rot.id_center, params[3]);
+        GETINT(rp->custom->description->map.rot.id_center, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_ROT_X:
         CHKPARAM(3);
 
-        GETFLOAT_T(rp->custom->description->common.map.rot.x, params[3]);
+        GETFLOAT_T(rp->custom->description->map.rot.x, params[3]);
 
         break;
       case EDJE_STATE_PARAM_MAP_ROT_Y:
         CHKPARAM(3);
         
-        GETFLOAT_T(rp->custom->description->common.map.rot.y, params[3]);
+        GETFLOAT_T(rp->custom->description->map.rot.y, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_ROT_Z:
         CHKPARAM(3);
         
-        GETFLOAT_T(rp->custom->description->common.map.rot.z, params[3]);
+        GETFLOAT_T(rp->custom->description->map.rot.z, params[3]);
 
         break;
       case EDJE_STATE_PARAM_MAP_BACK_CULL:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.backcull, params[3]);
+        GETINT(rp->custom->description->map.backcull, params[3]);
         
         break;
       case EDJE_STATE_PARAM_MAP_PERSP_ON:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.map.persp_on, params[3]);
+        GETINT(rp->custom->description->map.persp_on, params[3]);
         
         break;
       case EDJE_STATE_PARAM_PERSP_ZPLANE:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.persp.zplane, params[3]);
+        GETINT(rp->custom->description->persp.zplane, params[3]);
         
         break;
       case EDJE_STATE_PARAM_PERSP_FOCAL:
         CHKPARAM(3);
         
-        GETINT(rp->custom->description->common.persp.focal, params[3]);
+        GETINT(rp->custom->description->persp.focal, params[3]);
         
         break;
       default:
@@ -2016,247 +2155,349 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_ALIGNMENT:
         CHKPARAM(4);
 
-        SETFLOAT_T(rp->custom->description->common.align.x, params[3]);
-        SETFLOAT_T(rp->custom->description->common.align.y, params[4]);
+        SETFLOAT_T(rp->custom->description->align.x, params[3]);
+        SETFLOAT_T(rp->custom->description->align.y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_MIN:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.min.w, params[3]);
-        SETINT(rp->custom->description->common.min.h, params[4]);
+        SETINT(rp->custom->description->min.w, params[3]);
+        SETINT(rp->custom->description->min.h, params[4]);
 
         break;
       case EDJE_STATE_PARAM_MAX:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.max.w, params[3]);
-        SETINT(rp->custom->description->common.max.h, params[4]);
+        SETINT(rp->custom->description->max.w, params[3]);
+        SETINT(rp->custom->description->max.h, params[4]);
 
         break;
       case EDJE_STATE_PARAM_STEP:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.step.x, params[3]);
-        SETINT(rp->custom->description->common.step.y, params[4]);
+        SETINT(rp->custom->description->step.x, params[3]);
+        SETINT(rp->custom->description->step.y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_ASPECT:
         CHKPARAM(4);
 
-        SETFLOAT_T(rp->custom->description->common.aspect.min, params[3]);
-        SETFLOAT_T(rp->custom->description->common.aspect.max, params[4]);
+        SETFLOAT_T(rp->custom->description->aspect.min, params[3]);
+        SETFLOAT_T(rp->custom->description->aspect.max, params[4]);
 
         break;
       case EDJE_STATE_PARAM_ASPECT_PREF:
         CHKPARAM(3);
 
-        SETINT(rp->custom->description->common.aspect.prefer, params[3]);
+        SETINT(rp->custom->description->aspect.prefer, params[3]);
 
         break;
       case EDJE_STATE_PARAM_COLOR:
         CHKPARAM(6);
 
-        SETINT(rp->custom->description->common.color.r, params[3]);
-        SETINT(rp->custom->description->common.color.g, params[4]);
-        SETINT(rp->custom->description->common.color.b, params[5]);
-        SETINT(rp->custom->description->common.color.a, params[6]);
+        SETINT(rp->custom->description->color.r, params[3]);
+        SETINT(rp->custom->description->color.g, params[4]);
+        SETINT(rp->custom->description->color.b, params[5]);
+        SETINT(rp->custom->description->color.a, params[6]);
 
         break;
       case EDJE_STATE_PARAM_COLOR2:
         CHKPARAM(6);
 
-        SETINT(rp->custom->description->common.color2.r, params[3]);
-        SETINT(rp->custom->description->common.color2.g, params[4]);
-        SETINT(rp->custom->description->common.color2.b, params[5]);
-        SETINT(rp->custom->description->common.color2.a, params[6]);
+        SETINT(rp->custom->description->color2.r, params[3]);
+        SETINT(rp->custom->description->color2.g, params[4]);
+        SETINT(rp->custom->description->color2.b, params[5]);
+        SETINT(rp->custom->description->color2.a, params[6]);
 
         break;
       case EDJE_STATE_PARAM_COLOR3:
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETINT(rp->custom->description->text.color3.r, params[3]);
-        SETINT(rp->custom->description->text.color3.g, params[4]);
-        SETINT(rp->custom->description->text.color3.b, params[5]);
-        SETINT(rp->custom->description->text.color3.a, params[6]);
+          if (rp->part->type == EDJE_PART_TYPE_TEXT
+              || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+            return 0;
 
-        break;
+          CHKPARAM(6);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETINT(text->text.color3.r, params[3]);
+          SETINT(text->text.color3.g, params[4]);
+          SETINT(text->text.color3.b, params[5]);
+          SETINT(text->text.color3.a, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_COLOR_CLASS:
         CHKPARAM(4);
 
-        s = rp->custom->description->common.color_class;
+        s = rp->custom->description->color_class;
         SETSTRALLOCATE(s);
 
         break;
       case EDJE_STATE_PARAM_REL1:
         CHKPARAM(4);
 
-        SETFLOAT_T(rp->custom->description->common.rel1.relative_x, params[3]);
-        SETFLOAT_T(rp->custom->description->common.rel1.relative_y, params[4]);
+        SETFLOAT_T(rp->custom->description->rel1.relative_x, params[3]);
+        SETFLOAT_T(rp->custom->description->rel1.relative_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL1_TO:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.rel1.id_x, params[3]);
-        SETINT(rp->custom->description->common.rel1.id_y, params[4]);
+        SETINT(rp->custom->description->rel1.id_x, params[3]);
+        SETINT(rp->custom->description->rel1.id_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL1_OFFSET:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.rel1.offset_x, params[3]);
-        SETINT(rp->custom->description->common.rel1.offset_y, params[4]);
+        SETINT(rp->custom->description->rel1.offset_x, params[3]);
+        SETINT(rp->custom->description->rel1.offset_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL2:
         CHKPARAM(4);
 
-        SETFLOAT_T(rp->custom->description->common.rel2.relative_x, params[3]);
-        SETFLOAT_T(rp->custom->description->common.rel2.relative_y, params[4]);
+        SETFLOAT_T(rp->custom->description->rel2.relative_x, params[3]);
+        SETFLOAT_T(rp->custom->description->rel2.relative_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL2_TO:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.rel2.id_x, params[3]);
-        SETINT(rp->custom->description->common.rel2.id_y, params[4]);
+        SETINT(rp->custom->description->rel2.id_x, params[3]);
+        SETINT(rp->custom->description->rel2.id_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_REL2_OFFSET:
         CHKPARAM(4);
 
-        SETINT(rp->custom->description->common.rel2.offset_x, params[3]);
-        SETINT(rp->custom->description->common.rel2.offset_y, params[4]);
+        SETINT(rp->custom->description->rel2.offset_x, params[3]);
+        SETINT(rp->custom->description->rel2.offset_y, params[4]);
 
         break;
       case EDJE_STATE_PARAM_IMAGE:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Image *img;
 
-        SETINT(rp->custom->description->image.id, params[3]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(3);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          SETINT(img->image.id, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_BORDER:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        SETINT(rp->custom->description->image.border.l, params[3]);
-        SETINT(rp->custom->description->image.border.r, params[4]);
-        SETINT(rp->custom->description->image.border.t, params[5]);
-        SETINT(rp->custom->description->image.border.b, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          SETINT(img->image.border.l, params[3]);
+          SETINT(img->image.border.r, params[4]);
+          SETINT(img->image.border.t, params[5]);
+          SETINT(img->image.border.b, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_SMOOTH:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Image *img;
 
-        SETINT(rp->custom->description->image.fill.smooth, params[3]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(3);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          SETINT(img->image.fill.smooth, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_POS:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        SETFLOAT_T(rp->custom->description->image.fill.pos_rel_x, params[3]);
-        SETFLOAT_T(rp->custom->description->image.fill.pos_rel_y, params[4]);
-        SETINT(rp->custom->description->image.fill.pos_abs_x, params[5]);
-        SETINT(rp->custom->description->image.fill.pos_abs_y, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          SETFLOAT_T(img->image.fill.pos_rel_x, params[3]);
+          SETFLOAT_T(img->image.fill.pos_rel_y, params[4]);
+          SETINT(img->image.fill.pos_abs_x, params[5]);
+          SETINT(img->image.fill.pos_abs_y, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_FILL_SIZE:
-        if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
-        CHKPARAM(6);
+       {
+          Edje_Part_Description_Image *img;
 
-        SETFLOAT_T(rp->custom->description->image.fill.rel_x, params[3]);
-        SETFLOAT_T(rp->custom->description->image.fill.rel_y, params[4]);
-        SETINT(rp->custom->description->image.fill.abs_x, params[5]);
-        SETINT(rp->custom->description->image.fill.abs_y, params[6]);
+          if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
+          CHKPARAM(6);
 
-        break;
+          img = (Edje_Part_Description_Image*) rp->custom->description;
+
+          SETFLOAT_T(img->image.fill.rel_x, params[3]);
+          SETFLOAT_T(img->image.fill.rel_y, params[4]);
+          SETINT(img->image.fill.abs_x, params[5]);
+          SETINT(img->image.fill.abs_y, params[6]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        s = rp->custom->description->text.text;
-        SETSTRALLOCATE(s);
+          if (rp->part->type == EDJE_PART_TYPE_TEXT
+              || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+            return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          s = text->text.text;
+          SETSTRALLOCATE(s);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_CLASS:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
+       {
+          Edje_Part_Description_Text *text;
+
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+            return 0;
 
-        s = rp->custom->description->text.text_class;
-        SETSTRALLOCATE(s);
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          s = text->text.text_class;
+          SETSTRALLOCATE(s);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_FONT:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        s = rp->custom->description->text.font;
-        SETSTRALLOCATE(s);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          s = text->text.font;
+          SETSTRALLOCATE(s);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_STYLE:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        s = rp->custom->description->text.style;
-        SETSTRALLOCATE(s);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          s = text->text.style;
+          SETSTRALLOCATE(s);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_SIZE:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(3);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETINT(rp->custom->description->text.size, params[3]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 
-        break;
+          CHKPARAM(3);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETINT(text->text.size, params[3]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_FIT:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETINT(rp->custom->description->text.fit_x, params[3]);
-        SETINT(rp->custom->description->text.fit_y, params[4]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
+          CHKPARAM(4);
 
-        break;
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETINT(text->text.fit_x, params[3]);
+          SETINT(text->text.fit_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_MIN:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETINT(rp->custom->description->text.min_x, params[3]);
-        SETINT(rp->custom->description->text.min_y, params[4]);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETINT(text->text.min_x, params[3]);
+          SETINT(text->text.min_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_MAX:
-        if ( (rp->part->type != EDJE_PART_TYPE_TEXT) && \
-              (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
-          return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETINT(rp->custom->description->text.max_x, params[3]);
-        SETINT(rp->custom->description->text.max_y, params[4]);
+          if ( (rp->part->type != EDJE_PART_TYPE_TEXT) &&
+               (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+            return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETINT(text->text.max_x, params[3]);
+          SETINT(text->text.max_y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_TEXT_ALIGN:
-        if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
-        CHKPARAM(4);
+       {
+          Edje_Part_Description_Text *text;
 
-        SETFLOAT_T(rp->custom->description->text.align.x, params[3]);
-        SETFLOAT_T(rp->custom->description->text.align.y, params[4]);
+          if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 
-        break;
+          CHKPARAM(4);
+
+          text = (Edje_Part_Description_Text*) rp->custom->description;
+
+          SETFLOAT_T(text->text.align.x, params[3]);
+          SETFLOAT_T(text->text.align.y, params[4]);
+
+          break;
+       }
       case EDJE_STATE_PARAM_VISIBLE:
         CHKPARAM(3);
 
-        SETINT(rp->custom->description->common.visible, params[3]);
+        SETINT(rp->custom->description->visible, params[3]);
 
         break;
       default:
index 3f3536f..4fb2ff8 100644 (file)
@@ -1893,10 +1893,13 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
 
    if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD)
      {
+       Edje_Part_Description_Text *txt;
+
+       txt = (Edje_Part_Description_Text *) rp->chosen_description;
+
         en->select_allow = 0;
-       if ((rp->chosen_description) &&
-           (rp->chosen_description->text.repch))
-         evas_object_textblock_replace_char_set(rp->object, rp->chosen_description->text.repch);
+       if (txt && txt->text.repch)
+         evas_object_textblock_replace_char_set(rp->object, txt->text.repch);
        else
          evas_object_textblock_replace_char_set(rp->object, "*");
      }
index c7bd866..f7dc77b 100644 (file)
@@ -620,9 +620,10 @@ _edje_external_params_free(Eina_List *external_params, Eina_Bool free_strings)
 void
 _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
                            Edje_Calc_Params *params,
-                           Edje_Part_Description *chosen_desc)
+                           Edje_Part_Description_Common *chosen_desc)
 {
    Edje_External_Type *type;
+   Edje_Part_Description_External *ext;
    void *params1, *params2 = NULL;
    if (!ep->swallowed_object) return;
 
@@ -632,14 +633,20 @@ _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 
    if (!type->state_set) return;
 
+   ext = (Edje_Part_Description_External*) ep->param1.description;
+
    params1 = ep->param1.external_params ?
                  ep->param1.external_params :
-                 ep->param1.description->external_params;
+                 ext->external_params;
 
    if (ep->param2 && ep->param2->description)
-     params2 = ep->param2->external_params ?
+     {
+       ext = (Edje_Part_Description_External*) ep->param2->description;
+
+       params2 = ep->param2->external_params ?
                  ep->param2->external_params :
-                 ep->param2->description->external_params;
+         ext->external_params;
+     }
 
    type->state_set(type->data, ep->swallowed_object,
         params1, params2, ep->description_pos);
index beb8145..2d78b2a 100644 (file)
@@ -294,7 +294,7 @@ int
 _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, Eina_List *group_path)
 {
    Edje *ed;
-   int n;
+   unsigned int n;
    Eina_List *parts = NULL;
    Eina_List *old_swallows;
    int group_path_started = 0;
@@ -348,34 +348,41 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
          }
        else
          {
-            Eina_List *l;
             int i;
             int errors = 0;
-            Edje_Part *ep;
+            unsigned int j;
 
             /* colorclass stuff */
-            EINA_LIST_FOREACH(ed->collection->parts, l, ep)
+            for (j = 0; j < ed->collection->parts_count; ++j)
               {
-                 Eina_List *hist = NULL;
-                 Edje_Part_Description *desc;
+                 Edje_Part *ep;
+                 unsigned int k;
+
+                 ep = ed->collection->parts[j];
 
                  if (errors)
                    break;
                  /* Register any color classes in this parts descriptions. */
-                 if ((ep->default_desc) && (ep->default_desc->common.color_class))
-                   _edje_color_class_member_add(ed, ep->default_desc->common.color_class);
+                 if ((ep->default_desc) && (ep->default_desc->color_class))
+                   _edje_color_class_member_add(ed, ep->default_desc->color_class);
+
+                 for (k = 0; k < ep->other_count; k++)
+                   {
+                      Edje_Part_Description_Common *desc;
 
-                 EINA_LIST_FOREACH(ep->other_desc, hist, desc)
-                   if (desc->common.color_class)
-                     _edje_color_class_member_add(ed, desc->common.color_class);
+                      desc = ep->other_desc[k];
+
+                      if (desc->color_class)
+                        _edje_color_class_member_add(ed, desc->color_class);
+                   }
               }
             /* build real parts */
-            for (n = 0, l = ed->collection->parts; l; l = eina_list_next(l), n++)
+            for (n = 0; n < ed->collection->parts_count; n++)
               {
                  Edje_Part *ep;
                  Edje_Real_Part *rp;
 
-                 ep = eina_list_data_get(l);
+                 ep = ed->collection->parts[n];
                  rp = eina_mempool_malloc(_edje_real_part_mp, sizeof(Edje_Real_Part));
                  if (!rp)
                    {
@@ -477,6 +484,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
             if (n > 0)
               {
                  Edje_Real_Part *rp;
+                 Eina_List *l;
+
                  ed->table_parts = malloc(sizeof(Edje_Real_Part *) * n);
                  ed->table_parts_size = n;
                  /* FIXME: check malloc return */
@@ -490,14 +499,14 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                  for (i = 0; i < ed->table_parts_size; i++)
                    {
                       rp = ed->table_parts[i];
-                      if (rp->param1.description->common.rel1.id_x >= 0)
-                        rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->common.rel1.id_x % ed->table_parts_size];
-                      if (rp->param1.description->common.rel1.id_y >= 0)
-                        rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->common.rel1.id_y % ed->table_parts_size];
-                      if (rp->param1.description->common.rel2.id_x >= 0)
-                        rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->common.rel2.id_x % ed->table_parts_size];
-                      if (rp->param1.description->common.rel2.id_y >= 0)
-                        rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->common.rel2.id_y % ed->table_parts_size];
+                      if (rp->param1.description->rel1.id_x >= 0)
+                        rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size];
+                      if (rp->param1.description->rel1.id_y >= 0)
+                        rp->param1.rel1_to_y = ed->table_parts[rp->param1.description->rel1.id_y % ed->table_parts_size];
+                      if (rp->param1.description->rel2.id_x >= 0)
+                        rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
+                      if (rp->param1.description->rel2.id_y >= 0)
+                        rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->rel2.id_y % ed->table_parts_size];
                       if (rp->part->clip_to_id >= 0)
                         {
                            rp->clip_to = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size];
@@ -529,22 +538,31 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                       rp->swallow_params.min.w = 0;
                       rp->swallow_params.max.w = -1;
                       rp->swallow_params.max.h = -1;
-                      
-                      if (ed->file->feature_ver < 1)
+
+                      if (rp->part->type == EDJE_PART_TYPE_TEXT
+                          || rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
                         {
-                           rp->param1.description->text.id_source = -1;
-                           rp->param1.description->text.id_text_source = -1;
+                           Edje_Part_Description_Text *text;
+
+                           text = (Edje_Part_Description_Text *) rp->param1.description;
+
+                           if (ed->file->feature_ver < 1)
+                             {
+                                text->text.id_source = -1;
+                                text->text.id_text_source = -1;
+                             }
+
+                           if (text->text.id_source >= 0)
+                             rp->text.source = ed->table_parts[text->text.id_source % ed->table_parts_size];
+                           if (text->text.id_text_source >= 0)
+                             rp->text.text_source = ed->table_parts[text->text.id_text_source % ed->table_parts_size];
+                           if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+                             {
+                                _edje_entry_real_part_init(rp);
+                                if (!ed->has_entries)
+                                  ed->has_entries = EINA_TRUE;
+                             }
                         }
-                      if (rp->param1.description->text.id_source >= 0)
-                        rp->text.source = ed->table_parts[rp->param1.description->text.id_source % ed->table_parts_size];
-                      if (rp->param1.description->text.id_text_source >= 0)
-                        rp->text.text_source = ed->table_parts[rp->param1.description->text.id_text_source % ed->table_parts_size];
-                      if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
-                         {
-                            _edje_entry_real_part_init(rp);
-                            if (!ed->has_entries)
-                                ed->has_entries = EINA_TRUE;
-                         }
                    }
               }
             
@@ -554,6 +572,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
             if (n > 0)
               {
                  Edje_Program *pr;
+                 Eina_List *l;
+
                  /* FIXME: keeping a table AND a list is just bad - nuke list */
                  ed->table_programs = malloc(sizeof(Edje_Program *) * n);
                  ed->table_programs_size = n;
@@ -601,7 +621,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                   * XXX: and they're always set in this case, but GCC fails to
                   * XXX: notice that, so let's shut it up
                   */
-                 Eina_List *curr_item = NULL;
+                 Edje_Pack_Element **curr_item = NULL;
+                 unsigned int item_count = 0;
                  Edje_Pack_Element *pack_it = NULL;
                  const char *source = NULL;
                  
@@ -617,18 +638,30 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                        if (rp->part->items)
                          {
                             curr_item = rp->part->items;
-                            pack_it = curr_item->data;
-                            source = pack_it->source;
+                            item_count = rp->part->items_count;
+                            if (item_count > 0)
+                              {
+                                 pack_it = *curr_item;
+                                 source = pack_it->source;
+                                 item_count--;
+                                 curr_item++;
+                              }
                          }
                        break;
                     case EDJE_PART_TYPE_EXTERNAL:
                          {
+                            Edje_Part_Description_External *external;
                             Evas_Object *child_obj;
-                            child_obj = _edje_external_type_add(rp->part->source, evas_object_evas_get(ed->obj), ed->obj, rp->part->default_desc->external_params, rp->part->name);
+
+                            external = (Edje_Part_Description_External *) rp->part->default_desc;
+                            child_obj = _edje_external_type_add(rp->part->source,
+                                                                evas_object_evas_get(ed->obj), ed->obj,
+                                                                external->external_params, rp->part->name);
                             if (child_obj)
                               {
                                  _edje_real_part_swallow(rp, child_obj);
-                                 rp->param1.external_params = _edje_external_params_parse(child_obj, rp->param1.description->external_params);
+                                 rp->param1.external_params = _edje_external_params_parse(child_obj,
+                                                                                          external->external_params);
                                  _edje_external_recalc_apply(ed, rp, NULL, rp->chosen_description);
                               }
                          }
@@ -719,12 +752,19 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                                 evas_object_data_set(child_obj, "\377 edje.table_item", pack_it);
                              }
                            rp->items = eina_list_append(rp->items, child_obj);
-                           if (!(curr_item = curr_item->next))
-                             source = NULL;
-                           else
+
+                           if (item_count > 0)
                              {
-                                pack_it = curr_item->data;
+                                pack_it = *curr_item;
                                 source = pack_it->source;
+                                curr_item++;
+                                item_count--;
+                             }
+                           else
+                             {
+                                source = NULL;
+                                curr_item = NULL;
+                                pack_it = NULL;
                              }
                         }
                    }
@@ -772,12 +812,16 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                   if ((rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
                       (rp->part->default_desc))
                     {
+                      Edje_Part_Description_Text *text;
                        Edje_Style *stl  = NULL;
                        const char *style;
-                       
-                       style = rp->part->default_desc->text.style;
+
+                      text = (Edje_Part_Description_Text *) rp->part->default_desc;
+                       style = text->text.style;
                        if (style)
                          {
+                           Eina_List *l;
+
                             EINA_LIST_FOREACH(ed->file->styles, l, stl)
                               {
                                  if ((stl->name) && (!strcmp(stl->name, style))) break;
@@ -916,8 +960,11 @@ _edje_file_del(Edje *ed)
                        _edje_lua_free_reg(ed->L, rp->custom->description); // created in edje_lua.c::_edje_lua_part_fn_custom_state
                     }
 #endif
-                  _edje_collection_free_part_description_free(rp->custom->description,
-                                                             ed->file->free_strings);
+                  _edje_collection_free_part_description_clean(rp->part->type,
+                                                              rp->custom->description,
+                                                              ed->file->free_strings);
+                 free(rp->custom->description);
+                 rp->custom->description = NULL;
                }
 
             /* Cleanup optional part. */
@@ -938,16 +985,18 @@ _edje_file_del(Edje *ed)
      }
    if ((ed->file) && (ed->collection))
      {
-       Eina_List *l;
        Edje_Part *ep;
+       unsigned int i;
 
        _edje_textblock_styles_del(ed);
-       EINA_LIST_FOREACH(ed->collection->parts, l, ep)
+       for (i = 0; i < ed->collection->parts_count; ++i)
          {
-           _edje_text_part_on_del(ed, ep);
-           _edje_color_class_on_del(ed, ep);
+            ep = ed->collection->parts[i];
+
+            _edje_text_part_on_del(ed, ep);
+            _edje_color_class_on_del(ed, ep);
          }
-       
+
        _edje_cache_coll_unref(ed->file, ed->collection);
        ed->collection = NULL;
      }
@@ -1009,6 +1058,9 @@ _edje_file_free(Edje_File *edf)
    eina_hash_free(Hash);                       \
    Hash = NULL;
 
+   /* Clean cache before cleaning memory pool */
+   if (edf->collection_cache) _edje_cache_coll_flush(edf);
+
    HASH_FREE(edf->fonts);
    HASH_FREE(edf->collection);
    HASH_FREE(edf->data);
@@ -1064,7 +1116,6 @@ _edje_file_free(Edje_File *edf)
    if (edf->collection_patterns) edje_match_patterns_free(edf->collection_patterns);
    if (edf->path) eina_stringshare_del(edf->path);
    if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler);
-   if (edf->collection_cache) _edje_cache_coll_flush(edf);
    _edje_textblock_style_cleanup(edf);
    if (edf->ef) eet_close(edf->ef);
    free(edf);
@@ -1073,10 +1124,10 @@ _edje_file_free(Edje_File *edf)
 }
 
 void
-_edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
+_edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec, Edje_Part_Collection_Directory_Entry *ce)
 {
    Edje_Program *pr;
-   Edje_Part *ep;
+   unsigned int i;
 
    _edje_embryo_script_shutdown(ec);
    EINA_LIST_FREE(ec->programs, pr)
@@ -1100,34 +1151,26 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
          free(pa);
        free(pr);
      }
-   EINA_LIST_FREE(ec->parts, ep)
+   for (i = 0; i < ec->parts_count; ++i)
      {
-       Edje_Part_Description *desc;
+       Edje_Part *ep;
+       unsigned int j;
+
+       ep = ec->parts[i];
 
        if (edf->free_strings && ep->name) eina_stringshare_del(ep->name);
        if (ep->default_desc)
          {
-            _edje_collection_free_part_description_free(ep->default_desc, edf->free_strings);
+            _edje_collection_free_part_description_clean(ep->type, ep->default_desc, edf->free_strings);
             ep->default_desc = NULL;
          }
-       EINA_LIST_FREE(ep->other_desc, desc)
-         _edje_collection_free_part_description_free(desc, edf->free_strings);
-       free(ep);
-     }
-   if (ec->data)
-     {
-       Edje_Data *edt;
+       for (j = 0; j < ep->other_count; ++j)
+         _edje_collection_free_part_description_clean(ep->type, ep->other_desc[j], edf->free_strings);
 
-       EINA_LIST_FREE(ec->data, edt)
-         {
-             if (edf->free_strings)
-               {
-                  if (edt->key) eina_stringshare_del(edt->key);
-                  if (edt->value) eina_stringshare_del(edt->value);
-               }
-            free(edt);
-         }
+       free(ep->other_desc);
+       free(ep->items);
      }
+   if (ec->data) eina_hash_free(ec->data);
 #ifdef EDJE_PROGRAM_CACHE
    if (ec->prog_cache.no_matches) eina_hash_free(ec->prog_cache.no_matches);
    if (ec->prog_cache.matches)
@@ -1139,30 +1182,93 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
      }
 #endif
    if (ec->script) embryo_program_free(ec->script);
-#ifdef LUA2   
+#ifdef LUA2
    _edje_lua2_script_unload(ec);
 #endif
+
+   /* Destroy all part and description. */
+   eina_mempool_del(ce->mp.RECTANGLE);
+   eina_mempool_del(ce->mp.TEXT);
+   eina_mempool_del(ce->mp.IMAGE);
+   eina_mempool_del(ce->mp.SWALLOW);
+   eina_mempool_del(ce->mp.TEXTBLOCK);
+   eina_mempool_del(ce->mp.GROUP);
+   eina_mempool_del(ce->mp.BOX);
+   eina_mempool_del(ce->mp.TABLE);
+   eina_mempool_del(ce->mp.EXTERNAL);
+   eina_mempool_del(ce->mp.part);
+   memset(&ce->mp, 0, sizeof (ce->mp));
+
    free(ec);
+   ce->ref = NULL;
 }
 
 void
-_edje_collection_free_part_description_free(Edje_Part_Description *desc, Eina_Bool free_strings)
+_edje_collection_free_part_description_clean(int type, Edje_Part_Description_Common *desc, Eina_Bool free_strings)
 {
    Edje_Part_Image_Id *pi;
 
-   EINA_LIST_FREE(desc->image.tween_list, pi)
-     free(pi);
-   if (desc->external_params)
-     _edje_external_params_free(desc->external_params, free_strings);
-   if (free_strings)
+   if (free_strings && desc->color_class) eina_stringshare_del(desc->color_class);
+
+   switch (type)
+     {
+      case EDJE_PART_TYPE_IMAGE:
+       {
+          Edje_Part_Description_Image *img;
+
+          img = (Edje_Part_Description_Image *) desc;
+
+          EINA_LIST_FREE(img->image.tween_list, pi)
+            free(pi);
+       }
+      case EDJE_PART_TYPE_EXTERNAL:
+       {
+          Edje_Part_Description_External *external;
+
+          external = (Edje_Part_Description_External *) desc;
+
+          if (external->external_params)
+            _edje_external_params_free(external->external_params, free_strings);
+       }
+      case EDJE_PART_TYPE_TEXT:
+      case EDJE_PART_TYPE_TEXTBLOCK:
+        if (free_strings)
+          {
+             Edje_Part_Description_Text *text;
+
+             text = (Edje_Part_Description_Text *) desc;
+
+             if (text->text.text)          eina_stringshare_del(text->text.text);
+             if (text->text.text_class)    eina_stringshare_del(text->text.text_class);
+             if (text->text.style)         eina_stringshare_del(text->text.style);
+             if (text->text.font)          eina_stringshare_del(text->text.font);
+          }
+     }
+}
+
+void
+_edje_collection_free_part_description_free(int type,
+                                           Edje_Part_Description_Common *desc,
+                                           Edje_Part_Collection_Directory_Entry *ce,
+                                           Eina_Bool free_strings)
+{
+#define FREE_POOL(Type, Ce, Desc)                                      \
+   case EDJE_PART_TYPE_##Type: eina_mempool_free(Ce->mp.Type, Desc); break;
+
+   _edje_collection_free_part_description_clean(type, desc, free_strings);
+
+   switch (type)
      {
-       if (desc->common.color_class) eina_stringshare_del(desc->common.color_class);
-       if (desc->text.text)          eina_stringshare_del(desc->text.text);
-       if (desc->text.text_class)    eina_stringshare_del(desc->text.text_class);
-       if (desc->text.style)         eina_stringshare_del(desc->text.style);
-       if (desc->text.font)          eina_stringshare_del(desc->text.font);
+       FREE_POOL(RECTANGLE, ce, desc);
+       FREE_POOL(TEXT, ce, desc);
+       FREE_POOL(IMAGE, ce, desc);
+       FREE_POOL(SWALLOW, ce, desc);
+       FREE_POOL(TEXTBLOCK, ce, desc);
+       FREE_POOL(GROUP, ce, desc);
+       FREE_POOL(BOX, ce, desc);
+       FREE_POOL(TABLE, ce, desc);
+       FREE_POOL(EXTERNAL, ce, desc);
      }
-   free(desc);
 }
 
 #ifdef EDJE_PROGRAM_CACHE
index e78b5e9..2dfa38b 100644 (file)
@@ -213,7 +213,6 @@ typedef struct _Edje_Aspect                          Edje_Aspect;
 typedef struct _Edje_File                            Edje_File;
 typedef struct _Edje_Style                           Edje_Style;
 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_Entry            Edje_Font_Directory_Entry;
@@ -229,8 +228,14 @@ typedef struct _Edje_Part_Collection_Directory_Entry Edje_Part_Collection_Direct
 typedef struct _Edje_Pack_Element                    Edje_Pack_Element;
 typedef struct _Edje_Part_Collection                 Edje_Part_Collection;
 typedef struct _Edje_Part                            Edje_Part;
+typedef struct _Edje_Part_Api                        Edje_Part_Api;
+typedef struct _Edje_Part_Dragable                  Edje_Part_Dragable;
 typedef struct _Edje_Part_Image_Id                   Edje_Part_Image_Id;
-typedef struct _Edje_Part_Description                Edje_Part_Description;
+typedef struct _Edje_Part_Description_Image          Edje_Part_Description_Image;
+typedef struct _Edje_Part_Description_Text           Edje_Part_Description_Text;
+typedef struct _Edje_Part_Description_Box            Edje_Part_Description_Box;
+typedef struct _Edje_Part_Description_Table          Edje_Part_Description_Table;
+typedef struct _Edje_Part_Description_External       Edje_Part_Description_External;
 typedef struct _Edje_Part_Description_Common         Edje_Part_Description_Common;
 typedef struct _Edje_Part_Description_Spec_Image     Edje_Part_Description_Spec_Image;
 typedef struct _Edje_Part_Description_Spec_Text      Edje_Part_Description_Spec_Text;
@@ -367,13 +372,6 @@ struct _Edje_Style_Tag
 
 /*----------*/
 
-struct _Edje_Data
-{
-   const char *key;
-   char *value;
-};
-
-/*----------*/
 
 struct _Edje_Font_Directory_Entry
 {
@@ -522,8 +520,23 @@ struct _Edje_Part_Collection_Directory_Entry
       int      BOX;
       int      TABLE;
       int      EXTERNAL;
+      int      part;
    } count;
 
+   struct
+   {
+      Eina_Mempool *RECTANGLE;
+      Eina_Mempool *TEXT;
+      Eina_Mempool *IMAGE;
+      Eina_Mempool *SWALLOW;
+      Eina_Mempool *TEXTBLOCK;
+      Eina_Mempool *GROUP;
+      Eina_Mempool *BOX;
+      Eina_Mempool *TABLE;
+      Eina_Mempool *EXTERNAL;
+      Eina_Mempool *part;
+   } mp;
+
    Edje_Part_Collection *ref;
 };
 
@@ -553,19 +566,23 @@ struct _Edje_Pack_Element
 
 struct _Edje_Part_Collection
 {
-   Eina_List *programs; /* a list of Edje_Program */
-   Eina_List *parts; /* a list of Edje_Part */
-   Eina_List *data;
+   Eina_List *programs; /* a list of Edje_Program *//* FIXME: use multiple array */
+
+   Edje_Part **parts; /* an array of Edje_Part */
+   unsigned int parts_count;
+
+   Eina_Hash *data;
 
    int        id; /* the collection id */
 
-   Eina_Hash *alias; /* aliasing part*/
+   Eina_Hash *alias; /* aliasing part */
 
    struct {
       Edje_Size min, max;
    } prop;
 
    int        references;
+
 #ifdef EDJE_PROGRAM_CACHE
    struct {
       Eina_Hash                   *no_matches;
@@ -583,30 +600,41 @@ struct _Edje_Part_Collection
    unsigned char    checked : 1;
 };
 
-struct _Edje_Part
+struct _Edje_Part_Dragable
 {
-   const char            *name; /* the name if any of the part */
-   Edje_Part_Description *default_desc; /* the part descriptor for default */
-   Eina_List             *other_desc; /* other possible descriptors */
-   const char            *source, *source2, *source3, *source4, *source5, *source6;
-   int                    id; /* its id number */
-   int                    clip_to_id; /* the part id to clip this one to */
-   struct {
-      int                 step_x; /* drag jumps n pixels (0 = no limit) */
-      int                 step_y; /* drag jumps n pixels (0 = no limit) */
+   int                 step_x; /* drag jumps n pixels (0 = no limit) */
+   int                 step_y; /* drag jumps n pixels (0 = no limit) */
+
+   int                 count_x; /* drag area divided by n (0 = no limit) */
+   int                 count_y; /* drag area divided by n (0 = no limit) */
 
-      int                 count_x; /* drag area divided by n (0 = no limit) */
-      int                 count_y; /* drag area divided by n (0 = no limit) */
+   int                 confine_id; /* dragging within this bit, -1 = no */
 
-      int                 confine_id; /* dragging within this bit, -1 = no */
+   /* davinchi */
+   int           event_id; /* If it is used as scrollbar */
 
-      /* davinchi */
-      int                event_id; /* If it is used as scrollbar */
+   signed char         x; /* can u click & drag this bit in x dir */
+   signed char         y; /* can u click & drag this bit in y dir */
+};
 
-      signed char         x; /* can u click & drag this bit in x dir */
-      signed char         y; /* can u click & drag this bit in y dir */
-   } dragable;
-   Eina_List             *items; /* packed items for box and table */
+struct _Edje_Part_Api
+{
+   const char         *name;
+   const char         *description;
+};
+
+struct _Edje_Part
+{
+   const char                   *name; /* the name if any of the part */
+   Edje_Part_Description_Common *default_desc; /* the part descriptor for default */
+   Edje_Part_Description_Common **other_desc; /* other possible descriptors */
+   unsigned int                  other_count;
+   const char           *source, *source2, *source3, *source4, *source5, *source6;
+   int                    id; /* its id number */
+   int                    clip_to_id; /* the part id to clip this one to */
+   Edje_Part_Dragable     dragable;
+   Edje_Pack_Element    **items; /* packed items for box and table */
+   unsigned int           items_count;
    unsigned char          type; /* what type (image, rect, text) */
    unsigned char          effect; /* 0 = plain... */
    unsigned char          mouse_events; /* it will affect/respond to mouse events */
@@ -619,10 +647,7 @@ struct _Edje_Part
    unsigned char          entry_mode;
    unsigned char          select_mode;
    unsigned char          multiline;
-   struct {
-      const char         *name;
-      const char         *description;
-   } api;
+   Edje_Part_Api          api;
 };
 
 struct _Edje_Part_Image_Id
@@ -757,14 +782,33 @@ struct _Edje_Part_Description_Spec_Table
    } padding;
 };
 
-struct _Edje_Part_Description
+struct _Edje_Part_Description_Image
 {
    Edje_Part_Description_Common common;
    Edje_Part_Description_Spec_Image image;
+};
+
+struct _Edje_Part_Description_Text
+{
+   Edje_Part_Description_Common common;
    Edje_Part_Description_Spec_Text text;
+};
+
+struct _Edje_Part_Description_Box
+{
+   Edje_Part_Description_Common common;
    Edje_Part_Description_Spec_Box box;
+};
+
+struct _Edje_Part_Description_Table
+{
+   Edje_Part_Description_Common common;
    Edje_Part_Description_Spec_Table table;
+};
 
+struct _Edje_Part_Description_External
+{
+   Edje_Part_Description_Common common;
    Eina_List *external_params; /* parameters for external objects */
 };
 
@@ -950,7 +994,7 @@ struct _Edje_Real_Part_Set
 
 struct _Edje_Real_Part_State
 {
-   Edje_Part_Description *description; // 4
+   Edje_Part_Description_Common *description; // 4
    Edje_Real_Part        *rel1_to_x; // 4
    Edje_Real_Part        *rel1_to_y; // 4
    Edje_Real_Part        *rel2_to_x; // 4
@@ -1024,7 +1068,7 @@ struct _Edje_Real_Part
                  // text to front and have smaller struct for textblock
 
    FLOAT_T                   description_pos; // 8
-   Edje_Part_Description    *chosen_description; // 4
+   Edje_Part_Description_Common *chosen_description; // 4
    Edje_Real_Part_State      param1; // 20
    // WITH EDJE_CALC_CACHE: 140
    Edje_Real_Part_State     *param2, *custom; // 8
@@ -1296,7 +1340,9 @@ extern Eina_Mempool *_edje_real_part_mp;
 extern Eina_Mempool *_edje_real_part_state_mp;
 
 void  _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos);
-Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);
+Edje_Part_Description_Common *_edje_part_description_find(Edje *ed,
+                                                         Edje_Real_Part *rp,
+                                                         const char *name, double val);
 void  _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char  *d1, double v1, const char *d2, double v2);
 void  _edje_recalc(Edje *ed);
 void  _edje_recalc_do(Edje *ed);
@@ -1320,8 +1366,16 @@ void  _edje_file_add(Edje *ed);
 void  _edje_file_del(Edje *ed);
 void  _edje_file_free(Edje_File *edf);
 void  _edje_file_cache_shutdown(void);
-void  _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec);
-void  _edje_collection_free_part_description_free(Edje_Part_Description *desc, Eina_Bool free_strings);
+void  _edje_collection_free(Edje_File *edf,
+                           Edje_Part_Collection *ec,
+                           Edje_Part_Collection_Directory_Entry *ce);
+void  _edje_collection_free_part_description_clean(int type,
+                                                  Edje_Part_Description_Common *desc,
+                                                  Eina_Bool free_strings);
+void _edje_collection_free_part_description_free(int type,
+                                                Edje_Part_Description_Common *desc,
+                                                Edje_Part_Collection_Directory_Entry *ce,
+                                                Eina_Bool free_strings);
 
 void  _edje_object_smart_set(Edje_Smart_Api *sc);
 const Edje_Smart_Api * _edje_object_smart_class_get(void);
@@ -1346,9 +1400,14 @@ void  _edje_callbacks_patterns_clean(Edje *ed);
 void           _edje_text_init(void);
 void           _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep);
 void           _edje_text_part_on_del(Edje *ed, Edje_Part *ep);
-void           _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
+void           _edje_text_recalc_apply(Edje *ed,
+                                      Edje_Real_Part *ep,
+                                      Edje_Calc_Params *params,
+                                      Edje_Part_Description_Text *chosen_desc);
 Evas_Font_Size _edje_text_size_calc(Evas_Font_Size size, Edje_Text_Class *tc);
-const char *   _edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *size, char **free_later);
+const char *   _edje_text_class_font_get(Edje *ed,
+                                        Edje_Part_Description_Text *chosen_desc,
+                                        int *size, char **free_later);
 
 
 Edje_Real_Part   *_edje_real_part_get(Edje *ed, const char *part);
@@ -1625,7 +1684,9 @@ void _edje_external_signal_emit(Evas_Object *obj, const char *emission, const ch
 Eina_Bool _edje_external_param_set(Evas_Object *obj, const Edje_External_Param *param) EINA_ARG_NONNULL(1, 2);
 Eina_Bool _edje_external_param_get(const Evas_Object *obj, Edje_External_Param *param) EINA_ARG_NONNULL(1, 2);
 void _edje_external_params_free(Eina_List *params, Eina_Bool free_strings);
-void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
+void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
+                                Edje_Calc_Params *params,
+                                Edje_Part_Description_Common *chosen_desc);
 void *_edje_external_params_parse(Evas_Object *obj, const Eina_List *params);
 void _edje_external_parsed_params_free(Evas_Object *obj, void *params);
 
index a766c7e..def6f1b 100644 (file)
@@ -644,8 +644,8 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
                            if (rp->program)
                              _edje_program_end(ed, rp->program);
                            _edje_part_description_apply(ed, rp,
-                                                        rp->param1.description->common.state.name,
-                                                        rp->param1.description->common.state.value,
+                                                        rp->param1.description->state.name,
+                                                        rp->param1.description->state.value,
                                                         pr->state,
                                                         pr->value);
                            _edje_part_pos_set(ed, rp, pr->tween.mode, ZERO);
@@ -1136,7 +1136,7 @@ static Eina_Bool _edje_glob_callback(Edje_Program *pr, void *dt)
      {
        rp = _edje_real_part_get(data->ed, pr->filter.part ? pr->filter.part : data->source);
        if (rp)
-         exec = (rp->chosen_description->common.state.name == pr->filter.state);
+         exec = (rp->chosen_description->state.name == pr->filter.state);
      }
 
    if (exec)
index e203435..471befb 100644 (file)
@@ -40,34 +40,46 @@ _edje_text_init(void)
 void
 _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep)
 {
-   Eina_List *tmp;
    Edje_Part *pt = ep->part;
-   Edje_Part_Description *desc;
+   Edje_Part_Description_Text *desc;
+   unsigned int i;
 
    if (ep->part->type != EDJE_PART_TYPE_TEXT) return;
 
    /* if text class exists for this part, add the edje to the tc member list */
-   if ((pt->default_desc) && (pt->default_desc->text.text_class))
-     _edje_text_class_member_add(ed, pt->default_desc->text.text_class);
+   desc = (Edje_Part_Description_Text *) pt->default_desc;
+   if ((pt->default_desc) && (desc->text.text_class))
+     _edje_text_class_member_add(ed, desc->text.text_class);
 
    /* If any other classes exist add them */
-   EINA_LIST_FOREACH(pt->other_desc, tmp, desc)
-     if ((desc) && (desc->text.text_class))
-       _edje_text_class_member_add(ed, desc->text.text_class);
+   for (i = 0; i < pt->other_count; ++i)
+     {
+       desc = (Edje_Part_Description_Text *) pt->other_desc[i];
+       if ((desc) && (desc->text.text_class))
+         _edje_text_class_member_add(ed, desc->text.text_class);
+     }
 }
 
 void
 _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
 {
-   Eina_List *tmp;
-   Edje_Part_Description *desc;
+   Edje_Part_Description_Text *desc;
+   unsigned int i;
+
+   if (pt->type != EDJE_PART_TYPE_TEXT
+       && pt->type != EDJE_PART_TYPE_TEXTBLOCK)
+     return ;
 
-   if ((pt->default_desc) && (pt->default_desc->text.text_class))
-     _edje_text_class_member_del(ed, pt->default_desc->text.text_class);
+   desc = (Edje_Part_Description_Text *) pt->default_desc;
+   if ((pt->default_desc) && (desc->text.text_class))
+     _edje_text_class_member_del(ed, desc->text.text_class);
 
-   EINA_LIST_FOREACH(pt->other_desc, tmp, desc)
-     if (desc->text.text_class)
-       _edje_text_class_member_del(ed, desc->text.text_class);
+   for (i = 0; i < pt->other_count; ++i)
+     {
+       desc = (Edje_Part_Description_Text *) pt->other_desc[i];
+       if (desc->text.text_class)
+         _edje_text_class_member_del(ed, desc->text.text_class);
+     }
 }
 
 static void
@@ -267,7 +279,7 @@ _edje_text_font_get(const char *base, const char *new, char **free_later)
 }
 
 const char *
-_edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *size, char **free_later)
+_edje_text_class_font_get(Edje *ed, Edje_Part_Description_Text *chosen_desc, int *size, char **free_later)
 {
    Edje_Text_Class *tc;
    const char *text_class_name, *font;
@@ -292,7 +304,7 @@ _edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *siz
 void
 _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
                        Edje_Calc_Params *params,
-                       Edje_Part_Description *chosen_desc)
+                       Edje_Part_Description_Text *chosen_desc)
 {
    const char  *text;
    const char  *font;
@@ -315,13 +327,13 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 
    if (ep->text.text_source)
      {
-       text = ep->text.text_source->chosen_description->text.text;
+       text = ((Edje_Part_Description_Text *)ep->text.text_source->chosen_description)->text.text;
        if (ep->text.text_source->text.text) text = ep->text.text_source->text.text;
      }
    if (ep->text.source)
      {
-       font = ep->text.source->chosen_description->text.font;
-       size = ep->text.source->chosen_description->text.size;
+       font = ((Edje_Part_Description_Text *)ep->text.source->chosen_description)->text.font;
+       size = ((Edje_Part_Description_Text *)ep->text.source->chosen_description)->text.size;
        if (ep->text.source->text.font) font = ep->text.source->text.font;
        if (ep->text.source->text.size > 0) size = ep->text.source->text.size;
      }
index 90cde22..af0ef6e 100644 (file)
@@ -295,17 +295,13 @@ EAPI const char *
 edje_object_data_get(const Evas_Object *obj, const char *key)
 {
    Edje *ed;
-   Eina_List *l;
-   Edje_Data *di;
 
    ed = _edje_fetch(obj);
    if ((!ed) || (!key))
      return NULL;
    if (!ed->collection) return NULL;
-   EINA_LIST_FOREACH(ed->collection->data, l, di)
-     if ((di->key) && (!strcmp(di->key, key)))
-       return (const char *)di->value;
-   return NULL;
+   if (!ed->collection->data) return NULL;
+   return eina_hash_find(ed->collection->data, key);
 }
 
 /**
@@ -2855,7 +2851,7 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
             didw = 0;
             if (ep->chosen_description)
               {
-                 if (!ep->chosen_description->common.fixed.w)
+                 if (!ep->chosen_description->fixed.w)
                    {
                       if (w > maxw)
                         {
@@ -2869,10 +2865,10 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
                            /* FIXME: do something */
                         }
                    }
-                 if (!ep->chosen_description->common.fixed.h)
+                 if (!ep->chosen_description->fixed.h)
                    {
                       if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
-                            (!ep->chosen_description->text.min_x) &&
+                            (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
                             (didw)))
                         {
                            if (h > maxh)
@@ -2959,18 +2955,18 @@ edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val
      }
    if (rp->chosen_description)
      {
-       if (val_ret) *val_ret = rp->chosen_description->common.state.value;
-       if (rp->chosen_description->common.state.name)
-         return rp->chosen_description->common.state.name;
+       if (val_ret) *val_ret = rp->chosen_description->state.value;
+       if (rp->chosen_description->state.name)
+         return rp->chosen_description->state.name;
        return "default";
      }
    else
      {
        if (rp->param1.description)
          {
-            if (val_ret) *val_ret = rp->param1.description->common.state.value;
-            if (rp->param1.description->common.state.name)
-              return rp->param1.description->common.state.name;
+            if (val_ret) *val_ret = rp->param1.description->state.value;
+            if (rp->param1.description->state.name)
+              return rp->param1.description->state.name;
             return "default";
          }
      }
@@ -4454,15 +4450,14 @@ _edje_color_class_hash_free(void)
 void
 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
 {
-   Eina_List *tmp;
-   Edje_Part_Description *desc;
+   unsigned int i;
 
-   if ((ep->default_desc) && (ep->default_desc->common.color_class))
-     _edje_color_class_member_del(ed, ep->default_desc->common.color_class);
+   if ((ep->default_desc) && (ep->default_desc->color_class))
+     _edje_color_class_member_del(ed, ep->default_desc->color_class);
 
-   EINA_LIST_FOREACH(ep->other_desc, tmp, desc)
-     if (desc->common.color_class)
-       _edje_color_class_member_del(ed, desc->common.color_class);
+   for (i = 0; i < ep->other_count; ++i)
+     if (ep->other_desc[i]->color_class)
+       _edje_color_class_member_del(ed, ep->other_desc[i]->color_class);
 }
 
 Edje_Text_Class *