Edje_pick Fix
authorAharon Hillel <a.hillel@samsung.com>
Thu, 6 Dec 2012 07:54:54 +0000 (07:54 +0000)
committerDaniel Zaoui <daniel.zaoui@yahoo.com>
Thu, 6 Dec 2012 07:54:54 +0000 (07:54 +0000)
Signed-off-by: Aharon Hillel <a.hillel@samsung.com>
SVN revision: 80305

legacy/edje/src/bin/edje_cc_sources.c
legacy/edje/src/bin/edje_pick.c
legacy/edje/src/lib/edje_cache.c
legacy/edje/src/lib/edje_data.c
legacy/edje/src/lib/edje_load.c
legacy/edje/src/lib/edje_private.h

index 4a6be70..818890f 100644 (file)
@@ -41,14 +41,7 @@ source_edd(void)
    _external_list_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_external_list_edd, External_List, "list", list, _external_edd);
 
-   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc), "font", sizeof (Font));
-   _font_edd = eet_data_descriptor_stream_new(&eddc);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "file", file, EET_T_INLINED_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "name", name, EET_T_INLINED_STRING);
-
-   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc), "font_list", sizeof (Font_List));
-   _font_list_edd = eet_data_descriptor_stream_new(&eddc);
-   EET_DATA_DESCRIPTOR_ADD_LIST(_font_list_edd, Font_List, "list", list, _font_edd);
+   _edje_data_font_list_desc_make(&_font_list_edd, &_font_edd);
 }
 
 static void source_fetch_file(const char *fil, const char *filname);
index 898b1b9..abe8348 100644 (file)
@@ -9,6 +9,7 @@
 #include <unistd.h>\r
 #include <fcntl.h>\r
 #include <ctype.h>\r
+#include <Ecore_Getopt.h>\r
 \r
 #ifdef HAVE_EVIL\r
 # include <Evil.h>\r
 #include "edje_cc.h"\r
 #include "edje_private.h"\r
 \r
+#define EDJE_PICK_HELP_STRING \\r
+"\nEdje Pick - the \"edj\" merging tool.\n\\r
+===================================\n\n\\r
+Use Edje Pick to compose a single edj file \\r
+by selecting groups from edj files.\n\n\\r
+Use Edje Pick as follows:\n\\r
+Include files with \'--include\' file-name\n\\r
+Follow the included file-name by names of selected groups from this file.\n\\r
+To select a group use: \'--group\' group-name.\n\n\\r
+You must specify merged file name with \'--output\' file-name.\n\\r
+Use '--verbose' switch to get detailed log.\n\n\\r
+To produce 3rd file \'out.edj\' that composed  of:\n\\r
+Group \'test\' from \'ex1.edj\' and \'test2\', \'test3\', from \'ex2.edj\'\n\\r
+edje_pick -i ex1.edj -g test -i ex2.edj -g test2 -g test3 -o out.edj\n\n\\r
+By using \'--append\' whole file content is selected.\n\\r
+No need to specify selected groups with this switch.\n\\r
+Note that selected group with will override group with the same name\n\\r
+from appended-file when using \'--append\' switch.\n\n\\r
+Example, the command:\n\\r
+edje_pick -a theme1.edj -i default.edj -g elm/button/base/default \\r
+-g elm/check/base/default -o hybrid.edj\n\n\\r
+will produce a 3rd theme file \'hybrid.edj\',\n\\r
+composed of all theme1.edj components.\n\\r
+Replacing the button and check with widgets taken from default theme.\n\\r
+(Given that theme1.edj button, check group-name are as in default.edj)\n"\r
+\r
 struct _Edje_Pick_Id\r
 {\r
    int old_id;\r
@@ -36,6 +63,7 @@ struct _Edje_Pick_File_Params
    Eina_List *scriptlist;\r
    Eina_List *luascriptlist;\r
    Eina_List *imagelist;\r
+   Eina_List *imagesetlist;  /* List of IDs (Edje_Pick_Data) for image sets */\r
    Eina_List *samplelist;\r
    Eina_List *tonelist;\r
 };\r
@@ -43,8 +71,8 @@ typedef struct _Edje_Pick_File_Params Edje_Pick_File_Params;
 \r
 struct _Edje_Pick_Data\r
 {\r
-   const char *filename; /* Image, Sample File Name */\r
-   void *entry ;          /* used to build output file dir */\r
+   const char *filename;  /* Image, Sample File Name       */\r
+   void *entry ;          /* used to build output file dir FIXME: REMOVE THIS */\r
    void *data;            /* Data as taken from input file */\r
 \r
    int size;\r
@@ -76,36 +104,25 @@ typedef struct _Edje_Pick Edje_Pick;
 \r
 static Edje_Pick context = { EINA_FALSE, NULL, NULL };\r
 \r
-/* FIXME: Use Eina_Log */\r
 #define VERBOSE(COMMAND) if (context.v) { COMMAND; }\r
 \r
 enum _Edje_Pick_Status\r
   {\r
     EDJE_PICK_NO_ERROR,\r
-    EDJE_PICK_NO_INPUT_FILES_DEFINED,\r
-    EDJE_PICK_INCOMPLETE_STRUCT,\r
-    EDJE_PICK_INP_NAME_MISSING,\r
-    EDJE_PICK_DUP_FILENAME,\r
-    EDJE_PICK_DUP_OUT_FILENAME,\r
     EDJE_PICK_OUT_FILENAME_MISSING,\r
     EDJE_PICK_FAILED_OPEN_INP,\r
     EDJE_PICK_FAILED_READ_INP,\r
     EDJE_PICK_GROUP_NOT_FOUND,\r
     EDJE_PICK_IMAGE_NOT_FOUND,\r
     EDJE_PICK_SAMPLE_NOT_FOUND,\r
+    EDJE_PICK_INCLUDE_MISSING,\r
+    EDJE_PICK_GROUP_MISSING,\r
+    EDJE_PICK_PARSE_FAILED,\r
+    EDJE_PICK_HELP_SHOWN,\r
     EDJE_PICK_DUP_GROUP\r
   };\r
 typedef enum _Edje_Pick_Status Edje_Pick_Status;\r
 \r
-enum _Edje_Pick_Parse_Mode\r
-  {  /* Command-line parse modes */\r
-    EDJE_PICK_UNDEFINED,\r
-    EDJE_PICK_GET_FILENAME,\r
-    EDJE_PICK_GET_GROUPS,\r
-    EDJE_PICK_GET_OUTPUT_FILENAME\r
-  };\r
-typedef enum _Edje_Pick_Parse_Mode Edje_Pick_Parse_Mode;\r
-\r
 static void\r
 _edje_pick_args_show(Eina_List *ifs, char *out)\r
 {  /* Print command-line arguments after parsing phase */\r
@@ -113,18 +130,23 @@ _edje_pick_args_show(Eina_List *ifs, char *out)
    Eina_List *l;\r
    char *g;\r
 \r
-   printf("Got args for <%d> input files.\n", eina_list_count(ifs));\r
+   EINA_LOG_INFO("Got args for <%d> input files.\n", eina_list_count(ifs));\r
 \r
    EINA_LIST_FOREACH(ifs, l, p)\r
      {\r
         Eina_List *ll;\r
 \r
-        printf("\nFile name: %s\n\tGroups:\n", p->name);\r
-        EINA_LIST_FOREACH(p->groups, ll, g)\r
-          printf("\t\t%s\n", g);\r
+        if (p->append)\r
+          printf("\nFile name: %s\n\tGroups: ALL (append mode)\n", p->name);\r
+        else\r
+          {\r
+             printf("\nFile name: %s\n\tGroups:\n", p->name);\r
+             EINA_LIST_FOREACH(p->groups, ll, g)\r
+                printf("\t\t%s\n", g);\r
+          }\r
      }\r
 \r
-   printf("\nOutput file name was <%s>\n", out);\r
+   EINA_LOG_INFO("\nOutput file name was <%s>\n", out);\r
 }\r
 \r
 static void\r
@@ -140,13 +162,60 @@ _edje_pick_data_free(Eina_List *l)
      }\r
 }\r
 \r
+static void\r
+_edje_pick_out_file_free(Edje_File *out_file)\r
+{\r
+   if (out_file)\r
+     {\r
+        /* Free output file memory allocation */\r
+        if (out_file->ef)\r
+          eet_close(out_file->ef);\r
+\r
+        if (out_file->external_dir)\r
+          {\r
+             if (out_file->external_dir->entries)\r
+               free(out_file->external_dir->entries);\r
+\r
+             free(out_file->external_dir);\r
+          }\r
+\r
+        if (out_file->image_dir)\r
+          {\r
+             if (out_file->image_dir->entries)\r
+               free(out_file->image_dir->entries);\r
+\r
+             free(out_file->image_dir);\r
+          }\r
+\r
+        if (out_file->sound_dir)\r
+          {\r
+             if (out_file->sound_dir->samples)\r
+               free(out_file->sound_dir->samples);\r
+\r
+             if (out_file->sound_dir->tones)\r
+               free(out_file->sound_dir->tones);\r
+\r
+             free(out_file->sound_dir);\r
+          }\r
+\r
+        eina_list_free(out_file->color_classes);\r
+        eina_hash_free_cb_set(out_file->collection, free);\r
+        eina_hash_free(out_file->collection);\r
+        eina_stringshare_del(out_file->compiler);\r
+\r
+        free(out_file);\r
+     }\r
+}\r
+\r
 static int\r
-_edje_pick_cleanup(Eina_List *ifs, Edje_Pick_Status s)\r
+_edje_pick_cleanup(Eina_List *ifs, Edje_File *out_file, Edje_Pick_Status s)\r
 {\r
    Edje_Pick_File_Params *p;\r
    Edje_Pick_Font *ft;\r
    void *n;\r
 \r
+   _edje_pick_out_file_free(out_file);\r
+\r
    EINA_LIST_FREE(ifs, p)\r
      {\r
         EINA_LIST_FREE(p->groups, n)\r
@@ -161,13 +230,16 @@ _edje_pick_cleanup(Eina_List *ifs, Edje_Pick_Status s)
         _edje_pick_data_free(p->imagelist);\r
         p->imagelist = NULL;\r
 \r
+        _edje_pick_data_free(p->imagesetlist);\r
+        p->imagesetlist = NULL;\r
+\r
         _edje_pick_data_free(p->samplelist);\r
 \r
         EINA_LIST_FREE(p->tonelist, n)\r
           free(n);\r
 \r
         if (p->edf)\r
-          free(p->edf);\r
+          _edje_cache_file_unref(p->edf);\r
 \r
         free(p);\r
      }\r
@@ -184,32 +256,26 @@ _edje_pick_cleanup(Eina_List *ifs, Edje_Pick_Status s)
 \r
    switch (s)\r
      {\r
-      case EDJE_PICK_NO_INPUT_FILES_DEFINED:\r
-         printf("No input files defined.\n");\r
-         break;\r
-      case EDJE_PICK_INCOMPLETE_STRUCT:\r
-         printf("Missing name, groups or both for input file.\n");\r
-         break;\r
-      case EDJE_PICK_INP_NAME_MISSING:\r
-         printf("Missing name for input file.\n");\r
-         break;\r
-      case EDJE_PICK_DUP_FILENAME:\r
-         printf("Input file appears twice.\n");\r
-         break;\r
-      case EDJE_PICK_DUP_OUT_FILENAME:\r
-         printf("Output file appears twice.\n");\r
-         break;\r
       case EDJE_PICK_OUT_FILENAME_MISSING:\r
-         printf("Output file name missing.\n");\r
+         EINA_LOG_ERR("Output file name missing.\n");\r
          break;\r
       case EDJE_PICK_FAILED_OPEN_INP:\r
-         printf("Failed to open input file.\n");\r
+         EINA_LOG_ERR("Failed to open input file.\n");\r
          break;\r
       case EDJE_PICK_FAILED_READ_INP:\r
-         printf("Failed to read input file.\n");\r
+         EINA_LOG_ERR("Failed to read input file.\n");\r
          break;\r
       case EDJE_PICK_DUP_GROUP:\r
-         printf("Can't fetch groups with identical name from various files.\n");\r
+         EINA_LOG_ERR("Can't fetch groups with identical name from various files.\n");\r
+         break;\r
+      case EDJE_PICK_INCLUDE_MISSING:\r
+         EINA_LOG_ERR("Cannot select groups when no input file included.\n");\r
+         break;\r
+      case EDJE_PICK_GROUP_MISSING:\r
+         EINA_LOG_ERR("Group name missing for include file.\n");\r
+         break;\r
+      case EDJE_PICK_PARSE_FAILED:\r
+         EINA_LOG_ERR("Command parsing failed.\n");\r
          break;\r
       default:\r
          return s;\r
@@ -243,116 +309,165 @@ static int
 _edje_pick_command_line_parse(int argc, char **argv,\r
                              Eina_List **ifs, char **ofn)\r
 {  /* On return ifs is Input Files List, ofn is Output File Name */\r
+   Eina_List *gpf = NULL; /* List including counters of groups-per-file */\r
+   Eina_List *a_files = NULL;\r
+   Eina_List *i_files = NULL;\r
+   Eina_List *l;\r
+   Eina_List *ll;\r
+   Eina_List *cg;\r
+   Eina_List *groups = NULL;\r
    char *output_filename = NULL;\r
-   Edje_Pick_Parse_Mode pm = EDJE_PICK_UNDEFINED;\r
    Edje_Pick_File_Params *current_inp = NULL;\r
    Eina_List *files = NULL;  /* List of input files */\r
+   int *c = NULL;\r
+   char *str = NULL;\r
    int k;\r
+   Eina_Bool show_help = EINA_FALSE;\r
+\r
+   /* Define args syntax */\r
+#define IS_GROUP(x) ((!strcmp(x, "-g")) || (!strcmp(x, "--group")))\r
+#define IS_INCLUDE(x) ((!strcmp(x, "-i")) || (!strcmp(x, "--include")))\r
+#define IS_HELP(x) ((!strcmp(x, "-h")) || (!strcmp(x, "--help")))\r
+   static const Ecore_Getopt optdesc = {\r
+        "edje_pick",\r
+        NULL,\r
+        "0.0",\r
+        "(C) 2012 Enlightenment",\r
+        "Public domain?",\r
+        "Edje Pick - the \"edj\" merging tool.",\r
+\r
+        EINA_TRUE,\r
+        {\r
+           ECORE_GETOPT_STORE_TRUE('v', "verbose", "Verbose"),\r
+           ECORE_GETOPT_STORE('o', "output", "Output File",\r
+                 ECORE_GETOPT_TYPE_STR),\r
+           ECORE_GETOPT_APPEND_METAVAR('a', "append", "Append File",\r
+                 "STRING", ECORE_GETOPT_TYPE_STR),\r
+           ECORE_GETOPT_APPEND_METAVAR('i', "include", "Include File",\r
+                 "STRING", ECORE_GETOPT_TYPE_STR),\r
+           ECORE_GETOPT_APPEND_METAVAR('g', "group", "Add Group",\r
+                 "STRING", ECORE_GETOPT_TYPE_STR),\r
+           ECORE_GETOPT_HELP('h', "help"),\r
+           ECORE_GETOPT_SENTINEL\r
+        }\r
+   };\r
+\r
+   Ecore_Getopt_Value values[] = {\r
+        ECORE_GETOPT_VALUE_BOOL(context.v),\r
+        ECORE_GETOPT_VALUE_STR(output_filename),\r
+        ECORE_GETOPT_VALUE_LIST(a_files),\r
+        ECORE_GETOPT_VALUE_LIST(i_files),\r
+        ECORE_GETOPT_VALUE_LIST(groups),\r
+        ECORE_GETOPT_VALUE_NONE\r
+   };\r
 \r
    /* START - Read command line args */\r
+   c = NULL;\r
    for(k = 1; k < argc; k++)\r
-     {\r
-        /* START - parse command line */\r
-        if (strcmp(argv[k], "-a") == 0)\r
+     {  /* Run through args, count how many groups per file */\r
+        if(IS_GROUP(argv[k]))\r
           {\r
-             /* Switch mode to get file name */\r
-             if (current_inp &&\r
-                 ((!current_inp->name) ||\r
-                  ((!current_inp->append) && !current_inp->groups)))\r
-               return _edje_pick_cleanup(files, EDJE_PICK_INCOMPLETE_STRUCT);\r
-\r
-             current_inp = calloc(1, sizeof(*current_inp));\r
-             current_inp->append = EINA_TRUE;\r
-             files = eina_list_append(files, current_inp);\r
-             pm = EDJE_PICK_GET_FILENAME;\r
+             if (!c)\r
+               return _edje_pick_cleanup(files, NULL,\r
+                     EDJE_PICK_INCLUDE_MISSING);\r
+\r
+             (*c)++;\r
              continue;\r
           }\r
 \r
-        if (strcmp(argv[k], "-i") == 0)\r
+        if(IS_INCLUDE(argv[k]))\r
           {\r
-             /* Switch mode to get file name */\r
-             if (current_inp &&\r
-                 ((!current_inp->name) ||\r
-                  ((!current_inp->append) && !current_inp->groups)))\r
-               return _edje_pick_cleanup(files, EDJE_PICK_INCOMPLETE_STRUCT);\r
-\r
-             current_inp = calloc(1, sizeof(*current_inp));\r
-             files = eina_list_append(files, current_inp);\r
-             pm = EDJE_PICK_GET_FILENAME;\r
+             c = calloc(1, sizeof(int));\r
+             gpf = eina_list_append(gpf, c);\r
              continue;\r
           }\r
 \r
-        if (strcmp(argv[k], "-g") == 0)\r
-          {\r
-             /* Switch mode to get groups names for current file */\r
-             if (current_inp && (!current_inp->name))\r
-               return _edje_pick_cleanup(files, EDJE_PICK_INP_NAME_MISSING);\r
+        show_help |= IS_HELP(argv[k]);\r
+     }\r
 \r
-             pm = EDJE_PICK_GET_GROUPS;\r
-             continue;\r
-          }\r
+   if (show_help)\r
+     puts(EDJE_PICK_HELP_STRING);\r
 \r
-        if (strcmp(argv[k], "-o") == 0)\r
-          {\r
-             /* Switch to get output file name */\r
-             if (current_inp &&\r
-                 ((!current_inp->name) ||\r
-                  ((!current_inp->append) && !current_inp->groups)))\r
-               return _edje_pick_cleanup(files, EDJE_PICK_INCOMPLETE_STRUCT);\r
+   if (ecore_getopt_parse(&optdesc, values, argc, argv) < 0)\r
+     {\r
+        EINA_LIST_FREE(gpf, c)\r
+           free(c);\r
 \r
-             pm = EDJE_PICK_GET_OUTPUT_FILENAME;\r
-             continue;\r
-          }\r
+        return _edje_pick_cleanup(files, NULL, EDJE_PICK_PARSE_FAILED);\r
+     }\r
 \r
-        if (strcmp(argv[k], "-v") == 0)\r
-          {\r
-             context.v = EINA_TRUE;  /* Verbose mode on */\r
-             continue;\r
-          }\r
+   if (show_help)\r
+     {\r
+        EINA_LIST_FREE(gpf, c)\r
+           free(c);\r
+\r
+        ecore_getopt_list_free(i_files);\r
+        ecore_getopt_list_free(groups);\r
+        return _edje_pick_cleanup(files, NULL, EDJE_PICK_HELP_SHOWN);\r
+     }\r
 \r
-        switch (pm)\r
+   if (context.v)  /* Changed to INFO if verbose */\r
+     eina_log_level_set(EINA_LOG_LEVEL_INFO);\r
+\r
+   EINA_LIST_FOREACH(a_files, l, str)\r
+     {\r
+        current_inp = calloc(1, sizeof(*current_inp));\r
+        current_inp->append = EINA_TRUE;\r
+        current_inp->name = eina_stringshare_add(str);\r
+        files = eina_list_append(files, current_inp);\r
+     }\r
+   ecore_getopt_list_free(a_files);\r
+\r
+   ll = gpf;\r
+   cg = groups;\r
+   EINA_LIST_FOREACH(i_files, l, str)\r
+     {  /* Now match groups from groups-list with included files */\r
+        current_inp = calloc(1, sizeof(*current_inp));\r
+        current_inp->name = eina_stringshare_add(str);\r
+        files = eina_list_append(files, current_inp);\r
+        c = eina_list_data_get(ll);\r
+        if (c)\r
           {\r
-           case EDJE_PICK_GET_FILENAME:\r
-              if (current_inp->name)\r
-                return _edje_pick_cleanup(files, EDJE_PICK_DUP_FILENAME);\r
-              else\r
-                current_inp->name = argv[k];\r
-              break;\r
-\r
-           case EDJE_PICK_GET_GROUPS:\r
-              if (!current_inp)\r
-                return _edje_pick_cleanup(files, EDJE_PICK_INCOMPLETE_STRUCT);\r
-\r
-              if (_group_name_in_other_file(files, current_inp, argv[k]))\r
-                return _edje_pick_cleanup(files, EDJE_PICK_DUP_GROUP);\r
-\r
-              if (!eina_list_search_unsorted(current_inp->groups,\r
-                                             (Eina_Compare_Cb) strcmp,\r
-                                             argv[k]))\r
-                current_inp->groups = eina_list_append(current_inp->groups,\r
-                                                       eina_stringshare_add(argv[k]));\r
-              break;\r
-\r
-           case EDJE_PICK_GET_OUTPUT_FILENAME:\r
-              if (output_filename)\r
-                return _edje_pick_cleanup(files, EDJE_PICK_DUP_OUT_FILENAME);\r
-\r
-              output_filename = argv[k];\r
-              break;\r
-           default: ;\r
+             while(*c)\r
+               {\r
+                  char *g_name;\r
+                  if (!cg)\r
+                    {\r
+                       EINA_LIST_FREE(gpf, c)\r
+                          free(c);\r
+\r
+                       ecore_getopt_list_free(i_files);\r
+                       ecore_getopt_list_free(groups);\r
+                       return _edje_pick_cleanup(files, NULL,\r
+                             EDJE_PICK_GROUP_MISSING);\r
+                    }\r
+\r
+\r
+                  g_name = eina_list_data_get(cg);\r
+                  if (_group_name_in_other_file(files, current_inp, g_name))\r
+                    return _edje_pick_cleanup(files, NULL, EDJE_PICK_DUP_GROUP);\r
+\r
+                  if (!eina_list_search_unsorted(current_inp->groups,\r
+                           (Eina_Compare_Cb) strcmp, g_name))\r
+                    current_inp->groups = eina_list_append(\r
+                          current_inp->groups, eina_stringshare_add(g_name));\r
+\r
+                  cg = eina_list_next(cg);\r
+                  (*c)--;\r
+               }\r
           }\r
-     }  /* END   - parse command line */\r
+        ll = eina_list_next(ll);\r
+     }\r
 \r
-   if (!files)\r
-     return _edje_pick_cleanup(files, EDJE_PICK_NO_INPUT_FILES_DEFINED);\r
+   EINA_LIST_FREE(gpf, c)\r
+      free(c);\r
+\r
+   ecore_getopt_list_free(i_files);\r
+   ecore_getopt_list_free(groups);\r
 \r
-   if (current_inp &&\r
-       ((!current_inp->name) ||\r
-        ((!current_inp->append) && !current_inp->groups)))\r
-     return _edje_pick_cleanup(files, EDJE_PICK_INCOMPLETE_STRUCT);\r
 \r
    if (!output_filename)\r
-     return _edje_pick_cleanup(files, EDJE_PICK_OUT_FILENAME_MISSING);\r
+     return _edje_pick_cleanup(files, NULL, EDJE_PICK_OUT_FILENAME_MISSING);\r
    /* END   - Read command line args */\r
 \r
    /* Set output params, return OK */\r
@@ -408,21 +523,21 @@ _edje_pick_output_prepare(Edje_File *o, Edje_File *edf, char *name)
      {\r
         if (o->version != edf->version)\r
           {\r
-             printf("Warning: Merging files of various version.\n");\r
+             EINA_LOG_WARN("Warning: Merging files of various version.\n");\r
              if (o->version < edf->version)\r
                o->version = edf->version;\r
           }\r
 \r
         if (o->minor != edf->minor)\r
           {\r
-             printf("Warning: Merging files of various minor.\n");\r
+             EINA_LOG_WARN("Warning: Merging files of various minor.\n");\r
              if (o->minor < edf->minor)\r
                o->minor = edf->minor;\r
           }\r
 \r
         if (o->feature_ver != edf->feature_ver)\r
           {\r
-             printf("Warning: Merging files of various feature_ver.\n");\r
+             EINA_LOG_WARN("Warning: Merging files of various feature_ver.\n");\r
              if (o->feature_ver < edf->feature_ver)\r
                o->feature_ver = edf->feature_ver;\r
           }\r
@@ -438,62 +553,57 @@ _edje_pick_header_make(Edje_File *out_file , Edje_File *edf, Eina_List *ifs)
    static int current_group_id = 0;\r
    Edje_Part_Collection_Directory_Entry *ce;\r
    Eina_Bool status = EDJE_PICK_NO_ERROR;\r
-   Eina_List *l, *lst = NULL;\r
-\r
-   Eina_Iterator *i;\r
-   const char *key;\r
+   Eina_List *l;\r
    char *name1 = NULL;\r
 \r
-   i = eina_hash_iterator_key_new(edf->collection);\r
-\r
-   /* FIXME: Don't build a list, use iterator and hash where relevant */\r
-   EINA_ITERATOR_FOREACH(i, key)  /* Make list of all keys */\r
-     lst = eina_list_append(lst, eina_stringshare_add(key));\r
-\r
-   eina_iterator_free(i);\r
 \r
    _edje_cache_file_unref(edf);\r
 \r
    /* Build file header */\r
    if (context.current_file->append)\r
      {\r
-        EINA_LIST_FOREACH(lst, l, name1)\r
+        Eina_Iterator *i;\r
+        i = eina_hash_iterator_key_new(edf->collection);\r
+        EINA_ITERATOR_FOREACH(i, name1)  /* Run through all keys */\r
           {\r
              Edje_Part_Collection_Directory_Entry *ce_out;\r
 \r
              /* Use ALL groups from this file */\r
              /* Test that no duplicate-group name for files in append mode */\r
-             /* Here because we don't read EDC before parse cmd line       */\r
+             /* Done here because we don't read EDC before parse cmd line  */\r
+             /* We SKIP group of file in append-mode if we got this group  */\r
+             /* from file in include mode.                                 */\r
              if (_group_name_in_other_file(ifs, context.current_file, name1))\r
-               return EDJE_PICK_DUP_GROUP;\r
+               continue; /* Skip group of file in append mode */\r
 \r
              ce = eina_hash_find(edf->collection, name1);\r
              ce_out = malloc(sizeof(*ce_out));\r
              memcpy(ce_out, ce, sizeof(*ce_out));\r
 \r
              ce_out->id = current_group_id;\r
-             printf("Changing ID of group <%d> to <%d>\n",ce->id, ce_out->id);\r
+             EINA_LOG_INFO("Changing ID of group <%d> to <%d>\n",\r
+                   ce->id, ce_out->id);\r
              current_group_id++;\r
 \r
              eina_hash_direct_add(out_file->collection, ce_out->entry, ce_out);\r
 \r
              /* Add this group to groups to handle for this file */\r
-             context.current_file->groups = eina_list_append(context.current_file->groups,\r
-                                                             eina_stringshare_add(name1));\r
+             context.current_file->groups = eina_list_append(\r
+                   context.current_file->groups, eina_stringshare_add(name1));\r
           }\r
+\r
+        eina_iterator_free(i);\r
      }\r
    else\r
      {\r
         EINA_LIST_FOREACH(context.current_file->groups, l , name1)\r
           {\r
              /* Verify group found then add to ouput file header */\r
-             char *name2 = eina_list_search_unsorted(lst,\r
-                                                     (Eina_Compare_Cb) strcmp,\r
-                                                     name1);\r
+             ce = eina_hash_find(edf->collection, name1);\r
 \r
-             if (!name2)\r
+             if (!ce)\r
                {\r
-                  printf("Group <%s> was not found in <%s> file.\n",\r
+                  EINA_LOG_ERR("Group <%s> was not found in <%s> file.\n",\r
                          name1, context.current_file->name);\r
                   status = EDJE_PICK_GROUP_NOT_FOUND;\r
                }\r
@@ -502,23 +612,21 @@ _edje_pick_header_make(Edje_File *out_file , Edje_File *edf, Eina_List *ifs)
                   Edje_Part_Collection_Directory_Entry *ce_out;\r
 \r
                   /* Add this groups to hash, with filname pefix for entries */\r
-                  ce = eina_hash_find(edf->collection, name2);\r
                   ce_out = malloc(sizeof(*ce_out));\r
 \r
                   memcpy(ce_out, ce, sizeof(*ce_out));\r
 \r
                   ce_out->id = current_group_id;\r
-                  printf("Changing ID of group <%d> to <%d>\n",ce->id, ce_out->id);\r
+                  EINA_LOG_INFO("Changing ID of group <%d> to <%d>\n",\r
+                        ce->id, ce_out->id);\r
                   current_group_id++;\r
 \r
-                  eina_hash_direct_add(out_file->collection,ce_out->entry,ce_out);\r
+                  eina_hash_direct_add(out_file->collection,ce_out->entry,\r
+                        ce_out);\r
                }\r
           }\r
      }\r
 \r
-   EINA_LIST_FREE(lst, key)\r
-     eina_stringshare_del(key);\r
-\r
    return status;\r
 }\r
 \r
@@ -552,48 +660,112 @@ _edje_pick_new_id_get(Eina_List *id_list, int id, Eina_Bool set_used)
 }\r
 \r
 static int\r
-_edje_pick_images_add(Edje_File *edf)\r
+_edje_pick_images_add(Edje_File *edf, Edje_File *o)\r
 {\r
    char buf[1024];\r
-   int size, k;\r
+   int size;\r
+   unsigned int k;\r
    void *data;\r
    Eina_Bool status = EDJE_PICK_NO_ERROR;\r
    static int current_img_id = 0;\r
 \r
-   if (edf->image_dir)  /* Copy Images */\r
-     for (k = 0; k < (int) edf->image_dir->entries_count; k++)\r
-       {\r
-          Edje_Image_Directory_Entry *img = &edf->image_dir->entries[k];\r
-\r
-          snprintf(buf, sizeof(buf), "edje/images/%i", img->id);\r
-          VERBOSE(printf("Trying to read <%s>\n", img->entry));\r
-          data = eet_read(edf->ef, buf, &size);\r
-          if (size)\r
-            {  /* Advance image ID and register this in imagelist */\r
-               Edje_Pick_Data *image = malloc(sizeof(*image));\r
-\r
-               image->filename = eina_stringshare_add(img->entry);\r
-               image->data = data;\r
-               image->size = size;\r
-               image->entry = (void *) img;  /* for output file image dir */\r
-               image->id.old_id = img->id;\r
-               img->id = image->id.new_id = current_img_id;\r
-               image->id.used = EINA_FALSE;\r
-\r
-               VERBOSE(printf("Read image <%s> data <%p> size <%d>\n",\r
-                              buf, image->data, image->size));\r
-\r
-               current_img_id++;\r
-               context.current_file->imagelist = eina_list_append(context.current_file->imagelist,\r
-                                                                  image);\r
-            }\r
-          else\r
-            {\r
-               printf("Image <%s> was not found in <%s> file.\n",\r
-                      img->entry , context.current_file->name);\r
-               status = EDJE_PICK_IMAGE_NOT_FOUND;\r
-            }\r
-       }\r
+   if (edf->image_dir)\r
+     {\r
+        if (!o->image_dir)  /* First time only */\r
+          o->image_dir = calloc(1, sizeof(*(o->image_dir)));\r
+\r
+        for (k = 0; k < edf->image_dir->entries_count; k++)\r
+          {  /* Copy Images */\r
+             Edje_Image_Directory_Entry *img = &edf->image_dir->entries[k];\r
+\r
+             snprintf(buf, sizeof(buf), "edje/images/%i", img->id);\r
+             VERBOSE(EINA_LOG_INFO("Trying to read <%s>\n", img->entry));\r
+             data = eet_read(edf->ef, buf, &size);\r
+             if (size)\r
+               {  /* Advance image ID and register this in imagelist */\r
+                  Edje_Pick_Data *image = malloc(sizeof(*image));\r
+\r
+                  image->filename = eina_stringshare_add(img->entry);\r
+                  image->data = data;\r
+                  image->size = size;\r
+                  image->entry = (void *) img;  /* for output file image dir */\r
+                  image->id.old_id = img->id;\r
+                  img->id = image->id.new_id = current_img_id;\r
+                  image->id.used = EINA_FALSE;\r
+\r
+                  VERBOSE(EINA_LOG_INFO("Read image <%s> data <%p> size <%d>\n",\r
+                           buf, image->data, image->size));\r
+\r
+                  current_img_id++;\r
+                  context.current_file->imagelist = eina_list_append(\r
+                        context.current_file->imagelist, image);\r
+               }\r
+             else\r
+               {\r
+                  if (img->entry)\r
+                    {\r
+                       EINA_LOG_ERR("Image <%s> was not found in <%s> file.\n",\r
+                             img->entry , context.current_file->name);\r
+                       status = EDJE_PICK_IMAGE_NOT_FOUND;\r
+                    }\r
+                  else\r
+                    {\r
+                       EINA_LOG_ERR("Image entry <%s> was not found in <%s> file.\n", buf , context.current_file->name);\r
+                       status = EDJE_PICK_IMAGE_NOT_FOUND;\r
+                    }\r
+               }\r
+          }\r
+\r
+        if (edf->image_dir->entries)\r
+          {  /* Copy image dir entries of current file */\r
+             k = o->image_dir->entries_count; /* save current entries count */\r
+             o->image_dir->entries_count += edf->image_dir->entries_count;\r
+\r
+             /* alloc mem first time  or  re-allocate again (bigger array) */\r
+             o->image_dir->entries = realloc(o->image_dir->entries,\r
+                   o->image_dir->entries_count *\r
+                   sizeof(Edje_Image_Directory_Entry));\r
+\r
+             /* Concatinate current file entries to re-allocaed array */\r
+             memcpy(&o->image_dir->entries[k], edf->image_dir->entries,\r
+                   edf->image_dir->entries_count *\r
+                   sizeof(Edje_Image_Directory_Entry));\r
+          }\r
+\r
+        if (edf->image_dir->sets)\r
+          {  /* Copy image dir sets of current file */\r
+             k = o->image_dir->sets_count;      /* save current sets count */\r
+             o->image_dir->sets_count += edf->image_dir->sets_count;\r
+             /* alloc mem first time  or  re-allocate again (bigger array) */\r
+             o->image_dir->sets = realloc(o->image_dir->sets,\r
+                   o->image_dir->sets_count *\r
+                   sizeof(Edje_Image_Directory_Set_Entry));\r
+\r
+             /* Concatinate current file sets to re-allocaed array */\r
+             memcpy(&o->image_dir->sets[k], edf->image_dir->sets,\r
+                   edf->image_dir->sets_count *\r
+                   sizeof(Edje_Image_Directory_Set_Entry));\r
+\r
+             for (; k < o->image_dir->sets_count; k++)\r
+               {  /* Fix IDs in sets to new assigned IDs of entries */\r
+                  Eina_List *l;\r
+                  Edje_Image_Directory_Set_Entry *e;\r
+                  Edje_Pick_Data *set = calloc(1, sizeof(*set));\r
+                  set->id.old_id = o->image_dir->sets[k].id;\r
+                  set->id.new_id = k;\r
+\r
+                  /* Save IDs in set-list, used in Desc update later */\r
+                  context.current_file->imagesetlist = eina_list_append(\r
+                        context.current_file->imagesetlist, set);\r
+\r
+                  o->image_dir->sets[k].id = k;  /* Fix new sets IDs */\r
+                  EINA_LIST_FOREACH(o->image_dir->sets[k].entries, l, e)\r
+                     e->id = _edje_pick_new_id_get(\r
+                           context.current_file->imagelist,\r
+                           e->id, EINA_FALSE);\r
+               }\r
+          }\r
+     }\r
 \r
    return status;\r
 }\r
@@ -614,7 +786,7 @@ _edje_pick_sounds_add(Edje_File *edf)
              Edje_Sound_Sample *sample = &edf->sound_dir->samples[k];\r
 \r
              snprintf(buf, sizeof(buf), "edje/sounds/%i", sample->id);\r
-             VERBOSE(printf("Trying to read <%s>\n", sample->name));\r
+             VERBOSE(EINA_LOG_INFO("Trying to read <%s>\n", sample->name));\r
 \r
              data = eet_read(edf->ef, buf, &size);\r
              if (size)\r
@@ -628,7 +800,7 @@ _edje_pick_sounds_add(Edje_File *edf)
                   sample->id = smpl->id.new_id = current_sample_id;\r
                   smpl->id.used = EINA_FALSE;\r
 \r
-                  VERBOSE(printf("Read <%s> sample data <%p> size <%d>\n",\r
+                  VERBOSE(EINA_LOG_INFO("Read <%s> sample data <%p> size <%d>\n",\r
                                  buf, smpl->data, smpl->size));\r
 \r
                   current_sample_id++;\r
@@ -637,7 +809,7 @@ _edje_pick_sounds_add(Edje_File *edf)
                }\r
              else\r
                {\r
-                  printf("Sample <%s> was not found in <%s> file.\n",\r
+                  EINA_LOG_ERR("Sample <%s> was not found in <%s> file.\n",\r
                          sample->name, context.current_file->name);\r
                   status = EDJE_PICK_SAMPLE_NOT_FOUND;\r
                }\r
@@ -672,27 +844,13 @@ _font_cmp(const void *d1, const void *d2)
 static int\r
 _Edje_Pick_Fonts_add(Edje_File *edf)\r
 {\r
-   /* FIXME: share code with other bin */\r
    Eet_Data_Descriptor *_font_list_edd = NULL;\r
    Eet_Data_Descriptor *_font_edd;\r
-   Eet_Data_Descriptor_Class eddc;\r
    Font_List *fl;\r
    Font *f;\r
    Eina_List *l;\r
 \r
-   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),\r
-                                             "font", sizeof (Font));\r
-   _font_edd = eet_data_descriptor_stream_new(&eddc);\r
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font,\r
-                                 "file", file, EET_T_INLINED_STRING);\r
-   EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font,\r
-                                 "name", name, EET_T_INLINED_STRING);\r
-\r
-   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),\r
-                                             "font_list", sizeof (Font_List));\r
-   _font_list_edd = eet_data_descriptor_stream_new(&eddc);\r
-   EET_DATA_DESCRIPTOR_ADD_LIST(_font_list_edd, Font_List,\r
-                                "list", list, _font_edd);\r
+   _edje_data_font_list_desc_make(&_font_list_edd, &_font_edd);\r
    fl = eet_data_read(edf->ef, _font_list_edd, "edje_source_fontmap");\r
 \r
    EINA_LIST_FOREACH(fl->list, l, f)\r
@@ -740,7 +898,7 @@ _edje_pick_scripts_add(Edje_File *edf, int id, int new_id)
         s->id.new_id = new_id;\r
         s->id.used = EINA_TRUE;\r
 \r
-        VERBOSE(printf("Read embryo script <%s> data <%p> size <%d>\n",\r
+        VERBOSE(EINA_LOG_INFO("Read embryo script <%s> data <%p> size <%d>\n",\r
                        buf, s->data, s->size));\r
         context.current_file->scriptlist = eina_list_append(context.current_file->scriptlist, s);\r
      }\r
@@ -768,7 +926,7 @@ _edje_pick_lua_scripts_add(Edje_File *edf, int id, int new_id)
         s->id.new_id = new_id;\r
         s->id.used = EINA_TRUE;\r
 \r
-        VERBOSE(printf("Read lua script <%s> data <%p> size <%d>\n",\r
+        VERBOSE(EINA_LOG_INFO("Read lua script <%s> data <%p> size <%d>\n",\r
                        buf, s->data, s->size));\r
         context.current_file->luascriptlist = eina_list_append(context.current_file->luascriptlist, s);\r
      }\r
@@ -806,15 +964,28 @@ _edje_pick_images_desc_update(Edje_Part_Description_Image *desc)
    if (desc)\r
      {\r
         unsigned int k;\r
+        int new_id = (desc->image.set) ?\r
+           _edje_pick_new_id_get(context.current_file->imagesetlist,\r
+                 desc->image.id,\r
+                 EINA_TRUE) :\r
+           _edje_pick_new_id_get(context.current_file->imagelist,\r
+                 desc->image.id,\r
+                 EINA_TRUE);\r
 \r
-        desc->image.id = _edje_pick_new_id_get(context.current_file->imagelist,\r
-                                               desc->image.id,\r
-                                               EINA_TRUE);\r
+        desc->image.id = new_id;\r
 \r
         for (k = 0; k < desc->image.tweens_count; k++)\r
-          desc->image.tweens[k]->id = _edje_pick_new_id_get(context.current_file->imagelist,\r
-                                                            desc->image.tweens[k]->id ,\r
-                                                            EINA_TRUE);\r
+          {\r
+             new_id = (desc->image.set) ?\r
+                _edje_pick_new_id_get(context.current_file->imagesetlist,\r
+                      desc->image.tweens[k]->id ,\r
+                      EINA_TRUE) :\r
+                _edje_pick_new_id_get(context.current_file->imagelist,\r
+                      desc->image.tweens[k]->id ,\r
+                      EINA_TRUE);\r
+\r
+             desc->image.tweens[k]->id = new_id;\r
+          }\r
      }\r
 }\r
 \r
@@ -934,38 +1105,6 @@ _edje_pick_collection_process(Edje_Part_Collection *edc)
 }\r
 \r
 static void\r
-_edje_pick_image_dir_compose(Eina_List *images,\r
-                            Edje_Image_Directory_Set *sets,\r
-                            unsigned int sets_count,\r
-                            Edje_File *o)\r
-{\r
-   /* Compose image_dir array from all used images */\r
-   if (images)\r
-     {\r
-        Edje_Image_Directory_Entry *entry;\r
-        Edje_Image_Directory_Entry *p;\r
-        Eina_List *l;\r
-\r
-        o->image_dir = calloc(1, sizeof(*(o->image_dir)));\r
-\r
-        o->image_dir->entries = malloc(eina_list_count(images) *\r
-                                       sizeof(Edje_Image_Directory_Entry));\r
-\r
-        p = o->image_dir->entries;\r
-        EINA_LIST_FOREACH(images, l, entry)\r
-          {\r
-             memcpy(p, entry, sizeof(Edje_Image_Directory_Entry));\r
-             p++;\r
-          }\r
-\r
-        o->image_dir->entries_count = eina_list_count(images);\r
-\r
-        o->image_dir->sets = sets;\r
-        o->image_dir->sets_count = sets_count;\r
-     }\r
-}\r
-\r
-static void\r
 _edje_pick_sound_dir_compose(Eina_List *samples, Eina_List *tones, Edje_File *o)\r
 {  /* Compose sound_dir array from all used samples, tones */\r
    if (samples)\r
@@ -1007,7 +1146,7 @@ _edje_pick_sound_dir_compose(Eina_List *samples, Eina_List *tones, Edje_File *o)
      }\r
 }\r
 \r
-int \r
+int\r
 main(int argc, char **argv)\r
 {\r
    char *name1, *output_filename = NULL;\r
@@ -1018,7 +1157,6 @@ main(int argc, char **argv)
    Eina_List *samples = NULL;\r
    Eina_List *tones = NULL;\r
    Edje_Image_Directory_Set *sets = NULL; /* ALL files sets composed here */\r
-   unsigned int sets_count = 0;  /* ALL files sets-count accumolated here */\r
 \r
    Edje_Part_Collection *edc;\r
    Edje_Part_Collection_Directory_Entry *ce;\r
@@ -1029,19 +1167,12 @@ main(int argc, char **argv)
    void *n;\r
    int k, bytes;\r
 \r
-   if (argc < 4)\r
-     {\r
-        /* FIXME: display a proper help with information */\r
-        printf("%s -i|-a input-file.edj -g group1 [group2 ...] [-i input_file2.edj -g ...] -o output-file.edj\n", argv[0]);\r
-\r
-        return -1;\r
-     }\r
-\r
    eina_init();\r
    eet_init();\r
+   ecore_init();\r
    _edje_edd_init();\r
+   eina_log_level_set(EINA_LOG_LEVEL_WARN);  /* Changed to INFO if verbose */\r
 \r
-   /* FIXME: use Ecore_Getopt */\r
    k = _edje_pick_command_line_parse(argc, argv, &inp_files, &output_filename);\r
    if ( k != EDJE_PICK_NO_ERROR)\r
      return k;\r
@@ -1055,11 +1186,13 @@ main(int argc, char **argv)
 \r
         ef = eet_open(context.current_file->name, EET_FILE_MODE_READ);\r
         if (!ef)\r
-          return _edje_pick_cleanup(inp_files, EDJE_PICK_FAILED_OPEN_INP);\r
+          return _edje_pick_cleanup(inp_files, out_file,\r
+                EDJE_PICK_FAILED_OPEN_INP);\r
 \r
         edf = eet_data_read(ef, _edje_edd_edje_file, "edje/file");\r
         if (!edf)\r
-          return _edje_pick_cleanup(inp_files, EDJE_PICK_FAILED_READ_INP);\r
+          return _edje_pick_cleanup(inp_files, out_file,\r
+                EDJE_PICK_FAILED_READ_INP);\r
 \r
         context.current_file->edf = edf;\r
         edf->ef = ef;\r
@@ -1070,12 +1203,11 @@ main(int argc, char **argv)
         if (k != EDJE_PICK_NO_ERROR)\r
           {\r
              eet_close(ef);\r
-             eet_close(out_file->ef);\r
-             return _edje_pick_cleanup(inp_files, k);\r
+             return _edje_pick_cleanup(inp_files, out_file, k);\r
           }\r
 \r
         /* Build lists of all images, samples and fonts of input files    */\r
-        _edje_pick_images_add(edf);  /* Add Images to imagelist           */\r
+        _edje_pick_images_add(edf, out_file);  /* Add Images to imagelist */\r
         _edje_pick_sounds_add(edf);  /* Add Sounds to samplelist          */\r
         _Edje_Pick_Fonts_add(edf);   /* Add fonts from file to fonts list */\r
 \r
@@ -1089,46 +1221,22 @@ main(int argc, char **argv)
              ce = eina_hash_find(edf->collection, name1);\r
              if (!ce || (ce->id < 0))\r
                {\r
-                  printf("Failed to find group <%s> id\n", name1);\r
-                  return _edje_pick_cleanup(inp_files,\r
+                  EINA_LOG_ERR("Failed to find group <%s> id\n", name1);\r
+                  return _edje_pick_cleanup(inp_files, out_file,\r
                                             EDJE_PICK_GROUP_NOT_FOUND);\r
                }\r
 \r
-             VERBOSE(printf("Copy group: <%s>\n", name1));\r
-\r
-             /* FIXME: share code with edje_cache.c */\r
-             { /**  MEMPOOL ALLOC START *****************/\r
-                char *buffer;\r
-#define INIT_EMP(Tp, Sz, Ce)                                           \\r
-                buffer = alloca(strlen(ce->entry) + strlen(#Tp) + 2);  \\r
-                sprintf(buffer, "%s/%s", ce->entry, #Tp);               \\r
-                Ce->mp.Tp = eina_mempool_add("one_big", buffer, NULL, sizeof (Sz), Ce->count.Tp); \\r
-                _emp_##Tp = Ce->mp.Tp;\r
-\r
-#define INIT_EMP_BOTH(Tp, Sz, Ce)                                       \\r
-                INIT_EMP(Tp, Sz, Ce)\r
-\r
-                INIT_EMP_BOTH(RECTANGLE, Edje_Part_Description_Common, ce);\r
-                INIT_EMP_BOTH(TEXT, Edje_Part_Description_Text, ce);\r
-                INIT_EMP_BOTH(IMAGE, Edje_Part_Description_Image, ce);\r
-                INIT_EMP_BOTH(PROXY, Edje_Part_Description_Proxy, ce);\r
-                INIT_EMP_BOTH(SWALLOW, Edje_Part_Description_Common, ce);\r
-                INIT_EMP_BOTH(TEXTBLOCK, Edje_Part_Description_Text, ce);\r
-                INIT_EMP_BOTH(GROUP, Edje_Part_Description_Common, ce);\r
-                INIT_EMP_BOTH(BOX, Edje_Part_Description_Box, ce);\r
-                INIT_EMP_BOTH(TABLE, Edje_Part_Description_Table, ce);\r
-                INIT_EMP_BOTH(EXTERNAL, Edje_Part_Description_External, ce);\r
-                INIT_EMP_BOTH(SPACER, Edje_Part_Description_Common, ce);\r
-                INIT_EMP(part, Edje_Part, ce);\r
-             } /**  MEMPOOL ALLOC END *******************/\r
+             VERBOSE(EINA_LOG_INFO("Copy group: <%s>\n", name1));\r
+\r
+             edje_cache_emp_alloc(ce);\r
 \r
              snprintf(buf, sizeof(buf), "edje/collections/%i", ce->id);\r
-             printf("Trying to read group <%s>\n", buf);\r
+             EINA_LOG_INFO("Trying to read group <%s>\n", buf);\r
              edc = eet_data_read(edf->ef, _edje_edd_edje_part_collection, buf);\r
              if (!edc)\r
                {\r
-                  printf("Failed to read group <%s> id <%d>\n", name1, ce->id);\r
-                  return _edje_pick_cleanup(inp_files,\r
+                  EINA_LOG_ERR("Failed to read group <%s> id <%d>\n", name1, ce->id);\r
+                  return _edje_pick_cleanup(inp_files, out_file,\r
                                             EDJE_PICK_GROUP_NOT_FOUND);\r
                }\r
 \r
@@ -1146,10 +1254,11 @@ main(int argc, char **argv)
                 bytes = eet_data_write(out_file->ef,\r
                                        _edje_edd_edje_part_collection,\r
                                        buf, edc, comp_mode);\r
-                printf("Wrote <%d> bytes for group <%s>\n", bytes,buf);\r
+                EINA_LOG_INFO("Wrote <%d> bytes for group <%s>\n", bytes,buf);\r
              }\r
 \r
              free(edc);\r
+             edje_cache_emp_free(ce);\r
              eet_close(ef);\r
           }\r
 \r
@@ -1172,7 +1281,7 @@ main(int argc, char **argv)
              /* Write Scripts */\r
              snprintf(buf, sizeof(buf),\r
                       "edje/scripts/embryo/compiled/%i", s->id.new_id);\r
-             VERBOSE(printf("wrote embryo scr <%s> data <%p> size <%d>\n",\r
+             VERBOSE(EINA_LOG_INFO("wrote embryo scr <%s> data <%p> size <%d>\n",\r
                             buf, s->data, s->size));\r
              eet_write(out_file->ef, buf, s->data, s->size, comp_mode);\r
           }\r
@@ -1182,7 +1291,7 @@ main(int argc, char **argv)
              /* Write Lua Scripts */\r
              snprintf(buf, sizeof(buf),\r
                       "edje/scripts/lua/%i", s->id.new_id);\r
-             VERBOSE(printf("wrote lua scr <%s> data <%p> size <%d>\n",\r
+             VERBOSE(EINA_LOG_INFO("wrote lua scr <%s> data <%p> size <%d>\n",\r
                             buf, s->data, s->size));\r
              eet_write(out_file->ef, buf, s->data, s->size, comp_mode);\r
           }\r
@@ -1193,31 +1302,12 @@ main(int argc, char **argv)
           {\r
              if (context.current_file->append || s->id.used)\r
                {\r
-                  images = eina_list_append(images, s->entry);\r
-\r
-\r
                   snprintf(buf, sizeof(buf), "edje/images/%i", s->id.new_id);\r
                   eet_write(out_file->ef, buf, s->data, s->size, EINA_TRUE);\r
-                  VERBOSE(printf("Wrote <%s> image data <%p> size <%d>\n",\r
-                                 buf, s->data, s->size));\r
+                  VERBOSE(EINA_LOG_INFO("Wrote <%s> image data <%p> size <%d>\n", buf, s->data, s->size));\r
                }\r
           }\r
 \r
-        if (edf->image_dir && edf->image_dir->sets_count)\r
-          {\r
-             /* Update sets from current file sets */\r
-             sets = realloc(sets,\r
-                            (edf->image_dir->sets_count + sets_count)\r
-                            * sizeof(Edje_Image_Directory_Set));\r
-\r
-             memcpy(&sets[sets_count],\r
-                    edf->image_dir->sets,\r
-                    edf->image_dir->sets_count *\r
-                    sizeof(Edje_Image_Directory_Set));\r
-\r
-             sets_count += edf->image_dir->sets_count;\r
-          }\r
-\r
         EINA_LIST_FOREACH(context.current_file->samplelist, l, s)\r
           {\r
              if (context.current_file->append || s->id.used)\r
@@ -1228,7 +1318,7 @@ main(int argc, char **argv)
                            s->id.new_id);\r
                   eet_write(out_file->ef, buf,\r
                             s->data, s->size,EINA_TRUE);\r
-                  VERBOSE(printf("Wrote <%s> sample data <%p> size <%d>\n",\r
+                  VERBOSE(EINA_LOG_INFO("Wrote <%s> sample data <%p> size <%d>\n",\r
                                  buf, s->data, s->size));\r
                }\r
           }\r
@@ -1240,35 +1330,13 @@ main(int argc, char **argv)
           }\r
      }\r
 \r
-   /* Add all files images to out_file image_dir */\r
-   _edje_pick_image_dir_compose(images, sets, sets_count, out_file);\r
    _edje_pick_sound_dir_compose(samples, tones, out_file);\r
 \r
-   if (out_file->image_dir)\r
-     {\r
-        /* Fix sets IDs */\r
-        unsigned int j, i;\r
-        Edje_Image_Directory_Set *p;\r
-\r
-        for (j = 0; j < out_file->image_dir->sets_count; ++j)\r
-          {\r
-             p = &out_file->image_dir->sets[k];\r
-\r
-             for (i = 0; i < out_file->image_dir->entries_count; ++i)\r
-               if (!strcmp(out_file->image_dir->entries[i].entry, p->name))\r
-                 {\r
-                    p->id = i;\r
-                    break;\r
-                 }\r
-          }\r
-\r
-     }\r
-\r
    /* Write file header after processing all groups */\r
    bytes = eet_data_write(out_file->ef, _edje_edd_edje_file, "edje/file",\r
                           out_file, comp_mode);\r
 \r
-   VERBOSE(printf("Wrote <%d> bytes for file header.\n", bytes));\r
+   VERBOSE(EINA_LOG_INFO("Wrote <%d> bytes for file header.\n", bytes));\r
 \r
    eina_list_free(images);\r
    eina_list_free(samples);\r
@@ -1285,29 +1353,14 @@ main(int argc, char **argv)
      }\r
 \r
    {\r
-      /* FIXME: share code with other bin */\r
       /* Write Fonts from all files */\r
-      Eet_Data_Descriptor_Class eddc;\r
       Eet_Data_Descriptor *_font_list_edd = NULL;\r
       Eet_Data_Descriptor *_font_edd;\r
 \r
-      eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),\r
-                                                "font", sizeof (Font));\r
-\r
-      _font_edd = eet_data_descriptor_stream_new(&eddc);\r
-      EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font,\r
-                                    "file", file, EET_T_INLINED_STRING);\r
-      EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font,\r
-                                    "name", name, EET_T_INLINED_STRING);\r
-\r
-      eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),\r
-                                                "font_list", sizeof (Font_List));\r
-      _font_list_edd = eet_data_descriptor_stream_new(&eddc);\r
-      EET_DATA_DESCRIPTOR_ADD_LIST(_font_list_edd, Font_List,\r
-                                   "list", list, _font_edd);\r
+      _edje_data_font_list_desc_make(&_font_list_edd, &_font_edd);\r
       bytes = eet_data_write(out_file->ef, _font_list_edd,\r
                              "edje_source_fontmap", fl, comp_mode);\r
-      VERBOSE(printf("Wrote <%d> bytes for fontmap.\n", bytes));\r
+      VERBOSE(EINA_LOG_INFO("Wrote <%d> bytes for fontmap.\n", bytes));\r
 \r
       eet_data_descriptor_free(_font_list_edd);\r
       eet_data_descriptor_free(_font_edd);\r
@@ -1318,45 +1371,6 @@ main(int argc, char **argv)
      free(sets);\r
 \r
    printf("Wrote <%s> output file.\n", output_filename);\r
-   if (out_file)\r
-     {\r
-        /* Free output file memory allocation */\r
-        if (out_file->ef)\r
-          eet_close(out_file->ef);\r
-\r
-        if (out_file->external_dir)\r
-          {\r
-             if (out_file->external_dir->entries)\r
-               free(out_file->external_dir->entries);\r
-\r
-             free(out_file->external_dir);\r
-          }\r
-\r
-        if (out_file->image_dir)\r
-          {\r
-             if (out_file->image_dir->entries)\r
-               free(out_file->image_dir->entries);\r
-\r
-             free(out_file->image_dir);\r
-          }\r
-\r
-        if (out_file->sound_dir)\r
-          {\r
-             if (out_file->sound_dir->samples)\r
-               free(out_file->sound_dir->samples);\r
-\r
-             if (out_file->sound_dir->tones)\r
-               free(out_file->sound_dir->tones);\r
-\r
-             free(out_file->sound_dir);\r
-          }\r
-\r
-        eina_list_free(out_file->color_classes);\r
-        eina_hash_free_cb_set(out_file->collection, free);\r
-        eina_hash_free(out_file->collection);\r
-        eina_stringshare_del(out_file->compiler);\r
-        free(out_file);\r
-     }\r
 \r
-   return _edje_pick_cleanup(inp_files, EDJE_PICK_NO_ERROR);\r
+   return _edje_pick_cleanup(inp_files, out_file, EDJE_PICK_NO_ERROR);\r
 }\r
index 636bf36..26fc6e5 100644 (file)
@@ -7,6 +7,68 @@ static Eina_List   *_edje_file_cache = NULL;
 
 static int          _edje_collection_cache_size = 16;
 
+EAPI void
+edje_cache_emp_alloc(Edje_Part_Collection_Directory_Entry *ce)
+{  /* Init Eina Mempools this is also used in edje_pick.c */
+   char *buffer;
+#define INIT_EMP(Tp, Sz, Ce)                                           \
+   buffer = alloca(strlen(ce->entry) + strlen(#Tp) + 2);               \
+   sprintf(buffer, "%s/%s", ce->entry, #Tp);                           \
+   Ce->mp.Tp = eina_mempool_add("one_big", buffer, NULL, sizeof (Sz), Ce->count.Tp); \
+   _emp_##Tp = Ce->mp.Tp;
+
+#define INIT_EMP_BOTH(Tp, Sz, Ce)                                       \
+   INIT_EMP(Tp, Sz, Ce)                                                 \
+   Ce->mp_rtl.Tp = eina_mempool_add("one_big", buffer, NULL,            \
+         sizeof (Sz), Ce->count.Tp);
+
+   INIT_EMP_BOTH(RECTANGLE, Edje_Part_Description_Common, ce);
+   INIT_EMP_BOTH(TEXT, Edje_Part_Description_Text, ce);
+   INIT_EMP_BOTH(IMAGE, Edje_Part_Description_Image, ce);
+   INIT_EMP_BOTH(PROXY, Edje_Part_Description_Proxy, ce);
+   INIT_EMP_BOTH(SWALLOW, Edje_Part_Description_Common, ce);
+   INIT_EMP_BOTH(TEXTBLOCK, Edje_Part_Description_Text, ce);
+   INIT_EMP_BOTH(GROUP, Edje_Part_Description_Common, ce);
+   INIT_EMP_BOTH(BOX, Edje_Part_Description_Box, ce);
+   INIT_EMP_BOTH(TABLE, Edje_Part_Description_Table, ce);
+   INIT_EMP_BOTH(EXTERNAL, Edje_Part_Description_External, ce);
+   INIT_EMP_BOTH(SPACER, Edje_Part_Description_Common, ce);
+   INIT_EMP(part, Edje_Part, ce);
+}
+
+EAPI void
+edje_cache_emp_free(Edje_Part_Collection_Directory_Entry *ce)
+{  /* Free Eina Mempools this is also used in edje_pick.c */
+   /* 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.PROXY);
+   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.SPACER);
+   eina_mempool_del(ce->mp.part);
+   memset(&ce->mp, 0, sizeof (ce->mp));
+
+   eina_mempool_del(ce->mp_rtl.RECTANGLE);
+   eina_mempool_del(ce->mp_rtl.TEXT);
+   eina_mempool_del(ce->mp_rtl.IMAGE);
+   eina_mempool_del(ce->mp_rtl.PROXY);
+   eina_mempool_del(ce->mp_rtl.SWALLOW);
+   eina_mempool_del(ce->mp_rtl.TEXTBLOCK);
+   eina_mempool_del(ce->mp_rtl.GROUP);
+   eina_mempool_del(ce->mp_rtl.BOX);
+   eina_mempool_del(ce->mp_rtl.TABLE);
+   eina_mempool_del(ce->mp_rtl.EXTERNAL);
+   eina_mempool_del(ce->mp_rtl.SPACER);
+   memset(&ce->mp_rtl, 0, sizeof (ce->mp_rtl));
+   ce->ref = NULL;
+}
+
 static Edje_Part_Collection *
 _edje_file_coll_open(Edje_File *edf, const char *coll)
 {
@@ -15,7 +77,6 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    int id = -1, size = 0;
    Eina_List *l;
    char buf[256];
-   char *buffer;
    void *data;
 
    ce = eina_hash_find(edf->collection, coll);
@@ -42,30 +103,7 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    id = ce->id;
    if (id < 0) return NULL;
 
-#define INIT_EMP(Tp, Sz, Ce)                                           \
-   buffer = alloca(strlen(ce->entry) + strlen(#Tp) + 2);               \
-   sprintf(buffer, "%s/%s", ce->entry, #Tp);                           \
-   Ce->mp.Tp = eina_mempool_add("one_big", buffer, NULL, sizeof (Sz), Ce->count.Tp); \
-   _emp_##Tp = Ce->mp.Tp;
-
-#define INIT_EMP_BOTH(Tp, Sz, Ce)                                       \
-   INIT_EMP(Tp, Sz, Ce)                                                 \
-   Ce->mp_rtl.Tp = eina_mempool_add("one_big", buffer, NULL,            \
-         sizeof (Sz), Ce->count.Tp);
-
-   INIT_EMP_BOTH(RECTANGLE, Edje_Part_Description_Common, ce);
-   INIT_EMP_BOTH(TEXT, Edje_Part_Description_Text, ce);
-   INIT_EMP_BOTH(IMAGE, Edje_Part_Description_Image, ce);
-   INIT_EMP_BOTH(PROXY, Edje_Part_Description_Proxy, ce);
-   INIT_EMP_BOTH(SWALLOW, Edje_Part_Description_Common, ce);
-   INIT_EMP_BOTH(TEXTBLOCK, Edje_Part_Description_Text, ce);
-   INIT_EMP_BOTH(GROUP, Edje_Part_Description_Common, ce);
-   INIT_EMP_BOTH(BOX, Edje_Part_Description_Box, ce);
-   INIT_EMP_BOTH(TABLE, Edje_Part_Description_Table, ce);
-   INIT_EMP_BOTH(EXTERNAL, Edje_Part_Description_External, ce);
-   INIT_EMP_BOTH(SPACER, Edje_Part_Description_Common, ce);
-   INIT_EMP(part, Edje_Part, ce);
-
+   edje_cache_emp_alloc(ce);
    snprintf(buf, sizeof(buf), "edje/collections/%i", id);
    edc = eet_data_read(edf->ef, _edje_edd_edje_part_collection, buf);
    if (!edc) return NULL;
index b30f5c0..f6a000e 100644 (file)
@@ -1,3 +1,4 @@
+#include "edje_cc.h"  /* For struct Font */
 #include "edje_private.h"
 
 EAPI Eet_Data_Descriptor *_edje_edd_edje_file = NULL;
@@ -949,3 +950,24 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "physics_enabled", physics_enabled, EET_T_UCHAR);
 #endif
 }
+
+EAPI void
+_edje_data_font_list_desc_make(Eet_Data_Descriptor **_font_list_edd,
+      Eet_Data_Descriptor **_font_edd)
+{  /* User have to free: _font_list_edd, _font_edd */
+   Eet_Data_Descriptor_Class eddc;
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),
+                                             "font", sizeof (Font));
+   *_font_edd = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(*_font_edd, Font,
+                                 "file", file, EET_T_INLINED_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(*_font_edd, Font,
+                                 "name", name, EET_T_INLINED_STRING);
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc),
+                                             "font_list", sizeof (Font_List));
+   *_font_list_edd = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_LIST(*_font_list_edd, Font_List,
+                                "list", list, *_font_edd);
+}
index 05b52e0..ececce6 100644 (file)
@@ -1638,34 +1638,8 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec, Edje_Part_Collec
    eina_hash_free(ec->aliased);
 
    /* 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.PROXY);
-   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.SPACER);
-   eina_mempool_del(ce->mp.part);
-   memset(&ce->mp, 0, sizeof (ce->mp));
-
-   eina_mempool_del(ce->mp_rtl.RECTANGLE);
-   eina_mempool_del(ce->mp_rtl.TEXT);
-   eina_mempool_del(ce->mp_rtl.IMAGE);
-   eina_mempool_del(ce->mp_rtl.PROXY);
-   eina_mempool_del(ce->mp_rtl.SWALLOW);
-   eina_mempool_del(ce->mp_rtl.TEXTBLOCK);
-   eina_mempool_del(ce->mp_rtl.GROUP);
-   eina_mempool_del(ce->mp_rtl.BOX);
-   eina_mempool_del(ce->mp_rtl.TABLE);
-   eina_mempool_del(ce->mp_rtl.EXTERNAL);
-   eina_mempool_del(ce->mp_rtl.SPACER);
-   memset(&ce->mp_rtl, 0, sizeof (ce->mp_rtl));
+   edje_cache_emp_free(ce);
    free(ec);
-   ce->ref = NULL;
 }
 
 void
index fe7fcec..40e80c3 100644 (file)
@@ -1731,8 +1731,9 @@ const Eina_Array *edje_match_signal_source_hash_get(const char *signal,
                                                    const Eina_Rbtree *tree);
 void edje_match_signal_source_free(Edje_Signal_Source_Char *key, void *data);
 
-// FIXME remove below 2 eapi decls when edje_convert goes
+// FIXME remove below 3 eapi decls when edje_convert goes
 EAPI void _edje_edd_init(void);
+EAPI void _edje_data_font_list_desc_make(Eet_Data_Descriptor **_font_list_edd, Eet_Data_Descriptor **_font_edd);
 EAPI void _edje_edd_shutdown(void);
 
 EAPI extern Eet_Data_Descriptor *_edje_edd_edje_file;
@@ -1967,6 +1968,8 @@ Edje_File *_edje_cache_file_coll_open(const char *file, const char *coll, int *e
 void _edje_cache_coll_clean(Edje_File *edf);
 void _edje_cache_coll_flush(Edje_File *edf);
 void _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc);
+EAPI void edje_cache_emp_alloc(Edje_Part_Collection_Directory_Entry *ce);
+EAPI void edje_cache_emp_free(Edje_Part_Collection_Directory_Entry *ce);
 EAPI void _edje_cache_file_unref(Edje_File *edf);
 
 void _edje_embryo_globals_init(Edje *ed);