summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunsuChoi <jsuya.choi@samsung.com>2022-01-12 11:34:29 +0900
committerHermet Park <chuneon.park@samsung.com>2022-01-12 11:34:29 +0900
commitef784708b9278b8ef7131b2ee751e8c737fd3fa3 (patch)
tree2ac2725ec5d93971ab109b4e68b182c4fef5a55c
parent92f77c512305dde21e25ca92baab138cfc498054 (diff)
downloadefl-ef784708b9278b8ef7131b2ee751e8c737fd3fa3.tar.gz
evas_vg_load_svg: Fix colorstop offset parser
Summary: Values different from numbers and percentages should be ignored and the default values should be applied (zeros). And set the min and max of the offset value to be 0, 1. Also, this patch make that the offset is not input in the reverse order. Test Plan: Test SVG Image ``` <svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" > <linearGradient id="grad" x1="0" y1="0" x2="1" y2="1"> <stop offset="10%" stop-color="white"/> <stop offset="0.2" stop-color="red"/> <stop offset="30% k" stop-color="blue"/> <stop offset="40%" stop-color="yellow"/> <stop offset="0.5m" stop-color="red"/> <stop offset="0.6 " stop-color="green"/> <stop offset="70%m" stop-color="black"/> <stop offset="80%" stop-color="white"/> </linearGradient> <rect x="20" y="20" width="160" height="160" fill="url(#grad)"/> </svg> ``` Result {F4792365} Reviewers: Hermet, raster, kimcinoo Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12318
-rw-r--r--src/modules/evas/vg_loaders/svg/evas_vg_load_svg.c17
-rw-r--r--src/static_libs/vg_common/vg_common_svg.c11
2 files changed, 25 insertions, 3 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 27f06e8cc7..43a604d632 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
@@ -181,11 +181,22 @@ static inline double
_to_offset(const char *str)
{
char *end = NULL;
-
+ const char* str_end = str + strlen(str);
double parsed_value = eina_convert_strtod_c(str, &end);
+ char *ptr = strstr(str, "%");
- if (strstr(str, "%"))
- parsed_value = parsed_value / 100.0;
+ end = _skip_space(end, NULL);
+
+ if (ptr)
+ {
+ parsed_value = parsed_value / 100.0;
+ if (end != ptr || (end + 1) != str_end)
+ return 0;
+ }
+ else if (end != str_end)
+ {
+ return 0;
+ }
return parsed_value;
}
diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c
index 30fc0c0eb5..d75486ed58 100644
--- a/src/static_libs/vg_common/vg_common_svg.c
+++ b/src/static_libs/vg_common/vg_common_svg.c
@@ -696,6 +696,7 @@ _apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, Vg_F
double fopacity = ((double) fill_opacity) / 255; //fill opacity if any exists.
stops = calloc(stop_count, sizeof(Efl_Gfx_Gradient_Stop));
i = 0;
+ double prevOffset = 0;
EINA_LIST_FOREACH(g->stops, l, stop)
{
// Use premultiplied color
@@ -705,6 +706,16 @@ _apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, Vg_F
stops[i].b = (stop->b * opacity);
stops[i].a = (stop->a * fopacity);
stops[i].offset = stop->offset;
+ //NOTE: check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes
+ if (stop->offset < prevOffset)
+ {
+ stops[i].offset = prevOffset;
+ }
+ else if (stop->offset > 1)
+ {
+ stops[i].offset = 1;
+ }
+ prevOffset = stops[i].offset;
i++;
}
efl_gfx_gradient_stop_set(grad_obj, stops, stop_count);