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);

-- 


Reply via email to