evas: properly propagate Eina_Matrix from the VG scene graph to the Ector_Renderer.

This commit is contained in:
Cedric BAIL 2015-04-03 16:23:03 +02:00
parent 0bb66ffedf
commit 502ac45916
6 changed files with 39 additions and 13 deletions

View File

@ -197,7 +197,7 @@ evas_object_vg_render_pre(Evas_Object *eo_obj,
// FIXME: handle damage only on changed renderer.
s = e->engine.func->ector_get(e->engine.data.output);
if (vd->root && s)
_evas_vg_render_pre(vd->root, s);
_evas_vg_render_pre(vd->root, s, NULL);
/* dont pre-render the obj twice! */
if (obj->pre_render_done) return;

View File

@ -7,16 +7,18 @@
static void
_evas_vg_container_render_pre(Eo *obj EINA_UNUSED,
Eina_Matrix3 *parent,
Ector_Surface *s,
void *data,
Evas_VG_Node_Data *nd EINA_UNUSED)
Evas_VG_Node_Data *nd)
{
Evas_VG_Container_Data *pd = data;
Eina_List *l;
Eo *child;
EVAS_VG_COMPUTE_MATRIX(current, parent, nd);
EINA_LIST_FOREACH(pd->children, l, child)
_evas_vg_render_pre(child, s);
_evas_vg_render_pre(child, s, current);
}
static void

View File

@ -53,12 +53,14 @@ _evas_vg_gradient_linear_efl_graphics_gradient_linear_end_get(Eo *obj EINA_UNUSE
static void
_evas_vg_gradient_linear_render_pre(Eo *obj,
Eina_Matrix3 *parent,
Ector_Surface *s,
void *data,
Evas_VG_Node_Data *nd)
{
Evas_VG_Gradient_Linear_Data *pd = data;
Evas_VG_Gradient_Data *gd = eo_data_scope_get(obj, EVAS_VG_GRADIENT_CLASS);
EVAS_VG_COMPUTE_MATRIX(current, parent, nd);
if (!nd->renderer)
{
@ -66,7 +68,7 @@ _evas_vg_gradient_linear_render_pre(Eo *obj,
}
eo_do(nd->renderer,
ector_renderer_transformation_set(nd->m),
ector_renderer_transformation_set(current),
ector_renderer_origin_set(nd->x, nd->y),
ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a),
ector_renderer_visibility_set(nd->visibility),

View File

@ -67,12 +67,14 @@ _evas_vg_gradient_radial_efl_graphics_gradient_radial_focal_get(Eo *obj EINA_UNU
static void
_evas_vg_gradient_radial_render_pre(Eo *obj,
Eina_Matrix3 *parent,
Ector_Surface *s,
void *data,
Evas_VG_Node_Data *nd)
{
Evas_VG_Gradient_Radial_Data *pd = data;
Evas_VG_Gradient_Data *gd = eo_data_scope_get(obj, EVAS_VG_GRADIENT_CLASS);
EVAS_VG_COMPUTE_MATRIX(current, parent, nd);
if (!nd->renderer)
{
@ -80,7 +82,7 @@ _evas_vg_gradient_radial_render_pre(Eo *obj,
}
eo_do(nd->renderer,
ector_renderer_transformation_set(nd->m),
ector_renderer_transformation_set(current),
ector_renderer_origin_set(nd->x, nd->y),
ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a),
ector_renderer_visibility_set(nd->visibility),

View File

@ -13,7 +13,7 @@ struct _Evas_VG_Node_Data
Evas_VG_Node *mask;
Ector_Renderer *renderer;
void (*render_pre)(Eo *obj, Ector_Surface *s, void *data, Evas_VG_Node_Data *nd);
void (*render_pre)(Eo *obj, Eina_Matrix3 *parent, Ector_Surface *s, void *data, Evas_VG_Node_Data *nd);
void *data;
double x, y;
@ -38,13 +38,31 @@ struct _Evas_VG_Gradient_Data
};
static inline void
_evas_vg_render_pre(Evas_VG_Node *child, Ector_Surface *s)
_evas_vg_render_pre(Evas_VG_Node *child, Ector_Surface *s, Eina_Matrix3 *m)
{
Evas_VG_Node_Data *child_nd;
// FIXME: Prevent infinite loop
child_nd = eo_data_scope_get(child, EVAS_VG_NODE_CLASS);
child_nd->render_pre(child, s, child_nd->data, child_nd);
child_nd->render_pre(child, m, s, child_nd->data, child_nd);
}
#define EVAS_VG_COMPUTE_MATRIX(Current, Parent, Nd) \
Eina_Matrix3 *Current = Nd->m; \
Eina_Matrix3 _matrix_tmp; \
\
if (Parent) \
{ \
if (Current) \
{ \
eina_matrix3_compose(Parent, Current, &_matrix_tmp); \
Current = &_matrix_tmp; \
} \
else \
{ \
Current = Parent; \
} \
}
#endif

View File

@ -232,16 +232,18 @@ _evas_vg_shape_efl_graphics_shape_stroke_join_get(Eo *obj EINA_UNUSED,
static void
_evas_vg_shape_render_pre(Eo *obj EINA_UNUSED,
Eina_Matrix3 *parent,
Ector_Surface *s,
void *data,
Evas_VG_Node_Data *nd)
{
Evas_VG_Shape_Data *pd = data;
EVAS_VG_COMPUTE_MATRIX(current, parent, nd);
_evas_vg_render_pre(pd->fill, s);
_evas_vg_render_pre(pd->stroke.fill, s);
_evas_vg_render_pre(pd->stroke.marker, s);
_evas_vg_render_pre(nd->mask, s);
_evas_vg_render_pre(pd->fill, s, current);
_evas_vg_render_pre(pd->stroke.fill, s, current);
_evas_vg_render_pre(pd->stroke.marker, s, current);
_evas_vg_render_pre(nd->mask, s, current);
if (!nd->renderer)
{
@ -249,7 +251,7 @@ _evas_vg_shape_render_pre(Eo *obj EINA_UNUSED,
}
eo_do(nd->renderer,
ector_renderer_transformation_set(nd->m),
ector_renderer_transformation_set(current),
ector_renderer_origin_set(nd->x, nd->y),
ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a),
ector_renderer_visibility_set(nd->visibility),