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;
- if (vfd->loader) vfd->loader->file_close(vfd);
+ vfd->loader->file_close(vfd);
}
static void
}
else
{
- if (vg_entry->vfd->loader)
- vg_entry->vfd->loader->file_close(vg_entry->vfd);
+ vg_entry->vfd->loader->file_close(vg_entry->vfd);
}
}
}
if (vfd->anim_data) vfd->anim_data->frame_num = frame_num;
- if (vfd->loader && !vfd->loader->file_data(vfd)) return NULL;
+ if (!vfd->loader->file_data(vfd)) return NULL;
_root_update(vg_entry);