evas: code refactoring by tvg integration. 28/255428/11
authorHermet Park <chuneon.park@samsung.com>
Thu, 18 Mar 2021 07:08:18 +0000 (16:08 +0900)
committerHermet Park <chuneon.park@samsung.com>
Thu, 18 Mar 2021 11:46:35 +0000 (20:46 +0900)
Change-Id: Ib5d37aa93db784b7c2829f36ffe85ff987d36d73

12 files changed:
src/lib/evas/canvas/efl_canvas_vg_container.c
src/lib/evas/canvas/efl_canvas_vg_gradient.c
src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c
src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c
src/lib/evas/canvas/efl_canvas_vg_image.c
src/lib/evas/canvas/efl_canvas_vg_node.c
src/lib/evas/canvas/efl_canvas_vg_object.c
src/lib/evas/canvas/efl_canvas_vg_shape.c
src/lib/evas/canvas/evas_vg_path_helper.h [moved from src/lib/evas/canvas/evas_tvg_path_helpers.h with 98% similarity]
src/lib/evas/canvas/evas_vg_private.h
src/lib/evas/vg/evas_vg_cache.c
src/static_libs/vg_common/vg_common_svg.c

index d0c6d78..53e41ec 100644 (file)
@@ -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)
index b28b8c6..2f93211 100644 (file)
 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
index 2c402c4..ce8690a 100644 (file)
@@ -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;
index 20e46a7..da736c0 100644 (file)
@@ -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"
index eb0dfc0..738abc2 100644 (file)
@@ -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
 }
 
index 68e8f4c..a459606 100644 (file)
@@ -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)
index ad31251..ea54052 100644 (file)
@@ -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);
      }
index 69da7b1..02434f5 100644 (file)
@@ -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;
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 (file)
@@ -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,
index 788b8d6..cf5f128 100644 (file)
@@ -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
index ca262a3..8ec385b 100644 (file)
@@ -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;
index 8ca582a..7852daa 100644 (file)
@@ -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;