From: Subhransu Mohanty Date: Mon, 1 Aug 2016 09:00:03 +0000 (+0900) Subject: Revert "vector: backported from opensource" X-Git-Tag: accepted/tizen/common/20160804.174451~94 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F69%2F82169%2F1;p=platform%2Fupstream%2Fefl.git Revert "vector: backported from opensource" This reverts commit 35aaf1f7d1a4e7f95ca3fa1b7dd59893abec5d42. Change-Id: Icab1b1ba7e80bfbf43f7018adf8636497536ac3e --- diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 5309b75..6171396 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -7323,14 +7323,6 @@ st_collections_group_parts_part_description_inherit(void) } break; } - case EDJE_PART_TYPE_VECTOR: - { - Edje_Part_Description_Vector *ied = (Edje_Part_Description_Vector *) ed; - Edje_Part_Description_Vector *iparent = (Edje_Part_Description_Vector *) parent; - ied->vg.set = iparent->vg.set; - ied->vg.id = iparent->vg.id; - break; - } } #undef STRDUP diff --git a/src/lib/efl/interfaces/efl_gfx_shape.c b/src/lib/efl/interfaces/efl_gfx_shape.c index 7ffcda5..f7c306f 100644 --- a/src/lib/efl/interfaces/efl_gfx_shape.c +++ b/src/lib/efl/interfaces/efl_gfx_shape.c @@ -275,13 +275,13 @@ _efl_gfx_shape_equal_commands_internal(Efl_Gfx_Shape_Data *a, static inline double interpolate(double from, double to, double pos_map) { - return (from * (1.0 - pos_map)) + (to * pos_map); + return (from * pos_map) + (to * (1.0 - pos_map)); } static inline int interpolatei(int from, int to, double pos_map) { - return (from * (1.0 - pos_map)) + (to * pos_map); + return (from * pos_map) + (to * (1.0 - pos_map)); } typedef struct _Efl_Gfx_Property Efl_Gfx_Property; @@ -403,17 +403,17 @@ _efl_gfx_shape_interpolate(Eo *obj, Efl_Gfx_Shape_Data *pd, eo_do(obj, - efl_gfx_shape_stroke_scale_set(interpolate(property_from.scale, property_to.scale, pos_map)), - efl_gfx_shape_stroke_color_set(interpolatei(property_from.r, property_to.r, pos_map), - interpolatei(property_from.g, property_to.g, pos_map), - interpolatei(property_from.b, property_to.b, pos_map), - interpolatei(property_from.a, property_to.a, pos_map)), - efl_gfx_color_set(interpolatei(property_from.fr, property_to.fr, pos_map), - interpolatei(property_from.fg, property_to.fg, pos_map), - interpolatei(property_from.fb, property_to.fb, pos_map), - interpolatei(property_from.fa, property_to.fa, pos_map)), - efl_gfx_shape_stroke_width_set(interpolate(property_from.w, property_to.w, pos_map)), - efl_gfx_shape_stroke_location_set(interpolate(property_from.centered, property_to.centered, pos_map)), + efl_gfx_shape_stroke_scale_set(interpolate(property_to.scale, property_from.scale, pos_map)), + efl_gfx_shape_stroke_color_set(interpolatei(property_to.r, property_from.r, pos_map), + interpolatei(property_to.g, property_from.g, pos_map), + interpolatei(property_to.b, property_from.b, pos_map), + interpolatei(property_to.a, property_from.a, pos_map)), + efl_gfx_color_set(interpolatei(property_to.fr, property_from.fr, pos_map), + interpolatei(property_to.fg, property_from.fg, pos_map), + interpolatei(property_to.fb, property_from.fb, pos_map), + interpolatei(property_to.fa, property_from.fa, pos_map)), + efl_gfx_shape_stroke_width_set(interpolate(property_to.w, property_from.w, pos_map)), + efl_gfx_shape_stroke_location_set(interpolate(property_to.centered, property_from.centered, pos_map)), efl_gfx_shape_stroke_dash_set(dash, property_to.dash_length), efl_gfx_shape_stroke_cap_set(pos_map < 0.5 ? property_from.c : property_to.c), efl_gfx_shape_stroke_join_set(pos_map < 0.5 ? property_from.j : property_to.j), diff --git a/src/lib/evas/vg/evas_vg_cache.c b/src/lib/evas/vg/evas_vg_cache.c deleted file mode 100644 index 3123dec..0000000 --- a/src/lib/evas/vg/evas_vg_cache.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "evas_vg_cache.h" -#include "evas_vg_common.h" - -static Evas_Cache_Svg* svg_cache = NULL; - -static void -_evas_cache_vg_data_free_cb(void *data) -{ - Vg_Data *val = data; - - eo_del(val->vg); - free(val); -} - -static void -_evas_cache_svg_entry_free_cb(void *data) -{ - Svg_Entry *entry = data; - - eina_stringshare_del(entry->file); - free(entry->key); - eo_del(entry->root); - free(entry); -} - -void -evas_cache_svg_init(void) -{ - if (svg_cache) - { - svg_cache->ref++; - return; - } - - svg_cache = calloc(1, sizeof(Evas_Cache_Svg)); - svg_cache->vg_hash = eina_hash_string_superfast_new(_evas_cache_vg_data_free_cb); - svg_cache->active = eina_hash_string_superfast_new(_evas_cache_svg_entry_free_cb); - svg_cache->ref++; -} - -void -evas_cache_svg_shutdown(void) -{ - if (!svg_cache) return; - svg_cache->ref--; - if (svg_cache->ref) return; - _evas_vg_svg_node_eet_destroy(); - eina_hash_free(svg_cache->vg_hash); - eina_hash_free(svg_cache->active); - svg_cache = NULL; -} - -static Vg_Data * -_evas_cache_vg_data_find(const char *path, int vg_id) -{ - Vg_Data *vd; - Eina_Strbuf *key; - - key = eina_strbuf_new(); - eina_strbuf_append_printf(key, "%s/%d", path, vg_id); - vd = eina_hash_find(svg_cache->vg_hash, eina_strbuf_string_get(key)); - if (!vd) - { - vd = _evas_vg_load_vg_data(path, vg_id); - eina_hash_add(svg_cache->vg_hash, eina_strbuf_string_get(key), vd); - } - eina_strbuf_free(key); - return vd; -} - -static void -_evas_cache_svg_vg_tree_update(Svg_Entry *entry) -{ - Vg_Data *src_vg = NULL, *dst_vg = NULL; - if(!entry) return; - - if (!entry->src_vg) - { - entry->root = NULL; - return; - } - - src_vg = _evas_cache_vg_data_find(entry->file, entry->src_vg); - if (entry->dest_vg) - dst_vg = _evas_cache_vg_data_find(entry->file, entry->dest_vg); - - entry->root = _evas_vg_dup_vg_tree(src_vg, dst_vg, entry->key_frame, entry->w, entry->h); - eina_stringshare_del(entry->file); - entry->file = NULL; -} - -Svg_Entry* -evas_cache_svg_find(const char *path, - int src_vg, int dest_vg, - float key_frame, int w, int h) -{ - Svg_Entry* se; - Eina_Strbuf *key; - - if (!svg_cache) return NULL; - - key = eina_strbuf_new(); - eina_strbuf_append_printf(key, "%s/%d/%d/%.2f/%d/%d", - path, src_vg, dest_vg, key_frame, w, h); - se = eina_hash_find(svg_cache->active, eina_strbuf_string_get(key)); - if (!se) - { - se = calloc(1, sizeof(Svg_Entry)); - se->file = eina_stringshare_add(path); - se->key_frame = key_frame; - se->src_vg = src_vg; - se->dest_vg = dest_vg; - se->w = w; - se->h = h; - se->key = eina_strbuf_string_steal(key); - eina_hash_direct_add(svg_cache->active, se->key, se); - } - eina_strbuf_free(key); - se->ref++; - return se; -} - -Efl_VG* -evas_cache_svg_vg_tree_get(Svg_Entry *entry) -{ - if (entry->root) return entry->root; - - if (entry->file) - { - _evas_cache_svg_vg_tree_update(entry); - } - return entry->root; -} - -void -evas_cache_svg_entry_del(Svg_Entry *svg_entry) -{ - if (!svg_entry) return; - - svg_entry->ref--; -} - diff --git a/src/lib/evas/vg/evas_vg_eet_handler.c b/src/lib/evas/vg/evas_vg_eet_handler.c deleted file mode 100644 index 6d99c3f..0000000 --- a/src/lib/evas/vg/evas_vg_eet_handler.c +++ /dev/null @@ -1,814 +0,0 @@ -#include "evas_vg_common.h" - -Eet_Data_Descriptor *_edje_edd_edje_rect_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_circle_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_ellipse_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_gradient_stops_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_linear_gradient_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_radial_gradient_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_style_gradient_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_style_property_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_matrix3_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_doc_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_defs_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_g_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_arc_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_path_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_polygon_node = NULL; -Eet_Data_Descriptor *_edje_edd_edje_vg_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_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 (_edje_edd_edje_style_gradient_node) return _edje_edd_edje_style_gradient_node; - - EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Style_Gradient); - _edje_edd_edje_style_gradient_node = eet_data_descriptor_stream_new(&eetc); - _edje_edd_edje_gradient_stops_node = _eet_for_gradient_stops(); - _edje_edd_edje_linear_gradient_node = _eet_for_linear_gradient(); - _edje_edd_edje_radial_gradient_node = _eet_for_radial_gradient(); - - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "type", type, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "id", id, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "spread", spread, EET_T_INT); - EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "stops", stops, _edje_edd_edje_gradient_stops_node); - EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "radial", radial, _edje_edd_edje_radial_gradient_node); - EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_style_gradient_node, Svg_Style_Gradient, "linear", linear, _edje_edd_edje_linear_gradient_node); - - return _edje_edd_edje_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); - 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_VAR_ARRAY(eet, Svg_Polygon_Node, "points", points, EET_T_DOUBLE); - 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, "polygon" }, - { SVG_NODE_RECT, "rect" }, - { SVG_NODE_PATH, "path" }, - { 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 */ - -EAPI Eet_Data_Descriptor * -_evas_vg_svg_node_eet(void) -{ - Eet_Data_Descriptor *eet_union; - Eet_Data_Descriptor_Class eetc; - - if (_edje_edd_edje_vg_node) return _edje_edd_edje_vg_node; - - EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eetc, Svg_Node); - _edje_edd_edje_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); - - _edje_edd_edje_doc_node = _eet_for_doc_node(); - _edje_edd_edje_g_node = _eet_for_g_node(); - _edje_edd_edje_defs_node = _eet_for_defs_node(); - _edje_edd_edje_arc_node = _eet_for_arc_node(); - _edje_edd_edje_circle_node = _eet_for_circle_node(); - _edje_edd_edje_ellipse_node = _eet_for_ellipse_node(); - _edje_edd_edje_rect_node = _eet_for_rect_node(); - _edje_edd_edje_path_node = _eet_for_path_node(); - _edje_edd_edje_polygon_node = _eet_for_polygon_node(); - _edje_edd_edje_style_property_node = _eet_for_style_property(); - _edje_edd_edje_matrix3_node = _eet_for_eina_matrix3(); - - - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "doc", _edje_edd_edje_doc_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "g", _edje_edd_edje_g_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "defs", _edje_edd_edje_defs_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "arc", _edje_edd_edje_arc_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "circle", _edje_edd_edje_circle_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "ellipse", _edje_edd_edje_ellipse_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "rect", _edje_edd_edje_rect_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "path", _edje_edd_edje_path_node); - EET_DATA_DESCRIPTOR_ADD_MAPPING(eet_union, "polygon", _edje_edd_edje_polygon_node); - - EET_DATA_DESCRIPTOR_ADD_UNION(_edje_edd_edje_vg_node, Svg_Node, "node", node, type, eet_union); - - - EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_vg_node, Svg_Node, "child", child, _edje_edd_edje_vg_node); - EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_vg_node, Svg_Node, "id", id, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_vg_node, Svg_Node, "style", style, _edje_edd_edje_style_property_node); - EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_vg_node, Svg_Node, "transform", transform, _edje_edd_edje_matrix3_node); - - return _edje_edd_edje_vg_node; -} - -EAPI void -_evas_vg_svg_node_eet_destroy(void) -{ - FREE_DESCRIPTOR(_edje_edd_edje_rect_node); - FREE_DESCRIPTOR(_edje_edd_edje_circle_node); - FREE_DESCRIPTOR(_edje_edd_edje_ellipse_node); - FREE_DESCRIPTOR(_edje_edd_edje_gradient_stops_node); - FREE_DESCRIPTOR(_edje_edd_edje_linear_gradient_node); - FREE_DESCRIPTOR(_edje_edd_edje_radial_gradient_node); - FREE_DESCRIPTOR(_edje_edd_edje_style_gradient_node); - FREE_DESCRIPTOR(_edje_edd_edje_style_property_node); - FREE_DESCRIPTOR(_edje_edd_edje_matrix3_node); - FREE_DESCRIPTOR(_edje_edd_edje_doc_node); - FREE_DESCRIPTOR(_edje_edd_edje_defs_node); - FREE_DESCRIPTOR(_edje_edd_edje_g_node); - FREE_DESCRIPTOR(_edje_edd_edje_arc_node); - FREE_DESCRIPTOR(_edje_edd_edje_path_node); - FREE_DESCRIPTOR(_edje_edd_edje_polygon_node); - FREE_DESCRIPTOR(_edje_edd_edje_vg_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 = eo_add(EFL_VG_GRADIENT_LINEAR_CLASS, 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 = eo_add(EFL_VG_GRADIENT_RADIAL_CLASS, 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) return; - - // apply the fill style property - eo_do(vg, efl_gfx_shape_fill_rule_set(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_shape_append_move_to(vg, array[0], array[1]); - for (i=2; i < size; i+=2) - evas_vg_shape_shape_append_line_to(vg, array[i], array[i+1]); - - if (polygon) - evas_vg_shape_shape_append_close(vg); -} - -static void -_create_vg_node(Svg_Node *node, Efl_VG *parent) -{ - Efl_VG *vg = NULL; - Svg_Node *child; - Eina_List *l; - - switch (node->type) - { - case SVG_NODE_G: - { - vg = evas_vg_container_add(parent); - _apply_vg_property(node, vg); - EINA_LIST_FOREACH(node->child, l, child) - { - _create_vg_node(child, vg); - } - return; - } - break; - case SVG_NODE_PATH: - vg = evas_vg_shape_add(parent); - evas_vg_shape_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: - _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_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_shape_append_close(vg); - break; - case SVG_NODE_CIRCLE: - vg = evas_vg_shape_add(parent); - evas_vg_shape_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_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; - default: - break; - } - _apply_vg_property(node, vg); -} - -static void -_apply_stroke_scale(Efl_VG *node, double scale) -{ - Efl_VG *child; - Eina_Iterator *itr; - - if (eo_isa(node, EFL_VG_CONTAINER_CLASS)) - { - eo_do(node, itr = efl_vg_container_children_get()); - EINA_ITERATOR_FOREACH(itr, child) - _apply_stroke_scale(child, scale); - eina_iterator_free(itr); - } - else - { - evas_vg_shape_stroke_scale_set(node, scale); - } -} - -Vg_Data * -_evas_vg_load_vg_data(Eina_Stringshare *path, int svg_id) -{ - Eina_List *l; - Vg_Data *vector; - char svg_key[20]; - Eet_Data_Descriptor *svg_node_eet; - Svg_Node *child; - Svg_Node *node; - Eet_File *ef; - Efl_VG *root = NULL; - - ef = eet_open(path, EET_FILE_MODE_READ); - if (!ef) return NULL; - - // create and put it in the cache. - vector = calloc(1, sizeof(Vg_Data)); - vector->svg_id = svg_id; - - snprintf(svg_key, sizeof(svg_key), "edje/vectors/%i", svg_id); - svg_node_eet = _evas_vg_svg_node_eet(); - node = eet_data_read(ef, svg_node_eet, svg_key); - - if (!node || (node->type != SVG_NODE_DOC)) - { - root = NULL; - } - else - { - root = evas_vg_container_add(NULL); - EINA_LIST_FOREACH(node->child, l, child) - { - _create_vg_node(child, root); - } - vector->x = node->node.doc.vx; - vector->y = node->node.doc.vy; - vector->w = node->node.doc.vw; - vector->h = node->node.doc.vh; - } - vector->vg = root; - _evas_vg_svg_node_free(node); - eet_close(ef); - - return vector; -} - -static void -_apply_transformation(Efl_VG *root, double w, double h, Vg_Data *vg_data) -{ - double sx, sy, scale; - Eina_Matrix3 m; - - sx = w/vg_data->w; - sy = h/vg_data->h; - scale = sx < sy ? sx: sy; - eina_matrix3_identity(&m); - // allign hcenter and vcenter - //@TODO take care of the preserveaspectratio attribute - eina_matrix3_translate(&m, (w - vg_data->w * scale)/2.0, (h - vg_data->h * scale)/2.0); - eina_matrix3_scale(&m, scale, scale); - eina_matrix3_translate(&m, -vg_data->x, -vg_data->y); - evas_vg_node_transformation_set(root, &m); - _apply_stroke_scale(root, scale); -} - -Efl_VG * -_evas_vg_dup_vg_tree(Vg_Data *src, Vg_Data *dest, float pos, double w, double h) -{ - - Efl_VG *root; - Eina_Matrix3 m; - - if (!src) return NULL; - if (w==0 || h ==0 ) return NULL; - if (!dest) - { - root = evas_vg_container_add(NULL); - evas_vg_node_dup(root, src->vg); - _apply_transformation(root, w, h, src); - } - else - { - root = evas_vg_container_add(NULL); - evas_vg_node_dup(root, src->vg); - - // for start vector - _apply_transformation(src->vg, w, h, src); - - // for end vector - _apply_transformation(dest->vg, w, h, dest); - - // do the interpolation - if (!evas_vg_node_interpolate(root, src->vg, dest->vg, pos)) - { - ;//ERR(" Can't interpolate check the svg file \n"); - } - // performance hack - // instead of duplicating the tree and applying the transformation - // i just updated the transformation matrix and reset it back to null. - // assumption is that the root vg will never have a transformation - eina_matrix3_identity(&m); - evas_vg_node_transformation_set(src->vg, &m); - evas_vg_node_transformation_set(dest->vg, &m); - } - return root; -} - -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 -_evas_vg_svg_node_free(Svg_Node *node) -{ - Svg_Node *child; - Svg_Style_Gradient *grad; - - if (!node) return; - - EINA_LIST_FREE(node->child, child) - { - _evas_vg_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: - _evas_vg_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); -}