Reviewed by Oliver.
authorrwlbuis <rwlbuis@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Dec 2006 12:02:26 +0000 (12:02 +0000)
committerrwlbuis <rwlbuis@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Dec 2006 12:02:26 +0000 (12:02 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=11667
        SVG: method .getTransformToElement(elt) in SVGLocatable not implemented

        Implement getTransformToElement functionality. Introduce virtual
        baseclass SVGLocatable to allow one implementation of the functionality.
        Finally cleanup some code.

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

14 files changed:
LayoutTests/ChangeLog
LayoutTests/svg/custom/getTransformToElement-expected.checksum [new file with mode: 0644]
LayoutTests/svg/custom/getTransformToElement-expected.png [new file with mode: 0644]
LayoutTests/svg/custom/getTransformToElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/custom/getTransformToElement.svg [new file with mode: 0644]
WebCore/ChangeLog
WebCore/ksvg2/svg/SVGLocatable.cpp
WebCore/ksvg2/svg/SVGLocatable.h
WebCore/ksvg2/svg/SVGStyledLocatableElement.cpp
WebCore/ksvg2/svg/SVGStyledLocatableElement.h
WebCore/ksvg2/svg/SVGStyledTransformableElement.cpp
WebCore/ksvg2/svg/SVGStyledTransformableElement.h
WebCore/ksvg2/svg/SVGTextElement.h
WebCore/ksvg2/svg/SVGTransformable.h

index d0ee4d09f3504879ee6325db6a8be912e685ec83..57608512791f860a41212d7215e46d9a7aac0320 100644 (file)
@@ -1,3 +1,16 @@
+2006-12-03  Rob Buis  <buis@kde.org>
+
+        Reviewed by Oliver.
+
+        Testcase for:
+        http://bugs.webkit.org/show_bug.cgi?id=11667
+        SVG: method .getTransformToElement(elt) in SVGLocatable not implemented
+
+        * svg/custom/getTransformToElement-expected.checksum: Added.
+        * svg/custom/getTransformToElement-expected.png: Added.
+        * svg/custom/getTransformToElement-expected.txt: Added.
+        * svg/custom/getTransformToElement.svg: Added.
+
 2006-12-03  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Mitz.
diff --git a/LayoutTests/svg/custom/getTransformToElement-expected.checksum b/LayoutTests/svg/custom/getTransformToElement-expected.checksum
new file mode 100644 (file)
index 0000000..007b776
--- /dev/null
@@ -0,0 +1 @@
+c86e7eddcacec767702fe34086c63376
\ No newline at end of file
diff --git a/LayoutTests/svg/custom/getTransformToElement-expected.png b/LayoutTests/svg/custom/getTransformToElement-expected.png
new file mode 100644 (file)
index 0000000..a91e56b
Binary files /dev/null and b/LayoutTests/svg/custom/getTransformToElement-expected.png differ
diff --git a/LayoutTests/svg/custom/getTransformToElement-expected.txt b/LayoutTests/svg/custom/getTransformToElement-expected.txt
new file mode 100644 (file)
index 0000000..1d83b0e
--- /dev/null
@@ -0,0 +1,10 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+    KCanvasContainer {svg} at (-2.50,15.50) size 122.71x196.63
+      KCanvasContainer {g} at (0,0) size 0x0 [transform={m=((0.00,0.00)(0.00,0.00)) t=(0.00,0.00)}]
+      KCanvasContainer {g} at (-2.50,15.50) size 20.50x9 [transform={m=((1.00,0.00)(0.00,1.00)) t=(15.00,15.00)}]
+        RenderSVGText {text} at (50,150) size 800x36
+          RenderSVGInlineText {#text} at (0,-28) size 82x36
+            text run at (0,-28) width 82: "Passed"
+      KCanvasContainer {g} at (49.50,141.42) size 70.71x70.71 [transform={m=((0.71,0.71)(-0.71,0.71)) t=(0.00,0.00)}]
+        KCanvasItem {rect} at (49.50,141.42) size 70.71x70.71 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,0.00)}] [data="M50.00,50.00L120.00,50.00L120.00,80.00L50.00,80.00"]
diff --git a/LayoutTests/svg/custom/getTransformToElement.svg b/LayoutTests/svg/custom/getTransformToElement.svg
new file mode 100644 (file)
index 0000000..68136ad
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">
+<svg version="1.1" baseProfile="basic" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg-root" width="100%" height="100%" onload="runTest()">
+   <script type="text/ecmascript"><![CDATA[
+      function runTest() {
+        var referenceElement = document.getElementById("referenceText");
+        var ctm = referenceElement.getTransformToElement(document.getElementById("group1"));
+        if (ctm.a == 0.5 && ctm.b == 0 && ctm.c == 0 && ctm.d == 0.5 &&
+            ctm.e == -20 && ctm.f == -20) {
+        ctm = referenceElement.getTransformToElement(document.getElementById("group2"));
+        if (ctm.a.toFixed(3) == 0.354 && ctm.b.toFixed(3) == -0.354 &&
+            ctm.c.toFixed(3) == 0.354 && ctm.d.toFixed(3) == 0.354 &&
+            ctm.e.toFixed(3) == -7.071 && ctm.f == 0.0) {
+            ctm = referenceElement.getTransformToElement(document.getElementById("redRect"));
+            if (ctm.a.toFixed(3) == 0.354 && ctm.b.toFixed(3) == -0.354 &&
+                ctm.c.toFixed(3) == 0.354 && ctm.d.toFixed(3) == 0.354 &&
+                 ctm.e.toFixed(3) == -107.071 && ctm.f == 0.0) {
+               try {
+                 var ctm = referenceElement.getTransformToElement(document.getElementById("group0"));
+               } catch(e) {
+                     document.getElementById("referenceText").textContent = "Passed";
+               }
+             }
+           }
+         }
+      }
+   ]]></script>
+            <g id="group0" transform="scale(0)"/>
+            <g id="group1" transform="translate(15,15)">
+                <text id="referenceText" transform="translate(-20,-20),scale(0.5)" font-size="30" x="50" y="150">Failed</text>
+            </g>
+            <g id="group2" transform="rotate(45)">
+                <rect id="redRect" transform="translate(100,0)" x="50" y="50" width="70" height="30" fill="none"/>
+            </g>
+</svg>
index 58e35113cad33d130e89736c137ba4fdb95ca059..c11e966218a8e0ffb6cb2133bc802ce52604dcb7 100644 (file)
@@ -1,3 +1,37 @@
+2006-12-03  Rob Buis  <buis@kde.org>
+
+        Reviewed by Oliver.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11667
+        SVG: method .getTransformToElement(elt) in SVGLocatable not implemented
+
+        Implement getTransformToElement functionality. Introduce virtual
+        baseclass SVGLocatable to allow one implementation of the functionality.
+        Finally cleanup some code.
+
+        * ksvg2/svg/SVGLocatable.cpp:
+        (WebCore::SVGLocatable::getTransformToElement):
+        * ksvg2/svg/SVGLocatable.h:
+        * ksvg2/svg/SVGStyledLocatableElement.cpp:
+        (WebCore::SVGStyledLocatableElement::SVGStyledLocatableElement):
+        (WebCore::SVGStyledLocatableElement::nearestViewportElement):
+        (WebCore::SVGStyledLocatableElement::farthestViewportElement):
+        (WebCore::SVGStyledLocatableElement::getCTM):
+        (WebCore::SVGStyledLocatableElement::getScreenCTM):
+        * ksvg2/svg/SVGStyledLocatableElement.h:
+        * ksvg2/svg/SVGStyledTransformableElement.cpp:
+        (WebCore::SVGStyledTransformableElement::SVGStyledTransformableElement):
+        (WebCore::SVGStyledTransformableElement::localMatrix):
+        (WebCore::SVGStyledTransformableElement::getCTM):
+        (WebCore::SVGStyledTransformableElement::getScreenCTM):
+        (WebCore::SVGStyledTransformableElement::updateLocalTransform):
+        (WebCore::SVGStyledTransformableElement::parseMappedAttribute):
+        (WebCore::SVGStyledTransformableElement::nearestViewportElement):
+        (WebCore::SVGStyledTransformableElement::farthestViewportElement):
+        * ksvg2/svg/SVGStyledTransformableElement.h:
+        * ksvg2/svg/SVGTextElement.h:
+        * ksvg2/svg/SVGTransformable.h:
+
 2006-12-03  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by Rob.
index 1ce5b5544526e8a0807c67f3f35c443b8b5cf049..188fe9cce1fe772a0bc995cc9062e32dbf4035a2 100644 (file)
@@ -123,6 +123,24 @@ SVGMatrix* SVGLocatable::getScreenCTM(const SVGElement* element)
     return ctm;
 }
 
+SVGMatrix* SVGLocatable::getTransformToElement(SVGElement* target, ExceptionCode& ec) const
+{
+    RefPtr<SVGMatrix> startctm(getCTM());
+    SVGMatrix* ctm = SVGSVGElement::createSVGMatrix();
+    ctm->multiply(startctm.get());
+
+    SVGElement* targetElement = svg_dynamic_cast(target);
+    if (targetElement && targetElement->isStyledLocatable()) {
+        RefPtr<SVGMatrix> targetCTM = static_cast<SVGStyledLocatableElement*>(targetElement)->getCTM();
+        targetCTM.get()->inverse(ec);
+        if (ec)
+            return ctm;
+        ctm->postMultiply(targetCTM.get());
+    }
+
+    return ctm;
+}
+
 }
 
 #endif // SVG_SUPPORT
index dd3d0d1019b77b13749e4508947c771e617065fb..8ae46cf74ac9a53a81f49e09ab5d2fd2f1060d27 100644 (file)
@@ -46,7 +46,7 @@ namespace WebCore {
         virtual FloatRect getBBox() const = 0;
         virtual SVGMatrix* getCTM() const = 0;
         virtual SVGMatrix* getScreenCTM() const = 0;
-        virtual SVGMatrix* getTransformToElement(SVGElement*, ExceptionCode&) const = 0;
+        SVGMatrix* getTransformToElement(SVGElement*, ExceptionCode&) const;
 
     protected:
         static SVGElement* nearestViewportElement(const SVGStyledElement*);
index 2c216996bcbf0d956f0a4d2a515f68dfe41f1e6d..7e32408900cf07c17cad4685a043f35d7686ec1e 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
 #include "SVGMatrix.h"
 #include "SVGSVGElement.h"
 
-using namespace WebCore;
+namespace WebCore {
 
-SVGStyledLocatableElement::SVGStyledLocatableElement(const QualifiedName& tagName, Document *doc)
-: SVGStyledElement(tagName, doc), SVGLocatable()
+SVGStyledLocatableElement::SVGStyledLocatableElement(const QualifiedName& tagName, Document* doc)
+    : SVGLocatable()
+    , SVGStyledElement(tagName, doc)
 {
 }
 
@@ -42,12 +43,12 @@ SVGStyledLocatableElement::~SVGStyledLocatableElement()
 {
 }
 
-SVGElement *SVGStyledLocatableElement::nearestViewportElement() const
+SVGElementSVGStyledLocatableElement::nearestViewportElement() const
 {
     return SVGLocatable::nearestViewportElement(this);
 }
 
-SVGElement *SVGStyledLocatableElement::farthestViewportElement() const
+SVGElementSVGStyledLocatableElement::farthestViewportElement() const
 {
     return SVGLocatable::farthestViewportElement(this);
 }
@@ -57,20 +58,16 @@ FloatRect SVGStyledLocatableElement::getBBox() const
     return SVGLocatable::getBBox(this);
 }
 
-SVGMatrix *SVGStyledLocatableElement::getCTM() const
+SVGMatrixSVGStyledLocatableElement::getCTM() const
 {
     return SVGLocatable::getCTM(this);
 }
 
-SVGMatrix *SVGStyledLocatableElement::getScreenCTM() const
+SVGMatrixSVGStyledLocatableElement::getScreenCTM() const
 {
     return SVGLocatable::getScreenCTM(this);
 }
 
-SVGMatrix *SVGStyledLocatableElement::getTransformToElement(SVGElement *, ExceptionCode&) const
-{
-    // TODO!
-    return 0;
 }
 
 // vim:ts=4:noet
index 4f070bb38782443d9f4acc790d28582ed7befa68..c2e77598e37c32d5a3f122ac3dcd71db7e0a9747 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
@@ -32,7 +32,7 @@ namespace WebCore {
     class SVGMatrix;
     class SVGElement;
 
-    class SVGStyledLocatableElement : public SVGStyledElement, public SVGLocatable {
+    class SVGStyledLocatableElement : public SVGStyledElement, virtual public SVGLocatable {
     public:
         SVGStyledLocatableElement(const QualifiedName&, Document*);
         virtual ~SVGStyledLocatableElement();
@@ -46,7 +46,6 @@ namespace WebCore {
         virtual FloatRect getBBox() const;
         virtual SVGMatrix* getCTM() const;
         virtual SVGMatrix* getScreenCTM() const;
-        virtual SVGMatrix* getTransformToElement(SVGElement*, ExceptionCode&) const;
     };
 
 } // namespace WebCore
index 2915b5204d7ee9d33d684e7e3f1db372d5815038..21c6090070c6a688369251696975a0574fb1535c 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
@@ -35,9 +35,9 @@
 #include "SVGStyledElement.h"
 #include "SVGTransformList.h"
 
-using namespace WebCore;
+namespace WebCore {
 
-SVGStyledTransformableElement::SVGStyledTransformableElement(const QualifiedName& tagName, Document *doc)
+SVGStyledTransformableElement::SVGStyledTransformableElement(const QualifiedName& tagName, Documentdoc)
     : SVGStyledLocatableElement(tagName, doc)
     , SVGTransformable()
     , m_transform(new SVGTransformList)
@@ -50,22 +50,22 @@ SVGStyledTransformableElement::~SVGStyledTransformableElement()
 
 ANIMATED_PROPERTY_DEFINITIONS(SVGStyledTransformableElement, SVGTransformList*, TransformList, transformList, Transform, transform, SVGNames::transformAttr.localName(), m_transform.get())
 
-SVGMatrix *SVGStyledTransformableElement::localMatrix() const
+SVGMatrixSVGStyledTransformableElement::localMatrix() const
 {
     return lazy_create<SVGMatrix>(m_localMatrix);
 }
 
-SVGMatrix *SVGStyledTransformableElement::getCTM() const
+SVGMatrixSVGStyledTransformableElement::getCTM() const
 {
     return SVGTransformable::getCTM(this);
 }
 
-SVGMatrix *SVGStyledTransformableElement::getScreenCTM() const
+SVGMatrixSVGStyledTransformableElement::getScreenCTM() const
 {
     return SVGTransformable::getScreenCTM(this);
 }
 
-void SVGStyledTransformableElement::updateLocalTransform(SVGTransformList *localTransforms)
+void SVGStyledTransformableElement::updateLocalTransform(SVGTransformListlocalTransforms)
 {
     // Update cached local matrix
     RefPtr<SVGTransform> localTransform = localTransforms->concatenate();
@@ -78,10 +78,10 @@ void SVGStyledTransformableElement::updateLocalTransform(SVGTransformList *local
     }
 }
 
-void SVGStyledTransformableElement::parseMappedAttribute(MappedAttribute *attr)
+void SVGStyledTransformableElement::parseMappedAttribute(MappedAttributeattr)
 {
     if (attr->name() == SVGNames::transformAttr) {
-        SVGTransformList *localTransforms = transformBaseValue();
+        SVGTransformListlocalTransforms = transformBaseValue();
 
         ExceptionCode ec = 0;
         localTransforms->clear(ec);
@@ -92,12 +92,12 @@ void SVGStyledTransformableElement::parseMappedAttribute(MappedAttribute *attr)
         SVGStyledLocatableElement::parseMappedAttribute(attr);
 }
 
-SVGElement *SVGStyledTransformableElement::nearestViewportElement() const
+SVGElementSVGStyledTransformableElement::nearestViewportElement() const
 {
     return SVGTransformable::nearestViewportElement(this);
 }
 
-SVGElement *SVGStyledTransformableElement::farthestViewportElement() const
+SVGElementSVGStyledTransformableElement::farthestViewportElement() const
 {
     return SVGTransformable::farthestViewportElement(this);
 }
@@ -107,11 +107,6 @@ FloatRect SVGStyledTransformableElement::getBBox() const
     return SVGTransformable::getBBox(this);
 }
 
-SVGMatrix *SVGStyledTransformableElement::getTransformToElement(SVGElement*, ExceptionCode&) const
-{
-    return 0;
-}
-
 void SVGStyledTransformableElement::attach()
 {
     SVGStyledElement::attach();
@@ -120,6 +115,7 @@ void SVGStyledTransformableElement::attach()
         renderer()->setLocalTransform(m_localMatrix->matrix());
 }
 
+}
 
 // vim:ts=4:noet
 #endif // SVG_SUPPORT
index bfb9c3ae85b4d6402728083ea42bdc86e8ec963b..65920d19d0c9b91d3784b2c1d7a641b5734a12be 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
@@ -45,20 +45,19 @@ namespace WebCore {
         virtual bool isStyledTransformable() const { return true; }
 
         // 'SVGTransformable' functions
-        virtual SVGMatrix *localMatrix() const;
+        virtual SVGMatrixlocalMatrix() const;
 
         // Derived from: 'SVGLocatable'
-        virtual SVGMatrix *getCTM() const;
-        virtual SVGMatrix *getScreenCTM() const;
-        virtual SVGElement *nearestViewportElement() const;
-        virtual SVGElement *farthestViewportElement() const;
+        virtual SVGMatrixgetCTM() const;
+        virtual SVGMatrixgetScreenCTM() const;
+        virtual SVGElementnearestViewportElement() const;
+        virtual SVGElementfarthestViewportElement() const;
 
         virtual FloatRect getBBox() const;
-        virtual SVGMatrix *getTransformToElement(SVGElement*, ExceptionCode&) const;
 
-        virtual void parseMappedAttribute(MappedAttribute *attr);
+        virtual void parseMappedAttribute(MappedAttributeattr);
 
-        void updateLocalTransform(SVGTransformList *localTransforms);
+        void updateLocalTransform(SVGTransformListlocalTransforms);
         
         virtual void attach();
 
index 7cb0cf9df7ddee223cd8027cd67c3e1575fe4180..8ee4822f3e36c25ff8f40b889e6f0bf60fd44fa3 100644 (file)
@@ -45,7 +45,6 @@ namespace WebCore
         virtual FloatRect getBBox() const;
         virtual SVGMatrix* getCTM() const;
         virtual SVGMatrix* getScreenCTM() const;
-        virtual SVGMatrix* getTransformToElement(SVGElement*, ExceptionCode&) const { return 0; }
 
         virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
         virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
index fd8d358a99c16b7c7d253b30ddced9c084b79434..b52dedfa2c62565cd7d4d63821cf6ed47ba6e3e6 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
     class SVGMatrix;
     class SVGTransformList;
 
-    class SVGTransformable : public SVGLocatable {
+    class SVGTransformable : virtual public SVGLocatable {
     public:
         SVGTransformable();
         virtual ~SVGTransformable();