Support caching mechanism properly if multiple instances share one resource.
@feature
Change-Id: I3617cf52a51a237c19a424c076d435e01b3e3228
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
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"
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);
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
{
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
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;
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;
}
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;
}
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;
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 =
}
}
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;
}
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++)
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;