From: SangHyeon Jade Lee Date: Thu, 27 Dec 2018 07:48:01 +0000 (+0900) Subject: Revert "evas vg: optimize vg object internal connections." X-Git-Tag: submit/tizen/20181227.084356^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ec7eb6951287ea4fc54e89a0960b904432a7680e;p=platform%2Fupstream%2Fefl.git Revert "evas vg: optimize vg object internal connections." This reverts commit 90d311db9c5a7aeb2264073c4a45bcfdcc30c730. Change-Id: Ie46f314940c37707a6708617e5f67db275001ed8 Signed-off-by: SangHyeon Jade Lee --- diff --git a/src/lib/evas/canvas/efl_canvas_vg_container.c b/src/lib/evas/canvas/efl_canvas_vg_container.c index b733db5..addbf0c 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_container.c +++ b/src/lib/evas/canvas/efl_canvas_vg_container.c @@ -286,18 +286,7 @@ _efl_canvas_vg_container_efl_canvas_vg_node_mask_set(Eo *obj, pd->mask.option = op; efl_replace(&pd->mask_src, mask); - efl_canvas_vg_node_change(obj); -} - -static void -_efl_canvas_vg_container_efl_object_parent_set(Eo *obj, - Efl_Canvas_Vg_Container_Data *cd, - Eo *parent) -{ - efl_parent_set(efl_super(obj, MY_CLASS), parent); - - Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS); - efl_canvas_vg_container_vg_obj_update(obj, nd); + _efl_canvas_vg_node_changed(obj); } EOLIAN static Efl_VG * @@ -330,32 +319,6 @@ _efl_canvas_vg_container_efl_duplicate_duplicate(const Eo *obj, return container; } -void -efl_canvas_vg_container_vg_obj_update(Efl_VG *obj, Efl_Canvas_Vg_Node_Data *nd) -{ - if (!obj) return; - - Efl_Canvas_Vg_Container_Data *cd = efl_data_scope_get(obj, MY_CLASS); - if (!cd) return; - - Eina_List *l; - Efl_VG* child; - - EINA_LIST_FOREACH(cd->children, l, child) - { - Efl_Canvas_Vg_Node_Data *child_nd = - efl_data_scope_get(child, EFL_CANVAS_VG_NODE_CLASS); - - if (child_nd->vg_obj == nd->vg_obj) continue; - - child_nd->vg_obj = nd->vg_obj; - child_nd->vd = nd->vd; - - if (efl_isa(child, MY_CLASS)) - efl_canvas_vg_container_vg_obj_update(child, child_nd); - } -} - EAPI Efl_VG* evas_vg_container_add(Efl_VG *parent) { diff --git a/src/lib/evas/canvas/efl_canvas_vg_container.eo b/src/lib/evas/canvas/efl_canvas_vg_container.eo index 3d26efd..4060441 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_container.eo +++ b/src/lib/evas/canvas/efl_canvas_vg_container.eo @@ -18,7 +18,6 @@ class Efl.Canvas.Vg.Container (Efl.Canvas.Vg.Node) implements { Efl.Object.constructor; Efl.Object.destructor; - Efl.Object.parent { set; } Efl.Gfx.Path.bounds_get; Efl.Gfx.Path.interpolate; Efl.Duplicate.duplicate; diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient.c b/src/lib/evas/canvas/efl_canvas_vg_gradient.c index ad6761b..649643b 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient.c @@ -23,7 +23,7 @@ _efl_canvas_vg_gradient_efl_gfx_gradient_stop_set(Eo *obj EINA_UNUSED, memcpy(pd->colors, colors, length * sizeof(Efl_Gfx_Gradient_Stop)); pd->colors_count = length; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static void @@ -43,7 +43,7 @@ _efl_canvas_vg_gradient_efl_gfx_gradient_spread_set(Eo *obj EINA_UNUSED, { pd->spread = spread; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static Efl_Gfx_Gradient_Spread diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c b/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c index ad3118f..fa35d29 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c @@ -23,7 +23,7 @@ _efl_canvas_vg_gradient_linear_efl_gfx_gradient_linear_start_set(Eo *obj EINA_UN pd->start.x = x; pd->start.y = y; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static void @@ -43,7 +43,7 @@ _efl_canvas_vg_gradient_linear_efl_gfx_gradient_linear_end_set(Eo *obj EINA_UNUS pd->end.x = x; pd->end.y = y; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static void diff --git a/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c b/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c index 4146cdd..9ff537e 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c +++ b/src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c @@ -22,7 +22,7 @@ _efl_canvas_vg_gradient_radial_efl_gfx_gradient_radial_center_set(Eo *obj EINA_U pd->center.x = x; pd->center.y = y; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static void @@ -41,7 +41,7 @@ _efl_canvas_vg_gradient_radial_efl_gfx_gradient_radial_radius_set(Eo *obj EINA_U { pd->radius = r; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static double @@ -59,7 +59,7 @@ _efl_canvas_vg_gradient_radial_efl_gfx_gradient_radial_focal_set(Eo *obj EINA_UN pd->focal.x = x; pd->focal.y = y; - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static void diff --git a/src/lib/evas/canvas/efl_canvas_vg_node.c b/src/lib/evas/canvas/efl_canvas_vg_node.c index e5cc6c9..dc2c4a3 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_node.c +++ b/src/lib/evas/canvas/efl_canvas_vg_node.c @@ -17,26 +17,22 @@ static const Efl_Canvas_Vg_Interpolation interpolation_identity = { }; static void -_node_change(Efl_VG *obj, Efl_Canvas_Vg_Node_Data *nd) +_efl_canvas_vg_node_property_changed(void *data, const Efl_Event *event EINA_UNUSED) { - if (nd->flags != EFL_GFX_CHANGE_FLAG_NONE) return; - nd->flags = EFL_GFX_CHANGE_FLAG_ALL; + Efl_Canvas_Vg_Node_Data *pd = data; + Eo *parent; - Eo *p = obj; - while ((p = efl_parent_get(p))) - { - Efl_Canvas_Vg_Node_Data *pnd = efl_data_scope_get(p, MY_CLASS); - if (!pnd || (pnd->flags != EFL_GFX_CHANGE_FLAG_NONE)) break; - pnd->flags = EFL_GFX_CHANGE_FLAG_ALL; - } + if (!pd->flags) pd->flags = EFL_GFX_CHANGE_FLAG_ALL; - efl_canvas_vg_object_change(nd->vd); + if (efl_invalidated_get(event->object)) return; + parent = efl_parent_get(event->object); + efl_event_callback_call(parent, event->desc, event->info); } static void _efl_canvas_vg_node_transformation_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - const Eina_Matrix3 *m) + Efl_Canvas_Vg_Node_Data *pd, + const Eina_Matrix3 *m) { if (pd->intp) { @@ -60,7 +56,7 @@ _efl_canvas_vg_node_transformation_set(Eo *obj, } pd->flags |= EFL_GFX_CHANGE_FLAG_MATRIX; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); } const Eina_Matrix3 * @@ -79,13 +75,13 @@ _efl_canvas_vg_node_mask_set(Eo *obj EINA_UNUSED, static void _efl_canvas_vg_node_origin_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - double x, double y) + Efl_Canvas_Vg_Node_Data *pd, + double x, double y) { pd->x = x; pd->y = y; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); } static void @@ -98,14 +94,12 @@ _efl_canvas_vg_node_origin_get(const Eo *obj EINA_UNUSED, } static void -_efl_canvas_vg_node_efl_gfx_entity_position_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - Eina_Position2D pos) +_efl_canvas_vg_node_efl_gfx_entity_position_set(Eo *obj EINA_UNUSED, Efl_Canvas_Vg_Node_Data *pd, Eina_Position2D pos) { pd->x = (double) pos.x; pd->y = (double) pos.y; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); } static Eina_Position2D @@ -116,13 +110,12 @@ _efl_canvas_vg_node_efl_gfx_entity_position_get(const Eo *obj EINA_UNUSED, Efl_C } static void -_efl_canvas_vg_node_efl_gfx_entity_visible_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - Eina_Bool v) +_efl_canvas_vg_node_efl_gfx_entity_visible_set(Eo *obj EINA_UNUSED, + Efl_Canvas_Vg_Node_Data *pd, Eina_Bool v) { pd->visibility = v; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); } @@ -134,9 +127,9 @@ _efl_canvas_vg_node_efl_gfx_entity_visible_get(const Eo *obj EINA_UNUSED, } static void -_efl_canvas_vg_node_efl_gfx_color_color_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - int r, int g, int b, int a) +_efl_canvas_vg_node_efl_gfx_color_color_set(Eo *obj EINA_UNUSED, + Efl_Canvas_Vg_Node_Data *pd, + int r, int g, int b, int a) { if (r > 255) r = 255; if (r < 0) r = 0; @@ -167,7 +160,7 @@ _efl_canvas_vg_node_efl_gfx_color_color_set(Eo *obj, pd->b = b; pd->a = a; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); } static void @@ -224,7 +217,7 @@ _efl_canvas_vg_node_parent_checked_get(Eo *obj, static Eo * _efl_canvas_vg_node_efl_object_constructor(Eo *obj, - Efl_Canvas_Vg_Node_Data *nd) + Efl_Canvas_Vg_Node_Data *pd) { Efl_Canvas_Vg_Container_Data *cd; Eo *parent; @@ -237,16 +230,10 @@ _efl_canvas_vg_node_efl_object_constructor(Eo *obj, return NULL; } - if (parent) - { - Efl_Canvas_Vg_Node_Data *parent_nd = - efl_data_scope_get(parent, MY_CLASS); - nd->vg_obj = parent_nd->vg_obj; - nd->vd = parent_nd->vd; - } - - nd->flags = EFL_GFX_CHANGE_FLAG_ALL; - nd->changed = EINA_TRUE; + efl_event_callback_add(obj, EFL_GFX_PATH_EVENT_CHANGED, + _efl_canvas_vg_node_property_changed, pd); + pd->flags = EFL_GFX_CHANGE_FLAG_ALL; + pd->changed = EINA_TRUE; return obj; } @@ -320,31 +307,40 @@ _efl_canvas_vg_node_efl_object_name_set(Eo *obj, Efl_Canvas_Vg_Node_Data *pd EIN static void _efl_canvas_vg_node_efl_object_parent_set(Eo *obj, - Efl_Canvas_Vg_Node_Data *nd, - Eo *parent) + Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED, + Eo *parent) { Efl_Canvas_Vg_Container_Data *cd = NULL; Efl_Canvas_Vg_Container_Data *old_cd; + Efl_Canvas_Vg_Node_Data *nd; Efl_VG *old_parent; + Eina_Bool parent_container = EINA_TRUE; + + nd = efl_data_scope_get(obj, MY_CLASS); + + //No, prevent infinite calls parent_set() -> root_node_set() -> parent_set() -> ... + if (nd->parenting) return; + + //Cut off root node from vg object if it does.... + if (nd->vg_obj) + { + nd->parenting = EINA_TRUE; + evas_object_vg_root_node_set(nd->vg_obj, NULL); + nd->parenting = EINA_FALSE; + nd->vg_obj = NULL; + } if (efl_isa(parent, EFL_CANVAS_VG_CONTAINER_CLASS)) cd = efl_data_scope_get(parent, EFL_CANVAS_VG_CONTAINER_CLASS); else if (efl_isa(parent, EFL_CANVAS_VG_OBJECT_CLASS)) - { - if (nd->vg_obj != parent) - { - nd->vg_obj = parent; - nd->vd = efl_data_scope_get(parent, EFL_CANVAS_VG_OBJECT_CLASS); - efl_canvas_vg_container_vg_obj_update(obj, nd); - } - - } + parent_container = EINA_FALSE; else if (parent) { ERR("parent(%p, class = %s) is not allowed by vg node(%p).", parent, efl_class_name_get(efl_class_get(parent)), obj); return; } + else parent_container = EINA_FALSE; if (!_efl_canvas_vg_node_parent_checked_get(obj, &old_parent, &old_cd)) return; @@ -354,7 +350,6 @@ _efl_canvas_vg_node_efl_object_parent_set(Eo *obj, { old_cd->children = eina_list_remove(old_cd->children, obj); eina_hash_del(old_cd->names, efl_name_get(efl_super(obj, MY_CLASS)), obj); - _node_change(old_parent, efl_data_scope_get(old_parent, MY_CLASS)); } efl_parent_set(efl_super(obj, MY_CLASS), parent); @@ -363,19 +358,11 @@ _efl_canvas_vg_node_efl_object_parent_set(Eo *obj, { cd->children = eina_list_append(cd->children, obj); _efl_canvas_vg_node_name_insert(obj, cd); - - Efl_Canvas_Vg_Node_Data *parent_nd = efl_data_scope_get(parent, MY_CLASS); - _node_change(parent, parent_nd); - - if (nd->vg_obj != parent_nd->vg_obj) - { - nd->vg_obj = parent_nd->vg_obj; - nd->vd = parent_nd->vd; - efl_canvas_vg_container_vg_obj_update(obj, nd); - } } - _node_change(obj, nd); + _efl_canvas_vg_node_changed(old_parent); + _efl_canvas_vg_node_changed(obj); + if (parent_container) _efl_canvas_vg_node_changed(parent); } static void @@ -399,8 +386,8 @@ _efl_canvas_vg_node_efl_gfx_stack_raise(Eo *obj, Efl_Canvas_Vg_Node_Data *pd EIN cd->children = eina_list_remove_list(cd->children, lookup); cd->children = eina_list_append_relative_list(cd->children, obj, next); - _node_change(parent, efl_data_scope_get(parent, MY_CLASS)); - return; + _efl_canvas_vg_node_changed(parent); + return ; on_error: ERR("Err"); @@ -408,8 +395,8 @@ _efl_canvas_vg_node_efl_gfx_stack_raise(Eo *obj, Efl_Canvas_Vg_Node_Data *pd EIN static void _efl_canvas_vg_node_efl_gfx_stack_stack_above(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED, - Efl_Gfx_Stack *above) + Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED, + Efl_Gfx_Stack *above) { Efl_Canvas_Vg_Container_Data *cd; Eina_List *lookup, *ref; @@ -429,8 +416,8 @@ _efl_canvas_vg_node_efl_gfx_stack_stack_above(Eo *obj, cd->children = eina_list_remove_list(cd->children, lookup); cd->children = eina_list_append_relative_list(cd->children, obj, ref); - _node_change(parent, efl_data_scope_get(parent, MY_CLASS)); - return; + _efl_canvas_vg_node_changed(parent); + return ; on_error: ERR("Err"); @@ -438,8 +425,8 @@ _efl_canvas_vg_node_efl_gfx_stack_stack_above(Eo *obj, static void _efl_canvas_vg_node_efl_gfx_stack_stack_below(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED, - Efl_Gfx_Stack *below) + Efl_Canvas_Vg_Node_Data *pd EINA_UNUSED, + Efl_Gfx_Stack *below) { Efl_Canvas_Vg_Container_Data *cd; Eina_List *lookup, *ref; @@ -459,8 +446,8 @@ _efl_canvas_vg_node_efl_gfx_stack_stack_below(Eo *obj, cd->children = eina_list_remove_list(cd->children, lookup); cd->children = eina_list_prepend_relative_list(cd->children, obj, ref); - _node_change(parent, efl_data_scope_get(parent, MY_CLASS)); - return; + _efl_canvas_vg_node_changed(parent); + return ; on_error: ERR("Err"); @@ -482,13 +469,13 @@ _efl_canvas_vg_node_efl_gfx_stack_lower(Eo *obj, Efl_Canvas_Vg_Node_Data *pd EIN if (!lookup) goto on_error; prev = eina_list_prev(lookup); - if (!prev) return; + if (!prev) return ; cd->children = eina_list_remove_list(cd->children, lookup); cd->children = eina_list_prepend_relative_list(cd->children, obj, prev); - _node_change(parent, efl_data_scope_get(parent, MY_CLASS)); - return; + _efl_canvas_vg_node_changed(parent); + return ; on_error: ERR("Err"); @@ -636,11 +623,7 @@ _efl_canvas_vg_node_interpolate_point(Eina_Point_3D *d, /* Warning! Node itself doesn't have any path. Don't call super class(Path)'s */ static Eina_Bool -_efl_canvas_vg_node_efl_gfx_path_interpolate(Eo *obj, - Efl_Canvas_Vg_Node_Data *pd, - const Efl_VG *from, - const Efl_VG *to, - double pos_map) +_efl_canvas_vg_node_efl_gfx_path_interpolate(Eo *obj, Efl_Canvas_Vg_Node_Data *pd, const Efl_VG *from, const Efl_VG *to, double pos_map) { Efl_Canvas_Vg_Node_Data *fromd, *tod; double from_map; @@ -717,29 +700,18 @@ _efl_canvas_vg_node_efl_gfx_path_interpolate(Eo *obj, pd->visibility = pos_map >= 0.5 ? tod->visibility : fromd->visibility; - _node_change(obj, pd); + _efl_canvas_vg_node_changed(obj); return EINA_TRUE; } void -efl_canvas_vg_node_vg_obj_set(Efl_VG *node, Efl_VG *vg_obj, Efl_Canvas_Vg_Object_Data *vd) +efl_canvas_vg_node_root_set(Efl_VG *node, Efl_VG *vg_obj) { Efl_Canvas_Vg_Node_Data *nd = efl_data_scope_get(node, MY_CLASS); - if (nd->vg_obj == vg_obj) return; nd->vg_obj = vg_obj; - nd->vd = vd; - - //root node is always container. - efl_canvas_vg_container_vg_obj_update(node, nd); } -void -efl_canvas_vg_node_change(Eo *obj) -{ - if (!obj) return; - _node_change(obj, efl_data_scope_get(obj, EFL_CANVAS_VG_NODE_CLASS)); -} EOLIAN static Efl_VG * _efl_canvas_vg_node_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Node_Data *pd) diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index 4aad6bd..eb6377d 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -52,6 +52,19 @@ static const Evas_Object_Func object_func = }; static void +_evas_vg_tree_changed(void *data, const Efl_Event *event EINA_UNUSED) +{ + Evas_Object_Protected_Data *obj = data; + Efl_Canvas_Vg_Object_Data *pd = efl_data_scope_get(obj->object, MY_CLASS); + + if (pd->changed) return; + + pd->changed = EINA_TRUE; + + evas_object_change(obj->object, obj); +} + +static void _update_vgtree_viewport(Eo *obj, Efl_Canvas_Vg_Object_Data *pd) { double vb_w, vb_h, vp_w, vp_h, scale_w, scale_h, scale; @@ -103,7 +116,7 @@ _evas_vg_resize(void *data, const Efl_Event *ev) EOLIAN static Efl_VG * _efl_canvas_vg_object_root_node_get(const Eo *obj, Efl_Canvas_Vg_Object_Data *pd) { - Efl_VG *root; + Efl_VG *root = NULL; if (pd->vg_entry) { @@ -143,10 +156,7 @@ _efl_canvas_vg_object_root_node_set(Eo *eo_obj, Efl_Canvas_Vg_Object_Data *pd, E // detach/free the old root_node if (pd->user_entry && pd->user_entry->root) - { - efl_canvas_vg_node_vg_obj_set(pd->user_entry->root, NULL, NULL); - efl_parent_set(pd->user_entry->root, NULL); - } + efl_parent_set(pd->user_entry->root, NULL); if (root_node) { @@ -164,7 +174,8 @@ _efl_canvas_vg_object_root_node_set(Eo *eo_obj, Efl_Canvas_Vg_Object_Data *pd, E // set the parent so that vg canvas can render it. efl_parent_set(pd->user_entry->root, pd->root); - efl_canvas_vg_node_vg_obj_set(root_node, eo_obj, pd); + + efl_canvas_vg_node_root_set(root_node, eo_obj); } else if (pd->user_entry) { @@ -447,12 +458,14 @@ _efl_canvas_vg_object_efl_object_constructor(Eo *eo_obj, Efl_Canvas_Vg_Object_Da obj->private_data = efl_data_ref(eo_obj, MY_CLASS); obj->type = o_type; - /* default root node */ - pd->obj = obj; + /* root node */ + //FIXME: Well. I don't think this is necessary if user set a new root node... pd->root = efl_add_ref(EFL_CANVAS_VG_CONTAINER_CLASS, NULL); eina_array_step_set(&pd->cleanup, sizeof(pd->cleanup), 8); + efl_event_callback_add(pd->root, EFL_GFX_PATH_EVENT_CHANGED, _evas_vg_tree_changed, obj); + return eo_obj; } diff --git a/src/lib/evas/canvas/efl_canvas_vg_shape.c b/src/lib/evas/canvas/efl_canvas_vg_shape.c index 728afb5..106efec 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_shape.c +++ b/src/lib/evas/canvas/efl_canvas_vg_shape.c @@ -17,11 +17,6 @@ struct _Efl_Canvas_Vg_Shape_Data }; // FIXME: Use the renderer bounding box when it has been created instead of an estimation -static void -_efl_canvas_vg_shape_path_changed(void *data, const Efl_Event *event) -{ - efl_canvas_vg_node_change(event->object); -} static void _efl_canvas_vg_shape_fill_set(Eo *obj EINA_UNUSED, @@ -33,7 +28,7 @@ _efl_canvas_vg_shape_fill_set(Eo *obj EINA_UNUSED, pd->fill = efl_ref(f); efl_unref(tmp); - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static Efl_Canvas_Vg_Node * @@ -52,7 +47,7 @@ _efl_canvas_vg_shape_stroke_fill_set(Eo *obj EINA_UNUSED, pd->stroke.fill = efl_ref(f); efl_unref(tmp); - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static Efl_Canvas_Vg_Node * @@ -72,7 +67,7 @@ _efl_canvas_vg_shape_stroke_marker_set(Eo *obj EINA_UNUSED, pd->stroke.marker = efl_ref(m); efl_unref(tmp); - efl_canvas_vg_node_change(obj); + _efl_canvas_vg_node_changed(obj); } static Efl_Canvas_Vg_Shape * @@ -140,9 +135,6 @@ _efl_canvas_vg_shape_efl_object_constructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *p nd->render_pre = _efl_canvas_vg_shape_render_pre; nd->data = pd; - efl_event_callback_add(obj, EFL_GFX_PATH_EVENT_CHANGED, - _efl_canvas_vg_shape_path_changed, pd); - return obj; } @@ -153,9 +145,6 @@ _efl_canvas_vg_shape_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *pd if (pd->stroke.fill) efl_unref(pd->stroke.fill); if (pd->stroke.marker) efl_unref(pd->stroke.marker); - efl_event_callback_del(obj, EFL_GFX_PATH_EVENT_CHANGED, - _efl_canvas_vg_shape_path_changed, pd); - efl_gfx_path_reset(obj); efl_destructor(efl_super(obj, MY_CLASS)); } diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h index ee41804..904afec 100644 --- a/src/lib/evas/canvas/evas_vg_private.h +++ b/src/lib/evas/canvas/evas_vg_private.h @@ -43,7 +43,6 @@ struct _Efl_Canvas_Vg_Object_Data Efl_VG *root; Vg_Cache_Entry *vg_entry; Vg_User_Entry *user_entry; //holds the user set vg tree - Evas_Object_Protected_Data *obj; Eina_Rect fill; Eina_Rect viewbox; unsigned int width, height; @@ -64,8 +63,7 @@ struct _Efl_Canvas_Vg_Node_Data Ector_Renderer *renderer; - Efl_VG *vg_obj; - Efl_Canvas_Vg_Object_Data *vd; + Efl_VG *vg_obj; //...Not necessary!! void (*render_pre)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, Ector_Surface *surface, @@ -78,6 +76,7 @@ struct _Efl_Canvas_Vg_Node_Data Eina_Bool visibility : 1; Eina_Bool changed : 1; + Eina_Bool parenting : 1; }; typedef struct _Vg_Mask @@ -132,17 +131,7 @@ Eina_Bool evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_ent double evas_cache_vg_anim_duration_get(const Vg_Cache_Entry *vg_entry); unsigned int evas_cache_vg_anim_frame_count_get(const Vg_Cache_Entry *vg_entry); Eina_Size2D evas_cache_vg_entry_default_size_get(const Vg_Cache_Entry *vg_entry); -void efl_canvas_vg_node_vg_obj_set(Efl_VG *node, Efl_VG *vg_obj, Efl_Canvas_Vg_Object_Data *vd); -void efl_canvas_vg_node_change(Efl_VG *node); -void efl_canvas_vg_container_vg_obj_update(Efl_VG *obj, Efl_Canvas_Vg_Node_Data *nd); - -static inline void -efl_canvas_vg_object_change(Efl_Canvas_Vg_Object_Data *vd) -{ - if (!vd || vd->changed) return; - vd->changed = EINA_TRUE; - evas_object_change(vd->obj->object, vd->obj); -} +void efl_canvas_vg_node_root_set(Efl_VG *node, Efl_VG *vg_obj); static inline Efl_Canvas_Vg_Node_Data * _evas_vg_render_pre(Evas_Object_Protected_Data *vg_pd, Efl_VG *child, Ector_Surface *surface, Eina_Matrix3 *transform, Ector_Buffer *mask, int mask_op) @@ -153,6 +142,14 @@ _evas_vg_render_pre(Evas_Object_Protected_Data *vg_pd, Efl_VG *child, Ector_Surf return nd; } +static inline void +_efl_canvas_vg_node_changed(Eo *obj) +{ + Efl_Gfx_Path_Change_Event ev = { EFL_GFX_CHANGE_FLAG_FILL }; + + if (obj) efl_event_callback_call(obj, EFL_GFX_PATH_EVENT_CHANGED, &ev); +} + #define EFL_CANVAS_VG_COMPUTE_MATRIX(Current, Parent, Nd) \ Eina_Matrix3 *Current = Nd->m; \ Eina_Matrix3 _matrix_tmp; \