2008-04-17 Antti Koivisto <antti@apple.com>
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Apr 2008 07:40:17 +0000 (07:40 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Apr 2008 07:40:17 +0000 (07:40 +0000)
        Reviewed by Oliver.

        https://bugs.webkit.org/show_bug.cgi?id=18573

        Implement supplemental transforms and use them for <animateMotion> instead of the transform list.
        This will allow <animateTransform> and <animateMotion> combine properly.

        * svg/SVGAnimateMotionElement.cpp:
        (WebCore::SVGAnimateMotionElement::resetToBaseValue):
        (WebCore::SVGAnimateMotionElement::calculateAnimatedValue):
        (WebCore::SVGAnimateMotionElement::applyResultsToTarget):
        * svg/SVGElement.h:
        (WebCore::SVGElement::supplementalTransform):
        * svg/SVGStyledTransformableElement.cpp:
        (WebCore::SVGStyledTransformableElement::animatedLocalTransform):
        * svg/SVGStyledTransformableElement.h:
        (WebCore::SVGStyledTransformableElement::supplementalTransform):
        * svg/SVGTextElement.cpp:
        (WebCore::SVGTextElement::animatedLocalTransform):
        * svg/SVGTextElement.h:
        (WebCore::SVGTextElement::supplementalTransform):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@32197 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/svg/SVGAnimateMotionElement.cpp
WebCore/svg/SVGElement.h
WebCore/svg/SVGStyledTransformableElement.cpp
WebCore/svg/SVGStyledTransformableElement.h
WebCore/svg/SVGTextElement.cpp
WebCore/svg/SVGTextElement.h

index 6814675..005adaf 100644 (file)
@@ -1,6 +1,30 @@
 2008-04-17  Antti Koivisto  <antti@apple.com>
 
         Reviewed by Oliver.
+        
+        https://bugs.webkit.org/show_bug.cgi?id=18573
+
+        Implement supplemental transforms and use them for <animateMotion> instead of the transform list.
+        This will allow <animateTransform> and <animateMotion> combine properly.
+
+        * svg/SVGAnimateMotionElement.cpp:
+        (WebCore::SVGAnimateMotionElement::resetToBaseValue):
+        (WebCore::SVGAnimateMotionElement::calculateAnimatedValue):
+        (WebCore::SVGAnimateMotionElement::applyResultsToTarget):
+        * svg/SVGElement.h:
+        (WebCore::SVGElement::supplementalTransform):
+        * svg/SVGStyledTransformableElement.cpp:
+        (WebCore::SVGStyledTransformableElement::animatedLocalTransform):
+        * svg/SVGStyledTransformableElement.h:
+        (WebCore::SVGStyledTransformableElement::supplementalTransform):
+        * svg/SVGTextElement.cpp:
+        (WebCore::SVGTextElement::animatedLocalTransform):
+        * svg/SVGTextElement.h:
+        (WebCore::SVGTextElement::supplementalTransform):
+
+2008-04-17  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Oliver.
 
         Implement calcMode=paced.
         
index 557b3f7..a9e8dcc 100644 (file)
@@ -144,10 +144,11 @@ void SVGAnimateMotionElement::resetToBaseValue(const String&)
 {
     if (!hasValidTarget())
         return;
-    SVGStyledTransformableElement* transformableElement = static_cast<SVGStyledTransformableElement*>(targetElement());
-    // FIXME: This should modify supplemental transform, not the transform attribute!
-    ExceptionCode ec;
-    transformableElement->transform()->clear(ec);
+    SVGElement* target = targetElement();
+    AffineTransform* transform = target->supplementalTransform();
+    if (!transform)
+        return;
+    transform->reset();
 }
 
 bool SVGAnimateMotionElement::calculateFromAndToValues(const String& fromString, const String& toString)
@@ -166,40 +167,28 @@ bool SVGAnimateMotionElement::calculateFromAndByValues(const String& fromString,
     return true;
 }
 
-void SVGAnimateMotionElement::calculateAnimatedValue(float percentage, unsigned repeat, SVGSMILElement* resultElement)
+void SVGAnimateMotionElement::calculateAnimatedValue(float percentage, unsigned repeat, SVGSMILElement*)
 {
-    if (!resultElement->targetElement()->isStyledTransformable())
+    SVGElement* target = targetElement();
+    if (!target)
         return;
-    
-    // FIXME: This should modify supplemental transform, not the transform attribute!
-    SVGStyledTransformableElement* transformableElement = static_cast<SVGStyledTransformableElement*>(resultElement->targetElement());
-    RefPtr<SVGTransformList> transformList = transformableElement->transform();
-    if (!transformList)
+    AffineTransform* transform = target->supplementalTransform();
+    if (!transform)
         return;
     
-    ExceptionCode ec;
-    if (!isAdditive()) {
-        ASSERT(this == resultElement);
-        transformList->clear(ec);
-    }
+    if (!isAdditive())
+        transform->reset();
     
+    // FIXME: This needs to do paths and all that.
     FloatSize diff = m_toPoint - m_fromPoint;
-    AffineTransform transform;
-    // FIXME: Animate angles
-    transform.translate(diff.width() * percentage + m_fromPoint.x(), diff.height() * percentage + m_fromPoint.y());
-    
-    // FIXME: Accumulate.
-
-    if (!transform.isIdentity())
-        transformList->appendItem(SVGTransform(transform), ec);
-
-    if (transformableElement->renderer())
-        transformableElement->renderer()->setNeedsLayout(true); // should be part of setTransform
+    transform->translate(diff.width() * percentage + m_fromPoint.x(), diff.height() * percentage + m_fromPoint.y());
 }
     
 void SVGAnimateMotionElement::applyResultsToTarget()
 {
-    
+    SVGElement* target = targetElement();
+    if (target && target->renderer())
+        target->renderer()->setNeedsLayout(true);
 }
 
 float SVGAnimateMotionElement::calculateDistance(const String& fromString, const String& toString)
index a4672be..712fd49 100644 (file)
@@ -224,6 +224,8 @@ namespace WebCore {
         virtual void attributeChanged(Attribute*, bool preserveDecls = false);
 
         void sendSVGLoadEventIfPossible(bool sendParentLoadEvents = false);
+        
+        virtual AffineTransform* supplementalTransform() { return 0; }
 
         // Forwarded properties (declared/defined anywhere else in the inheritance structure)
 
index 28ce33c..b034028 100644 (file)
@@ -60,7 +60,14 @@ AffineTransform SVGStyledTransformableElement::getScreenCTM() const
 
 AffineTransform SVGStyledTransformableElement::animatedLocalTransform() const
 {
-    return transform()->concatenate().matrix();
+    return m_supplementalTransform ? transform()->concatenate().matrix() * *m_supplementalTransform : transform()->concatenate().matrix();
+}
+    
+AffineTransform* SVGStyledTransformableElement::supplementalTransform()
+{
+    if (!m_supplementalTransform)
+        m_supplementalTransform.set(new AffineTransform());
+    return m_supplementalTransform.get();
 }
 
 void SVGStyledTransformableElement::parseMappedAttribute(MappedAttribute* attr)
index 8e23a51..bfefdce 100644 (file)
@@ -46,6 +46,7 @@ namespace WebCore {
         virtual SVGElement* farthestViewportElement() const;
         
         virtual AffineTransform animatedLocalTransform() const;
+        virtual AffineTransform* supplementalTransform();
 
         virtual FloatRect getBBox() const;
 
@@ -59,6 +60,9 @@ namespace WebCore {
 
     protected:
         ANIMATED_PROPERTY_DECLARATIONS(SVGStyledTransformableElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
+    private:
+        // Used by <animateMotion>
+        OwnPtr<AffineTransform> m_supplementalTransform;
     };
 
 } // namespace WebCore
index 0c66081..d132064 100644 (file)
@@ -94,7 +94,14 @@ AffineTransform SVGTextElement::getCTM() const
 
 AffineTransform SVGTextElement::animatedLocalTransform() const
 {
-    return transform()->concatenate().matrix();
+    return m_supplementalTransform ? transform()->concatenate().matrix() * *m_supplementalTransform : transform()->concatenate().matrix();
+}
+
+AffineTransform* SVGTextElement::supplementalTransform()
+{
+    if (!m_supplementalTransform)
+        m_supplementalTransform.set(new AffineTransform());
+    return m_supplementalTransform.get();
 }
 
 RenderObject* SVGTextElement::createRenderer(RenderArena* arena, RenderStyle* style)
index 6cf2baf..19c5f4b 100644 (file)
@@ -44,6 +44,7 @@ namespace WebCore {
         virtual AffineTransform getCTM() const;
         virtual AffineTransform getScreenCTM() const;
         virtual AffineTransform animatedLocalTransform() const;
+        virtual AffineTransform* supplementalTransform();
 
         virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
         virtual bool childShouldCreateRenderer(Node*) const;
@@ -54,8 +55,10 @@ namespace WebCore {
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
-        mutable AffineTransform m_localMatrix;
         ANIMATED_PROPERTY_DECLARATIONS(SVGTextElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
+       
+       // Used by <animateMotion>
+       OwnPtr<AffineTransform> m_supplementalTransform;
     };
 
 } // namespace WebCore