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 32bfb17d76..5bfdf41728 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 @@ -1758,15 +1758,63 @@ _handle_radial_r_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, cons radial->r = _gradient_to_double(loader->svg_parse, value, SVG_PARSER_LENGTH_OTHER); } +static void +_recalc_radial_cx_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, Eina_Bool user_space) +{ + if (!user_space) + { + radial->cx = radial->cx * loader->svg_parse->global.width; + } +} + +static void +_recalc_radial_cy_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, Eina_Bool user_space) +{ + if (!user_space) + { + radial->cy = radial->cy * loader->svg_parse->global.height; + } +} + +static void +_recalc_radial_fx_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, Eina_Bool user_space) +{ + if (!user_space) + { + radial->fx = radial->fx * loader->svg_parse->global.width; + } +} + +static void +_recalc_radial_fy_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, Eina_Bool user_space) +{ + if (!user_space) + { + radial->fy = radial->fy * loader->svg_parse->global.height; + } +} + +static void +_recalc_radial_r_attr(Evas_SVG_Loader *loader, Svg_Radial_Gradient* radial, Eina_Bool user_space) +{ + if (!user_space) + { + radial->r = radial->r * (sqrt(pow(loader->svg_parse->global.height, 2) + pow(loader->svg_parse->global.width, 2)) / sqrt(2.0)); + } +} + + typedef void (*Radial_Method)(Evas_SVG_Loader *loader, Svg_Radial_Gradient *radial, const char *value); +typedef void (*Radial_Method_Recalc)(Evas_SVG_Loader *loader, Svg_Radial_Gradient *radial, Eina_Bool user_space); #define RADIAL_DEF(Name) \ - { #Name, sizeof (#Name), _handle_radial_##Name##_attr} + { #Name, sizeof (#Name), _handle_radial_##Name##_attr, _recalc_radial_##Name##_attr} static const struct { const char *tag; int sz; Radial_Method tag_handler;; + Radial_Method_Recalc tag_recalc; } radial_tags[] = { RADIAL_DEF(cx), RADIAL_DEF(cy), @@ -1814,6 +1862,7 @@ _attr_parse_radial_gradient_node(void *data, const char *key, const char *value) static Svg_Style_Gradient * _create_radialGradient(Evas_SVG_Loader *loader, const char *buf, unsigned buflen) { + unsigned int i = 0; Svg_Style_Gradient *grad = calloc(1, sizeof(Svg_Style_Gradient)); loader->svg_parse->style_grad = grad; @@ -1834,6 +1883,11 @@ _create_radialGradient(Evas_SVG_Loader *loader, const char *buf, unsigned buflen eina_simple_xml_attributes_parse(buf, buflen, _attr_parse_radial_gradient_node, loader); + for (i = 0; i < sizeof (radial_tags) / sizeof(radial_tags[0]); i++) + radial_tags[i].tag_recalc(loader, grad->radial, grad->user_space); + + grad->use_percentage = EINA_TRUE; + return loader->svg_parse->style_grad; } diff --git a/src/static_libs/vg_common/vg_common_svg.c b/src/static_libs/vg_common/vg_common_svg.c index e753e229d0..20a167c806 100644 --- a/src/static_libs/vg_common/vg_common_svg.c +++ b/src/static_libs/vg_common/vg_common_svg.c @@ -618,10 +618,18 @@ _apply_gradient_property(Svg_Style_Gradient *g, Efl_VG *vg, Efl_VG *parent, Vg_F int min = (r.h > r.w) ? r.w : r.h; radius = sqrt(pow(min, 2) + pow(min, 2)) / sqrt(2.0); } + if (g->use_percentage) + { + g->radial->cx = g->radial->cx * r.w + r.x; + g->radial->cy = g->radial->cy * r.h + r.y; + g->radial->r = g->radial->r * radius; + g->radial->fx = g->radial->fx * r.w + r.x; + g->radial->fy = g->radial->fy * r.h + r.y; + } grad_obj = efl_add(EFL_CANVAS_VG_GRADIENT_RADIAL_CLASS, parent); - efl_gfx_gradient_radial_center_set(grad_obj, g->radial->cx * r.w + r.x, g->radial->cy * r.h + r.y); - efl_gfx_gradient_radial_radius_set(grad_obj, g->radial->r * radius); - efl_gfx_gradient_radial_focal_set(grad_obj, g->radial->fx * r.w + r.x, g->radial->fy * r.h + r.y); + efl_gfx_gradient_radial_center_set(grad_obj, g->radial->cx, g->radial->cy); + efl_gfx_gradient_radial_radius_set(grad_obj, g->radial->r); + efl_gfx_gradient_radial_focal_set(grad_obj, g->radial->fx, g->radial->fy); /* in case of objectBoundingBox it need proper scaling */ if (!g->user_space) @@ -955,7 +963,6 @@ _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 { @@ -966,6 +973,7 @@ _create_gradient_node(Efl_VG *vg) efl_gfx_gradient_radial_focal_get(vg, &grad->radial->fx, &grad->radial->fy); grad->radial->r = efl_gfx_gradient_radial_radius_get(vg); } + grad->use_percentage = EINA_FALSE; return grad;