evas json: new feature for lottie - #7 58/189158/1
authorHermet Park <hermetpark@gmail.com>
Mon, 3 Sep 2018 12:00:55 +0000 (21:00 +0900)
committerHermet Park <hermetpark@gmail.com>
Fri, 14 Sep 2018 02:26:59 +0000 (11:26 +0900)
Support caching mechanism properly if multiple instances share one resource.

@feature

Change-Id: I3617cf52a51a237c19a424c076d435e01b3e3228

src/lib/evas/canvas/efl_canvas_vg_object.c
src/lib/evas/canvas/evas_vg_private.h
src/lib/evas/include/evas_private.h
src/lib/evas/vg/evas_vg_cache.c
src/modules/evas/vg_loaders/eet/evas_vg_load_eet.c
src/modules/evas/vg_loaders/json/evas_vg_load_json.c
src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c
src/static_libs/vg_common/vg_common_json.c
src/static_libs/vg_common/vg_common_svg.c

index 285b38f..50b2166 100644 (file)
@@ -827,7 +827,7 @@ _efl_canvas_vg_object_efl_gfx_image_animation_controller_animated_frame_duration
                                                                                      int frame_num EINA_UNUSED)
 {
    if (!pd->vg_entry) return 0;
-   return pd->vg_entry->vfd->anim.duration;
+   return evas_cache_vg_anim_duration_get(pd->vg_entry);
 }
 
 EOLIAN static Eina_Bool
@@ -851,7 +851,7 @@ _efl_canvas_vg_object_efl_gfx_image_animation_controller_animated_frame_get(cons
                                                                             Efl_Canvas_Vg_Object_Data *pd EINA_UNUSED)
 {
    if (!pd->vg_entry) return 0;
-   return pd->vg_entry->vfd->anim.frame_cnt;
+   return evas_cache_vg_anim_frame_count_get(pd->vg_entry);
 }
 
 #include "efl_canvas_vg_object.eo.c"
index f9e9758..f6f64d5 100644 (file)
@@ -105,10 +105,12 @@ struct _Efl_Canvas_Vg_Interpolation
 void                        evas_cache_vg_init(void);
 void                        evas_cache_vg_shutdown(void);
 Vg_Cache_Entry*  evas_cache_vg_entry_create(const char *file, const char *key, int w, int h);
-Efl_VG*                     evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, int frame_num);
+Efl_VG*                     evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, unsigned int frame_num);
 void                        evas_cache_vg_entry_del(Vg_Cache_Entry *vg_entry);
 Vg_File_Data *              evas_cache_vg_file_open(const char *file, const char *key);
 Eina_Bool                   evas_cache_vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const char *flags);
+double                      evas_cache_vg_anim_duration_get(const Vg_Cache_Entry *vg_entry);
+unsigned int                evas_cache_vg_anim_frame_count_get(const Vg_Cache_Entry *vg_entry);
 
 void                        efl_canvas_vg_node_root_set(Efl_VG *node, Efl_VG *vg_obj);
 
index 736ec21..90f0ca3 100755 (executable)
@@ -138,6 +138,7 @@ typedef struct _Evas_Canvas3D_Header_Eet       Evas_Canvas3D_Header_Eet;
 typedef struct _Evas_Canvas3D_File_Eet         Evas_Canvas3D_File_Eet;
 
 typedef struct _Vg_File_Data                   Vg_File_Data;
+typedef struct _Vg_File_Anim_Data              Vg_File_Anim_Data;
 
 struct _Evas_Canvas3D_Vec2_Eet
 {
@@ -1524,25 +1525,25 @@ struct _Evas_Image_Save_Func
   int (*image_save) (RGBA_Image *im, const char *file, const char *key, int quality, int compress, const char *encoding);
 };
 
+struct _Vg_File_Anim_Data
+{
+   unsigned int frame_num;            //current frame number
+   unsigned int frame_cnt;            //total frame count
+   float        duration;             //animation duration
+};
+
 struct _Vg_File_Data
 {
-   Eina_Rectangle  view_box;
-   Efl_VG         *root;
+   Efl_VG            *root;
    Evas_Vg_Load_Func *loader;
+   Eina_Rectangle     view_box;
+   Vg_File_Anim_Data *anim_data;           //only when animation supported.
    int ref;
 
-   struct
-     {
-        unsigned int frame_num;            //current frame number
-        unsigned int frame_cnt;            //total frame count
-        float duration;                    //animation duration
-     } anim;
-
-   //Used in JSON
-   void           *loader_data;           //loader specific local data
+   void           *loader_data;            //loader specific local data
 
-   //Used in SVG
-   Eina_Bool       preserve_aspect : 1;
+   Eina_Bool       static_viewbox: 1;
+   Eina_Bool       preserve_aspect : 1;    //Used in SVG
 };
 
 struct _Evas_Vg_Load_Func
index e69c496..180c816 100644 (file)
@@ -282,8 +282,22 @@ evas_cache_vg_entry_create(const char *file,
    return vg_entry;
 }
 
+double
+evas_cache_vg_anim_duration_get(const Vg_Cache_Entry* vg_entry)
+{
+   if (!vg_entry->vfd->anim_data) return 0;
+   return vg_entry->vfd->anim_data->duration;
+}
+
+unsigned int
+evas_cache_vg_anim_frame_count_get(const Vg_Cache_Entry* vg_entry)
+{
+   if (!vg_entry->vfd->anim_data) return 0;
+   return vg_entry->vfd->anim_data->frame_cnt;
+}
+
 Efl_VG*
-evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, int frame_num)
+evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, unsigned int frame_num)
 {
    if (!vg_entry) return NULL;
    if ((vg_entry->w < 1) || (vg_entry->h < 1)) return NULL;
@@ -291,13 +305,25 @@ evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, int frame_num)
    Vg_File_Data *vfd = vg_entry->vfd;
    if (!vfd) return NULL;
 
-   if (vg_entry->root && ((unsigned int)frame_num == vfd->anim.frame_num))
-     return vg_entry->root;
+   //Hit Caching?
+   if (vg_entry->root)
+     {
+        if (!vfd->anim_data || (frame_num == vfd->anim_data->frame_num))
+          {
+             if (vfd->static_viewbox ||
+                 ((vfd->view_box.w == vg_entry->w) &&
+                  (vfd->view_box.h == vg_entry->h)))
+                 return vg_entry->root;
+          }
+     }
 
-   if (vfd->view_box.w == 0) vfd->view_box.w = vg_entry->w;
-   if (vfd->view_box.h == 0) vfd->view_box.h = vg_entry->h;
+   if (!vfd->static_viewbox)
+     {
+        vfd->view_box.w = vg_entry->w;
+        vfd->view_box.h = vg_entry->h;
+     }
 
-   vfd->anim.frame_num = frame_num;
+   if (vfd->anim_data) vfd->anim_data->frame_num = frame_num;
 
    if (!vfd->loader->file_data(vfd)) return NULL;
 
index 2b5fcfc..3b83b2f 100644 (file)
@@ -42,13 +42,13 @@ evas_vg_load_file_open_eet(const char *file, const char *key, int *error EINA_UN
 }
 
 static Eina_Bool
-evas_vg_load_file_close_eet(Vg_File_Data *vfd)
+evas_vg_load_file_close_eet(Vg_File_Data *vfd EINA_UNUSED)
 {
    return EINA_TRUE;
 }
 
 static Eina_Bool
-evas_vg_load_file_data_eet(Vg_File_Data *vfd)
+evas_vg_load_file_data_eet(Vg_File_Data *vfd EINA_UNUSED)
 {
    return EINA_TRUE;
 }
index c8fc753..eb6c83f 100644 (file)
@@ -19,10 +19,8 @@ evas_vg_load_file_close_json(Vg_File_Data *vfd)
    if (!vfd) return EINA_FALSE;
 
    LOTPlayer *player = (LOTPlayer *) vfd->loader_data;
-
-   ERR("close json vfd = %p, lotplayer! = %p", vfd, player);
-
    lotplayer_destroy(player);
+   if (vfd->anim_data) free(vfd->anim_data);
    free(vfd);
 
    return EINA_TRUE;
@@ -46,26 +44,40 @@ evas_vg_load_file_open_json(const char *file,
    if (!player)
      {
         ERR("Failed to create LOTPlayer");
-        free(vfd);
-        return NULL;
+        goto err;
      }
 
    int ret = lotplayer_set_file(player, file);
    if (LOT_PLAYER_ERROR_NONE != ret)
      {
         ERR("Failed to lotplayer_set_file(), result = %d", ret);
-        free(vfd);
-        lotplayer_destroy(player);
-        return NULL;
+        goto err;
      }
 
-   vfd->loader_data = (void *) player;
-   vfd->anim.duration = lotplayer_get_playtime(player);
-   vfd->anim.frame_cnt = lotplayer_get_totalframe(player);
+   unsigned int frame_cnt = lotplayer_get_totalframe(player);
+
+   //Support animation
+   if (frame_cnt > 1)
+     {
+        vfd->anim_data = calloc(1, sizeof(Vg_File_Anim_Data));
+        if (!vfd->anim_data) goto err;
+        vfd->anim_data->duration = lotplayer_get_playtime(player);
+        vfd->anim_data->frame_cnt = frame_cnt;
+     }
 
-   ERR("open json vfd(%p) lotplayer! = %p, file = %s", vfd, player, file);
+   vfd->loader_data = (void *) player;
 
    return vfd;
+
+err:
+   if (vfd)
+     {
+        if (vfd->anim_data) free(vfd->anim_data);
+        free(vfd);
+     }
+   if (player) lotplayer_destroy(player);
+
+   return NULL;
 }
 
 static Evas_Vg_Load_Func evas_vg_load_json_func =
index d92eadb..66719d3 100644 (file)
@@ -2326,13 +2326,13 @@ _update_gradient(Svg_Node *node, Eina_List *grad_list)
      }
 }
 static Eina_Bool
-evas_vg_load_file_data_svg(Vg_File_Data *vfd)
+evas_vg_load_file_data_svg(Vg_File_Data *vfd EINA_UNUSED)
 {
    return EINA_TRUE;
 }
 
 static Eina_Bool
-evas_vg_load_file_close_svg(Vg_File_Data *vfd)
+evas_vg_load_file_close_svg(Vg_File_Data *vfd EINA_UNUSED)
 {
    return EINA_TRUE;
 }
index c9db8cc..8354f13 100644 (file)
@@ -20,10 +20,10 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd)
 
    lotplayer_set_size(player, vfd->view_box.w, vfd->view_box.h);
 
-   float progress = ((float) vfd->anim.frame_num / (float) vfd->anim.frame_cnt);
+   float progress = ((float) vfd->anim_data->frame_num / (float) vfd->anim_data->frame_cnt);
    int size = lotplayer_get_node_count(player, progress);
 
-   ERR("data json vfd = %p, player = %p, size = %d, root(%p) viewbox(%d %d %d %d) progress(%f)", vfd, player, size, root, vfd->view_box.x, vfd->view_box.y, vfd->view_box.w, vfd->view_box.h, progress);
+   //ERR("data json vfd = %p, player = %p, size = %d, root(%p) viewbox(%d %d %d %d) progress(%f)", vfd, player, size, root, vfd->view_box.x, vfd->view_box.y, vfd->view_box.w, vfd->view_box.h, progress);
 
    //Construct vg tree
    for (int i = 0; i < size; i++)
index 3afad84..2a033eb 100644 (file)
@@ -828,6 +828,7 @@ vg_common_svg_create_vg_node(Svg_Node *node)
    vg_data->view_box.w = node->node.doc.vw;
    vg_data->view_box.h = node->node.doc.vh;
    vg_data->preserve_aspect = node->node.doc.preserve_aspect;
+   vg_data->static_viewbox = EINA_TRUE;
    vg_data->root = vg_common_create_vg_node_helper(node, NULL, vg_data);
 
    return vg_data;