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 6814675dfe8f464eeec481dbc07322ef7197660e..005adafee7889a1b92f30d7b0f8efd0e7fbe6844 100644 (file)
@@ -1,3 +1,27 @@
+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.
 2008-04-17  Antti Koivisto  <antti@apple.com>
 
         Reviewed by Oliver.
index 557b3f73d7afaaaf634794a05e27ad1b3bbd58fa..a9e8dccbad774e064668fcbf27b2b5ebb6eb434b 100644 (file)
@@ -144,10 +144,11 @@ void SVGAnimateMotionElement::resetToBaseValue(const String&)
 {
     if (!hasValidTarget())
         return;
 {
     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)
 }
 
 bool SVGAnimateMotionElement::calculateFromAndToValues(const String& fromString, const String& toString)
@@ -166,40 +167,28 @@ bool SVGAnimateMotionElement::calculateFromAndByValues(const String& fromString,
     return true;
 }
 
     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;
         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;
     
         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;
     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()
 {
 }
     
 void SVGAnimateMotionElement::applyResultsToTarget()
 {
-    
+    SVGElement* target = targetElement();
+    if (target && target->renderer())
+        target->renderer()->setNeedsLayout(true);
 }
 
 float SVGAnimateMotionElement::calculateDistance(const String& fromString, const String& toString)
 }
 
 float SVGAnimateMotionElement::calculateDistance(const String& fromString, const String& toString)
index a4672beb1a3dc4723b96d5567049a0f17ccc376a..712fd4946d2c3bcee409f32334fe0ea1324a1c34 100644 (file)
@@ -224,6 +224,8 @@ namespace WebCore {
         virtual void attributeChanged(Attribute*, bool preserveDecls = false);
 
         void sendSVGLoadEventIfPossible(bool sendParentLoadEvents = false);
         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)
 
 
         // Forwarded properties (declared/defined anywhere else in the inheritance structure)
 
index 28ce33c30fe8bdfb846f0d7d1d7193af51a50593..b034028ddecae00c2fcf3fce06d5dbb194051d20 100644 (file)
@@ -60,7 +60,14 @@ AffineTransform SVGStyledTransformableElement::getScreenCTM() const
 
 AffineTransform SVGStyledTransformableElement::animatedLocalTransform() 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)
 }
 
 void SVGStyledTransformableElement::parseMappedAttribute(MappedAttribute* attr)
index 8e23a514b79196ef95262a62bc78fdc7f2f06698..bfefdcec983e3132388531be45017c98f7616a19 100644 (file)
@@ -46,6 +46,7 @@ namespace WebCore {
         virtual SVGElement* farthestViewportElement() const;
         
         virtual AffineTransform animatedLocalTransform() const;
         virtual SVGElement* farthestViewportElement() const;
         
         virtual AffineTransform animatedLocalTransform() const;
+        virtual AffineTransform* supplementalTransform();
 
         virtual FloatRect getBBox() const;
 
 
         virtual FloatRect getBBox() const;
 
@@ -59,6 +60,9 @@ namespace WebCore {
 
     protected:
         ANIMATED_PROPERTY_DECLARATIONS(SVGStyledTransformableElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
 
     protected:
         ANIMATED_PROPERTY_DECLARATIONS(SVGStyledTransformableElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
+    private:
+        // Used by <animateMotion>
+        OwnPtr<AffineTransform> m_supplementalTransform;
     };
 
 } // namespace WebCore
     };
 
 } // namespace WebCore
index 0c66081e594f4bcb043a78e8500061a7b01086e6..d1320647144bcd82fe54f44b7207f30b37336411 100644 (file)
@@ -94,7 +94,14 @@ AffineTransform SVGTextElement::getCTM() const
 
 AffineTransform SVGTextElement::animatedLocalTransform() 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)
 }
 
 RenderObject* SVGTextElement::createRenderer(RenderArena* arena, RenderStyle* style)
index 6cf2baf420721765264a2a020651a73c336c1a81..19c5f4b67c5b3e444f11701528cac27173de6ef5 100644 (file)
@@ -44,6 +44,7 @@ namespace WebCore {
         virtual AffineTransform getCTM() const;
         virtual AffineTransform getScreenCTM() const;
         virtual AffineTransform animatedLocalTransform() const;
         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;
 
         virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
         virtual bool childShouldCreateRenderer(Node*) const;
@@ -54,8 +55,10 @@ namespace WebCore {
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
-        mutable AffineTransform m_localMatrix;
         ANIMATED_PROPERTY_DECLARATIONS(SVGTextElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
         ANIMATED_PROPERTY_DECLARATIONS(SVGTextElement, SVGTransformList*, RefPtr<SVGTransformList>, Transform, transform)
+       
+       // Used by <animateMotion>
+       OwnPtr<AffineTransform> m_supplementalTransform;
     };
 
 } // namespace WebCore
     };
 
 } // namespace WebCore