if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr))
attributes.setSpreadMethod(current->spreadMethod());
- if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr))
- attributes.setBoundingBoxMode(current->gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+ if (!attributes.hasGradientUnits() && current->hasAttribute(SVGNames::gradientUnitsAttr))
+ attributes.setGradientUnits(current->gradientUnits());
if (!attributes.hasGradientTransform() && current->hasAttribute(SVGNames::gradientTransformAttr)) {
AffineTransform transform;
return true;
}
-void SVGRadialGradientElement::calculateFocalCenterPointsAndRadius(const RadialGradientAttributes& attributes, FloatPoint& focalPoint, FloatPoint& centerPoint, float& radius)
-{
- // Determine gradient focal/center points and radius
- if (attributes.boundingBoxMode()) {
- focalPoint = FloatPoint(attributes.fx().valueAsPercentage(), attributes.fy().valueAsPercentage());
- centerPoint = FloatPoint(attributes.cx().valueAsPercentage(), attributes.cy().valueAsPercentage());
- radius = attributes.r().valueAsPercentage();
- } else {
- focalPoint = FloatPoint(attributes.fx().value(this), attributes.fy().value(this));
- centerPoint = FloatPoint(attributes.cx().value(this), attributes.cy().value(this));
- radius = attributes.r().value(this);
- }
-
- // Eventually adjust focal points, as described below
- float deltaX = focalPoint.x() - centerPoint.x();
- float deltaY = focalPoint.y() - centerPoint.y();
- float radiusMax = 0.99f * radius;
-
- // Spec: If (fx, fy) lies outside the circle defined by (cx, cy) and r, set
- // (fx, fy) to the point of intersection of the line through (fx, fy) and the circle.
- // We scale the radius by 0.99 to match the behavior of FireFox.
- if (sqrt(deltaX * deltaX + deltaY * deltaY) > radiusMax) {
- float angle = atan2f(deltaY, deltaX);
-
- deltaX = cosf(angle) * radiusMax;
- deltaY = sinf(angle) * radiusMax;
- focalPoint = FloatPoint(deltaX + centerPoint.x(), deltaY + centerPoint.y());
- }
-}
-
bool SVGRadialGradientElement::selfHasRelativeLengths() const
{
return cx().isRelative()