forked from enlightenment/efl
evas: properly propagate Eina_Matrix from the VG scene graph to the Ector_Renderer.
This commit is contained in:
parent
0bb66ffedf
commit
502ac45916
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue