hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=35f17a13fa0cd1de855cc2215e4f0ac9da6fb7bc
commit 35f17a13fa0cd1de855cc2215e4f0ac9da6fb7bc Author: JunsuChoi <jsuya.c...@samsung.com> Date: Tue Sep 15 12:11:49 2020 +0900 vg_load_svg: Support dasharray attribute for stroke Summary: It supports stroke-dasharray, one of the stroke properties of svg. https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray Test Plan: [Test SVG] <svg viewBox="0 0 30 10" xmlns="http://www.w3.org/2000/svg"> <!-- No dashes nor gaps --> <line x1="0" y1="1" x2="30" y2="1" stroke="black" /> <!-- Dashes and gaps of the same size --> <line x1="0" y1="3" x2="30" y2="3" stroke="black" stroke-dasharray="4" /> <!-- Dashes and gaps of different sizes --> <line x1="0" y1="5" x2="30" y2="5" stroke="black" stroke-dasharray="4 1" /> <!-- Dashes and gaps of various sizes with an odd number of values --> <line x1="0" y1="7" x2="30" y2="7" stroke="black" stroke-dasharray="4 1 2" /> <!-- Dashes and gaps of various sizes with an even number of values --> <line x1="0" y1="9" x2="30" y2="9" stroke="black" stroke-dasharray="4 1 2 3" /> </svg> Reviewers: Hermet, smohanty Reviewed By: Hermet Subscribers: kimcinoo, herb, cedric, #committers, #reviewers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12146 --- src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c | 34 ++++++++++++++++++---- src/static_libs/vg_common/vg_common_svg.c | 3 ++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c index f40bfa4915..246e3e2a0e 100644 --- a/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c +++ b/src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c @@ -259,8 +259,6 @@ static struct { _PARSE_TAG(Efl_Gfx_Fill_Rule, fill_rule, fill_rule_tags, EFL_GFX_FILL_RULE_WINDING); -#if 0 -// unused at the moment /* parse the dash pattern used during stroking a path. * Value: none | <dasharray> | inherit * Initial: none @@ -269,7 +267,8 @@ _PARSE_TAG(Efl_Gfx_Fill_Rule, fill_rule, fill_rule_tags, EFL_GFX_FILL_RULE_WINDI static inline void _parse_dash_array(const char *str, Efl_Gfx_Dash** dash, int *length) { - double tmp[30]; + // It is assumed that the length of the dasharray string is 255 or less. + double tmp[255]; char *end = NULL; int leni, gapi, count = 0, index = 0; @@ -291,20 +290,21 @@ _parse_dash_array(const char *str, Efl_Gfx_Dash** dash, int *length) gapi = (2 * index + 1) % count; (*dash)[index].length = tmp[leni]; (*dash)[index].gap = tmp[gapi]; + index++; } } else { // even case *length = count/2; *dash = calloc(*length, sizeof(Efl_Gfx_Dash)); - while (index < count) + while (index < *length) { (*dash)[index].length = tmp[2 * index]; (*dash)[index].gap = tmp[2 * index + 1]; + index++; } } } -#endif static Eina_Stringshare * _id_from_url(const char *url) @@ -864,6 +864,13 @@ _handle_stroke_opacity_attr(Evas_SVG_Loader *loader EINA_UNUSED, Svg_Node* node, node->style->stroke.opacity = _to_opacity(value); } +static void +_handle_stroke_dasharray_attr(Evas_SVG_Loader *loader EINA_UNUSED, Svg_Node* node, const char *value) +{ + node->style->stroke.flags |= SVG_STROKE_FLAGS_DASH; + _parse_dash_array(value, &node->style->stroke.dash, &node->style->stroke.dash_count); +} + static void _handle_stroke_width_attr(Evas_SVG_Loader *loader, Svg_Node* node, const char *value) { @@ -942,6 +949,7 @@ static const struct { STYLE_DEF(stroke-linejoin, stroke_linejoin), STYLE_DEF(stroke-linecap, stroke_linecap), STYLE_DEF(stroke-opacity, stroke_opacity), + STYLE_DEF(stroke-dasharray, stroke_dasharray), STYLE_DEF(transform, transform), STYLE_DEF(display, display) }; @@ -2367,6 +2375,22 @@ _inherit_style(Svg_Style_Property *child, Svg_Style_Property *parent) { child->stroke.join = parent->stroke.join; } + if (!(child->stroke.flags & SVG_STROKE_FLAGS_DASH)) + { + int i = 0; + int count = parent->stroke.dash_count; + if (count > 0) + { + if (child->stroke.dash) free(child->stroke.dash); + child->stroke.dash = calloc(count, sizeof(Efl_Gfx_Dash)); + child->stroke.dash_count = count; + for (i = 0; i < count; i++) + { + child->stroke.dash[i].length = parent->stroke.dash[i].length; + child->stroke.dash[i].gap = parent->stroke.dash[i].gap; + } + } + } } void diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c index f5b71c43d2..38e203b205 100644 --- a/src/static_libs/vg_common/vg_common_svg.c +++ b/src/static_libs/vg_common/vg_common_svg.c @@ -498,6 +498,7 @@ _node_style_free(Svg_Style_Property *style) eina_stringshare_del(style->fill.paint.url); _svg_style_gradient_free(style->stroke.paint.gradient); eina_stringshare_del(style->stroke.paint.url); + if (style->stroke.dash) free(style->stroke.dash); free(style); } @@ -770,6 +771,8 @@ _apply_vg_property(Svg_Node *node, Efl_VG *vg, Efl_VG *parent, Vg_File_Data *vg_ efl_gfx_shape_stroke_cap_set(vg, style->stroke.cap); efl_gfx_shape_stroke_join_set(vg, style->stroke.join); efl_gfx_shape_stroke_scale_set(vg, style->stroke.scale); + if (style->stroke.dash && style->stroke.dash_count > 0) + efl_gfx_shape_stroke_dash_set(vg, style->stroke.dash, style->stroke.dash_count); // if stroke property is NULL then do nothing if (style->stroke.paint.none) --