evas: propagate the change to child when object is a vector graphic container
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Thu, 19 May 2016 08:55:06 +0000 (01:55 -0700)
committerCedric Bail <cedric@osg.samsung.com>
Thu, 19 May 2016 09:23:56 +0000 (02:23 -0700)
Summary: let me know whats your thought

Reviewers: Hermet, cedric

Subscribers: cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D3893

Signed-off-by: Cedric Bail <cedric@osg.samsung.com>
src/lib/efl/interfaces/efl_gfx_types.eot
src/lib/evas/canvas/evas_vg_container.c
src/lib/evas/canvas/evas_vg_gradient_linear.c
src/lib/evas/canvas/evas_vg_gradient_radial.c
src/lib/evas/canvas/evas_vg_node.c
src/lib/evas/canvas/evas_vg_private.h
src/lib/evas/canvas/evas_vg_shape.c

index d7a85d1..0e4dd1e 100644 (file)
@@ -159,3 +159,12 @@ enum Efl.Gfx.Border_Fill_Mode
    solid = 2 [[Image's center region is to be made solid, even if it has transparency on it]]
 }
 
+enum Efl.Gfx.Change.Flag
+{
+   [[What property got changed for this object @since 1.18]]
+   none    = 0x0, [[No change]]
+   matrix  = 0x1, [[matrix got changed]]
+   path    = 0x2, [[path got changes]]
+   all     = -1   [[all property got changed]]
+}
+
index b34d137..fc11bec 100644 (file)
@@ -15,14 +15,25 @@ _efl_vg_container_render_pre(Eo *obj EINA_UNUSED,
    Efl_VG_Container_Data *pd = data;
    Eina_List *l;
    Eo *child;
+   Efl_VG_Data *child_nd;
+   Efl_Gfx_Change_Flag flag;
 
-   if (!nd->changed) return ;
-   nd->changed = EINA_FALSE;
+   if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return ;
+
+   flag = nd->flags;
+   nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
 
    EFL_VG_COMPUTE_MATRIX(current, parent, nd);
 
    EINA_LIST_FOREACH(pd->children, l, child)
-     _evas_vg_render_pre(child, s, current);
+     {
+        if (flag & EFL_GFX_CHANGE_FLAG_MATRIX)
+          {
+             child_nd = eo_data_scope_get(child, EFL_VG_CLASS);
+             child_nd->flags |= EFL_GFX_CHANGE_FLAG_MATRIX;
+          }
+        _evas_vg_render_pre(child, s, current);
+     }
 }
 
 static Eo *
@@ -38,6 +49,7 @@ _efl_vg_container_eo_base_constructor(Eo *obj,
    nd = eo_data_scope_get(obj, EFL_VG_CLASS);
    nd->render_pre = _efl_vg_container_render_pre;
    nd->data = pd;
+   nd->flags = EFL_GFX_CHANGE_FLAG_ALL;
 
    return obj;
 }
index 5aa2607..1149170 100644 (file)
@@ -65,8 +65,9 @@ _efl_vg_gradient_linear_render_pre(Eo *obj,
    Efl_VG_Gradient_Linear_Data *pd = data;
    Efl_VG_Gradient_Data *gd;
 
-   if (!nd->changed) return ;
-   nd->changed = EINA_FALSE;
+   if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return ;
+
+   nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
 
    gd = eo_data_scope_get(obj, EFL_VG_GRADIENT_CLASS);
    EFL_VG_COMPUTE_MATRIX(current, parent, nd);
index c36150a..4a46c7a 100644 (file)
@@ -81,8 +81,9 @@ _efl_vg_gradient_radial_render_pre(Eo *obj,
    Efl_VG_Gradient_Radial_Data *pd = data;
    Efl_VG_Gradient_Data *gd;
 
-   if (!nd->changed) return ;
-   nd->changed = EINA_FALSE;
+   if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return ;
+
+   nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
 
    gd = eo_data_scope_get(obj, EFL_VG_GRADIENT_CLASS);
    EFL_VG_COMPUTE_MATRIX(current, parent, nd);
index 7a55b20..3c44b91 100644 (file)
@@ -23,8 +23,7 @@ _efl_vg_property_changed(void *data, const Eo_Event *event)
    Efl_VG_Data *pd = data;
    Eo *parent;
 
-   if (pd->changed) return EINA_TRUE;
-   pd->changed = EINA_TRUE;
+   if (!pd->flags) pd->flags = EFL_GFX_CHANGE_FLAG_ALL;
 
    parent = eo_parent_get(event->object);
    eo_event_callback_call(parent, event->desc, event->info);
@@ -57,6 +56,7 @@ _efl_vg_transformation_set(Eo *obj,
         pd->m = NULL;
      }
 
+   pd->flags |= EFL_GFX_CHANGE_FLAG_MATRIX;
    _efl_vg_changed(obj);
 }
 
@@ -275,6 +275,7 @@ _efl_vg_eo_base_constructor(Eo *obj,
    }
 
    eo_event_callback_add(obj, EFL_GFX_CHANGED, _efl_vg_property_changed, pd);
+   pd->flags = EFL_GFX_CHANGE_FLAG_ALL;
    pd->changed = EINA_TRUE;
 
    return obj;
index fca6680..711e287 100644 (file)
@@ -37,6 +37,7 @@ struct _Efl_VG_Data
 
    double x, y;
    int r, g, b, a;
+   Efl_Gfx_Change_Flag flags;
 
    Eina_Bool visibility : 1;
    Eina_Bool changed : 1;
index b356b07..c3599f0 100644 (file)
@@ -131,8 +131,9 @@ _efl_vg_shape_render_pre(Eo *obj EINA_UNUSED,
    Efl_VG_Data *fill, *stroke_fill, *stroke_marker, *mask;
    double xn = nd->x, yn = nd->y ;
 
-   if (!nd->changed) return ;
-   nd->changed = EINA_FALSE;
+   if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return ;
+
+   nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
 
    if(parent) eina_matrix3_point_transform(parent, nd->x, nd->y, &xn, &yn);