jaehwan pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=65b7ab95bc5eb0da3a982dc44d2dbce2f092b097

commit 65b7ab95bc5eb0da3a982dc44d2dbce2f092b097
Author: Jaehwan Kim <jae.hwan....@samsung.com>
Date:   Fri Dec 23 13:10:14 2016 +0900

    edje_pick: add vector resources into the output file.
---
 src/bin/edje/edje_pick.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 129 insertions(+), 1 deletion(-)

diff --git a/src/bin/edje/edje_pick.c b/src/bin/edje/edje_pick.c
index b856115..c7d41f6 100644
--- a/src/bin/edje/edje_pick.c
+++ b/src/bin/edje/edje_pick.c
@@ -64,6 +64,7 @@ struct _Edje_Pick_File_Params
    Eina_List *luascriptlist;
    Eina_List *imagelist;
    Eina_List *imagesetlist;  /* List of IDs (Edje_Pick_Data) for image sets */
+   Eina_List *vectorlist;
    Eina_List *samplelist;
    Eina_List *tonelist;
    Eina_List *vibrationlist;
@@ -238,6 +239,9 @@ _edje_pick_cleanup(Eina_List *ifs, Edje_File *out_file, 
Edje_Pick_Status s)
         _edje_pick_data_free(p->imagelist);
         p->imagelist = NULL;
 
+        _edje_pick_data_free(p->vectorlist);
+        p->vectorlist = NULL;
+
         _edje_pick_data_free(p->imagesetlist);
         p->imagesetlist = NULL;
 
@@ -861,7 +865,7 @@ _edje_pick_images_copy(Edje_File *edf, Edje_File *o)
    int old_id;
    Eina_Bool status = EDJE_PICK_NO_ERROR;
    Eina_List *l, *l1;
-   Edje_Pick_Data *image, *set;
+   Edje_Pick_Data *image, *set, *vector;
 
    if (edf->image_dir)
      {
@@ -934,6 +938,38 @@ _edje_pick_images_copy(Edje_File *edf, Edje_File *o)
                     }
                }
           }
+
+        if (edf->image_dir->vectors)
+          {  /* Copy vector dir entries of current file */
+             Edje_Vector_Directory_Entry *vectors = NULL;
+
+             EINA_LIST_FOREACH(context.current_file->vectorlist, l, vector)
+               {
+                  if (vector->id.used)
+                    {
+                       o->image_dir->vectors_count += 1;
+
+                       /* alloc mem first time  or  re-allocate again (bigger 
array) */
+                       vectors = realloc(o->image_dir->vectors,
+                                         o->image_dir->vectors_count *
+                                         sizeof(Edje_Vector_Directory_Entry));
+                       if (!vectors)
+                         {
+                            EINA_LOG_ERR("Out of memory in realloc()");
+                            return EDJE_PICK_IMAGE_NOT_FOUND;
+                         }
+                       o->image_dir->vectors = vectors;
+
+                       old_id = _edje_pick_image_old_id_get(
+                         context.current_file->vectorlist, 
o->image_dir->vectors_count - 1);
+                       /* Concatinate current file vectors to re-allocaed 
array */
+                       
memcpy(&o->image_dir->vectors[o->image_dir->vectors_count - 1],
+                              &edf->image_dir->vectors[old_id],
+                              sizeof(Edje_Vector_Directory_Entry));
+                       o->image_dir->vectors[o->image_dir->vectors_count - 
1].id = vector->id.new_id;
+                    }
+               }
+          }
      }
 
    return status;
@@ -1267,6 +1303,68 @@ _edje_pick_image_set_add(int id, Edje_File *edf, 
Edje_File *o)
    return current_set_id;
 }
 
+static int
+_edje_pick_vector_entry_add(int id, Edje_File *edf, Edje_File *o)
+{
+   char buf[1024];
+   int size;
+   void *data;
+   static int current_vg_id = -1;
+
+   int new_id = _edje_pick_image_new_id_get(context.current_file->vectorlist, 
id);
+   if (new_id >= 0) return new_id;
+
+   if (edf->image_dir)
+     {
+        if (!o->image_dir)  /* First time only */
+          o->image_dir = calloc(1, sizeof(*(o->image_dir)));
+
+        if (edf->image_dir->vectors)
+          { /* Copy Vectors */
+             Edje_Vector_Directory_Entry *vg = &edf->image_dir->vectors[id];
+
+             snprintf(buf, sizeof(buf), "edje/vectors/%i", vg->id);
+             VERBOSE(EINA_LOG_INFO("Trying to read <%s>\n", vg->entry));
+             data = eet_read(edf->ef, buf, &size);
+             if (size)
+               {  /* Advance vector ID and register this in vectorlist */
+                  current_vg_id++;
+                  Edje_Pick_Data *vector = malloc(sizeof(*vector));
+
+                  vector->filename = eina_stringshare_add(vg->entry);
+                  vector->data = data;
+                  vector->size = size;
+                  vector->entry = (void *) vg;  /* for output file vector dir 
*/
+                  vector->id.old_id = vg->id;
+                  vg->id = vector->id.new_id = current_vg_id;
+                  vector->id.used = EINA_TRUE;
+
+                  VERBOSE(EINA_LOG_INFO("Read vector <%s> data <%p> size <%d>, 
new_id : %d\n",
+                                        buf, vector->data, vector->size, 
vector->id.new_id));
+
+                  context.current_file->vectorlist = eina_list_append(
+                    context.current_file->vectorlist, vector);
+               }
+             else
+               {
+                  if (vg->entry)
+                    {
+                       EINA_LOG_ERR("Vector <%s> was not found in <%s> 
file.\n",
+                                    vg->entry , context.current_file->name);
+                    }
+                  else
+                    {
+                       EINA_LOG_ERR("Vector entry <%s> was not found in <%s> 
file.\n", buf , context.current_file->name);
+                    }
+                  /* Should that really be freed? Or is some other handling 
needed? */
+                  free(data);
+               }
+          }
+     }
+
+   return current_vg_id;
+}
+
 static void
 _edje_pick_images_desc_update(Edje_Part_Description_Image *desc, Edje_File 
*edf, Edje_File *o)
 {
@@ -1292,6 +1390,18 @@ 
_edje_pick_images_desc_update(Edje_Part_Description_Image *desc, Edje_File *edf,
 }
 
 static void
+_edje_pick_vectors_desc_update(Edje_Part_Description_Vector *desc, Edje_File 
*edf, Edje_File *o)
+{
+   /* Update all IDs of vectors in descs */
+   if (desc)
+     {
+        int new_id = _edje_pick_vector_entry_add(desc->vg.id, edf, o);
+
+        desc->vg.id = new_id;
+     }
+}
+
+static void
 _edje_pick_styles_desc_update(Edje_Part_Description_Text *desc, Edje_File 
*edf, Edje_File *o)
 {
    Eina_List *l;
@@ -1357,6 +1467,14 @@ _edje_pick_resources_process(Edje_Part_Collection *edc, 
Edje_File *edf, Edje_Fil
              for (k = 0; k < part->other.desc_count; k++)
                _edje_pick_images_desc_update((Edje_Part_Description_Image *) 
part->other.desc[k], edf, o);
           }
+        else if (part->type == EDJE_PART_TYPE_VECTOR)
+          {
+             /* Update IDs of all vectors in ALL descs of this part */
+             _edje_pick_vectors_desc_update((Edje_Part_Description_Vector *) 
part->default_desc, edf, o);
+
+             for (k = 0; k < part->other.desc_count; k++)
+               _edje_pick_vectors_desc_update((Edje_Part_Description_Vector *) 
part->other.desc[k], edf, o);
+          }
         else if (part->type == EDJE_PART_TYPE_TEXT || part->type == 
EDJE_PART_TYPE_TEXTBLOCK)
           {
              /* Update all styles in ALL descs of this part */
@@ -1697,6 +1815,16 @@ main(int argc, char **argv)
                }
           }
 
+        EINA_LIST_FOREACH(context.current_file->vectorlist, t, s)
+          {
+             if (context.current_file->append || s->id.used)
+               {
+                  snprintf(buf, sizeof(buf), "edje/vectors/%i", s->id.new_id);
+                  eet_write(out_file->ef, buf, s->data, s->size, EINA_TRUE);
+                  VERBOSE(EINA_LOG_INFO("Wrote <%s> vector data <%p> size 
<%d>\n", buf, s->data, s->size));
+               }
+          }
+
         EINA_LIST_FOREACH(context.current_file->samplelist, l, s)
           {
              if (context.current_file->append || s->id.used)

-- 


Reply via email to