evas: propagate the change to child when object is a vector graphic container

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>
This commit is contained in:
Subhransu Mohanty 2016-05-19 01:55:06 -07:00 committed by Cedric Bail
parent ce4a9ee6c8
commit 655ed09ab4
7 changed files with 37 additions and 11 deletions

View 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]]
}

View 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;
}

View 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);

View 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);

View 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;

View 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;

View 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);