From 79b283ab94a463c99a3ffeaedda2f4f268479a01 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 29 Mar 2018 13:58:00 -0700 Subject: [PATCH] evas: fix lifecycle of Ector renderer. Ector renderer are created by a factory pattern which return a reference. The possible logic improvement from here would be to rely on setting the parent of the object to the Ector_Surface and manage a cache by intercepting efl_noref to trigger an efl_del of the object or a temporary cache of it. That's for later. --- src/lib/evas/canvas/efl_canvas_vg_node.eo | 1 + src/lib/evas/canvas/evas_vg_node.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_vg_node.eo b/src/lib/evas/canvas/efl_canvas_vg_node.eo index 0296a4185b..a273afab9e 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_node.eo +++ b/src/lib/evas/canvas/efl_canvas_vg_node.eo @@ -65,6 +65,7 @@ abstract Efl.Canvas.VG.Node (Efl.Object, Efl.Gfx, Efl.Gfx.Color, Efl.Gfx.Stack, Efl.Object.name { set; } Efl.Object.parent { set; } Efl.Object.constructor; + Efl.Object.invalidate; Efl.Object.destructor; Efl.Gfx.visible { get; set; } Efl.Gfx.Color.color { get; set; } diff --git a/src/lib/evas/canvas/evas_vg_node.c b/src/lib/evas/canvas/evas_vg_node.c index 569e77b5f9..d950aa8e75 100644 --- a/src/lib/evas/canvas/evas_vg_node.c +++ b/src/lib/evas/canvas/evas_vg_node.c @@ -260,6 +260,18 @@ _efl_canvas_vg_node_efl_object_constructor(Eo *obj, return obj; } +static void +_efl_canvas_vg_node_efl_object_invalidate(Eo *obj, Efl_Canvas_VG_Node_Data *pd) +{ + if (pd->renderer) + { + efl_unref(pd->renderer); + pd->renderer = NULL; + } + + efl_invalidate(efl_super(obj, MY_CLASS)); +} + static void _efl_canvas_vg_node_efl_object_destructor(Eo *obj, Efl_Canvas_VG_Node_Data *pd) { @@ -268,12 +280,6 @@ _efl_canvas_vg_node_efl_object_destructor(Eo *obj, Efl_Canvas_VG_Node_Data *pd) free(pd->m); pd->m = NULL; } - - if (pd->renderer) - { - efl_del(pd->renderer); - pd->renderer = NULL; - } if (pd->intp) { free(pd->intp); @@ -651,7 +657,7 @@ _efl_canvas_vg_node_efl_gfx_path_interpolate(Eo *obj, tod = efl_data_scope_get(to, EFL_CANVAS_VG_NODE_CLASS); from_map = 1.0 - pos_map; - efl_del(pd->renderer); + efl_unref(pd->renderer); pd->renderer = NULL; if (fromd->m || tod->m)