edje_pick: add vector resources into the output file.

This commit is contained in:
Jaehwan Kim 2016-12-23 13:10:14 +09:00
parent 792acc9f9e
commit 65b7ab95bc
1 changed files with 129 additions and 1 deletions

View File

@ -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)
{
@ -1291,6 +1389,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)
{
@ -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)