hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=2fe158ce652860b2aa5a2e883e6b2beb0ee1c670
commit 2fe158ce652860b2aa5a2e883e6b2beb0ee1c670 Author: YoungBok Shin <[email protected]> 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 <[email protected]> - 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); --
