cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=79b283ab94a463c99a3ffeaedda2f4f268479a01
commit 79b283ab94a463c99a3ffeaedda2f4f268479a01 Author: Cedric BAIL <[email protected]> Date: Thu Mar 29 13:58:00 2018 -0700 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 @@ -261,6 +261,18 @@ _efl_canvas_vg_node_efl_object_constructor(Eo *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) { if (pd->m) @@ -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) --
