summaryrefslogtreecommitdiffstats
path: root/WebCore/svg/SVGAnimateTransformElement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/svg/SVGAnimateTransformElement.cpp')
-rw-r--r--WebCore/svg/SVGAnimateTransformElement.cpp21
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);