evas vector: Fixed container interpolation 38/249138/2
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Mon, 7 Dec 2020 14:17:13 +0000 (15:17 +0100)
committerHermet Park <chuneon.park@samsung.com>
Wed, 9 Dec 2020 11:11:19 +0000 (11:11 +0000)
Commit fixes containers interpolation (interpolation of all childrens in
container), used mostly in edje files as svg loaders. Additionally hash
array of shape targets was removed because of rendering pipe changed.
Now tvg_canvas_clear() is used in rendering pipeline, which simplifies
code.

Change-Id: I2a328ab13afb088e170d6ccd8fe43808176ec3ba

src/lib/evas/canvas/efl_canvas_vg_container.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_private.h

index 2082010..524d688 100644 (file)
@@ -62,22 +62,12 @@ _efl_canvas_vg_container_render_pre_tvg(Evas_Object_Protected_Data *obj,
    if (!nd || !nd->data) return;
    cd = nd->data;
 
+   tvg_scene_clear(cd->scene);
+
    if (scene != NULL)
-     {
-        if (eina_hash_find(cd->targets, &scene) == NULL)
-          {
-             tvg_scene_push(scene, cd->scene);
-             eina_hash_add(cd->targets, &scene, scene);
-          }
-     }
+     tvg_scene_push(scene, cd->scene);
    else if (scene == NULL && canvas != NULL)
-     {
-        if (eina_hash_find(cd->targets, &canvas) == NULL)
-          {
-             tvg_canvas_push(canvas, cd->scene);
-             eina_hash_add(cd->targets, &canvas, canvas);
-          }
-     }
+     tvg_canvas_push(canvas, cd->scene);
 
    EFL_CANVAS_VG_COMPUTE_MATRIX(cTransform, pTransform, nd);
 
@@ -301,7 +291,6 @@ _efl_canvas_vg_container_efl_object_constructor(Eo *obj,
 
 #ifdef HAVE_THORVG
    pd->scene = tvg_scene_new();
-   pd->targets = eina_hash_pointer_new(NULL);
    nd->render_pre_tvg = _efl_canvas_vg_container_render_pre_tvg;
 #endif
 
@@ -325,7 +314,6 @@ _efl_canvas_vg_container_efl_object_destructor(Eo *obj,
 #else
    tvg_scene_clear(pd->scene);
    tvg_paint_del(pd->scene);
-   eina_hash_free(pd->targets);
 #endif
 
    efl_unref(pd->comp_target);
index b0783f4..941e04a 100644 (file)
@@ -449,6 +449,8 @@ static void
 _render_to_buffer_tvg(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd,
                       Efl_VG *root, int w, int h)
 {
+   tvg_canvas_clear(pd->tvg_canvas, false);
+
    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);
index 0876f1d..b555ecc 100644 (file)
@@ -55,10 +55,6 @@ struct _Efl_Canvas_Vg_Shape_Data
    //scaling using scale * width
    double scale;
 
-   //hash array indicates where shape was added. It have to be used to don't double
-   //the same objects stored in one canvas or scene.
-   Eina_Hash *targets;
-
    //Flag indicates if shape was started. It is used to store start position
    //and keep shape current point valid when shape close API is called.
    Eina_Bool started;
@@ -772,21 +768,9 @@ _efl_canvas_vg_shape_render_pre_tvg(Evas_Object_Protected_Data *vg_pd,
      }
 
    if (scene)
-     {
-        if (eina_hash_find(sd->targets, &scene) == NULL)
-          {
-             tvg_scene_push(scene, sd->shape);
-             eina_hash_add(sd->targets, &scene, scene);
-          }
-     }
+     tvg_scene_push(scene, sd->shape);
    else if (canvas)
-     {
-        if (eina_hash_find(sd->targets, &canvas) == NULL)
-          {
-             tvg_canvas_push(canvas, sd->shape);
-             eina_hash_add(sd->targets, &canvas, canvas);
-          }
-     }
+     tvg_canvas_push(canvas, sd->shape);
 
    uint8_t opacity = nd->visibility ? 255 : 0;
    tvg_paint_set_opacity(sd->shape, opacity);
@@ -816,7 +800,6 @@ _efl_canvas_vg_shape_efl_object_constructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *p
    nd->render_pre_tvg = _efl_canvas_vg_shape_render_pre_tvg;
    pd->shape = tvg_shape_new();
    pd->scale = 1.0;
-   pd->targets = eina_hash_pointer_new(NULL);
 
    //default EFL implementation. We don't want to draw invisible shapes.
    //when object is visible, renderer changes opacity to valid value.
@@ -836,7 +819,6 @@ _efl_canvas_vg_shape_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *pd
 
 #ifdef HAVE_THORVG
    tvg_paint_del(pd->shape);
-   eina_hash_free(pd->targets);
 #else
    efl_gfx_path_reset(obj);
 #endif
@@ -851,8 +833,9 @@ _efl_canvas_vg_shape_efl_gfx_path_interpolate(Eo *obj,
                                               const Efl_Canvas_Vg_Node *to,
                                               double pos_map)
 {
-   Efl_Canvas_Vg_Shape_Data *fromd, *tod;
    Eina_Bool r = EINA_TRUE;
+#ifndef HAVE_THORVG
+   Efl_Canvas_Vg_Shape_Data *fromd, *tod;
 
    //Check if both objects have same type
    if (!(efl_isa(from, MY_CLASS) && efl_isa(to, MY_CLASS)))
@@ -877,6 +860,9 @@ _efl_canvas_vg_shape_efl_gfx_path_interpolate(Eo *obj,
    //Stroke Marker
    if (fromd->stroke.marker && tod->stroke.marker && pd->stroke.marker)
      r &= efl_gfx_path_interpolate(pd->stroke.marker, fromd->stroke.marker, tod->stroke.marker, pos_map);
+#else
+   r = evas_vg_shape_interpolate(obj, from, to, pos_map);
+#endif
 
    return r;
 }
index f8dac76..1c9189a 100644 (file)
@@ -133,7 +133,6 @@ struct _Efl_Canvas_Vg_Container_Data
 
 #ifdef HAVE_THORVG
    Tvg_Paint *scene;
-   Eina_Hash *targets;
 #endif
 };