cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=4961586ddde817320574a8c38d9ac0dc233716f0
commit 4961586ddde817320574a8c38d9ac0dc233716f0 Author: Cedric BAIL <ced...@osg.samsung.com> Date: Wed Jun 8 10:47:17 2016 -0700 edje: little bit of refactoring, more needed. --- src/bin/edje/edje_svg_loader.c | 186 ++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 105 deletions(-) diff --git a/src/bin/edje/edje_svg_loader.c b/src/bin/edje/edje_svg_loader.c index 2ab2b4d..1ded253 100644 --- a/src/bin/edje/edje_svg_loader.c +++ b/src/bin/edje/edje_svg_loader.c @@ -107,72 +107,62 @@ _to_opacity(const char *str) return a; } +#define _PARSE_TAG(Type, Short_Name, Tags_Array, Default) \ + static Type _to_##Short_Name(const char *str) \ + { \ + unsigned int i; \ + \ + for (i = 0; i < sizeof (Tags_Array) / sizeof (Tags_Array[0]); i++) \ + if (!strcmp(str, Tags_Array[i].tag)) \ + return Tags_Array[i].Short_Name; \ + return Default; \ + } /* parse the line cap used during stroking a path. * Value: butt | round | square | inherit * Initial: butt * https://www.w3.org/TR/SVG/painting.html */ -static inline Efl_Gfx_Cap -_to_line_cap(const char *str) -{ - Efl_Gfx_Cap cap = EFL_GFX_CAP_LAST; +static struct { + Efl_Gfx_Cap line_cap; + const char *tag; +} line_cap_tags[] = { + { EFL_GFX_CAP_BUTT, "butt" }, + { EFL_GFX_CAP_ROUND, "round" }, + { EFL_GFX_CAP_SQUARE, "square" } +}; - if (!strcmp(str, "butt")) - { - cap = EFL_GFX_CAP_BUTT; - } - else if (!strcmp(str, "round")) - { - cap = EFL_GFX_CAP_ROUND; - } - else if (!strcmp(str, "square")) - { - cap = EFL_GFX_CAP_SQUARE; - } - return cap; -} +_PARSE_TAG(Efl_Gfx_Cap, line_cap, line_cap_tags, EFL_GFX_CAP_LAST); /* parse the line join used during stroking a path. * Value: miter | round | bevel | inherit * Initial: miter * https://www.w3.org/TR/SVG/painting.html */ -static inline Efl_Gfx_Join -_to_line_join(const char *str) -{ - Efl_Gfx_Join join = EFL_GFX_JOIN_LAST; +static struct { + Efl_Gfx_Join line_join; + const char *tag; +} line_join_tags[] = { + { EFL_GFX_JOIN_MITER, "miter" }, + { EFL_GFX_JOIN_ROUND, "round" }, + { EFL_GFX_JOIN_BEVEL, "bevel" } +}; - if (!strcmp(str, "miter")) - { - join = EFL_GFX_JOIN_MITER; - } - else if (!strcmp(str, "round")) - { - join = EFL_GFX_JOIN_ROUND; - } - else if (!strcmp(str, "bevel")) - { - join = EFL_GFX_JOIN_BEVEL; - } - return join; -} +_PARSE_TAG(Efl_Gfx_Join, line_join, line_join_tags, EFL_GFX_JOIN_LAST); /* parse the fill rule used during filling a path. * Value: nonzero | evenodd | inherit * Initial: nonzero * https://www.w3.org/TR/SVG/painting.html */ -static inline Efl_Gfx_Fill_Rule -_to_fill_rule(const char *str) -{ - Efl_Gfx_Fill_Rule rule = EFL_GFX_FILL_RULE_WINDING; - if (!strcmp(str, "evenodd")) - { - rule = EFL_GFX_FILL_RULE_ODD_EVEN; - } - return rule; -} +static struct { + Efl_Gfx_Fill_Rule fill_rule; + const char *tag; +} fill_rule_tags[] = { + { EFL_GFX_FILL_RULE_ODD_EVEN, "evenodd" } +}; + +_PARSE_TAG(Efl_Gfx_Fill_Rule, fill_rule, fill_rule_tags, EFL_GFX_FILL_RULE_WINDING); /* parse the dash pattern used during stroking a path. * Value: none | <dasharray> | inherit @@ -223,7 +213,6 @@ static char * { char tmp[50]; int i = 0; - char * id; url = _skip_space(url, NULL); if ((*url) == '(') @@ -238,9 +227,8 @@ static char * ++url; } tmp[i] = '\0'; - id = malloc(strlen(tmp)); - strcpy(id, tmp); - return id; + + return strdup(tmp); } static unsigned char @@ -509,19 +497,6 @@ parse_length(const char *str, Svg_Length_Type *type) return value; } -static -Efl_Gfx_Fill_Rule -_parse_fill_rule(const char *str) -{ - Efl_Gfx_Fill_Rule fill = EFL_GFX_FILL_RULE_WINDING; - - if (!strcmp(str, "evenodd")) - { - fill = EFL_GFX_FILL_RULE_ODD_EVEN; - } - return fill; -} - static Eina_Bool _attr_parse_svg_node(void *data, const char *key, const char *value) { @@ -619,7 +594,7 @@ _handle_color_opacity_attr(Svg_Node* node, const char *value) static void _handle_fill_rule_attr(Svg_Node* node, const char *value) { - node->style->fill.fill_rule = _parse_fill_rule(value); + node->style->fill.fill_rule = _to_fill_rule(value); } static void @@ -1084,33 +1059,23 @@ static const struct { TAG_DEF(switch) }; -static Factory_Method -_find_group_factory(const char *name) -{ - unsigned int i; - int sz = strlen(name); - - for (i = 0; i < sizeof (group_tags) / sizeof(group_tags[0]); i++) - if (group_tags[i].sz - 1 == sz && !strncmp(group_tags[i].tag, name, sz)) - { - return group_tags[i].tag_handler; - } - return NULL; -} - -static Factory_Method -_find_graphics_factory(const char *name) -{ - unsigned int i; - int sz = strlen(name); - - for (i = 0; i < sizeof (graphics_tags) / sizeof(graphics_tags[0]); i++) - if (graphics_tags[i].sz - 1 == sz && !strncmp(graphics_tags[i].tag, name, sz)) - { - return graphics_tags[i].tag_handler; - } - return NULL; -} +#define FIND_FACTORY(Short_Name, Tags_Array) \ + static Factory_Method \ + _find_##Short_Name##_factory(const char *name) \ + { \ + unsigned int i; \ + int sz = strlen(name); \ + \ + for (i = 0; i < sizeof (Tags_Array) / sizeof(Tags_Array[0]); i++) \ + if (group_tags[i].sz - 1 == sz && !strncmp(Tags_Array[i].tag, name, sz)) \ + { \ + return Tags_Array[i].tag_handler; \ + } \ + return NULL; \ + } + +FIND_FACTORY(group, group_tags); +FIND_FACTORY(graphics, graphics_tags); static void _handle_radial_cx_attr(Svg_Radial_Gradient* radial, const char *value) @@ -1388,24 +1353,35 @@ _evas_svg_loader_xml_open_parser(Evas_SVG_Loader *loader, } +#define POP_TAG(Tag) \ + { #Tag, sizeof (#Tag) } + +static const struct { + const char *tag; + size_t sz; +} pop_array[] = { + POP_TAG(g), + POP_TAG(svg), + POP_TAG(defs) +}; + static void _evas_svg_loader_xml_close_parser(Evas_SVG_Loader *loader, - const char *content, unsigned int length EINA_UNUSED) + const char *content, + unsigned int length EINA_UNUSED) { + unsigned int i; + content = _skip_space(content, NULL); - if (!strncmp(content, "g", 1)) - { - eina_array_pop(loader->stack); - } - else if (!strncmp(content, "svg", 3)) - { - eina_array_pop(loader->stack); - } - else if (!strncmp(content, "defs", 3)) - { - eina_array_pop(loader->stack); - } - else if (!strncmp(content, "linearGradient", 13)) + + for (i = 0; i < sizeof (pop_array) / sizeof (pop_array[0]); i++) + if (!strncmp(content, pop_array[i].tag, pop_array[i].sz - 1)) + { + eina_array_pop(loader->stack); + break ; + } + + if (!strncmp(content, "linearGradient", 13)) { //TODO } --