static_lib: added vg_common static lib
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Wed, 2 Nov 2016 10:22:55 +0000 (19:22 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Fri, 27 Oct 2017 05:58:38 +0000 (14:58 +0900)
Features:
 Copied vg eet descriptor from edje_data
 Copied convert func  from Svg_Node to Efl_VG from edje
 added  convert function from Efl_VG to Svg_Node

src/Makefile_Evas.am
src/lib/evas/include/evas_private.h
src/static_libs/vg_common/vg_common.c [new file with mode: 0644]
src/static_libs/vg_common/vg_common.h [new file with mode: 0644]

index 8789e95..bc2c0ab 100644 (file)
@@ -1601,8 +1601,11 @@ endif
 
 if BUILD_VG_LOADER_SVG
 if EVAS_STATIC_BUILD_VG_SVG
-lib_evas_libevas_la_SOURCES += modules/evas/vg_loaders/svg/evas_vg_load_svg.c
-lib_evas_libevas_la_CPPFLAGS += @evas_vg_loader_svg_cflags@
+lib_evas_libevas_la_SOURCES += modules/evas/vg_loaders/svg/evas_vg_load_svg.c \
+static_libs/vg_common/vg_common.c \
+static_libs/vg_common/vg_common.h 
+lib_evas_libevas_la_CPPFLAGS += -I$(top_srcdir)/src/static_libs/vg_common \
+@evas_vg_loader_svg_cflags@
 lib_evas_libevas_la_LIBADD += @evas_vg_loader_svg_libs@
 else
 vgloadersvgpkgdir = $(libdir)/evas/modules/vg_loaders/svg/$(MODULE_ARCH)
@@ -1613,9 +1616,12 @@ vgloadersvgpkg_LTLIBRARIES = modules/evas/vg_loaders/svg/module.la
 install_vgloadersvgpkgLTLIBRARIES = install-vgloadersvgpkgLTLIBRARIES
 $(install_vgloadersvgpkgLTLIBRARIES): install-libLTLIBRARIES
 
-modules_evas_vg_loaders_svg_module_la_SOURCES = modules/evas/vg_loaders/svg/evas_vg_load_svg.c
+modules_evas_vg_loaders_svg_module_la_SOURCES = modules/evas/vg_loaders/svg/evas_vg_load_svg.c \
+static_libs/vg_common/vg_common.c \
+static_libs/vg_common/vg_common.h
 modules_evas_vg_loaders_svg_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
 -I$(top_srcdir)/src/lib/evas/include \
+-I$(top_srcdir)/src/static_libs/vg_common \
 @EVAS_CFLAGS@ \
 @evas_vg_loader_svg_cflags@
 modules_evas_vg_loaders_svg_module_la_LIBADD = \
index 8a16d63..2cedf01 100644 (file)
@@ -142,6 +142,8 @@ typedef struct _Evas_Canvas3D_Mesh_Eet         Evas_Canvas3D_Mesh_Eet;
 typedef struct _Evas_Canvas3D_Header_Eet       Evas_Canvas3D_Header_Eet;
 typedef struct _Evas_Canvas3D_File_Eet         Evas_Canvas3D_File_Eet;
 
+typedef struct _Vg_File_Data                   Vg_File_Data;
+
 struct _Evas_Canvas3D_Vec2_Eet
 {
    float x;
@@ -1629,14 +1631,21 @@ struct _Evas_Image_Save_Func
   int (*image_save) (RGBA_Image *im, const char *file, const char *key, int quality, int compress, const char *encoding);
 };
 
+struct _Vg_File_Data
+{
+   Eina_Rectangle  view_box;
+   Efl_VG         *root;
+   Eina_Bool       preserve_aspect;
+};
+
 struct _Evas_Vg_Load_Func
 {
-  void     *(*file_data) (Eina_File *f, Eina_Stringshare *key, int *error);
+   Vg_File_Data *(*file_data) (const char *file, const char *key, int *error);
 };
 
 struct _Evas_Vg_Save_Func
 {
-  int (*vg_save) (void *vg, const char *file, const char *key, int compress);
+   int (*vg_save) (Vg_File_Data *vg, const char *file, const char *key, int compress);
 };
 
 #ifdef __cplusplus
diff --git a/src/static_libs/vg_common/vg_common.c b/src/static_libs/vg_common/vg_common.c
new file mode 100644 (file)
index 0000000..673ab0a
--- /dev/null
@@ -0,0 +1,965 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "vg_common.h"
+
+#include <Eet.h>
+#include <Evas.h>
+
+
+
+Eet_Data_Descriptor *_eet_rect_node = NULL;
+Eet_Data_Descriptor *_eet_circle_node = NULL;
+Eet_Data_Descriptor *_eet_ellipse_node = NULL;
+Eet_Data_Descriptor *_eet_gradient_stops_node = NULL;
+Eet_Data_Descriptor *_eet_linear_gradient_node = NULL;
+Eet_Data_Descriptor *_eet_radial_gradient_node = NULL;
+Eet_Data_Descriptor *_eet_style_gradient_node = NULL;
+Eet_Data_Descriptor *_eet_style_property_node = NULL;
+Eet_Data_Descriptor *_eet_matrix3_node = NULL;
+Eet_Data_Descriptor *_eet_doc_node = NULL;
+Eet_Data_Descriptor *_eet_defs_node = NULL;
+Eet_Data_Descriptor *_eet_g_node = NULL;
+Eet_Data_Descriptor *_eet_arc_node = NULL;
+Eet_Data_Descriptor *_eet_path_node = NULL;
+Eet_Data_Descriptor *_eet_polygon_node = NULL;
+Eet_Data_Descriptor *_eet_vg_node = NULL;
+Eet_Data_Descriptor *_eet_line_node = NULL;
+Eet_Data_Descriptor *_eet_custom_command_node = NULL;
+
+#define FREE_DESCRIPTOR(eed)                      \
+  if (eed)                              \
+    {                                   \
+       eet_data_descriptor_free((eed)); \
+       (eed) = NULL;                    \
+    }
+
+static inline Eet_Data_Descriptor*
+_eet_for_rect_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Rect_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "x", x, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "y", y, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "w", w, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "h", h, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "rx", rx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Rect_Node, "ry", ry, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_line_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Line_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Line_Node, "x1", x1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Line_Node, "y1", y1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Line_Node, "x2", x2, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Line_Node, "y2", y2, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_circle_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Circle_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Circle_Node, "cx", cx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Circle_Node, "cy", cy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Circle_Node, "r", r, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_ellipse_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Ellipse_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Ellipse_Node, "cx", cx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Ellipse_Node, "cy", cy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Ellipse_Node, "rx", rx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Ellipse_Node, "ry", ry, EET_T_DOUBLE);
+   return eet;
+}
+
+
+static inline Eet_Data_Descriptor*
+_eet_for_gradient_stops(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Efl_Gfx_Gradient_Stop);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Efl_Gfx_Gradient_Stop, "offset", offset, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Efl_Gfx_Gradient_Stop, "r", r, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Efl_Gfx_Gradient_Stop, "g", g, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Efl_Gfx_Gradient_Stop, "b", b, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Efl_Gfx_Gradient_Stop, "a", a, EET_T_INT);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_linear_gradient(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Linear_Gradient);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Linear_Gradient, "x1", x1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Linear_Gradient, "y1", y1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Linear_Gradient, "x2", x2, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Linear_Gradient, "y2", y2, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_radial_gradient(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Radial_Gradient);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Radial_Gradient, "cx", cx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Radial_Gradient, "cy", cy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Radial_Gradient, "fx", fx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Radial_Gradient, "fy", fy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Radial_Gradient, "r", r, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_style_gradient(void)
+{
+   Eet_Data_Descriptor_Class eetc;
+
+   if (_eet_style_gradient_node) return _eet_style_gradient_node;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Style_Gradient);
+   _eet_style_gradient_node = eet_data_descriptor_stream_new(&eetc);
+   _eet_gradient_stops_node = _eet_for_gradient_stops();
+   _eet_linear_gradient_node = _eet_for_linear_gradient();
+   _eet_radial_gradient_node = _eet_for_radial_gradient();
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "type", type, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "id", id, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_style_gradient_node, Svg_Style_Gradient, "spread", spread, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_eet_style_gradient_node, Svg_Style_Gradient, "stops", stops, _eet_gradient_stops_node);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_eet_style_gradient_node, Svg_Style_Gradient, "radial", radial, _eet_radial_gradient_node);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_eet_style_gradient_node, Svg_Style_Gradient, "linear", linear, _eet_linear_gradient_node);
+
+   return _eet_style_gradient_node;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_style_property(void)
+{
+   Eet_Data_Descriptor *eet, *eet_gradient, *eet_dash;
+   Eet_Data_Descriptor_Class eetc, eetc_dash;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Style_Property);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   eet_gradient = _eet_for_style_gradient();
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc_dash, Efl_Gfx_Dash);
+   eet_dash = eet_data_descriptor_stream_new(&eetc_dash);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet_dash, Efl_Gfx_Dash, "length", length, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet_dash, Efl_Gfx_Dash, "gap", gap, EET_T_DOUBLE);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "r", r, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "g", g, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "b", b, EET_T_INT);
+   // for fill
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.flags", fill.flags, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.r", fill.paint.r, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.g", fill.paint.g, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.b", fill.paint.b, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.none", fill.paint.none, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.cur_color", fill.paint.cur_color, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_SUB(eet, Svg_Style_Property, "fill.paint.gradient", fill.paint.gradient, eet_gradient);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.paint.url", fill.paint.url, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.opacity", fill.opacity, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "fill.fill_rule", fill.fill_rule, EET_T_INT);
+
+   // for stroke
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.flags", stroke.flags, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.r", stroke.paint.r, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.g", stroke.paint.g, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.b", stroke.paint.b, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.none", stroke.paint.none, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.cur_color", stroke.paint.cur_color, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_SUB(eet, Svg_Style_Property, "stroke.paint.gradient", stroke.paint.gradient, eet_gradient);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.paint.url", stroke.paint.url, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.opacity", stroke.opacity, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.scale", stroke.scale, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.width", stroke.width, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.centered", stroke.centered, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.cap", stroke.cap, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.join", stroke.join, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(eet, Svg_Style_Property, "stroke.dash", stroke.dash, eet_dash);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Style_Property, "stroke.dash_count", stroke.dash_count, EET_T_INT);
+
+   return eet;
+}
+
+static Eet_Data_Descriptor*
+_eet_for_eina_matrix3(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Eina_Matrix3);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "xx", xx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "xy", xy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "xz", xz, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "yx", yx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "yy", yy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "yz", yz, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "zx", zx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "zy", zy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Eina_Matrix3, "zz", zz, EET_T_DOUBLE);
+
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_doc_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Doc_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "width", width, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "height", height, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "vx", vx, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "vy", vy, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "vw", vw, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "vh", vh, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Doc_Node, "preserve_aspect", preserve_aspect, EET_T_INT);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_defs_node(void)
+{
+   Eet_Data_Descriptor *eet, *eet_gradient;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Defs_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   eet_gradient = _eet_for_style_gradient();
+
+   EET_DATA_DESCRIPTOR_ADD_LIST(eet, Svg_Defs_Node, "gradients", gradients, eet_gradient);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_g_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_G_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_arc_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Arc_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_polygon_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Polygon_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Polygon_Node, "points_count", points_count, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY(eet, Svg_Polygon_Node, "points", points, EET_T_DOUBLE);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_custom_command_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Custom_Command_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Custom_Command_Node, "points_count", points_count, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY(eet, Svg_Custom_Command_Node, "points", points, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Custom_Command_Node, "commands_count", commands_count, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY(eet, Svg_Custom_Command_Node, "commands", commands, EET_T_INT);
+   return eet;
+}
+
+static inline Eet_Data_Descriptor*
+_eet_for_path_node(void)
+{
+   Eet_Data_Descriptor *eet;
+   Eet_Data_Descriptor_Class eetc;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Path_Node);
+   eet = eet_data_descriptor_stream_new(&eetc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(eet, Svg_Path_Node, "path", path, EET_T_STRING);
+   return eet;
+}
+
+struct
+{
+   Svg_Node_Type u;
+   const char       *name;
+} eet_mapping[] = {
+   { SVG_NODE_DOC, "doc" },
+   { SVG_NODE_G, "g" },
+   { SVG_NODE_DEFS, "defs" },
+   { SVG_NODE_ARC, "arc" },
+   { SVG_NODE_CIRCLE, "circle" },
+   { SVG_NODE_ELLIPSE, "ellipse" },
+   { SVG_NODE_POLYGON, "polygon" },
+   { SVG_NODE_POLYLINE, "polyline" },
+   { SVG_NODE_RECT, "rect" },
+   { SVG_NODE_PATH, "path" },
+   { SVG_NODE_LINE, "line" },
+   { SVG_NODE_CUSTOME_COMMAND, "command" },
+   { SVG_NODE_UNKNOWN, NULL }
+};
+
+static const char *
+/* union
+   type_get() */
+_union_type_get(const void *data,
+                Eina_Bool  *unknow)
+{
+   const Svg_Node_Type *u = data;
+   int i;
+
+   if (unknow)
+     *unknow = EINA_FALSE;
+
+   for (i = 0; eet_mapping[i].name != NULL; ++i)
+     if (*u == eet_mapping[i].u)
+       return eet_mapping[i].name;
+
+   if (unknow)
+     *unknow = EINA_TRUE;
+   return NULL;
+} /* _union_type_get */
+
+static Eina_Bool
+_union_type_set(const char *type,
+                void       *data,
+                Eina_Bool   unknow)
+{
+   Svg_Node_Type *u = data;
+   int i;
+
+   if (unknow)
+     return EINA_FALSE;
+
+   for (i = 0; eet_mapping[i].name != NULL; ++i)
+     if (strcmp(eet_mapping[i].name, type) == 0)
+       {
+          *u = eet_mapping[i].u;
+          return EINA_TRUE;
+       }
+   return EINA_FALSE;
+} /* _union_type_set */
+
+Eet_Data_Descriptor *
+vg_common_svg_node_eet(void)
+{
+   Eet_Data_Descriptor *eet_union;
+   Eet_Data_Descriptor_Class eetc;
+
+   if (_eet_vg_node) return _eet_vg_node;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Node);
+   _eet_vg_node = eet_data_descriptor_stream_new(&eetc);
+
+   eetc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
+   eetc.func.type_get = _union_type_get;
+   eetc.func.type_set = _union_type_set;
+   eet_union = eet_data_descriptor_stream_new(&eetc);
+
+   _eet_doc_node = _eet_for_doc_node();
+   _eet_g_node = _eet_for_g_node();
+   _eet_defs_node = _eet_for_defs_node();
+   _eet_arc_node = _eet_for_arc_node();
+   _eet_circle_node = _eet_for_circle_node();
+   _eet_ellipse_node = _eet_for_ellipse_node();
+   _eet_rect_node = _eet_for_rect_node();
+   _eet_line_node = _eet_for_line_node();
+   _eet_path_node = _eet_for_path_node();
+   _eet_polygon_node = _eet_for_polygon_node();
+   _eet_custom_command_node = _eet_for_custom_command_node();
+   _eet_style_property_node = _eet_for_style_property();
+   _eet_matrix3_node = _eet_for_eina_matrix3();
+
+
+
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "doc", _eet_doc_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "g", _eet_g_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "defs", _eet_defs_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "arc", _eet_arc_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "circle", _eet_circle_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "ellipse", _eet_ellipse_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "rect", _eet_rect_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "line", _eet_line_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "path", _eet_path_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "polygon", _eet_polygon_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "polyline", _eet_polygon_node);
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "command", _eet_custom_command_node);
+
+   EET_DATA_DESCRIPTOR_ADD_UNION(_eet_vg_node, Svg_Node, "node", node, type, eet_union);
+
+
+   EET_DATA_DESCRIPTOR_ADD_LIST(_eet_vg_node, Svg_Node, "child", child, _eet_vg_node);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_eet_vg_node, Svg_Node, "id", id, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_eet_vg_node, Svg_Node, "style", style, _eet_style_property_node);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_eet_vg_node, Svg_Node, "transform", transform, _eet_matrix3_node);
+
+   return _eet_vg_node;
+}
+
+void 
+vg_common_svg_node_eet_destroy(void)
+{
+   FREE_DESCRIPTOR(_eet_rect_node);
+   FREE_DESCRIPTOR(_eet_circle_node);
+   FREE_DESCRIPTOR(_eet_ellipse_node);
+   FREE_DESCRIPTOR(_eet_gradient_stops_node);
+   FREE_DESCRIPTOR(_eet_linear_gradient_node);
+   FREE_DESCRIPTOR(_eet_radial_gradient_node);
+   FREE_DESCRIPTOR(_eet_style_gradient_node);
+   FREE_DESCRIPTOR(_eet_style_property_node);
+   FREE_DESCRIPTOR(_eet_matrix3_node);
+   FREE_DESCRIPTOR(_eet_doc_node);
+   FREE_DESCRIPTOR(_eet_defs_node);
+   FREE_DESCRIPTOR(_eet_g_node);
+   FREE_DESCRIPTOR(_eet_arc_node);
+   FREE_DESCRIPTOR(_eet_path_node);
+   FREE_DESCRIPTOR(_eet_polygon_node);
+   FREE_DESCRIPTOR(_eet_vg_node);
+   FREE_DESCRIPTOR(_eet_line_node);
+   FREE_DESCRIPTOR(_eet_custom_command_node);
+}
+
+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);
+}
+
+void
+vg_common_svg_node_free(Svg_Node *node)
+{
+   Svg_Node *child;
+   Svg_Style_Gradient *grad;
+
+   if (!node) return;
+
+   EINA_LIST_FREE(node->child, child)
+     {
+        vg_common_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:
+           free(node->node.polygon.points);
+           break;
+        case SVG_NODE_POLYLINE:
+           free(node->node.polyline.points);
+           break;
+        case SVG_NODE_DOC:
+           vg_common_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);
+}
+
+static Efl_VG *
+_apply_gradient_property(Svg_Style_Gradient *g)
+{
+   Efl_VG *grad_obj = NULL;
+   Efl_Gfx_Gradient_Stop *stops, *stop;
+   int stop_count = 0, i = 0;
+   Eina_List *l;
+
+   if (g->type == SVG_LINEAR_GRADIENT)
+     {
+        grad_obj = evas_vg_gradient_linear_add(NULL);
+        evas_vg_gradient_linear_start_set(grad_obj, g->linear->x1, g->linear->y1);
+        evas_vg_gradient_linear_end_set(grad_obj, g->linear->x2, g->linear->y2);
+     }
+   else if (g->type == SVG_RADIAL_GRADIENT)
+     {
+        grad_obj = evas_vg_gradient_radial_add(NULL);
+        evas_vg_gradient_radial_center_set(grad_obj, g->radial->cx, g->radial->cy);
+        evas_vg_gradient_radial_radius_set(grad_obj, g->radial->r);
+        evas_vg_gradient_radial_focal_set(grad_obj, g->radial->fx, g->radial->fy);
+     }
+   else
+     {
+        // not a known gradient
+        return NULL;
+     }
+   // apply common prperty
+   evas_vg_gradient_spread_set(grad_obj, g->spread);
+   // update the stops
+   stop_count = eina_list_count(g->stops);
+   if (stop_count)
+     {
+        stops = calloc(stop_count, sizeof(Efl_Gfx_Gradient_Stop));
+        i = 0;
+        EINA_LIST_FOREACH(g->stops, l, stop)
+          {
+             stops[i].r = stop->r;
+             stops[i].g = stop->g;
+             stops[i].b = stop->b;
+             stops[i].a = stop->a;
+             stops[i].offset = stop->offset;
+             i++;
+          }
+        evas_vg_gradient_stop_set(grad_obj, stops, stop_count);
+        free(stops);
+     }
+   return grad_obj;
+}
+
+// vg tree creation
+static void
+_apply_vg_property(Svg_Node *node, Efl_VG *vg)
+{
+   Svg_Style_Property *style = node->style;
+
+   // update the vg name
+   if (node->id)
+     evas_vg_node_name_set(vg, node->id);
+
+   // apply the transformation
+   if (node->transform)
+     evas_vg_node_transformation_set(vg, node->transform);
+
+   if ((node->type == SVG_NODE_G) || (node->type == SVG_NODE_DOC)) return;
+
+   // apply the fill style property
+   efl_gfx_shape_fill_rule_set(vg, style->fill.fill_rule);
+   // if fill property is NULL then do nothing
+   if (style->fill.paint.none)
+     {
+        //do nothing
+     }
+   else if (style->fill.paint.gradient)
+     {
+        // if the fill has gradient then apply.
+        evas_vg_shape_fill_set(vg, _apply_gradient_property(style->fill.paint.gradient));
+     }
+   else if (style->fill.paint.cur_color)
+     {
+        // apply the current style color
+        evas_vg_node_color_set(vg, style->r, style->g,
+                               style->b, style->fill.opacity);
+     }
+   else
+     {
+        // apply the fill color
+        evas_vg_node_color_set(vg, style->fill.paint.r, style->fill.paint.g,
+                               style->fill.paint.b, style->fill.opacity);
+     }
+
+   // apply the stroke style property
+   //@TODO HACK, fix the below api to take the stroke width as pixels
+   // rightnow it draws double the pixel (inside and outside the outline)
+   evas_vg_shape_stroke_width_set(vg, style->stroke.width/2.0);
+   evas_vg_shape_stroke_cap_set(vg, style->stroke.cap);
+   evas_vg_shape_stroke_join_set(vg, style->stroke.join);
+   evas_vg_shape_stroke_scale_set(vg, style->stroke.scale);
+   // if stroke property is NULL then do nothing
+   if (style->stroke.paint.none)
+     {
+        //do nothing
+     }
+   else if (style->stroke.paint.gradient)
+     {
+        // if the fill has gradient then apply.
+        evas_vg_shape_stroke_fill_set(vg, _apply_gradient_property(style->stroke.paint.gradient));
+     }
+   else if (style->stroke.paint.url)
+     {
+        // apply the color pointed by url
+        // TODO
+     }
+   else if (style->stroke.paint.cur_color)
+     {
+        // apply the current style color
+        evas_vg_shape_stroke_color_set(vg, style->r, style->g,
+                                       style->b, style->stroke.opacity);
+     }
+   else
+     {
+        // apply the stroke color
+        evas_vg_shape_stroke_color_set(vg, style->stroke.paint.r, style->stroke.paint.g,
+                                       style->stroke.paint.b, style->stroke.opacity);
+     }
+}
+
+static void
+_add_polyline(Efl_VG *vg, double *array, int size, Eina_Bool polygon)
+{
+   int i;
+
+   if (size < 2) return;
+
+   evas_vg_shape_append_move_to(vg, array[0], array[1]);
+   for (i=2; i < size; i+=2)
+     evas_vg_shape_append_line_to(vg, array[i], array[i+1]);
+
+   if (polygon)
+     evas_vg_shape_append_close(vg);
+}
+
+static Efl_VG *
+vg_common_create_vg_node_helper(Svg_Node *node, Efl_VG *parent)
+{
+   Efl_VG *vg = NULL;
+   Svg_Node *child;
+   Eina_List *l;
+
+   switch (node->type)
+     {
+        case SVG_NODE_DOC:
+        case SVG_NODE_G:
+           {
+              vg = evas_vg_container_add(parent);
+              _apply_vg_property(node, vg);
+              EINA_LIST_FOREACH(node->child, l, child)
+                {
+                   vg_common_create_vg_node_helper(child, vg);
+                }
+              return vg;
+           }
+           break;
+        case SVG_NODE_PATH:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_append_svg_path(vg, node->node.path.path);
+           break;
+        case SVG_NODE_POLYGON:
+           vg = evas_vg_shape_add(parent);
+           _add_polyline(vg, node->node.polygon.points, node->node.polygon.points_count, EINA_TRUE);
+           break;
+        case SVG_NODE_POLYLINE:
+           vg = evas_vg_shape_add(parent);
+           _add_polyline(vg, node->node.polygon.points, node->node.polygon.points_count, EINA_FALSE);
+           break;
+        case SVG_NODE_ELLIPSE:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_append_arc(vg, node->node.ellipse.cx - node->node.ellipse.rx,
+                                          node->node.ellipse.cy - node->node.ellipse.ry,
+                                          2*node->node.ellipse.rx, 2*node->node.ellipse.ry, 0, 360);
+           evas_vg_shape_append_close(vg);
+           break;
+        case SVG_NODE_CIRCLE:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_append_circle(vg, node->node.circle.cx, node->node.circle.cy, node->node.circle.r);
+           break;
+        case SVG_NODE_RECT:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_append_rect(vg, node->node.rect.x, node->node.rect.y, node->node.rect.w, node->node.rect.h,
+                                           node->node.rect.rx, node->node.rect.ry);
+           break;
+        case SVG_NODE_LINE:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_append_move_to(vg, node->node.line.x1, node->node.line.y1);
+           evas_vg_shape_append_line_to(vg, node->node.line.x2, node->node.line.y2);
+           break;
+        case SVG_NODE_CUSTOME_COMMAND:
+           vg = evas_vg_shape_add(parent);
+           evas_vg_shape_path_set(vg, node->node.command.commands, node->node.command.points);
+           break;
+       default:
+           break;
+     }
+   if (vg)
+   _apply_vg_property(node, vg);
+   return vg;
+}
+
+Vg_File_Data *
+vg_common_create_vg_node(Svg_Node *node)
+{
+   Vg_File_Data *vg_data;
+
+   if (!node || (node->type != SVG_NODE_DOC)) return NULL;
+
+   vg_data = calloc(1, sizeof(Vg_File_Data));
+   vg_data->view_box.x = node->node.doc.vx;
+   vg_data->view_box.y = node->node.doc.vy;
+   vg_data->view_box.w = node->node.doc.vw;
+   vg_data->view_box.h = node->node.doc.vh;
+   vg_data->preserve_aspect = node->node.doc.preserve_aspect;
+   vg_data->root = vg_common_create_vg_node_helper(node, NULL);
+
+   return vg_data;
+}
+
+static Svg_Node *
+_create_node(Svg_Node *parent, Svg_Node_Type type)
+{
+   Svg_Node *node = calloc(1, sizeof(Svg_Node));
+
+   // default fill property
+   node->style = calloc(1, sizeof(Svg_Style_Property));
+
+   // update the default value of stroke and fill
+   //https://www.w3.org/TR/SVGTiny12/painting.html#SpecifyingPaint
+   // default fill color is black
+   node->style->fill.paint.r = 0;
+   node->style->fill.paint.g = 0;
+   node->style->fill.paint.b = 0;
+   node->style->fill.paint.none = EINA_FALSE;
+   // default fill opacity is 1
+   node->style->fill.opacity = 255;
+
+   // default fill rule is nonzero
+   node->style->fill.fill_rule = EFL_GFX_FILL_RULE_WINDING;
+
+   // default stroke is none
+   node->style->stroke.paint.none = EINA_TRUE;
+   // default stroke opacity is 1
+   node->style->stroke.opacity = 255;
+   // default stroke width is 1
+   node->style->stroke.width = 1;
+   // default line cap is butt
+   node->style->stroke.cap = EFL_GFX_CAP_BUTT;
+   // default line join is miter
+   node->style->stroke.join = EFL_GFX_JOIN_MITER;
+   node->style->stroke.scale = 1.0;
+
+   node->parent = parent;
+   node->type = type;
+   node->child = NULL;
+
+   if (parent)
+     parent->child = eina_list_append(parent->child, node);
+   return node;
+}
+
+static Svg_Style_Gradient*
+_create_gradient_node(Efl_VG *vg)
+{
+   const Efl_Gfx_Gradient_Stop *stops = NULL;
+   Efl_Gfx_Gradient_Stop *new_stop;
+   unsigned int count, i;
+
+   Svg_Style_Gradient *grad = calloc(1, sizeof(Svg_Style_Gradient));
+
+   grad->spread = evas_vg_gradient_spread_get(vg);
+   evas_vg_gradient_stop_get(vg, &stops, &count);
+   for (i=0 ; i < count; i++)
+     {
+        new_stop = calloc(1, sizeof(Efl_Gfx_Gradient_Stop));
+        memcpy(new_stop, stops, sizeof(Efl_Gfx_Gradient_Stop));
+        grad->stops = eina_list_append(grad->stops, new_stop);
+        stops++;
+     }
+   if (efl_isa(vg, EFL_VG_GRADIENT_LINEAR_CLASS))
+     {
+        grad->type = SVG_LINEAR_GRADIENT;
+        grad->linear = calloc(1, sizeof(Svg_Linear_Gradient));
+        evas_vg_gradient_linear_start_get(vg, &grad->linear->x1, &grad->linear->y1);
+        evas_vg_gradient_linear_end_get(vg, &grad->linear->x2, &grad->linear->y2);
+     }
+   else
+     {
+        grad->type = SVG_RADIAL_GRADIENT;
+        grad->radial = calloc(1, sizeof(Svg_Radial_Gradient));
+        evas_vg_gradient_radial_center_get(vg, &grad->radial->cx, &grad->radial->cy);
+        evas_vg_gradient_radial_focal_get(vg, &grad->radial->fx, &grad->radial->fy);
+        grad->radial->r = evas_vg_gradient_radial_radius_get(vg);
+     }
+
+   return grad;
+}
+
+static void
+_apply_svg_property(Svg_Node *node, Efl_VG *vg)
+{
+   const Eina_Matrix3 *matrix;
+   const char *id;
+   Svg_Style_Property *style = node->style;
+
+   // transformation
+   if ((matrix = evas_vg_node_transformation_get(vg)))
+     {
+        node->transform = calloc(1, sizeof(Eina_Matrix3));
+        eina_matrix3_copy(node->transform, matrix);
+     }
+
+   if ((id = evas_vg_node_name_get(vg)))
+     {
+        node->id = eina_stringshare_add(id);
+     }
+
+   if (node->type == SVG_NODE_G) return;
+
+
+   // apply the fill style property
+   style->fill.fill_rule = efl_gfx_shape_fill_rule_get(vg);
+   style->fill.paint.none = EINA_FALSE;
+   if (evas_vg_shape_fill_get(vg))
+     {
+        // if the fill has gradient then apply.
+        style->fill.paint.gradient = _create_gradient_node(evas_vg_shape_fill_get(vg));
+     }
+   else
+     {
+        evas_vg_node_color_get(vg, &style->fill.paint.r, &style->fill.paint.g,
+                               &style->fill.paint.b, &style->fill.opacity);
+     }
+
+   // apply stroke style property
+   style->stroke.paint.none = EINA_FALSE;
+
+   if (evas_vg_shape_stroke_fill_get(vg))
+     {
+        // if the stroke has gradient then apply.
+        style->stroke.paint.gradient = _create_gradient_node(evas_vg_shape_stroke_fill_get(vg));
+     }
+   else
+     {
+        // apply the stroke color
+        evas_vg_shape_stroke_color_get(vg, &style->stroke.paint.r, &style->stroke.paint.g,
+                                       &style->stroke.paint.b, &style->stroke.opacity);
+     }
+
+   // keep the stroke width same as svg spec.
+   style->stroke.width = (evas_vg_shape_stroke_width_get(vg) * 2.0);
+   style->stroke.cap = evas_vg_shape_stroke_cap_get(vg);
+   style->stroke.join = evas_vg_shape_stroke_join_get(vg);
+   style->stroke.scale = evas_vg_shape_stroke_scale_get(vg);
+
+
+}
+
+static void
+vg_common_create_svg_node_helper(Efl_VG *vg, Svg_Node *parent)
+{
+   Eina_Iterator *it;
+   Efl_VG *child;
+   Svg_Node *svg_node;
+   const Efl_Gfx_Path_Command *commands;
+   unsigned int points_count, commands_count;
+   const double *points;
+
+   if (efl_isa(vg, EFL_VG_CONTAINER_CLASS))
+     {
+        svg_node = _create_node(parent, SVG_NODE_G);
+        _apply_svg_property(svg_node, vg);
+        // apply property
+        it = efl_vg_container_children_get(vg);
+        EINA_ITERATOR_FOREACH(it, child)
+          {
+             vg_common_create_svg_node_helper(child, svg_node);
+          }
+     }
+   else
+     {
+        svg_node = _create_node(parent, SVG_NODE_CUSTOME_COMMAND);
+        evas_vg_shape_path_get(vg, &commands, &points);
+        evas_vg_shape_path_length_get(vg, &commands_count, &points_count);
+        svg_node->node.command.commands_count = commands_count;
+        svg_node->node.command.points_count = points_count;
+        svg_node->node.command.points = calloc(points_count, sizeof(double));
+        svg_node->node.command.commands = calloc(commands_count, sizeof(Efl_Gfx_Path_Command));
+        memcpy(svg_node->node.command.commands, commands, sizeof (Efl_Gfx_Path_Command) * commands_count);
+        memcpy(svg_node->node.command.points, points, sizeof (double) * points_count);
+        _apply_svg_property(svg_node, vg);
+     }
+}
+
+Svg_Node *
+vg_common_create_svg_node(Vg_File_Data *node)
+{
+   Svg_Node *doc;
+
+   if (!node || !node->root) return NULL;
+
+   doc = _create_node(NULL, SVG_NODE_DOC);
+
+   doc->node.doc.vx = node->view_box.x;
+   doc->node.doc.vy = node->view_box.y;
+   doc->node.doc.vw = node->view_box.w;
+   doc->node.doc.vh = node->view_box.h;
+   doc->node.doc.preserve_aspect = node->preserve_aspect;
+   vg_common_create_svg_node_helper(node->root, doc);
+   return doc;
+}
diff --git a/src/static_libs/vg_common/vg_common.h b/src/static_libs/vg_common/vg_common.h
new file mode 100644 (file)
index 0000000..70c7449
--- /dev/null
@@ -0,0 +1,299 @@
+#ifndef VG_COMMON_H_
+#define VG_COMMON_H_
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+typedef enum _Svg_Node_Type                Svg_Node_Type;
+typedef enum _Svg_Length_Type              Svg_Length_Type;
+
+typedef struct _Svg_Node                   Svg_Node;
+typedef struct _Svg_Doc_Node               Svg_Doc_Node;
+typedef struct _Svg_G_Node                 Svg_G_Node;
+typedef struct _Svg_Defs_Node              Svg_Defs_Node;
+typedef struct _Svg_Arc_Node               Svg_Arc_Node;
+typedef struct _Svg_Circle_Node            Svg_Circle_Node;
+typedef struct _Svg_Ellipse_Node           Svg_Ellipse_Node;
+typedef struct _Svg_Polygon_Node           Svg_Polygon_Node;
+typedef struct _Svg_Rect_Node              Svg_Rect_Node;
+typedef struct _Svg_Path_Node              Svg_Path_Node;
+typedef struct _Svg_Style_Property         Svg_Style_Property;
+typedef struct _Svg_Line_Node              Svg_Line_Node;
+typedef struct _Svg_Custom_Command_Node    Svg_Custom_Command_Node;
+
+
+typedef struct  _Svg_Style_Stroke          Svg_Style_Stroke;
+typedef struct  _Svg_Style_Fill            Svg_Style_Fill;
+typedef enum    _Svg_Fill_Flags            Svg_Fill_Flags;
+typedef enum    _Svg_Stroke_Flags          Svg_Stroke_Flags;
+
+
+typedef enum   _Svg_Gradient_Type          Svg_Gradient_Type;
+typedef struct _Svg_Style_Gradient         Svg_Style_Gradient;
+typedef struct _Svg_Linear_Gradient        Svg_Linear_Gradient;
+typedef struct _Svg_Radial_Gradient        Svg_Radial_Gradient;
+typedef struct _Svg_Paint                  Svg_Paint;
+
+enum _Svg_Node_Type
+{
+   SVG_NODE_DOC,
+   SVG_NODE_G,
+   SVG_NODE_DEFS,
+   SVG_NODE_SWITCH,
+   SVG_NODE_ANIMATION,
+   SVG_NODE_ARC,
+   SVG_NODE_CIRCLE,
+   SVG_NODE_ELLIPSE,
+   SVG_NODE_IMAGE,
+   SVG_NODE_LINE,
+   SVG_NODE_PATH,
+   SVG_NODE_POLYGON,
+   SVG_NODE_POLYLINE,
+   SVG_NODE_RECT,
+   SVG_NODE_TEXT,
+   SVG_NODE_TEXTAREA,
+   SVG_NODE_TSPAN,
+   SVG_NODE_USE,
+   SVG_NODE_VIDEO,
+   SVG_NODE_CUSTOME_COMMAND,
+   SVG_NODE_UNKNOWN
+};
+
+enum _Svg_Length_Type
+{
+   SVG_LT_PERCENT,
+   SVG_LT_PX,
+   SVG_LT_PC,
+   SVG_LT_PT,
+   SVG_LT_MM,
+   SVG_LT_CM,
+   SVG_LT_IN,
+};
+
+struct _Svg_Doc_Node
+{
+   double width;
+   double height;
+   double vx;
+   double vy;
+   double vw;
+   double vh;
+   Eina_Bool preserve_aspect;
+   Svg_Node *defs;
+};
+
+struct _Svg_G_Node
+{
+
+};
+
+struct _Svg_Defs_Node
+{
+   Eina_List   *gradients;
+};
+
+struct _Svg_Arc_Node
+{
+
+};
+
+struct _Svg_Ellipse_Node
+{
+   double cx;
+   double cy;
+   double rx;
+   double ry;
+};
+
+struct _Svg_Circle_Node
+{
+   double cx;
+   double cy;
+   double r;
+};
+
+struct _Svg_Rect_Node
+{
+   double x;
+   double y;
+   double w;
+   double h;
+   double rx;
+   double ry;
+};
+
+struct _Svg_Line_Node
+{
+   double x1;
+   double y1;
+   double x2;
+   double y2;
+};
+
+struct _Svg_Custom_Command_Node
+{
+   int                         points_count;
+   int                         commands_count;
+   double                     *points;
+   Efl_Gfx_Path_Command       *commands;
+};
+
+struct _Svg_Path_Node
+{
+   Eina_Stringshare *path;
+};
+
+struct _Svg_Polygon_Node
+{
+   int points_count;
+   double *points;
+};
+
+
+enum _Svg_Gradient_Type
+{
+   SVG_LINEAR_GRADIENT,
+   SVG_RADIAL_GRADIENT
+};
+struct _Svg_Linear_Gradient
+{
+   double x1;
+   double y1;
+   double x2;
+   double y2;
+};
+
+struct _Svg_Radial_Gradient
+{
+   double cx;
+   double cy;
+   double fx;
+   double fy;
+   double r;
+};
+
+struct _Svg_Style_Gradient
+{
+   Svg_Gradient_Type type;
+   Eina_Stringshare  *id;
+   Eina_Stringshare  *ref;
+   Efl_Gfx_Gradient_Spread spread;
+   Eina_List   *stops; // Efl_Gfx_Gradient_Stop
+   Svg_Radial_Gradient *radial;
+   Svg_Linear_Gradient *linear;
+};
+
+struct _Svg_Paint
+{
+   int        r;
+   int        g;
+   int        b;
+   Eina_Bool  none;
+   Eina_Bool  cur_color;
+   Svg_Style_Gradient  *gradient;
+   Eina_Stringshare    *url;
+};
+
+enum _Svg_Fill_Flags
+{
+   SVG_FILL_FLAGS_PAINT     = 0x1,
+   SVG_FILL_FLAGS_OPACITY   = 0x2,
+   SVG_FILL_FLAGS_GRADIENT  = 0x4,
+   SVG_FILL_FLAGS_FILL_RULE = 0x8
+};
+
+enum _Svg_Stroke_Flags
+{
+   SVG_STROKE_FLAGS_PAINT    = 0x1,
+   SVG_STROKE_FLAGS_OPACITY  = 0x2,
+   SVG_STROKE_FLAGS_GRADIENT = 0x4,
+   SVG_STROKE_FLAGS_SCALE    = 0x8,
+   SVG_STROKE_FLAGS_WIDTH    = 0x10,
+   SVG_STROKE_FLAGS_CAP      = 0x20,
+   SVG_STROKE_FLAGS_JOIN     = 0x40,
+   SVG_STROKE_FLAGS_DASH     = 0x80,
+};
+
+struct _Svg_Style_Fill
+{
+   Svg_Fill_Flags       flags;
+   Svg_Paint            paint;
+   int                  opacity;
+   Efl_Gfx_Fill_Rule    fill_rule;
+};
+
+struct _Svg_Style_Stroke
+{
+   Svg_Stroke_Flags     flags;
+   Svg_Paint            paint;
+   int                  opacity;
+   double               scale;
+   double               width;
+   double               centered;
+   Efl_Gfx_Cap          cap;
+   Efl_Gfx_Join         join;
+   Efl_Gfx_Dash        *dash;
+   int                  dash_count;
+};
+
+struct _Svg_Style_Property
+{
+   Svg_Style_Fill     fill;
+   Svg_Style_Stroke   stroke;
+   // the color property indirectly 
+   // used by fill and stroke
+   int                r;
+   int                g;
+   int                b;
+};
+
+struct _Svg_Node
+{
+   Svg_Node_Type        type;
+   Svg_Node            *parent;
+   Eina_List           *child;
+   Eina_Stringshare    *id;
+   Svg_Style_Property  *style;
+   Eina_Matrix3        *transform;
+   union
+     {
+        Svg_G_Node   g;
+        Svg_Doc_Node doc;
+        Svg_Defs_Node defs;
+        Svg_Arc_Node arc;
+        Svg_Circle_Node circle;
+        Svg_Ellipse_Node ellipse;
+        Svg_Polygon_Node polygon;
+        Svg_Polygon_Node polyline;
+        Svg_Rect_Node rect;
+        Svg_Path_Node path;
+        Svg_Line_Node line;
+        Svg_Custom_Command_Node command;
+     }node;
+};
+
+enum _Svg_Style_Type
+{
+   SVG_STYLE_QUALITY,
+   SVG_STYLE_FILL,
+   SVG_STYLE_VIEWPORT_FILL,
+   SVG_STYLE_FONT,
+   SVG_STYLE_STROKE,
+   SVG_STYLE_SOLID_COLOR,
+   SVG_STYLE_GRADIENT,
+   SVG_STYLE_TRANSFORM,
+   SVG_STYLE_OPACITY,
+   SVG_STYLE_COMP_OP
+};
+
+Eet_Data_Descriptor * vg_common_svg_node_eet(void);
+void vg_common_svg_node_eet_destroy(void);
+Vg_File_Data * vg_common_create_vg_node(Svg_Node *node);
+Svg_Node * vg_common_create_svg_node(Vg_File_Data *node);
+void vg_common_svg_node_free(Svg_Node *node);
+
+#endif //EVAS_VG_COMMON_H_