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 950db2bea1..97a7215776 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 @@ -1519,6 +1519,7 @@ _clone_gradient(Svg_Style_Gradient *from) grad->id = _copy_id(from->id); grad->ref = _copy_id(from->ref); grad->spread = from->spread; + grad->use_percentage = from->use_percentage; grad->user_space = from->user_space; grad->stops = _clone_grad_stops(from->stops); if (grad->type == SVG_LINEAR_GRADIENT) @@ -1874,15 +1875,53 @@ _handle_linear_y2_attr(Evas_SVG_Loader *loader, Svg_Linear_Gradient* linear, con linear->y2 = _gradient_to_double(loader->svg_parse, value, SVG_PARSER_LENGTH_VERTICAL); } +static void +_recalc_linear_x1_attr(Evas_SVG_Loader *loader, Svg_Linear_Gradient* linear, Eina_Bool user_space) +{ + if (!user_space) + { + linear->x1 = linear->x1 * loader->svg_parse->global.width; + } +} + +static void +_recalc_linear_y1_attr(Evas_SVG_Loader *loader, Svg_Linear_Gradient* linear, Eina_Bool user_space) +{ + if (!user_space) + { + linear->y1 = linear->y1 * loader->svg_parse->global.height; + } +} + +static void +_recalc_linear_x2_attr(Evas_SVG_Loader *loader, Svg_Linear_Gradient* linear, Eina_Bool user_space) +{ + if (!user_space) + { + linear->x2 = linear->x2 * loader->svg_parse->global.width; + } +} + +static void +_recalc_linear_y2_attr(Evas_SVG_Loader *loader, Svg_Linear_Gradient* linear, Eina_Bool user_space) +{ + if (!user_space) + { + linear->y2 = linear->y2 * loader->svg_parse->global.height; + } +} + typedef void (*Linear_Method)(Evas_SVG_Loader *loader, Svg_Linear_Gradient *linear, const char *value); +typedef void (*Linear_Method_Recalc)(Evas_SVG_Loader *loader, Svg_Linear_Gradient *linear, Eina_Bool user_space); #define LINEAR_DEF(Name) \ - { #Name, sizeof (#Name), _handle_linear_##Name##_attr} + { #Name, sizeof (#Name), _handle_linear_##Name##_attr, _recalc_linear_##Name##_attr} static const struct { const char *tag; int sz; - Linear_Method tag_handler;; + Linear_Method tag_handler; + Linear_Method_Recalc tag_recalc; } linear_tags[] = { LINEAR_DEF(x1), LINEAR_DEF(y1), @@ -1931,6 +1970,7 @@ _create_linearGradient(Evas_SVG_Loader *loader, const char *buf, unsigned buflen { Svg_Style_Gradient *grad = calloc(1, sizeof(Svg_Style_Gradient)); loader->svg_parse->style_grad = grad; + unsigned int i; grad->type = SVG_LINEAR_GRADIENT; grad->user_space = EINA_FALSE; @@ -1942,6 +1982,11 @@ _create_linearGradient(Evas_SVG_Loader *loader, const char *buf, unsigned buflen eina_simple_xml_attributes_parse(buf, buflen, _attr_parse_linear_gradient_node, loader); + for (i = 0; i < sizeof (linear_tags) / sizeof(linear_tags[0]); i++) + linear_tags[i].tag_recalc(loader, grad->linear, grad->user_space); + + grad->use_percentage = EINA_TRUE; + return loader->svg_parse->style_grad; } diff --git a/src/static_libs/vg_common/vg_common.h b/src/static_libs/vg_common/vg_common.h index ab0cb0ded3..b1dfa7d7f9 100644 --- a/src/static_libs/vg_common/vg_common.h +++ b/src/static_libs/vg_common/vg_common.h @@ -206,6 +206,7 @@ struct _Svg_Style_Gradient Eina_List *stops; // Efl_Gfx_Gradient_Stop Svg_Radial_Gradient *radial; Svg_Linear_Gradient *linear; + Eina_Bool use_percentage; }; struct _Svg_Paint diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c index 1c33e6454e..9f26453abc 100644 --- a/src/static_libs/vg_common/vg_common_svg.c +++ b/src/static_libs/vg_common/vg_common_svg.c @@ -568,8 +568,16 @@ _apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, Vg_F if (g->type == SVG_LINEAR_GRADIENT) { grad_obj = efl_add(EFL_CANVAS_VG_GRADIENT_LINEAR_CLASS, parent); - efl_gfx_gradient_linear_start_set(grad_obj, g->linear->x1 * r.w + r.x, g->linear->y1 * r.h + r.y); - efl_gfx_gradient_linear_end_set(grad_obj, g->linear->x2 * r.w + r.x, g->linear->y2 * r.h + r.y); + + if (g->use_percentage) + { + g->linear->x1 = g->linear->x1 * r.w + r.x; + g->linear->y1 = g->linear->y1 * r.h + r.y; + g->linear->x2 = g->linear->x2 * r.w + r.x; + g->linear->y2 = g->linear->y2 * r.h + r.y; + } + efl_gfx_gradient_linear_start_set(grad_obj, g->linear->x1, g->linear->y1); + efl_gfx_gradient_linear_end_set(grad_obj, g->linear->x2, g->linear->y2); } else if (g->type == SVG_RADIAL_GRADIENT) { @@ -911,6 +919,7 @@ _create_gradient_node(Efl_VG *vg) if (!grad->linear) goto oom_error; efl_gfx_gradient_linear_start_get(vg, &grad->linear->x1, &grad->linear->y1); efl_gfx_gradient_linear_end_get(vg, &grad->linear->x2, &grad->linear->y2); + grad->use_percentage = EINA_FALSE; } else {