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);