From 4cebc065fba8a7eaf051d75881fa48377c41490f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 18 Mar 2021 16:08:18 +0900 Subject: [PATCH] evas: code refactoring by tvg integration. Change-Id: Ib5d37aa93db784b7c2829f36ffe85ff987d36d73 --- src/lib/evas/canvas/efl_canvas_vg_container.c | 18 +- src/lib/evas/canvas/efl_canvas_vg_gradient.c | 38 ++-- .../evas/canvas/efl_canvas_vg_gradient_linear.c | 41 ++-- .../evas/canvas/efl_canvas_vg_gradient_radial.c | 37 ++-- src/lib/evas/canvas/efl_canvas_vg_image.c | 36 +--- src/lib/evas/canvas/efl_canvas_vg_node.c | 4 - src/lib/evas/canvas/efl_canvas_vg_object.c | 50 ++--- src/lib/evas/canvas/efl_canvas_vg_shape.c | 239 +++++++-------------- ...as_tvg_path_helpers.h => evas_vg_path_helper.h} | 20 +- src/lib/evas/canvas/evas_vg_private.h | 32 ++- src/lib/evas/vg/evas_vg_cache.c | 2 +- src/static_libs/vg_common/vg_common_svg.c | 4 +- 12 files changed, 195 insertions(+), 326 deletions(-) rename src/lib/evas/canvas/{evas_tvg_path_helpers.h => evas_vg_path_helper.h} (98%) diff --git a/src/lib/evas/canvas/efl_canvas_vg_container.c b/src/lib/evas/canvas/efl_canvas_vg_container.c index d0c6d78..53e41ec 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_container.c +++ b/src/lib/evas/canvas/efl_canvas_vg_container.c @@ -173,15 +173,9 @@ _efl_canvas_vg_container_render_pre_tvg(Evas_Object_Protected_Data *obj, tvg_scene_clear(cd->scene); - if (!nd->visibility) - return; + if (!nd->visibility) return; - if (nd->a < 255) tvg_paint_set_opacity(cd->scene, nd->a); - - if (scene != NULL) - tvg_scene_push(scene, cd->scene); - else if (scene == NULL && canvas != NULL) - tvg_canvas_push(canvas, cd->scene); + tvg_paint_set_opacity(cd->scene, nd->a); EFL_CANVAS_VG_COMPUTE_MATRIX(cTransform, pTransform, nd); @@ -191,6 +185,9 @@ _efl_canvas_vg_container_render_pre_tvg(Evas_Object_Protected_Data *obj, if (cnd && cnd->render_pre_tvg) cnd->render_pre_tvg(obj, child, cnd, cTransform, canvas, cd->scene); } + + if (scene) tvg_scene_push(scene, cd->scene); + else if (canvas) tvg_canvas_push(canvas, cd->scene); } #endif @@ -222,6 +219,8 @@ _efl_canvas_vg_container_render_pre(Evas_Object_Protected_Data *vg_pd, //Container may have composite target. //FIXME : _prepare_comp() should only work in cases with matte or masking. // This condition is valid because the masking use same type as matte. + + //FIX_TVG: Missing tvg support composition???? #ifndef HAVE_THORVG if (pd->comp_target && (pd->comp.method == EFL_GFX_VG_COMPOSITE_METHOD_MATTE_ALPHA || @@ -316,7 +315,6 @@ _efl_canvas_vg_container_efl_object_destructor(Eo *obj, efl_unref(pd->comp.buffer); } #else - tvg_scene_clear(pd->scene); tvg_paint_del(pd->scene); #endif @@ -569,7 +567,7 @@ efl_canvas_vg_container_vg_obj_update(Efl_VG *obj, Efl_Canvas_Vg_Node_Data *nd) void efl_canvas_vg_container_blend_buffer_clear(Efl_VG *obj EINA_UNUSED, Efl_Canvas_Vg_Container_Data *cd) { -#ifndef HAVE_THORV +#ifndef HAVE_THORVG if (!cd->blend.buffer) return; if (cd->blend.pixels) diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient.c b/src/lib/evas/canvas/efl_canvas_vg_gradient.c index b28b8c6..2f93211 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient.c @@ -12,19 +12,15 @@ static void _gradient_stop_set(Evas_Vg_Gradient *obj, const Efl_Gfx_Gradient_Stop *colors, unsigned int length) { - Tvg_Color_Stop *color_stops = NULL; - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - - unsigned int i = 0; - if (!obj) return; - gd = efl_data_scope_get(obj, MY_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS); + if (!gd) return; - color_stops = malloc(sizeof(Tvg_Color_Stop) * length); - if (color_stops == NULL) return; + Tvg_Color_Stop *color_stops = malloc(sizeof(Tvg_Color_Stop) * length); + if (!color_stops) return; + unsigned int i = 0; for (i = 0; i < length; ++i) { color_stops[i].offset = colors[i].offset; @@ -43,16 +39,14 @@ _gradient_stop_set(Evas_Vg_Gradient *obj, const Efl_Gfx_Gradient_Stop *colors, u static void _gradient_stop_get(Evas_Vg_Gradient *obj, Efl_Gfx_Gradient_Stop **colors, unsigned int *length) { - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - gd = efl_data_scope_get(obj, MY_CLASS); + if (!obj || !colors || !length) return; + const Tvg_Color_Stop *stop = NULL; uint32_t len = 0; unsigned int i = 0; - if (!obj || !colors || !length) return; - - gd = efl_data_scope_get(obj, MY_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS); + if (!gd) return; tvg_gradient_get_color_stops(gd->gradient, &stop, &len); *length = len; @@ -172,9 +166,7 @@ EOLIAN static Efl_VG * _efl_canvas_vg_gradient_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Gradient_Data *pd) { - Efl_VG *cn = NULL; - - cn = efl_duplicate(efl_super(obj, MY_CLASS)); + Efl_VG *cn = efl_duplicate(efl_super(obj, MY_CLASS)); efl_gfx_gradient_stop_set(cn, pd->colors, pd->colors_count); efl_gfx_gradient_spread_set(cn, pd->spread); return cn; @@ -204,9 +196,8 @@ EAPI void evas_vg_gradient_spread_set(Evas_Vg_Gradient *obj, Evas_Vg_Gradient_Spread s) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; if (!obj) return; - gd = efl_data_scope_get(obj, MY_CLASS); + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS); tvg_gradient_set_spread(gd->gradient, (Tvg_Stroke_Fill)s); #else efl_gfx_gradient_spread_set(obj, (Efl_Gfx_Gradient_Spread)s); @@ -217,13 +208,12 @@ EAPI Evas_Vg_Gradient_Spread evas_vg_gradient_spread_get(Evas_Vg_Gradient *obj) { #ifdef HAVE_THORVG - Tvg_Stroke_Fill fill = TVG_STROKE_FILL_PAD; - Efl_Canvas_Vg_Gradient_Data *gd; - if (!obj) return EVAS_VG_GRADIENT_SPREAD_LAST; - gd = efl_data_scope_get(obj, MY_CLASS); + + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS); if (!gd || !gd->gradient) return EVAS_VG_GRADIENT_SPREAD_LAST; + Tvg_Stroke_Fill fill = TVG_STROKE_FILL_PAD; tvg_gradient_get_spread(gd->gradient, &fill); return (Evas_Vg_Gradient_Spread)fill; #else diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c b/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c index 2c402c4..ce8690a 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c @@ -103,13 +103,15 @@ _gradient_linear_render_pre_tvg(Efl_Canvas_Vg_Gradient_Data *gd, Tvg_Paint *shape) { if (!gd || !shape) return; + + //FIX_TVG: ignore the flag.... if nothing changed, do it needs to call again? tvg_shape_set_linear_gradient(shape, gd->gradient); } #endif static Eo * _efl_canvas_vg_gradient_linear_efl_object_constructor(Eo *obj, - Efl_Canvas_Vg_Gradient_Linear_Data *pd) + Efl_Canvas_Vg_Gradient_Linear_Data *pd) { Efl_Canvas_Vg_Node_Data *nd; Efl_Canvas_Vg_Gradient_Data *gd; @@ -122,7 +124,6 @@ _efl_canvas_vg_gradient_linear_efl_object_constructor(Eo *obj, gd->gradient_render_pre_tvg = _gradient_linear_render_pre_tvg; gd->spread = EFL_GFX_GRADIENT_SPREAD_PAD; gd->gradient = tvg_linear_gradient_new(); - gd->shape = NULL; #endif nd->data = pd; @@ -192,13 +193,12 @@ EAPI void evas_vg_gradient_linear_start_set(Evas_Vg_Gradient_Linear *obj, double x, double y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float x2 = 0.f, y2 = 0.f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float x2 = 0.f, y2 = 0.f; tvg_linear_gradient_get(gd->gradient, NULL, NULL, &x2, &y2); tvg_linear_gradient_set(gd->gradient, x, y, x2, y2); @@ -212,13 +212,12 @@ EAPI void evas_vg_gradient_linear_start_get(Evas_Vg_Gradient_Linear *obj, double *x, double *y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float x1 = 0.f, y1 = 0.f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float x1 = 0.f, y1 = 0.f; tvg_linear_gradient_get(gd->gradient, &x1, &y1, NULL, NULL); if (x) *x = x1; if (y) *y = y1; @@ -232,13 +231,12 @@ EAPI void evas_vg_gradient_linear_end_set(Evas_Vg_Gradient_Linear *obj, double x, double y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float x1 = 0.f, y1 = 0.f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float x1 = 0.f, y1 = 0.f; tvg_linear_gradient_get(gd->gradient, &x1, &y1, NULL, NULL); tvg_linear_gradient_set(gd->gradient, x1, y1, x, y); @@ -252,13 +250,12 @@ EAPI void evas_vg_gradient_linear_end_get(Evas_Vg_Gradient_Linear *obj, double *x, double *y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float x2 = 0.f, y2 = 0.f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float x2 = 0.f, y2 = 0.f; tvg_linear_gradient_get(gd->gradient, NULL, NULL, &x2, &y2); if (x) *x = x2; if (y) *y = y2; diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c b/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c index 20e46a7..da736c0 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c @@ -139,7 +139,6 @@ _efl_canvas_vg_gradient_radial_efl_object_constructor(Eo *obj, Efl_Canvas_Vg_Gra gd->gradient_render_pre_tvg = _gradient_radial_render_pre_tvg; gd->spread = EFL_GFX_GRADIENT_SPREAD_PAD; gd->gradient = tvg_radial_gradient_new(); - gd->shape = NULL; #endif nd->data = pd; @@ -215,13 +214,12 @@ EAPI void evas_vg_gradient_radial_center_set(Evas_Vg_Gradient_Radial *obj, double x, double y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float r = 0.0f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float r = 0.0f; tvg_radial_gradient_get(gd->gradient, NULL, NULL, &r); tvg_radial_gradient_set(gd->gradient, x, y, r); @@ -235,11 +233,10 @@ EAPI void evas_vg_gradient_radial_center_get(Evas_Vg_Gradient_Radial *obj, double *x, double *y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; float tx = 0.f, ty = 0.f; tvg_radial_gradient_get(gd->gradient, &tx, &ty, NULL); @@ -255,13 +252,12 @@ EAPI void evas_vg_gradient_radial_radius_set(Evas_Vg_Gradient_Radial *obj, double r) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float x = 0.0f, y = 0.0f; - if (!obj) return; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return; + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return; + + float x = 0.0f, y = 0.0f; tvg_radial_gradient_get(gd->gradient, &x, &y, NULL); tvg_radial_gradient_set(gd->gradient, x, y, r); @@ -275,11 +271,12 @@ EAPI double evas_vg_gradient_radial_radius_get(Evas_Vg_Gradient_Radial *obj) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Gradient_Data *gd = NULL; - float r = 0.0f; if (!obj) return 0.0; - gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); - if (!gd || !gd->gradient) return 0.0; + + Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, EFL_CANVAS_VG_GRADIENT_CLASS); + if (!gd) return 0.0; + + float r = 0.0f; tvg_radial_gradient_get(gd->gradient, NULL, NULL, &r); return r; #else @@ -305,4 +302,4 @@ evas_vg_gradient_radial_add(Evas_Vg_Container *parent) return efl_add(EFL_CANVAS_VG_GRADIENT_RADIAL_CLASS, parent); } -#include "efl_canvas_vg_gradient_radial.eo.c" \ No newline at end of file +#include "efl_canvas_vg_gradient_radial.eo.c" diff --git a/src/lib/evas/canvas/efl_canvas_vg_image.c b/src/lib/evas/canvas/efl_canvas_vg_image.c index eb0dfc0..738abc2 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_image.c +++ b/src/lib/evas/canvas/efl_canvas_vg_image.c @@ -75,23 +75,6 @@ _efl_canvas_vg_image_render_pre(Evas_Object_Protected_Data *vg_pd, #endif #ifdef HAVE_THORVG -void -_convert_eina_to_tvg_mat_transpose(const Eina_Matrix3 *eina_mat, Tvg_Matrix *tvg_mat) -{ - if (!eina_mat || !tvg_mat) return; - - tvg_mat->e11 = eina_mat->xx; - tvg_mat->e21 = eina_mat->xy; - tvg_mat->e31 = eina_mat->xz; - - tvg_mat->e12 = eina_mat->yx; - tvg_mat->e22 = eina_mat->yy; - tvg_mat->e32 = eina_mat->yz; - - tvg_mat->e13 = eina_mat->zx; - tvg_mat->e23 = eina_mat->zy; - tvg_mat->e33 = eina_mat->zz; -} static void _efl_canvas_vg_image_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_pd, Efl_VG *obj, @@ -123,7 +106,7 @@ _efl_canvas_vg_image_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_p tvg_paint_translate(pd->picture, nd->x, nd->y); if (cTransform) { - _convert_eina_to_tvg_mat_transpose(cTransform, &trans_mat); + _convert_eina_to_tvg_mat(cTransform, &trans_mat); trans_mat.e13 += nd->x; trans_mat.e23 += nd->y; tvg_paint_transform(pd->picture, &trans_mat); @@ -131,13 +114,12 @@ _efl_canvas_vg_image_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_p efl_gfx_color_get(obj, NULL, NULL, NULL, &alpha); EFL_CANVAS_VG_COMPUTE_ALPHA(c_r, c_g, c_b, c_a, alpha, nd); - // TODO: apply color + + //FIX_TVG: apply color tvg_paint_set_opacity(pd->picture, alpha); - if (scene) - tvg_scene_push(scene, pd->picture); - else if (canvas) - tvg_canvas_push(canvas, pd->picture); + if (scene) tvg_scene_push(scene, pd->picture); + else if (canvas) tvg_canvas_push(canvas, pd->picture); } #endif @@ -152,11 +134,12 @@ _efl_canvas_vg_image_efl_object_constructor(Eo *obj, Efl_Canvas_Vg_Image_Data *p #ifndef HAVE_THORVG nd->render_pre = _efl_canvas_vg_image_render_pre; - efl_gfx_color_set(obj , 255, 255, 255, 255); #else nd->render_pre_tvg = _efl_canvas_vg_image_render_pre_tvg; #endif + efl_gfx_color_set(obj , 255, 255, 255, 255); + return obj; } @@ -171,11 +154,6 @@ _efl_canvas_vg_image_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Image_Data *pd efl_unref(pd->buffer); pd->buffer = NULL; } -#else - if (pd->picture) - { - pd->picture = NULL; - } #endif } diff --git a/src/lib/evas/canvas/efl_canvas_vg_node.c b/src/lib/evas/canvas/efl_canvas_vg_node.c index 68e8f4c..a459606 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_node.c +++ b/src/lib/evas/canvas/efl_canvas_vg_node.c @@ -266,11 +266,7 @@ _efl_canvas_vg_node_efl_object_constructor(Eo *obj, } static void -#ifdef HAVE_THORVG -_efl_canvas_vg_node_efl_object_invalidate(Eo *obj, Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED) -#else _efl_canvas_vg_node_efl_object_invalidate(Eo *obj, Efl_Canvas_Vg_Node_Data *pd) -#endif { #ifndef HAVE_THORVG if (pd->renderer) diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index ad31251..ea54052 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -421,7 +421,6 @@ _efl_canvas_vg_object_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Vg_Object_Da pd->tvg_canvas_size.h = 0; #endif - pd->sync_render = EINA_FALSE; eina_array_step_set(&pd->cleanup, sizeof(pd->cleanup), 8); return eo_obj; } @@ -446,7 +445,7 @@ _efl_canvas_vg_object_efl_object_finalize(Eo *obj, Efl_Canvas_Vg_Object_Data *pd #ifdef HAVE_THORVG static void -_render_to_buffer_tvg(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd, +_render_to_tvg_buffer(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd, Efl_VG *root, int w EINA_UNUSED, int h EINA_UNUSED) { tvg_canvas_clear(pd->tvg_canvas, false); @@ -454,36 +453,29 @@ _render_to_buffer_tvg(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data if (!efl_isa(root, EFL_CANVAS_VG_GRADIENT_CLASS)) { Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(root, EFL_CANVAS_VG_NODE_CLASS); - if (nd && nd->render_pre_tvg && pd) - nd->render_pre_tvg(obj, root, nd, NULL, pd->tvg_canvas, NULL); + if (nd) nd->render_pre_tvg(obj, root, nd, NULL, pd->tvg_canvas, NULL); } tvg_canvas_update(pd->tvg_canvas); if (tvg_canvas_draw(pd->tvg_canvas) == TVG_RESULT_SUCCESS) - { - tvg_canvas_sync(pd->tvg_canvas); - } + tvg_canvas_sync(pd->tvg_canvas); } static void _render_tvg_buffer_to_screen(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd, - void *engine, void *output, void *context, void *surface, - void *buffer, int x, int y, int w, int h, Eina_Bool do_async) + void *engine, void *output, void *context, void *surface, + void *buffer, int x, int y, int w, int h, Eina_Bool do_async) { - if (!obj || !pd || !buffer) return; + if (!buffer) return; - if (!pd->im) - { - pd->im = ENFN->image_new_from_data(engine, w, h, buffer, 255, - EVAS_COLORSPACE_ARGB8888); - } - else - { - pd->im = ENFN->image_data_put(engine, pd->im, buffer); - } + //FIXE_TVG: Need to use the method original ector surface buffer (tbm or dynamic texture) + if (!pd->im) pd->im = ENFN->image_new_from_data(engine, w, h, buffer, 255, EVAS_COLORSPACE_ARGB8888); + else pd->im = ENFN->image_data_put(engine, pd->im, buffer); ENFN->image_dirty_region(engine, pd->im, 0, 0, w, h); + + //FIX_TVG: Check _render_buffer_to_screen(): async_unref variable. ENFN->image_draw(engine, output, context, surface, pd->im, 0, 0, w, h, x, y, w, h, EINA_TRUE, do_async); @@ -886,20 +878,12 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED, ENFN->context_render_op_set(engine, context, obj->cur->render_op); #ifdef HAVE_THORVG - Efl_Canvas_Vg_Node_Data *nd = NULL; Eina_Size2D size; - if (!pd || !pd->root) return; - if (!obj || !obj->cur) return; - - nd = efl_data_scope_get(pd->root, EFL_CANVAS_VG_NODE_CLASS); - if (!nd) return; - size.w = obj->cur->geometry.w; size.h = obj->cur->geometry.h; - if (size.w == 0 || size.h == 0) return; - + //Reset canvas size if (pd->tvg_canvas_size.w != size.w || pd->tvg_canvas_size.h != size.h) { pd->tvg_buffer = realloc(pd->tvg_buffer, size.w * size.h * sizeof(uint32_t)); @@ -916,8 +900,6 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED, ENFN->image_free(engine, pd->im); pd->im = NULL; } - - pd->changed = EINA_TRUE; } Vg_Cache_Entry *vg_entry = pd->vg_entry; @@ -925,6 +907,7 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED, { evas_cache_vg_entry_value_provider_update(vg_entry, efl_key_data_get(obj->object, "_vg_value_providers")); + //FIX_TVG: see _cache_vg_entry_render() how it handles the aspect ratio for optimal buffer size if ((size.w != vg_entry->w) || (size.h != vg_entry->h)) { vg_entry = evas_cache_vg_entry_resize(vg_entry, size.w, size.h); @@ -935,14 +918,15 @@ _efl_canvas_vg_object_render(Evas_Object *eo_obj EINA_UNUSED, Efl_VG *root = evas_cache_vg_tree_get(pd->vg_entry, pd->frame_idx); if (!root) return; - _render_to_buffer_tvg(obj, pd, root, + _render_to_tvg_buffer(obj, pd, root, vg_entry->w, vg_entry->h); } - if (pd->user_entry && pd->user_entry->root) + if (pd->user_entry) { - _render_to_buffer_tvg(obj, pd, pd->user_entry->root, + //FIX_TVG: see _user_vg_entry_render() how it handles the render region for optimal buffer size + _render_to_tvg_buffer(obj, pd, pd->user_entry->root, obj->cur->geometry.w, obj->cur->geometry.h); } diff --git a/src/lib/evas/canvas/efl_canvas_vg_shape.c b/src/lib/evas/canvas/efl_canvas_vg_shape.c index 69da7b1..02434f5 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_shape.c +++ b/src/lib/evas/canvas/efl_canvas_vg_shape.c @@ -6,28 +6,19 @@ #define MY_CLASS EFL_CANVAS_VG_SHAPE_CLASS #ifdef HAVE_THORVG -#include "evas_tvg_path_helpers.h" +#include "evas_vg_path_helper.h" #endif #ifdef HAVE_THORVG -#define SVG_PATH_NUM_LEN 7 #define DASH_PATTERN_EL_SIZE 2 -#define PTS_COUNT_LINE_MOVE 2 -#define PTS_COUNT_CUBIC 4 typedef enum { - EFL_TVG_PATH_CMD_TYPE_NO_BEZIER = 0, /**< For svg path commands other than listed below */ - EFL_TVG_PATH_CMD_TYPE_BEZIER_CUBIC, /**< For svg path commands S/s/C/c */ - EFL_TVG_PATH_CMD_TYPE_BEZIER_QUADRATIC /**< For svg path commands T/t/Q/q */ -} Efl_Tvg_Path_Cmd_Type; - -typedef struct _Tvg_Color Tvg_Color; -struct _Tvg_Color -{ - uint8_t r, g, b, a; -}; + PATH_CMD_TYPE_NO_BEZIER = 0, /**< For svg path commands other than listed below */ + PATH_CMD_TYPE_BEZIER_CUBIC, /**< For svg path commands S/s/C/c */ + PATH_CMD_TYPE_BEZIER_QUADRATIC /**< For svg path commands T/t/Q/q */ +} Path_Cmd_Type; #endif @@ -49,7 +40,7 @@ struct _Efl_Canvas_Vg_Shape_Data Tvg_Point curr_ctrl; Tvg_Point curr; Tvg_Point start; - Efl_Tvg_Path_Cmd_Type cmd_prev; + Path_Cmd_Type cmd_prev; //Storage for stroke's width passed in evas_vg_shape_stroke_width_set. Width variable is used to implement stroke //scaling using scale * width @@ -75,13 +66,10 @@ _interpolate(double from, double to, double pos_map) static Tvg_Paint* _get_tvg_shape(Evas_Vg_Shape *obj) { - Efl_Canvas_Vg_Node_Data *nd = NULL; - Efl_Canvas_Vg_Shape_Data *sd = NULL; - - nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); if (!nd) return NULL; - sd = nd->data; + Efl_Canvas_Vg_Shape_Data *sd = nd->data; if (!sd) return NULL; return sd->shape; @@ -90,9 +78,7 @@ _get_tvg_shape(Evas_Vg_Shape *obj) static Efl_Canvas_Vg_Shape_Data* _get_shape_data(Evas_Vg_Shape *obj) { - Efl_Canvas_Vg_Node_Data *nd = NULL; - - nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); if (!nd) return NULL; return nd->data; @@ -160,7 +146,6 @@ _get_path_length(const Evas_Vg_Path_Command *commands, static void _assign_current_point(Efl_Canvas_Vg_Shape_Data *sd, void *cmd EINA_UNUSED, double x, double y) { - if (!sd) return; /* Assign current point of shape's svg path. If it's first append command function additionally assign passed x,y as start point of shape's path */ sd->curr.x = x; @@ -176,19 +161,11 @@ _assign_current_point(Efl_Canvas_Vg_Shape_Data *sd, void *cmd EINA_UNUSED, doubl static void _assign_current_ctrl_point(Efl_Canvas_Vg_Shape_Data *sd, double x, double y) { - if (!sd) return; sd->curr_ctrl.x = x; sd->curr_ctrl.y = y; } static void -_assign_command(Efl_Canvas_Vg_Shape_Data *sd, Efl_Tvg_Path_Cmd_Type c_prev) -{ - if (!sd) return; - sd->cmd_prev = c_prev; -} - -static void _append_scubic_to(Evas_Vg_Shape *obj, double x, double y, double ctrl_x1, double ctrl_y1) { @@ -203,7 +180,7 @@ _append_scubic_to(Evas_Vg_Shape *obj, double x, double y, sd = nd->data; if (!sd) return; - if (sd->cmd_prev == EFL_TVG_PATH_CMD_TYPE_BEZIER_CUBIC) + if (sd->cmd_prev == PATH_CMD_TYPE_BEZIER_CUBIC) { ctrl_x0 = 2 * sd->curr.x - sd->curr_ctrl.x; ctrl_y0 = 2 * sd->curr.y - sd->curr_ctrl.y; @@ -238,7 +215,7 @@ _append_quadratic(Evas_Vg_Shape *obj, double x, double y, double ctrl_x, double evas_vg_shape_append_cubic_to(obj, x, y, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1); _assign_current_ctrl_point(sd, ctrl_x, ctrl_y); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_BEZIER_QUADRATIC); + sd->cmd_prev = PATH_CMD_TYPE_BEZIER_QUADRATIC; } static void @@ -256,7 +233,7 @@ _append_squadratic(Evas_Vg_Shape *obj, double x, double y) sd = nd->data; if (!sd) return; - if (sd->cmd_prev == EFL_TVG_PATH_CMD_TYPE_BEZIER_QUADRATIC) + if (sd->cmd_prev == PATH_CMD_TYPE_BEZIER_QUADRATIC) { ctrl_x = 2 * sd->curr.x - sd->curr_ctrl.x; ctrl_y = 2 * sd->curr.y - sd->curr_ctrl.y; @@ -275,7 +252,7 @@ _append_squadratic(Evas_Vg_Shape *obj, double x, double y) evas_vg_shape_append_cubic_to(obj, x, y, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1); _assign_current_ctrl_point(sd, ctrl_x, ctrl_y); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_BEZIER_QUADRATIC); + sd->cmd_prev = PATH_CMD_TYPE_BEZIER_QUADRATIC; } // code based on enesim/moonlight sources @@ -354,7 +331,7 @@ _append_arc_to(Evas_Vg_Shape *obj, double x, double y, var.sin_theta1 = sin_theta2; } _assign_current_ctrl_point(sd, ex, ey); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_NO_BEZIER); + sd->cmd_prev = PATH_CMD_TYPE_NO_BEZIER; } static void @@ -428,12 +405,7 @@ _shape_properties_interpolate(Evas_Vg_Shape *obj, const Evas_Vg_Shape *to, double pos_map) { - Efl_Canvas_Vg_Shape_Data *sd = NULL; - const Efl_Canvas_Vg_Shape_Data *sd_from = NULL; - const Efl_Canvas_Vg_Shape_Data *sd_to = NULL; - Efl_Canvas_Vg_Node_Data *nd = NULL; - const Efl_Canvas_Vg_Node_Data *nd_from = NULL; - const Efl_Canvas_Vg_Node_Data *nd_to = NULL; + if (!obj || !from || !to) return EINA_FALSE; unsigned int i = 0; int a = 0, r = 0, g = 0, b = 0; @@ -446,21 +418,19 @@ _shape_properties_interpolate(Evas_Vg_Shape *obj, Tvg_Stroke_Join join, join_to; float width, width_to; - if (!obj || !from || !to) return EINA_FALSE; - - nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); - nd_from = efl_data_scope_get(from, EFL_CANVAS_VG_NODE_CLASS); - nd_to = efl_data_scope_get(to, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd_from = efl_data_scope_get(from, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd_to = efl_data_scope_get(to, EFL_CANVAS_VG_NODE_CLASS); nd->x = _interpolate(nd_from->x, nd_to->x, pos_map); nd->y = _interpolate(nd_from->y, nd_to->y, pos_map); - sd = _get_shape_data(obj); - sd_from = _get_shape_data((Evas_Vg_Shape*)from); - sd_to = _get_shape_data((Evas_Vg_Shape*)to); + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); + Efl_Canvas_Vg_Shape_Data *sd_from = _get_shape_data(from); + Efl_Canvas_Vg_Shape_Data *sd_to = _get_shape_data(to); - efl_gfx_color_get((const Eo*)from, &r, &g, &b, &a); - efl_gfx_color_get((const Eo*)to, &to_r, &to_g, &to_b, &to_a); + efl_gfx_color_get(from, &r, &g, &b, &a); + efl_gfx_color_get(to, &to_r, &to_g, &to_b, &to_a); a = _interpolate(a, to_a, pos_map); r = _interpolate(r, to_r, pos_map); @@ -491,9 +461,7 @@ _shape_properties_interpolate(Evas_Vg_Shape *obj, if (dash && dash_to && dash_cnt > 0 && dash_cnt == dash_to_cnt) { for (i = 0; i < dash_cnt; ++i) - { - dash[i] = _interpolate(dash[i], dash_to[i], pos_map); - } + dash[i] = _interpolate(dash[i], dash_to[i], pos_map); } tvg_shape_set_stroke_dash(sd->shape, dash, dash_cnt); @@ -517,11 +485,7 @@ _shape_interpolate(Evas_Vg_Shape *obj, const Evas_Vg_Shape *to, double pos_map) { - evas_vg_shape_reset(obj); - - Tvg_Paint *tvg_dest = NULL; - Tvg_Paint *tvg_from = NULL; - Tvg_Paint *tvg_to = NULL; + if (!obj || !from || !to) return EINA_FALSE; Tvg_Path_Command *path_commands_from = NULL; Tvg_Point *path_coords_from = NULL; @@ -538,11 +502,11 @@ _shape_interpolate(Evas_Vg_Shape *obj, Tvg_Point *path_coords_dest = NULL; unsigned int i = 0; - if (!obj || !from || !to) return EINA_FALSE; + evas_vg_shape_reset(obj); - tvg_dest = _get_tvg_shape(obj); - tvg_from = _get_tvg_shape((Evas_Vg_Shape*)from); - tvg_to = _get_tvg_shape((Evas_Vg_Shape*)to); + Tvg_Paint* tvg_dest = _get_tvg_shape(obj); + Tvg_Paint* tvg_from = _get_tvg_shape((Evas_Vg_Shape*)from); + Tvg_Paint* tvg_to = _get_tvg_shape((Evas_Vg_Shape*)to); if (!tvg_dest || !tvg_from || !tvg_to) return EINA_FALSE; @@ -563,6 +527,7 @@ _shape_interpolate(Evas_Vg_Shape *obj, _shape_properties_interpolate(obj, from, to, pos_map); tvg_shape_append_path(tvg_dest, path_commands_from, cmds_count_from, path_coords_dest, pts_count_from); free(path_coords_dest); + return EINA_TRUE; } #endif @@ -688,24 +653,6 @@ _efl_canvas_vg_shape_render_pre(Evas_Object_Protected_Data *vg_pd, #endif #ifdef HAVE_THORVG -void -_convert_eina_to_tvg_mat(const Eina_Matrix3 *eina_mat, Tvg_Matrix *tvg_mat) -{ - if (!eina_mat || !tvg_mat) return; - - tvg_mat->e11 = eina_mat->xx; - tvg_mat->e12 = eina_mat->xy; - tvg_mat->e13 = eina_mat->xz; - - tvg_mat->e21 = eina_mat->yx; - tvg_mat->e22 = eina_mat->yy; - tvg_mat->e23 = eina_mat->yz; - - tvg_mat->e31 = eina_mat->zx; - tvg_mat->e32 = eina_mat->zy; - tvg_mat->e33 = eina_mat->zz; -} - static void _efl_canvas_vg_shape_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_pd, Efl_VG *obj, @@ -713,13 +660,13 @@ _efl_canvas_vg_shape_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_p Eina_Matrix3 *pTransform, void *canvas, void *scene) { + if (!nd || !nd->data) return; + Efl_Canvas_Vg_Shape_Data *sd = NULL; Tvg_Matrix trans_mat = { 0 }; - int r = 0, g = 0, b = 0, a = 0; - if (!nd || !nd->data) return; nd->flags = EFL_GFX_CHANGE_FLAG_NONE; sd = nd->data; @@ -748,13 +695,10 @@ _efl_canvas_vg_shape_render_pre_tvg(EINA_UNUSED Evas_Object_Protected_Data *vg_p } } - if (scene) - tvg_scene_push(scene, sd->shape); - else if (canvas) - tvg_canvas_push(canvas, sd->shape); + tvg_paint_set_opacity(sd->shape, nd->visibility ? 255 : 0); - uint8_t opacity = nd->visibility ? 255 : 0; - tvg_paint_set_opacity(sd->shape, opacity); + if (scene) tvg_scene_push(scene, sd->shape); + else if (canvas) tvg_canvas_push(canvas, sd->shape); } #endif @@ -941,12 +885,10 @@ EAPI double evas_vg_shape_stroke_scale_get(Evas_Vg_Shape *obj) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - - if (!obj) return 0.0; + if (!obj) return 0; - sd = _get_shape_data(obj); - if (!sd) return 0.0; + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); + if (!sd) return 0; return sd->scale; #else @@ -958,10 +900,9 @@ EAPI void evas_vg_shape_stroke_scale_set(Evas_Vg_Shape *obj, double s) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; if (!obj) return; - sd = _get_shape_data(obj); + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd) return; sd->scale = s; @@ -1017,10 +958,9 @@ EAPI void evas_vg_shape_stroke_width_set(Evas_Vg_Shape *obj, double w) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; if (!obj) return; - sd = _get_shape_data(obj); + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd) return; sd->width = w; @@ -1051,18 +991,16 @@ EAPI void evas_vg_shape_stroke_dash_get(Evas_Vg_Shape *obj, const Evas_Vg_Dash **dash, unsigned int *length) { #ifdef HAVE_THORVG + if (!dash || !length) return; + const float *dashPattern; uint32_t cnt = 0; - - Evas_Vg_Dash *d = NULL; - unsigned int i = 0; - if (!dash || !length) return; tvg_shape_get_stroke_dash(_get_tvg_shape(obj), &dashPattern, &cnt); if (!cnt) return; - d = calloc(cnt / DASH_PATTERN_EL_SIZE, sizeof(Evas_Vg_Dash)); + Evas_Vg_Dash *d = calloc(cnt / DASH_PATTERN_EL_SIZE, sizeof(Evas_Vg_Dash)); if (!d) return; for (i = 0; i < cnt / DASH_PATTERN_EL_SIZE; ++i) @@ -1155,19 +1093,17 @@ evas_vg_shape_path_set(Evas_Vg_Shape *obj, const Evas_Vg_Path_Command *op, const unsigned int pts_length = 0; unsigned int i = 0, k = 0; - Tvg_Path_Command *commands = NULL; Tvg_Point *pts = NULL; _get_path_length(op, &cmd_length, &pts_length); - commands = malloc(sizeof(Tvg_Path_Command) * (cmd_length - 1)); + Tvg_Path_Command* commands = malloc(sizeof(Tvg_Path_Command) * (cmd_length - 1)); if (!commands) return; - pts = malloc(sizeof(Tvg_Point) * pts_length / 2); + Tvg_Point* pts = malloc(sizeof(Tvg_Point) * pts_length / 2); if (!pts) return; k = 0; - for (i = 0; i < pts_length; i += 2) { pts[k].x = points[i]; @@ -1193,22 +1129,17 @@ evas_vg_shape_path_get(Evas_Vg_Shape *obj, const Evas_Vg_Path_Command **op, cons { if (!op || !points) return; #ifdef HAVE_THORVG - Tvg_Paint *shape = NULL; + Evas_Vg_Path_Command *evas_cmds = NULL; + double *evas_pts = NULL; + + Tvg_Paint *shape = _get_tvg_shape(obj); const Tvg_Path_Command *tvg_cmds = NULL; uint32_t cmds_len = 0; + tvg_shape_get_path_commands(shape, &tvg_cmds, &cmds_len); const Tvg_Point *tvg_pts = NULL; uint32_t pts_len = 0; - - unsigned int i = 0, j = 0; - - Evas_Vg_Path_Command *evas_cmds = NULL; - double *evas_pts = NULL; - - shape = _get_tvg_shape(obj); - - tvg_shape_get_path_commands(shape, &tvg_cmds, &cmds_len); tvg_shape_get_path_coords(shape, &tvg_pts, &pts_len); if (!tvg_cmds || (cmds_len <= 0) || !tvg_pts || (pts_len <= 0)) @@ -1218,19 +1149,17 @@ evas_vg_shape_path_get(Evas_Vg_Shape *obj, const Evas_Vg_Path_Command **op, cons return; } + unsigned int i = 0, j = 0; evas_cmds = (Evas_Vg_Path_Command*)malloc(sizeof(Evas_Vg_Path_Command) * (cmds_len + 1)); for (i = 0; i < cmds_len; ++i) - { - evas_cmds[i] = _get_evas_command(tvg_cmds[i]); - } + evas_cmds[i] = _get_evas_command(tvg_cmds[i]); evas_cmds[cmds_len] = EVAS_VG_PATH_COMMAND_END; *op = evas_cmds; evas_pts = (double*)malloc(sizeof(double) * pts_len * 2); - i = 0; for (i = 0; i < pts_len; ++i) { @@ -1273,14 +1202,11 @@ EAPI void evas_vg_shape_current_get(Evas_Vg_Shape *obj, double *x, double *y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Node_Data *nd = NULL; - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); if (!nd) return; - sd = nd->data; + Efl_Canvas_Vg_Shape_Data *sd = nd->data; if (!sd) return; if (x) *x = sd->curr.x; @@ -1294,14 +1220,11 @@ EAPI void evas_vg_shape_current_ctrl_get(Evas_Vg_Shape *obj, double *x, double *y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Node_Data *nd = NULL; - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); + Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); if (!nd) return; - sd = nd->data; + Efl_Canva_Vg_Shape_Data *sd = nd->data; if (!sd) return; if (x) *x = sd->curr_ctrl.x; @@ -1347,15 +1270,14 @@ EAPI void evas_vg_shape_append_move_to(Evas_Vg_Shape *obj, double x, double y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canva_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; tvg_shape_move_to(sd->shape, x, y); _assign_current_point(sd, NULL, x, y); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_NO_BEZIER); + sd->cmd_prev = PATH_CMD_TYPE_NO_BEZIER; #else efl_gfx_path_append_move_to(obj, x, y); #endif @@ -1366,15 +1288,14 @@ EAPI void evas_vg_shape_append_line_to(Evas_Vg_Shape *obj, double x, double y) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; tvg_shape_line_to(sd->shape, x, y); _assign_current_point(sd, NULL, x, y); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_NO_BEZIER); + sd->cmd_prev = PATH_CMD_TYPE_NO_BEZIER; #else efl_gfx_path_append_line_to(obj, x, y); #endif @@ -1407,16 +1328,15 @@ EAPI void evas_vg_shape_append_cubic_to(Evas_Vg_Shape *obj, double x, double y, double ctrl_x0, double ctrl_y0, double ctrl_x1, double ctrl_y1) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; tvg_shape_cubic_to(sd->shape, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1, x, y); _assign_current_point(sd, NULL, x, y); _assign_current_ctrl_point(sd, ctrl_x1, ctrl_y1); - _assign_command(sd, EFL_TVG_PATH_CMD_TYPE_BEZIER_CUBIC); + sd->cmd_prev = PATH_CMD_TYPE_BEZIER_CUBIC; #else efl_gfx_path_append_cubic_to(obj, ctrl_x0, ctrl_y0, ctrl_x1, ctrl_y1, x, y); #endif @@ -1451,6 +1371,11 @@ evas_vg_shape_append_arc(Evas_Vg_Shape *obj, double x, double y, double w, doubl #ifndef HAVE_THORVG efl_gfx_path_append_arc(obj, x, y, w, h, start_angle, sweep_length); #else + if (!obj) return; + + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); + if (!sd || !sd->shape) return; + Efl_Canvas_Vg_Shape_Data *sd = NULL; const Tvg_Path_Command *cmds = NULL; uint32_t cmds_count = 0; @@ -1460,10 +1385,6 @@ evas_vg_shape_append_arc(Evas_Vg_Shape *obj, double x, double y, double w, doubl //FIX_TVG: we can revise this with tvg appendArc() way. Point curve_start = _curves_for_arc(x, y, w, h, start_angle, sweep_length, pts, &point_count); - if (!obj) return; - sd = _get_shape_data(obj); - if (!sd || !sd->shape) return; - tvg_shape_get_path_commands(sd->shape, &cmds, &cmds_count); if (cmds_count && cmds[cmds_count - 1] != TVG_PATH_COMMAND_CLOSE) { @@ -1506,10 +1427,9 @@ EAPI void evas_vg_shape_append_circle(Evas_Vg_Shape *obj, double x, double y, double radius) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canva_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; tvg_shape_append_circle(sd->shape, x, y, radius, radius); @@ -1524,11 +1444,11 @@ EAPI void evas_vg_shape_append_ellipse(Evas_Vg_Shape *obj, double cx, double cy, double rx, double ry) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; + tvg_shape_append_circle(sd->shape, cx, cy, rx, ry); _assign_current_point(sd, NULL, cx, cy - ry); #else @@ -1541,10 +1461,9 @@ EAPI void evas_vg_shape_append_rect(Evas_Vg_Shape *obj, double x, double y, double w, double h, double rx, double ry) { #ifdef HAVE_THORVG - Efl_Canvas_Vg_Shape_Data *sd = NULL; - if (!obj) return; - sd = _get_shape_data(obj); + + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); if (!sd || !sd->shape) return; tvg_shape_append_rect(sd->shape, x, y, w, h, rx, ry); @@ -1559,8 +1478,10 @@ EAPI void evas_vg_shape_append_svg_path(Evas_Vg_Shape *obj, const char *svg_path_data) { #ifdef HAVE_THORVG + #define SVG_PATH_NUM_LEN 7 + Efl_Canvas_Vg_Shape_Data *sd = _get_shape_data(obj); - Efl_Tvg_Shape_Svg_Path svg_path = { 0 }; + Shape_Svg_Path svg_path = { 0 }; double number_array[SVG_PATH_NUM_LEN] = {0}; int number_count = 0; diff --git a/src/lib/evas/canvas/evas_tvg_path_helpers.h b/src/lib/evas/canvas/evas_vg_path_helper.h similarity index 98% rename from src/lib/evas/canvas/evas_tvg_path_helpers.h rename to src/lib/evas/canvas/evas_vg_path_helper.h index 087fa11..51a916a 100644 --- a/src/lib/evas/canvas/evas_tvg_path_helpers.h +++ b/src/lib/evas/canvas/evas_vg_path_helper.h @@ -8,19 +8,15 @@ #define PATH_KAPPA 0.5522847498 -typedef struct _Efl_Tvg_Shape_Svg_Path Efl_Tvg_Shape_Svg_Path; -typedef struct _Arc_To_Init_Variables Arc_To_Init_Variables; -typedef struct _Point Point; - -struct _Efl_Tvg_Shape_Svg_Path { +typedef struct _Shape_Svg_Path { char *svg_path_data; - Tvg_Path_Command *cmds; + Tvg_Path_Commtand *cmds; Tvg_Point *pts; uint32_t cmds_cnt; uint32_t pts_cnt; uint32_t cmds_reserved; uint32_t pts_reserved; -}; +} Shape_Svg_Path; struct _Arc_To_Init_Variables { double cx, cy; @@ -30,12 +26,12 @@ struct _Arc_To_Init_Variables { double sin_phi_rx, sin_phi_ry; double cos_theta1, sin_theta1; int segments; -}; +} Arc_To_Init_Variables; -struct _Point { +typedef struct _Point { double x; double y; -}; +} Point; static char * _skipcomma(const char *content) @@ -304,7 +300,7 @@ _arc_to_variables_initialization(double x, double y, double rx, double ry, } static Eina_Bool -_svg_path_grow(Efl_Tvg_Shape_Svg_Path *svg_path, int command_length) +_svg_path_grow(Shape_Svg_Path *svg_path, int command_length) { if (svg_path->pts_cnt + command_length > svg_path->pts_reserved) { @@ -331,7 +327,7 @@ _svg_path_grow(Efl_Tvg_Shape_Svg_Path *svg_path, int command_length) } static void -_process_command(Efl_Tvg_Shape_Svg_Path *svg_path, char c, double *pts, +_process_command(Shape_Svg_Path *svg_path, char c, double *pts, int *number_array, double *cur_x, double *cur_y, double *cur_ctl_x, double *cur_ctl_y, double *start_x, double *start_y, diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h index 788b8d6..cf5f128 100644 --- a/src/lib/evas/canvas/evas_vg_private.h +++ b/src/lib/evas/canvas/evas_vg_private.h @@ -73,22 +73,18 @@ struct _Efl_Canvas_Vg_Node_Data { Eina_Matrix3 *m; Efl_Canvas_Vg_Interpolation *intp; - -#ifndef HAVE_THORVG - Ector_Renderer *renderer; -#endif - Efl_VG *vg_obj; Efl_Canvas_Vg_Object_Data *vd; +#ifdef HAVE_THORVG + void (*render_pre_tvg)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, Eina_Matrix3 *ptransform, void *canvas, void *scene); +#else + Ector_Renderer *renderer; + void (*render_pre)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, void *engine, void *output, void *contenxt, Ector_Surface *surface, Eina_Matrix3 *ptransform, int opacity, Ector_Buffer *comp, Efl_Gfx_Vg_Composite_Method comp_method, void *data); - -#ifdef HAVE_THORVG - void (*render_pre_tvg)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, Eina_Matrix3 *ptransform, void *canvas, void *scene); - void (*render_tvg)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, void *canvas); #endif void *data; @@ -185,7 +181,23 @@ Eina_Inarray* evas_cache_vg_anim_sector_list_get(const Vg_Cache_En // #ifdef HAVE_THORVG -void _convert_eina_to_tvg_mat(const Eina_Matrix3 *eina_mat, Tvg_Matrix *tvg_mat); +static inline void +_convert_eina_to_tvg_mat(const Eina_Matrix3 *eina_mat, Tvg_Matrix *tvg_mat) +{ + if (!eina_mat || !tvg_mat) return; + + tvg_mat->e11 = eina_mat->xx; + tvg_mat->e12 = eina_mat->xy; + tvg_mat->e13 = eina_mat->xz; + + tvg_mat->e21 = eina_mat->yx; + tvg_mat->e22 = eina_mat->yy; + tvg_mat->e23 = eina_mat->yz; + + tvg_mat->e31 = eina_mat->zx; + tvg_mat->e32 = eina_mat->zy; + tvg_mat->e33 = eina_mat->zz; +} #endif static inline void diff --git a/src/lib/evas/vg/evas_vg_cache.c b/src/lib/evas/vg/evas_vg_cache.c index ca262a3..8ec385b 100644 --- a/src/lib/evas/vg/evas_vg_cache.c +++ b/src/lib/evas/vg/evas_vg_cache.c @@ -323,7 +323,7 @@ evas_cache_vg_shutdown(void) vg_cache->ref--; #ifdef HAVE_THORVG - tvg_engine_term(TVG_ENGINE_SW | TVG_ENGINE_GL); + tvg_engine_term(TVG_ENGINE_SW); #endif if (vg_cache->ref > 0) return; diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c index 8ca582a..7852daa 100644 --- a/src/static_libs/vg_common/vg_common_svg.c +++ b/src/static_libs/vg_common/vg_common_svg.c @@ -794,7 +794,7 @@ _apply_vg_property(Svg_Node *node, Efl_VG *vg, Efl_VG *parent, Vg_File_Data *vg_ // apply the fill style property #ifndef HAVE_THORVG - //TODO: not supported by evas api? + //FIX_TVG: replace? efl_gfx_shape_fill_rule_set(vg, style->fill.fill_rule); #endif evas_vg_shape_stroke_width_set(vg, style->stroke.width); @@ -1116,7 +1116,7 @@ _apply_svg_property(Svg_Node *node, Efl_VG *vg) // apply the fill style property #ifndef HAVE_THORVG - //TODO: fill rule api missing in evas + //FIX_TVG:: replace? style->fill.fill_rule = efl_gfx_shape_fill_rule_get(vg); #endif style->fill.paint.none = EINA_FALSE; -- 2.7.4