Gradient didnt update after setting new parameters (like new color stops, center point or radius).
This fix solves the problem. Could be tested with evas-vg-gradient-manipulation.c example.
Shape was added into Efl_Canvas_Vg_Gradient_Data for efl_canvas_vg_node_change() calling.
gd->gradient_render_pre_tvg() is now called in renderer loop.
Fixed for svg-gradient.
Change-Id: I401984cf5f163520dad0c46489ebb24b72325258
tvg_gradient_set_color_stops(gd->gradient, color_stops, length);
free(color_stops);
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
}
static void
}
#else
static void
-_gradient_linear_render_pre_tvg(Efl_Canvas_Vg_Node *nd EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *gd,
+_gradient_linear_render_pre_tvg(Efl_Canvas_Vg_Gradient_Data *gd,
Tvg_Paint *shape)
{
if (!gd || !shape) return;
gd->gradient_render_pre_tvg = _gradient_linear_render_pre_tvg;
gd->spread = EFL_GFX_GRADIENT_SPREAD_PAD;
gd->gradient = tvg_linear_gradient_new();
+ gd->shape = NULL;
#endif
nd->data = pd;
tvg_linear_gradient_get(gd->gradient, NULL, NULL, &x2, &y2);
tvg_linear_gradient_set(gd->gradient, x, y, x2, y2);
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
#else
efl_gfx_gradient_linear_start_set(obj, x, y);
#endif
tvg_linear_gradient_get(gd->gradient, &x1, &y1, NULL, NULL);
tvg_linear_gradient_set(gd->gradient, x1, y1, x, y);
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
#else
efl_gfx_gradient_linear_end_set(obj, x, y);
#endif
}
#else
static void
-_gradient_radial_render_pre_tvg(Efl_Canvas_Vg_Node *nd EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *gd,
+_gradient_radial_render_pre_tvg(Efl_Canvas_Vg_Gradient_Data *gd,
Tvg_Paint *shape)
{
if (!gd || !gd->gradient || !shape) return;
gd->gradient_render_pre_tvg = _gradient_radial_render_pre_tvg;
gd->spread = EFL_GFX_GRADIENT_SPREAD_PAD;
gd->gradient = tvg_radial_gradient_new();
+ gd->shape = NULL;
#endif
nd->data = pd;
tvg_radial_gradient_get(gd->gradient, NULL, NULL, &r);
tvg_radial_gradient_set(gd->gradient, x, y, r);
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
#else
efl_gfx_gradient_radial_center_set(obj, x, y);
#endif
tvg_radial_gradient_get(gd->gradient, &x, &y, NULL);
tvg_radial_gradient_set(gd->gradient, x, y, r);
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
#else
efl_gfx_gradient_radial_radius_set(obj, r);
#endif
efl_unref(tmp);
#ifdef HAVE_THORVG
- Efl_Canvas_Vg_Gradient_Data *gd = NULL;
- gd = efl_data_scope_get(pd->fill, EFL_CANVAS_VG_GRADIENT_CLASS);
-
- if (efl_isa(pd->fill, EFL_CANVAS_VG_GRADIENT_LINEAR_CLASS))
- tvg_shape_set_linear_gradient(pd->shape, gd->gradient);
- else if (efl_isa(pd->fill, EFL_CANVAS_VG_GRADIENT_RADIAL_CLASS))
- tvg_shape_set_radial_gradient(pd->shape, gd->gradient);
+ Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(pd->fill, EFL_CANVAS_VG_GRADIENT_CLASS);
+ if (gd) gd->gradient_render_pre_tvg(gd, pd->shape);
#endif
}
efl_gfx_color_get(obj, &r, &g, &b, &a);
tvg_shape_set_fill_color(sd->shape, r, g, b, a);
}
+ else if (efl_isa(sd->fill, EFL_CANVAS_VG_GRADIENT_CLASS))
+ {
+ Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(sd->fill, EFL_CANVAS_VG_GRADIENT_CLASS);
+ if (gd)
+ {
+ gd->shape = obj;
+ gd->gradient_render_pre_tvg(gd, sd->shape);
+ }
+ }
if (scene)
tvg_scene_push(scene, sd->shape);
#ifdef HAVE_THORVG
Tvg_Gradient *gradient;
- void (*gradient_render_pre_tvg)(Efl_Canvas_Vg_Node *nd, Efl_Canvas_Vg_Gradient_Data *gd, Tvg_Paint *shape);
+ Evas_Vg_Shape *shape;
+ void (*gradient_render_pre_tvg)(Efl_Canvas_Vg_Gradient_Data *gd, Tvg_Paint *shape);
#endif
};