Tvg_Matrix trans_mat = { 0 };
if (!nd || !nd->data) return;
-
Efl_Canvas_Vg_Image_Data *pd = nd->data;
if (nd->flags != EFL_GFX_CHANGE_FLAG_NONE)
{
nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
- if (!pd->picture && pd->image)
- {
- pd->picture = tvg_picture_new();
- if (tvg_picture_load_raw(pd->picture, pd->image, pd->w, pd->h, true) != TVG_RESULT_SUCCESS)
- {
- printf("Error loading image buffer \n");
- return;
- }
- }
- if (!pd->picture) return;
-
EFL_CANVAS_VG_COMPUTE_MATRIX(cTransform, pTransform, nd);
tvg_paint_translate(pd->picture, nd->x, nd->y);
if (cTransform)
nd->render_pre = _efl_canvas_vg_image_render_pre;
#else
nd->render_pre_tvg = _efl_canvas_vg_image_render_pre_tvg;
+ pd->picture = tvg_picture_new();
#endif
efl_gfx_color_set(obj , 255, 255, 255, 255);
efl_unref(pd->buffer);
pd->buffer= NULL;
}
+#else
+ if (pd->image != data || pd->w != size.w || pd->h != size.h)
+ {
+ if (!pd->picture || tvg_picture_load_raw(pd->picture, data, size.w, size.h, true) != TVG_RESULT_SUCCESS)
+ {
+ printf("Error loading image buffer \n");
+ return;
+ }
+ }
#endif
pd->image = data;
pd->h = size.h;
}
+// This function is HAVE_THORVG only
+static void
+_efl_canvas_vg_image_filepath_set(Eo *obj EINA_UNUSED, Efl_Canvas_Vg_Image_Data *pd, const char *path)
+{
+#ifdef HAVE_THORVG
+ if (!pd->picture || tvg_picture_load(pd->picture, path) != TVG_RESULT_SUCCESS)
+ {
+ printf("Error loading image from path \'%s\' \n", path);
+ return;
+ }
+#endif
+}
+
+// This function is HAVE_THORVG only
+static Eina_Rect
+_efl_canvas_vg_image_viewbox_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Vg_Image_Data *pd)
+{
+#ifdef HAVE_THORVG
+ float x, y, w, h;
+
+ if (!pd->picture || tvg_picture_get_viewbox(pd->picture, &x, &y, &w, &h) != TVG_RESULT_SUCCESS)
+ return EINA_RECT(0, 0, 0, 0);
+
+ return EINA_RECT(x, y, w, h);
+#endif
+}
+
+// This function is HAVE_THORVG only
+// Duplication is used on _root_update() for static_viewbox image
+EOLIAN static Efl_Canvas_Vg_Node *
+_efl_canvas_vg_image_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Image_Data *pd)
+{
+#ifdef HAVE_THORVG
+ Efl_Canvas_Vg_Node *node = NULL;
+ Efl_Canvas_Vg_Image_Data *sd = NULL;
+
+ node = efl_duplicate(efl_super(obj, MY_CLASS));
+ sd = efl_data_scope_get(node, MY_CLASS);
+
+ if (pd->picture)
+ {
+ if (sd->picture) tvg_paint_del(sd->picture);
+ sd->picture = tvg_paint_duplicate(pd->picture);
+ }
+
+ sd->image = pd->image; // note: no memcpy here
+ sd->w = pd->w;
+ sd->h = pd->h;
+
+ return node;
+#endif
+}
+
#include "efl_canvas_vg_image.eo.c"
MATCHING(".svg", "svg")
};
+#ifdef HAVE_THORVG
+struct ext_loader_thorvg_s
+{
+ unsigned int length;
+ const char *extension;
+};
+
+#define EXTENSION(Ext) { sizeof(Ext)-1, Ext }
+
+static const struct ext_loader_thorvg_s thorvg_extensions[] =
+{
+ EXTENSION(".svg")
+};
+
+static Eina_Bool
+_thorvg_loader_applicable(const char *file)
+{
+ if (!file) return EINA_FALSE;
+
+ const int len = strlen(file);
+ const char *end = file + len;
+ unsigned int i;
+ int len2;
+
+ for (i = 0; i < (sizeof (thorvg_extensions) / sizeof(struct ext_loader_thorvg_s)); i++)
+ {
+ len2 = thorvg_extensions[i].length;
+ if (len2 > len) continue;
+ if (!strcasecmp(end - len2, thorvg_extensions[i].extension))
+ {
+ return EINA_TRUE;
+ }
+ }
+ return EINA_FALSE;
+}
+#endif
+
+
static Evas_Module *
_find_loader_module(const char *file)
{
unsigned int i;
const char *file_name = eina_file_filename_get(file);
+
+#ifdef HAVE_THORVG
+ if (_thorvg_loader_applicable(file_name))
+ {
+ vfd = calloc(1, sizeof(Vg_File_Data));
+ EINA_SAFETY_ON_NULL_RETURN_VAL(vfd, NULL);
+
+ Efl_Canvas_Vg_Image *image = efl_add_ref(EFL_CANVAS_VG_IMAGE_CLASS, NULL);
+ efl_canvas_vg_image_filepath_set(image, file_name);
+ vfd->root = image;
+
+ Eina_Rect r = efl_canvas_vg_image_viewbox_get(image);
+ vfd->view_box.x = r.x;
+ vfd->view_box.y = r.y;
+ vfd->view_box.w = r.w;
+ vfd->view_box.h = r.h;
+
+ vfd->preserve_aspect = EINA_TRUE;
+ vfd->static_viewbox = EINA_TRUE;
+ vfd->thorvg_loader = EINA_TRUE;
+ return vfd;
+ }
+#endif
+
em = _find_loader_module(file_name);
if (em)
{
_evas_cache_vg_data_free_cb(void *data)
{
Vg_File_Data *vfd = data;
- vfd->loader->file_close(vfd);
+ if (vfd->loader) vfd->loader->file_close(vfd);
}
static void
}
else
{
- vg_entry->vfd->loader->file_close(vg_entry->vfd);
+ if (vg_entry->vfd->loader)
+ vg_entry->vfd->loader->file_close(vg_entry->vfd);
}
}
}
if (vfd->anim_data) vfd->anim_data->frame_num = frame_num;
- if (!vfd->loader->file_data(vfd)) return NULL;
+ if (vfd->loader && !vfd->loader->file_data(vfd)) return NULL;
_root_update(vg_entry);