jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=9be9da17bfacaa4d43f2ba145a6be3f214cd0a2f
commit 9be9da17bfacaa4d43f2ba145a6be3f214cd0a2f Author: Subhransu Mohanty <sub.moha...@samsung.com> Date: Thu Jul 7 16:29:21 2016 +0900 edje/svg: added _edje_svg_node_free() function Reviewers: cedric, jpeg Reviewed By: jpeg Subscribers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D4143 --- src/bin/edje/edje_cc_out.c | 1 + src/lib/edje/edje_load.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ src/lib/edje/edje_private.h | 1 + 3 files changed, 75 insertions(+) diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c index f164361..0f969fa 100644 --- a/src/bin/edje/edje_cc_out.c +++ b/src/bin/edje/edje_cc_out.c @@ -1271,6 +1271,7 @@ data_write_vectors(Eet_File *ef, int *vector_num) *vector_num += 1; eina_file_close(f); found = EINA_TRUE; + _edje_svg_node_free(root); break; } if (!found) diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index 69feb92..98a89c9 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -2566,6 +2566,7 @@ _edje_ref_vector_data(Edje *ed, int svg_id) } vector->vg = root; ed->vector_cache = eina_list_append(ed->vector_cache, vector); + _edje_svg_node_free(node); return vector; } @@ -2659,3 +2660,75 @@ edje_3d_object_add(Evas_Object *obj, Eo **root_node, Eo *scene) return EINA_TRUE; } + +static void +_svg_style_gradient_free(Svg_Style_Gradient *grad) +{ + Efl_Gfx_Gradient_Stop *stop; + + if (!grad) return; + + eina_stringshare_del(grad->id); + eina_stringshare_del(grad->ref); + free(grad->radial); + free(grad->linear); + + EINA_LIST_FREE(grad->stops, stop) + { + free(stop); + } + free(grad); +} + +static void +_node_style_free(Svg_Style_Property *style) +{ + if (!style) return; + + _svg_style_gradient_free(style->fill.paint.gradient); + eina_stringshare_del(style->fill.paint.url); + _svg_style_gradient_free(style->stroke.paint.gradient); + eina_stringshare_del(style->stroke.paint.url); + free(style); +} + +EAPI void +_edje_svg_node_free(Svg_Node *node) +{ + Svg_Node *child; + Svg_Style_Gradient *grad; + + if (!node) return; + + EINA_LIST_FREE(node->child, child) + { + _edje_svg_node_free(child); + } + + eina_stringshare_del(node->id); + free(node->transform); + _node_style_free(node->style); + switch (node->type) + { + case SVG_NODE_PATH: + eina_stringshare_del(node->node.path.path); + break; + case SVG_NODE_POLYGON: + case SVG_NODE_POLYLINE: + free(node->node.polygon.points); + break; + case SVG_NODE_DOC: + _edje_svg_node_free(node->node.doc.defs); + break; + case SVG_NODE_DEFS: + EINA_LIST_FREE(node->node.defs.gradients, grad) + { + _svg_style_gradient_free(grad); + } + break; + default: + break; + } + free(node); +} + diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 3b06513..9faded9 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -3273,6 +3273,7 @@ void _edje_dupe_vector_data(Edje *ed, int svg_id, double width, double height, Edje_Vector_Data * _edje_ref_vector_data(Edje *ed, int svg_id); +EAPI void _edje_svg_node_free(Svg_Node *node); #ifdef HAVE_LIBREMIX #include <remix/remix.h> --