From bd99e1ba806990d5e1da718521109d4aa3422437 Mon Sep 17 00:00:00 2001 From: Michal Szczecinski Date: Mon, 7 Dec 2020 15:17:13 +0100 Subject: [PATCH] evas vector: Fixed container interpolation 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 | 20 ++++--------------- src/lib/evas/canvas/efl_canvas_vg_object.c | 2 ++ src/lib/evas/canvas/efl_canvas_vg_shape.c | 28 +++++++-------------------- src/lib/evas/canvas/evas_vg_private.h | 1 - 4 files changed, 13 insertions(+), 38 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_vg_container.c b/src/lib/evas/canvas/efl_canvas_vg_container.c index 2082010..524d688 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_container.c +++ b/src/lib/evas/canvas/efl_canvas_vg_container.c @@ -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); diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index b0783f4..941e04a 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -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); diff --git a/src/lib/evas/canvas/efl_canvas_vg_shape.c b/src/lib/evas/canvas/efl_canvas_vg_shape.c index 0876f1d..b555ecc 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_shape.c +++ b/src/lib/evas/canvas/efl_canvas_vg_shape.c @@ -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; } diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h index f8dac76..1c9189a 100644 --- a/src/lib/evas/canvas/evas_vg_private.h +++ b/src/lib/evas/canvas/evas_vg_private.h @@ -133,7 +133,6 @@ struct _Efl_Canvas_Vg_Container_Data #ifdef HAVE_THORVG Tvg_Paint *scene; - Eina_Hash *targets; #endif }; -- 2.7.4