diff options
Diffstat (limited to 'WebCore/svg/SVGAnimateTransformElement.cpp')
-rw-r--r-- | WebCore/svg/SVGAnimateTransformElement.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/WebCore/svg/SVGAnimateTransformElement.cpp b/WebCore/svg/SVGAnimateTransformElement.cpp index 96485a6..1a305bb 100644 --- a/WebCore/svg/SVGAnimateTransformElement.cpp +++ b/WebCore/svg/SVGAnimateTransformElement.cpp @@ -28,10 +28,11 @@ #include "SVGAnimateTransformElement.h" #include "AffineTransform.h" -#include "MappedAttribute.h" +#include "Attribute.h" #include "RenderObject.h" #include "SVGAngle.h" #include "SVGElementInstance.h" +#include "SVGGradientElement.h" #include "SVGParserUtilities.h" #include "SVGSVGElement.h" #include "SVGStyledTransformableElement.h" @@ -60,10 +61,14 @@ SVGAnimateTransformElement::~SVGAnimateTransformElement() bool SVGAnimateTransformElement::hasValidTarget() const { SVGElement* targetElement = this->targetElement(); - return SVGAnimationElement::hasValidTarget() && (targetElement->isStyledTransformable() || targetElement->hasTagName(SVGNames::textTag)); + return SVGAnimationElement::hasValidTarget() + && (targetElement->isStyledTransformable() + || targetElement->hasTagName(SVGNames::textTag) + || targetElement->hasTagName(SVGNames::linearGradientTag) + || targetElement->hasTagName(SVGNames::radialGradientTag)); } -void SVGAnimateTransformElement::parseMappedAttribute(MappedAttribute* attr) +void SVGAnimateTransformElement::parseMappedAttribute(Attribute* attr) { if (attr->name() == SVGNames::typeAttr) { if (attr->value() == "translate") @@ -88,6 +93,8 @@ static PassRefPtr<SVGTransformList> transformListFor(SVGElement* element) return static_cast<SVGStyledTransformableElement*>(element)->transform(); if (element->hasTagName(SVGNames::textTag)) return static_cast<SVGTextElement*>(element)->transform(); + if (element->hasTagName(SVGNames::linearGradientTag) || element->hasTagName(SVGNames::radialGradientTag)) + return static_cast<SVGGradientElement*>(element)->gradientTransform(); return 0; } @@ -95,6 +102,12 @@ void SVGAnimateTransformElement::resetToBaseValue(const String& baseValue) { if (!hasValidTarget()) return; + + if (targetElement()->hasTagName(SVGNames::linearGradientTag) || targetElement()->hasTagName(SVGNames::radialGradientTag)) { + targetElement()->setAttribute(SVGNames::gradientTransformAttr, baseValue.isEmpty() ? "matrix(1 0 0 1 0 0)" : baseValue); + return; + } + if (baseValue.isEmpty()) { ExceptionCode ec; RefPtr<SVGTransformList> list = transformListFor(targetElement()); @@ -175,6 +188,8 @@ void SVGAnimateTransformElement::applyResultsToTarget() static_cast<SVGStyledTransformableElement*>(shadowTreeElement)->setTransformBaseValue(transformList.get()); else if (shadowTreeElement->hasTagName(SVGNames::textTag)) static_cast<SVGTextElement*>(shadowTreeElement)->setTransformBaseValue(transformList.get()); + else if (shadowTreeElement->hasTagName(SVGNames::linearGradientTag) || shadowTreeElement->hasTagName(SVGNames::radialGradientTag)) + static_cast<SVGGradientElement*>(shadowTreeElement)->setGradientTransformBaseValue(transformList.get()); if (RenderObject* renderer = shadowTreeElement->renderer()) { renderer->setNeedsTransformUpdate(); renderer->setNeedsLayout(true); |