On Mon, 17 Feb 2020 02:02:51 -0800 YoungBok Shin <id213...@gmail.com> said:
before we get too much further into this... just a naming and confusion thing. shouldn't we refer to this as little support, not json? yes - the actual encoding of data in lottie files is in json but it is not a generic thing. like svg is not referred to as "xml support". :) shouldn't we adapt the name of our loaders, config options and all of the docs and info to refer to this as lottie support as that's what it all really is? :) > hermet pushed a commit to branch master. > > http://git.enlightenment.org/core/efl.git/commit/?id=2fe158ce652860b2aa5a2e883e6b2beb0ee1c670 > > commit 2fe158ce652860b2aa5a2e883e6b2beb0ee1c670 > Author: YoungBok Shin <id213...@gmail.com> > Date: Mon Feb 17 18:59:09 2020 +0900 > > edje: add json file support feature > > Summary: > It also starts to support following new edc properties. > This is backported patch from Tizen 5.0 > > 1. frame > desc { "default" > vector { > frame: 0.5; // 0.0 ~ 1.0 > } > } > > 2. actions > program { "vector_animation"; > // VG_ANIM_PLAY, VG_ANIM_PLAY_BACK, VG_ANIM_LOOP, > // VG_ANIM_STOP, VG_ANIM_PAUSE, VG_ANIM_RESUME > action: VG_ANIM_PLAY; > target: "your_vector_part"; > } > > @feature > > Co-authored-by: Jaehyun Cho <jae_hyun....@samsung.com> > - Fix to remove Efl.Canvas.Animation_Player on edje > > Test Plan: > {F3840540} > {F3840542} > {F3840543} > make and test attached file > > edje_cc -beta -id ./ json_edc.edc json.edj > gcc -o test test_edc.c -g `pkg-config --cflags --libs evas elementary > rlottie` ./test > > Reviewers: Hermet, Jaehyun_Cho, id213sin > > Reviewed By: Hermet > > Subscribers: segfaultxavi, raster, cedric, #reviewers, #committers > > Tags: #efl > > Differential Revision: https://phab.enlightenment.org/D11228 > --- > src/bin/edje/edje_cc_handlers.c | 56 +++++++++++++++ > src/bin/edje/edje_cc_out.c | 51 +++++++++++--- > src/lib/edje/Edje_Common.h | 8 ++- > src/lib/edje/edje_calc.c | 150 +++++++++++++++++++++++++++++++++++++ > +-- src/lib/edje/edje_data.c | 3 + > src/lib/edje/edje_load.c | 20 ++++++ > src/lib/edje/edje_private.h | 32 ++++++++- > src/lib/edje/edje_program.c | 72 +++++++++++++++++++ > 8 files changed, 371 insertions(+), 21 deletions(-) > > diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c > index 6b7ec172e7..59a0f377a8 100644 > --- a/src/bin/edje/edje_cc_handlers.c > +++ b/src/bin/edje/edje_cc_handlers.c > @@ -516,6 +516,9 @@ static void > st_collections_group_parts_part_description_params_bool(void); static > void st_collections_group_parts_part_description_params_choice(void); > static void > st_collections_group_parts_part_description_params_smart(void); +/* vector > part parameter */ +static void > st_collections_group_parts_part_description_vector_frame(void); + > static void ob_collections_group_programs_program(void); > static void st_collections_group_programs_program_name(void); > static void st_collections_group_programs_program_signal(void); > @@ -1047,6 +1050,7 @@ New_Statement_Handler statement_handlers[] = > {"collections.group.parts.part.description.params.bool", > st_collections_group_parts_part_description_params_bool}, > {"collections.group.parts.part.description.params.choice", > st_collections_group_parts_part_description_params_choice}, > {"collections.group.parts.part.description.params.*", > st_collections_group_parts_part_description_params_smart}, > + {"collections.group.parts.part.description.vector.frame", > st_collections_group_parts_part_description_vector_frame}, > IMAGE_STATEMENTS("collections.group.parts.part.description.") { > "collections.group.parts.part.description.font", st_fonts_font > @@ -1590,6 +1594,7 @@ New_Object_Handler object_handlers[] = > {"collections.group.parts.part.description.map.zoom", NULL}, > {"collections.group.parts.part.description.perspective", NULL}, > {"collections.group.parts.part.description.params", NULL}, > + {"collections.group.parts.part.description.vector", NULL}, > {"collections.group.parts.part.description.color_classes", NULL}, /* > dup */ {"collections.group.parts.part.description.color_classes.color_class", > ob_color_class}, /* dup */ > {"collections.group.parts.part.description.text_classes", NULL}, /* dup */ > @@ -2545,6 +2550,7 @@ _handle_vector_image(void) { > ed->vg.set = EINA_TRUE; > ed->vg.id = edje_file->image_dir->vectors[i].id; > + ed->vg.type = edje_file->image_dir->vectors[i].type; > break; > } > } > @@ -2587,6 +2593,7 @@ st_images_vector(void) > Edje_Vector_Directory_Entry *vector; > const char *tmp; > unsigned int i; > + size_t entry_len; > > check_min_arg_count(1); > > @@ -2618,6 +2625,16 @@ st_images_vector(void) > > vector->entry = tmp; > vector->id = edje_file->image_dir->vectors_count - 1; > + > + entry_len = strlen(vector->entry); > + if ((entry_len > 5) && !strncmp(vector->entry + entry_len - 5, ".json", > 5)) > + { > + vector->type = EDJE_VECTOR_FILE_TYPE_JSON; > + } > + else > + { > + vector->type = EDJE_VECTOR_FILE_TYPE_SVG; > + } > } > > /** > @@ -8960,6 +8977,8 @@ > st_collections_group_parts_part_description_inherit(void) > Edje_Part_Description_Vector *iparent = (Edje_Part_Description_Vector > *)parent; ied->vg.set = iparent->vg.set; ied->vg.id = iparent->vg.id; > + ied->vg.type = iparent->vg.type; > + ied->vg.frame = iparent->vg.frame; > break; > } > } > @@ -15235,6 +15254,25 @@ > st_collections_group_parts_part_description_params_choice(void) > _st_collections_group_parts_part_description_params(EDJE_EXTERNAL_PARAM_TYPE_CHOICE); > } > > +static void > +st_collections_group_parts_part_description_vector_frame(void) > +{ > + Edje_Part_Description_Vector *ed; > + > + check_arg_count(1); > + > + if (current_part->type != EDJE_PART_TYPE_VECTOR) > + { > + ERR("parse error %s:%i. vector attributes in non-VECTOR part.", > + file_in, line - 1); > + exit(-1); > + } > + > + ed = (Edje_Part_Description_Vector *)current_desc; > + > + ed->vg.frame = parse_float_range(0, 0.0, 1.0); > +} > + > /** @edcsubsection{collections_group_parts_description_links, > * Group.Parts.Part.Description.Links} */ > > @@ -15747,6 +15785,12 @@ st_collections_group_programs_program_action(void) > "PHYSICS_STOP", EDJE_ACTION_TYPE_PHYSICS_STOP, > "PHYSICS_ROT_SET", > EDJE_ACTION_TYPE_PHYSICS_ROT_SET, "PLAY_VIBRATION", > EDJE_ACTION_TYPE_VIBRATION_SAMPLE, > + "VG_ANIM_STOP", EDJE_ACTION_TYPE_VG_ANIM_STOP, > + "VG_ANIM_PAUSE", EDJE_ACTION_TYPE_VG_ANIM_PAUSE, > + "VG_ANIM_RESUME", EDJE_ACTION_TYPE_VG_ANIM_RESUME, > + "VG_ANIM_PLAY", EDJE_ACTION_TYPE_VG_ANIM_PLAY, > + "VG_ANIM_PLAY_BACK", > EDJE_ACTION_TYPE_VG_ANIM_REWIND, > + "VG_ANIM_LOOP", EDJE_ACTION_TYPE_VG_ANIM_LOOP, > NULL); > if (ep->action == EDJE_ACTION_TYPE_STATE_SET) > { > @@ -15908,6 +15952,12 @@ st_collections_group_programs_program_action(void) > case EDJE_ACTION_TYPE_ACTION_STOP: > case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR: > case EDJE_ACTION_TYPE_PHYSICS_STOP: > + case EDJE_ACTION_TYPE_VG_ANIM_STOP: > + case EDJE_ACTION_TYPE_VG_ANIM_PAUSE: > + case EDJE_ACTION_TYPE_VG_ANIM_RESUME: > + case EDJE_ACTION_TYPE_VG_ANIM_PLAY: > + case EDJE_ACTION_TYPE_VG_ANIM_REWIND: > + case EDJE_ACTION_TYPE_VG_ANIM_LOOP: > check_arg_count(1); > break; > > @@ -16187,6 +16237,12 @@ _program_target_add(char *name) > case EDJE_ACTION_TYPE_PHYSICS_STOP: > case EDJE_ACTION_TYPE_PHYSICS_ROT_SET: > #endif > + case EDJE_ACTION_TYPE_VG_ANIM_STOP: > + case EDJE_ACTION_TYPE_VG_ANIM_PAUSE: > + case EDJE_ACTION_TYPE_VG_ANIM_RESUME: > + case EDJE_ACTION_TYPE_VG_ANIM_PLAY: > + case EDJE_ACTION_TYPE_VG_ANIM_REWIND: > + case EDJE_ACTION_TYPE_VG_ANIM_LOOP: > data_queue_part_lookup(pc, name, &(et->id)); > break; > > diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c > index f932eac9e9..4c192efe6e 100644 > --- a/src/bin/edje/edje_cc_out.c > +++ b/src/bin/edje/edje_cc_out.c > @@ -1428,19 +1428,48 @@ data_write_vectors(Eet_File *ef, int *vector_num) > if (!f) continue; > eina_file_close(f); > > - if (efl_file_set(vg, eina_strbuf_string_get(buf))) > - error_and_abort(ef, "Failed to parse svg : %s", > vector->entry); > - if (efl_file_load(vg)) > - error_and_abort(ef, "Failed to parse svg : %s", > vector->entry); > + if (vector->type == EDJE_VECTOR_FILE_TYPE_JSON) > + { > + char *json_data = NULL; > + int json_data_len = 0; > > - eina_strbuf_reset(buf); > - eina_strbuf_append_printf(buf, "edje/vectors/%i", vector->id); > - if (!efl_file_save(vg, eet_file_get(ef), > eina_strbuf_string_get(buf), NULL)) > - error_and_abort(ef, "Failed to write data in Eet for svg : > %s", vector->entry); > + f = eina_file_open(eina_strbuf_string_get(buf), > EINA_FALSE); > + if (!f) continue; > > - *vector_num += 1; > - found = EINA_TRUE; > - break; > + json_data_len = (int) eina_file_size_get(f); > + json_data = eina_file_map_all(f, EINA_FILE_POPULATE); > + > + eina_strbuf_reset(buf); > + eina_strbuf_append_printf(buf, "edje/vectors/%i", > vector->id); > + eet_write(ef, eina_strbuf_string_get(buf), json_data, > json_data_len, EET_COMPRESSION_NONE); + > + eina_file_map_free(f, json_data); > + eina_file_close(f); > + > + *vector_num += 1; > + found = EINA_TRUE; > + break; > + } > + else > + { > + f = eina_file_open(eina_strbuf_string_get(buf), > EINA_FALSE); > + if (!f) continue; > + eina_file_close(f); > + > + if (efl_file_set(vg, eina_strbuf_string_get(buf))) > + error_and_abort(ef, "Failed to parse svg : %s", > vector->entry); > + if (efl_file_load(vg)) > + error_and_abort(ef, "Failed to parse svg : %s", > vector->entry); + > + eina_strbuf_reset(buf); > + eina_strbuf_append_printf(buf, "edje/vectors/%i", > vector->id); > + if (!efl_file_save(vg, eet_file_get(ef), > eina_strbuf_string_get(buf), NULL)) > + error_and_abort(ef, "Failed to write data in Eet for > svg :%s", vector->entry); + > + *vector_num += 1; > + found = EINA_TRUE; > + break; > + } > } > if (!found) > error_and_abort(ef, "Unable to find the svg :%s", vector->entry); > diff --git a/src/lib/edje/Edje_Common.h b/src/lib/edje/Edje_Common.h > index 22aa8e667a..be752343ab 100644 > --- a/src/lib/edje/Edje_Common.h > +++ b/src/lib/edje/Edje_Common.h > @@ -1952,7 +1952,13 @@ typedef enum _Edje_Action_Type > EDJE_ACTION_TYPE_PHYSICS_ROT_SET = 23, /**< @since 1.8 @brief > Physics rotation set action value */ > EDJE_ACTION_TYPE_VIBRATION_SAMPLE = 24, /**< @since 1.10 @brief > vibration sample action value */ EDJE_ACTION_TYPE_MO = > 25, /**< @since 1.15 @brief Mo action value */ > - EDJE_ACTION_TYPE_LAST = 26 /**< Last action value */ > + EDJE_ACTION_TYPE_VG_ANIM_STOP, > + EDJE_ACTION_TYPE_VG_ANIM_PAUSE, > + EDJE_ACTION_TYPE_VG_ANIM_RESUME, > + EDJE_ACTION_TYPE_VG_ANIM_PLAY, > + EDJE_ACTION_TYPE_VG_ANIM_REWIND, > + EDJE_ACTION_TYPE_VG_ANIM_LOOP, > + EDJE_ACTION_TYPE_LAST = 32 /**< Last action value */ > } Edje_Action_Type; > > /** > diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c > index 4c11f6ab4e..eba505b721 100644 > --- a/src/lib/edje/edje_calc.c > +++ b/src/lib/edje/edje_calc.c > @@ -3280,34 +3280,133 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part > *ep, Edje_Calc_Params *p3, Edj } > > static void > -_edje_svg_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 > EINA_UNUSED, Edje_Part_Description_Vector *chosen_desc, FLOAT_T pos) > +_edje_vector_animation_running_cb(void *data, const Efl_Event *event) { > - int new_svg = -1; //invalid svg > + double pos = *((double*)event->info); > + Edje_Real_Part *ep = (Edje_Real_Part *)data; > + int frame, frame_count; > + > + frame_count = efl_gfx_frame_controller_frame_count_get(ep->object) - 1; > + if (frame_count < 0) frame_count = 0; > + > + if (ep->typedata.vector->backward) > + frame = ep->typedata.vector->start_frame - (int) (frame_count * pos); > + else > + frame = ep->typedata.vector->start_frame + (int) (frame_count * pos); > + > + efl_gfx_frame_controller_frame_set(ep->object, frame); > + > + if ((ep->typedata.vector->backward && (frame <= 0)) || > + (!ep->typedata.vector->backward && (frame >= frame_count))) > + { > + if (ep->typedata.vector->loop) > + { > + if (ep->typedata.vector->backward) > + ep->typedata.vector->start_frame = frame_count; > + else > + ep->typedata.vector->start_frame = 0; > + > + efl_canvas_object_animation_start(ep->object, > + ep->typedata.vector->anim, > + 1.0, 0.0); > + } > + else > + { > + efl_canvas_object_animation_stop(ep->object); > + } > + } > +} > + > +static void > +_edje_vector_load_json(Edje *ed, Edje_Real_Part *ep, const char *key) > +{ > + Edje_Part_Description_Vector *desc = (Edje_Part_Description_Vector > *)ep->chosen_description; > + Eina_File *file; > + char *json_data; > + double frame_duration; > + int json_data_len = 0; > + int frame_count; > + > + if (ep->typedata.vector->anim == NULL) > + { > + Eo *anim = efl_add(EFL_CANVAS_ANIMATION_CLASS, ed->base.evas); > + ep->typedata.vector->anim = anim; > + efl_event_callback_add(ep->object, > + > EFL_CANVAS_OBJECT_ANIMATION_EVENT_ANIMATION_PROGRESS_UPDATED, > + _edje_vector_animation_running_cb, ep); > + } > + > + if (ep->typedata.vector->current_id != desc->vg.id) > + { > + json_data = (char *)eet_read(ed->file->ef, key, &json_data_len); > + json_data[json_data_len] = '\0'; > + file = eina_file_virtualize(NULL, json_data, json_data_len + 1, > EINA_FALSE); > + efl_file_simple_mmap_load(ep->object, file, NULL); > + > + if (ep->typedata.vector->json_virtual_file) > + eina_file_close(ep->typedata.vector->json_virtual_file); > + ep->typedata.vector->json_virtual_file = file; > + > + if (ep->typedata.vector->json_data) > + free(ep->typedata.vector->json_data); > + ep->typedata.vector->json_data = json_data; > + > + ep->typedata.vector->current_id = desc->vg.id; > + } > + > + frame_duration = efl_gfx_frame_controller_frame_duration_get(ep->object, > 0, 0); > + efl_animation_duration_set(ep->typedata.vector->anim, frame_duration); > + > + if (!ep->typedata.vector->is_playing) > + { > + frame_count = efl_gfx_frame_controller_frame_count_get(ep->object); > + efl_gfx_frame_controller_frame_set(ep->object, (int)(frame_count * > desc->vg.frame)); > + } > +} > + > +static void > +_edje_vector_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 > EINA_UNUSED, Edje_Part_Description_Vector *chosen_desc, FLOAT_T pos) +{ > + int new_id = -1; //invalid svg > int w, h; > char src_key[32], dest_key[32]; > Efl_VG *src_root, *dest_root, *root; > + Edje_Vector_File_Type type = chosen_desc->vg.type; > + Edje_Vector_File_Type new_type = EDJE_VECTOR_FILE_TYPE_SVG; > > evas_object_geometry_get(ep->object, NULL, NULL, &w, &h); > if( (w == 0) || (h == 0)) return; > > snprintf(src_key, sizeof(src_key), "edje/vectors/%i", chosen_desc->vg.id); > > + if (type == EDJE_VECTOR_FILE_TYPE_JSON) > + { > + _edje_vector_load_json(ed, ep, src_key); > + > + return; > + } > + > if (ep->param2) > { > Edje_Part_Description_Vector *next_state = > (Edje_Part_Description_Vector *)ep->param2->description; if > (chosen_desc->vg.id != next_state->vg.id) > - new_svg = next_state->vg.id; > + { > + new_id = next_state->vg.id; > + new_type = next_state->vg.type; > + } > else > - pos = 0; > + { > + pos = 0; > + } > } > > - if (new_svg < 0) > + if ((new_id < 0) || (new_type == EDJE_VECTOR_FILE_TYPE_JSON)) > { > efl_file_simple_load(ep->object, ed->file->path, src_key); > } > else > { > - snprintf(dest_key, sizeof(dest_key), "edje/vectors/%i", new_svg); > + snprintf(dest_key, sizeof(dest_key), "edje/vectors/%i", new_id); > > efl_file_simple_load(ep->object, ed->file->path, src_key); > src_root = efl_canvas_vg_object_root_node_get(ep->object); > @@ -3329,6 +3428,43 @@ _edje_svg_recalc_apply(Edje *ed, Edje_Real_Part *ep, > Edje_Calc_Params *p3 EINA_U } > } > > +void > +_edje_part_vector_anim_stop(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) > +{ > + Edje_Part_Description_Vector *desc = (Edje_Part_Description_Vector > *)rp->chosen_description; > + double frame_count = efl_gfx_frame_controller_frame_count_get(rp->object); > + > + efl_canvas_object_animation_stop(rp->object); > + efl_gfx_frame_controller_frame_set(rp->object, (int)(frame_count * > desc->vg.frame)); > + rp->typedata.vector->is_playing = EINA_FALSE; > +} > + > +void > +_edje_part_vector_anim_pause(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) > +{ > + efl_canvas_object_animation_pause_set(rp->object, EINA_TRUE); > +} > + > +void > +_edje_part_vector_anim_resume(Edje *ed EINA_UNUSED, Edje_Real_Part *rp) > +{ > + if (rp->typedata.vector->is_playing) > + { > + rp->typedata.vector->start_frame = > efl_gfx_frame_controller_frame_get(rp->object); > + efl_canvas_object_animation_pause_set(rp->object, EINA_FALSE); > + } > +} > + > +void > +_edje_part_vector_anim_play(Edje *ed EINA_UNUSED, Edje_Real_Part *rp, > Eina_Bool backward, Eina_Bool loop) +{ > + rp->typedata.vector->backward = backward; > + rp->typedata.vector->loop = loop; > + rp->typedata.vector->start_frame = > efl_gfx_frame_controller_frame_get(rp->object); > + rp->typedata.vector->is_playing = EINA_TRUE; > + efl_canvas_object_animation_start(rp->object, rp->typedata.vector->anim, > 1.0, 0.0); +} > + > static Edje_Real_Part * > _edje_real_part_state_get(Edje *ed, Edje_Real_Part *ep, int flags, int id, > int *state) { > @@ -5089,7 +5225,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int > flags, Edje_Calc_Params *sta break; > > case EDJE_PART_TYPE_VECTOR: > - _edje_svg_recalc_apply(ed, ep, pf, > (Edje_Part_Description_Vector *)chosen_desc, pos); > + _edje_vector_recalc_apply(ed, ep, pf, > (Edje_Part_Description_Vector *)chosen_desc, pos); break; > > case EDJE_PART_TYPE_TEXTBLOCK: > diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c > index daa4a01ac7..41f73ab410 100644 > --- a/src/lib/edje/edje_data.c > +++ b/src/lib/edje/edje_data.c > @@ -424,6 +424,7 @@ _edje_edd_init(void) > eet_data_descriptor_file_new(&eddc); > EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_vector_directory_entry, > Edje_Vector_Directory_Entry, "entry", entry, EET_T_STRING); > EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_vector_directory_entry, > Edje_Vector_Directory_Entry, "id", id, EET_T_INT); > + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_vector_directory_entry, > Edje_Vector_Directory_Entry, "type", type, EET_T_INT); > EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Image_Directory); > _edje_edd_edje_image_directory = > @@ -971,6 +972,8 @@ _edje_edd_init(void) > > EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB(_edje_edd_edje_part_description_vector, > Edje_Part_Description_Vector, common); > EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_vector, > Edje_Part_Description_Vector, "vg.id", vg.id, EET_T_INT); > EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_vector, > Edje_Part_Description_Vector, "vg.set", vg.set, EET_T_UCHAR); > + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_vector, > Edje_Part_Description_Vector, "vg.type", vg.type, EET_T_INT); > + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_vector, > Edje_Part_Description_Vector, "vg.frame", vg.frame, EET_T_DOUBLE); > > EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, > Edje_Part_Description_Common); diff --git a/src/lib/edje/edje_load.c > b/src/lib/edje/edje_load.c index ec51e2a37a..a3c2e3ca15 100644 > --- a/src/lib/edje/edje_load.c > +++ b/src/lib/edje/edje_load.c > @@ -951,6 +951,13 @@ _edje_object_file_set_internal(Evas_Object *obj, const > Eina_File *file, const ch if (!rp->typedata.container) memerr = EINA_TRUE; > break; > > + case EDJE_PART_TYPE_VECTOR: > + rp->type = EDJE_RP_TYPE_VECTOR; > + rp->typedata.vector = calloc(1, > sizeof(Edje_Real_Part_Vector)); > + if (!rp->typedata.vector) memerr = EINA_TRUE; > + rp->typedata.vector->current_id = -1; > + break; > + > default: > break; > } > @@ -2022,6 +2029,19 @@ _edje_file_del(Edje *ed) > free(rp->typedata.swallow); > rp->typedata.swallow = NULL; > } > + else if ((rp->type == EDJE_RP_TYPE_VECTOR) && > + (rp->typedata.vector)) > + { > + if (rp->typedata.vector->anim) > + efl_del(rp->typedata.vector->anim); > + if (rp->typedata.vector->json_virtual_file) > + eina_file_close(rp->typedata.vector->json_virtual_file); > + if (rp->typedata.vector->json_data) > + free(rp->typedata.vector->json_data); > + > + free(rp->typedata.vector); > + rp->typedata.vector = NULL; > + } > > /* Cleanup optional part. */ > free(rp->drag); > diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h > index 9abbb50962..c3f3ebbda6 100644 > --- a/src/lib/edje/edje_private.h > +++ b/src/lib/edje/edje_private.h > @@ -393,6 +393,7 @@ typedef struct _Edje_Real_Part_Container > Edje_Real_Part_Container; typedef struct _Edje_Real_Part_State > Edje_Real_Part_State; typedef struct _Edje_Real_Part_Drag Edje_Real_Part_Drag; > typedef struct _Edje_Real_Part_Set Edje_Real_Part_Set; > +typedef struct _Edje_Real_Part_Vector Edje_Real_Part_Vector; > typedef struct _Edje_Real_Part Edje_Real_Part; > typedef struct _Edje_Running_Program Edje_Running_Program; > typedef struct _Edje_Signal_Callback Edje_Signal_Callback; > @@ -686,10 +687,17 @@ struct _Edje_Image_Directory > unsigned int vectors_count; > }; > > +typedef enum _Edje_Vector_File_Type > +{ > + EDJE_VECTOR_FILE_TYPE_SVG = 0, > + EDJE_VECTOR_FILE_TYPE_JSON > +} Edje_Vector_File_Type; > + > struct _Edje_Vector_Directory_Entry > { > const char *entry; /* the nominal name of the vector image - if any */ > int id; /* the id no. of the image */ > + Edje_Vector_File_Type type; > }; > > struct _Edje_Image_Directory_Entry > @@ -1600,8 +1608,10 @@ struct _Edje_Part_Description_Spec_Camera > > struct _Edje_Part_Description_Spec_Svg > { > - int id; /* the svg id to use */ > - Eina_Bool set; /* if vg condition it's content */ > + int id; /* the svg id to use */ > + Eina_Bool set; /* if vg condition it's content */ > + Edje_Vector_File_Type type; > + double frame; > }; > > struct _Edje_Part_Description_Image > @@ -1988,6 +1998,7 @@ struct _Edje_Real_Part_Drag > #define EDJE_RP_TYPE_TEXT 1 > #define EDJE_RP_TYPE_CONTAINER 2 > #define EDJE_RP_TYPE_SWALLOW 3 > +#define EDJE_RP_TYPE_VECTOR 4 > > struct _Edje_Real_Part_Text > { > @@ -2032,6 +2043,18 @@ struct _Edje_Real_Part_Swallow > } swallow_params; // 28 // FIXME: only if type SWALLOW > }; > > +struct _Edje_Real_Part_Vector > +{ > + Eo *anim; > + Eina_File *json_virtual_file; > + char *json_data; > + int start_frame; > + int current_id; > + Eina_Bool backward : 1; > + Eina_Bool loop : 1; > + Eina_Bool is_playing : 1; > +}; > + > struct _Edje_Real_Part > { > Edje_Real_Part_State param1; // 32 > @@ -2054,6 +2077,7 @@ struct _Edje_Real_Part > Edje_Real_Part_Text *text; > Edje_Real_Part_Container *container; > Edje_Real_Part_Swallow *swallow; > + Edje_Real_Part_Vector *vector; > } typedata; // 4 > FLOAT_T description_pos; // 8 > Edje_Rectangle req; // 16 > @@ -3326,6 +3350,10 @@ char * _edje_text_cursor_content_get(Edje_Real_Part > *rp, Efl_Text_Cursor_Handle void _edje_object_part_text_insert(Edje *ed, > Edje_Real_Part *rp, const char *text); > void _edje_internal_proxy_shutdown(void); > +void _edje_part_vector_anim_stop(Edje *ed, Edje_Real_Part *rp); > +void _edje_part_vector_anim_pause(Edje *ed, Edje_Real_Part *rp); > +void _edje_part_vector_anim_resume(Edje *ed, Edje_Real_Part *rp); > +void _edje_part_vector_anim_play(Edje *ed, Edje_Real_Part *rp, Eina_Bool > backward, Eina_Bool loop); > #ifdef HAVE_EPHYSICS > Eina_Bool _edje_ephysics_load(void); > diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c > index b1edd1fa2b..fbef7639ed 100644 > --- a/src/lib/edje/edje_program.c > +++ b/src/lib/edje/edje_program.c > @@ -1221,6 +1221,78 @@ low_mem_current: > break; > > #endif > + > + case EDJE_ACTION_TYPE_VG_ANIM_STOP: > + if (_edje_block_break(ed)) > + goto break_prog; > + EINA_LIST_FOREACH(pr->targets, l, pt) > + { > + if (pt->id >= 0) > + { > + rp = ed->table_parts[pt->id % ed->table_parts_size]; > + if (rp) > + _edje_part_vector_anim_stop(ed, rp); > + } > + } > + break; > + > + case EDJE_ACTION_TYPE_VG_ANIM_PAUSE: > + if (_edje_block_break(ed)) > + goto break_prog; > + EINA_LIST_FOREACH(pr->targets, l, pt) > + { > + if (pt->id >= 0) > + { > + rp = ed->table_parts[pt->id % ed->table_parts_size]; > + if (rp) > + _edje_part_vector_anim_pause(ed, rp); > + } > + } > + break; > + > + case EDJE_ACTION_TYPE_VG_ANIM_RESUME: > + if (_edje_block_break(ed)) > + goto break_prog; > + EINA_LIST_FOREACH(pr->targets, l, pt) > + { > + if (pt->id >= 0) > + { > + rp = ed->table_parts[pt->id % ed->table_parts_size]; > + if (rp) > + _edje_part_vector_anim_resume(ed, rp); > + } > + } > + break; > + > + case EDJE_ACTION_TYPE_VG_ANIM_LOOP: > + case EDJE_ACTION_TYPE_VG_ANIM_REWIND: > + case EDJE_ACTION_TYPE_VG_ANIM_PLAY: > + if (_edje_block_break(ed)) > + goto break_prog; > + EINA_LIST_FOREACH(pr->targets, l, pt) > + { > + if (pt->id >= 0) > + { > + rp = ed->table_parts[pt->id % ed->table_parts_size]; > + if (rp) > + { > + Eina_Bool vector_anim_backward = EINA_FALSE; > + Eina_Bool vector_anim_loop = EINA_FALSE; > + > + if (pr->action == EDJE_ACTION_TYPE_VG_ANIM_REWIND) > + vector_anim_backward = EINA_TRUE; > + > + if (pr->action == EDJE_ACTION_TYPE_VG_ANIM_LOOP) > + vector_anim_loop = EINA_TRUE; > + > + _edje_part_vector_anim_play(ed, rp, > + vector_anim_backward, > + vector_anim_loop); > + } > + } > + } > + break; > + > default: > // _edje_emit(ed, "program,start", pr->name); > // _edje_emit(ed, "program,stop", pr->name); > > -- > > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- Carsten Haitzler - ras...@rasterman.com _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel