summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunsuChoi <jsuya.choi@samsung.com>2020-09-15 12:11:49 +0900
committerHermet Park <chuneon.park@samsung.com>2020-09-15 12:11:49 +0900
commit35f17a13fa0cd1de855cc2215e4f0ac9da6fb7bc (patch)
tree0a03fce07557e15edfaf987453811aa43d447ba2
parentc412406487579627b79f417f947ca512aa034ce0 (diff)
downloadefl-35f17a13fa0cd1de855cc2215e4f0ac9da6fb7bc.tar.gz
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
-rw-r--r--src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c34
-rw-r--r--src/static_libs/vg_common/vg_common_svg.c3
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)
@@ -865,6 +865,13 @@ _handle_stroke_opacity_attr(Evas_SVG_Loader *loader EINA_UNUSED, Svg_Node* node,
}
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)
{
node->style->stroke.flags |= SVG_STROKE_FLAGS_WIDTH;
@@ -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)