Revert "evas vg: optimize vg object internal connections." 31/196331/1 submit/tizen/20181227.084356
authorSangHyeon Jade Lee <sh10233.lee@samsung.com>
Thu, 27 Dec 2018 07:48:01 +0000 (16:48 +0900)
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>
Thu, 27 Dec 2018 07:59:58 +0000 (16:59 +0900)
This reverts commit 90d311db9c5a7aeb2264073c4a45bcfdcc30c730.

Change-Id: Ie46f314940c37707a6708617e5f67db275001ed8
Signed-off-by: SangHyeon Jade Lee <sh10233.lee@samsung.com>
src/lib/evas/canvas/efl_canvas_vg_container.c
src/lib/evas/canvas/efl_canvas_vg_container.eo
src/lib/evas/canvas/efl_canvas_vg_gradient.c
src/lib/evas/canvas/efl_canvas_vg_gradient_linear.c
src/lib/evas/canvas/efl_canvas_vg_gradient_radial.c
src/lib/evas/canvas/efl_canvas_vg_node.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 b733db5..addbf0c 100644 (file)
@@ -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)
 {
index 3d26efd..4060441 100644 (file)
@@ -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;
index ad6761b..649643b 100644 (file)
@@ -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
index ad3118f..fa35d29 100644 (file)
@@ -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
index 4146cdd..9ff537e 100644 (file)
@@ -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
index e5cc6c9..dc2c4a3 100644 (file)
@@ -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)
index 4aad6bd..eb6377d 100644 (file)
@@ -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;
 }
 
index 728afb5..106efec 100644 (file)
@@ -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));
 }
index ee41804..904afec 100644 (file)
@@ -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;                                             \