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>

-- 


Reply via email to