evas vg: fix gradient stroke fill memory leaks.

There were continous creation of gradient objects,
We can stop it by caching it properly,

Also, fix mismatched ref/unref counts.
This commit is contained in:
Hermet Park 2019-09-24 11:46:50 +09:00
parent 1fe81e4937
commit f8306e19aa
2 changed files with 18 additions and 3 deletions

View File

@ -23,6 +23,8 @@ _efl_canvas_vg_shape_fill_set(Eo *obj EINA_UNUSED,
Efl_Canvas_Vg_Shape_Data *pd,
Efl_Canvas_Vg_Node *f)
{
if (pd->fill == f) return;
Efl_Canvas_Vg_Node *tmp = pd->fill;
pd->fill = efl_ref(f);
@ -40,8 +42,9 @@ _efl_canvas_vg_shape_stroke_fill_set(Eo *obj EINA_UNUSED,
Efl_Canvas_Vg_Shape_Data *pd,
Efl_Canvas_Vg_Node *f)
{
Efl_Canvas_Vg_Node *tmp = pd->fill;
if (pd->stroke.fill == f) return;
Efl_Canvas_Vg_Node *tmp = pd->stroke.fill;
pd->stroke.fill = efl_ref(f);
efl_unref(tmp);
}

View File

@ -177,13 +177,25 @@ _construct_drawable_nodes(Efl_Canvas_Vg_Container *parent, const LOTLayerNode *l
if (node->mGradient.type == GradientLinear)
{
grad = efl_add(EFL_CANVAS_VG_GRADIENT_LINEAR_CLASS, parent);
char *key = _get_key_val(shape);
grad = efl_key_data_get(shape, key);
if (!grad)
{
grad = efl_add(EFL_CANVAS_VG_GRADIENT_LINEAR_CLASS, parent);
efl_key_data_set(shape, key, grad);
}
efl_gfx_gradient_linear_start_set(grad, node->mGradient.start.x, node->mGradient.start.y);
efl_gfx_gradient_linear_end_set(grad, node->mGradient.end.x, node->mGradient.end.y);
}
else if (node->mGradient.type == GradientRadial)
{
grad = efl_add(EFL_CANVAS_VG_GRADIENT_RADIAL_CLASS, parent);
char *key = _get_key_val(shape);
grad = efl_key_data_get(shape, key);
if (!grad)
{
grad = efl_add(EFL_CANVAS_VG_GRADIENT_RADIAL_CLASS, parent);
efl_key_data_set(shape, key, grad);
}
efl_gfx_gradient_radial_center_set(grad, node->mGradient.center.x, node->mGradient.center.y);
efl_gfx_gradient_radial_focal_set(grad, node->mGradient.focal.x, node->mGradient.focal.y);
efl_gfx_gradient_radial_radius_set(grad, node->mGradient.cradius);