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

Reply via email to