Reviewed by Rob.
authorzimmermann <zimmermann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Dec 2006 12:16:31 +0000 (12:16 +0000)
committerzimmermann <zimmermann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Dec 2006 12:16:31 +0000 (12:16 +0000)
Fixes: http://bugs.webkit.org/show_bug.cgi?id=11813

Pass SVGLength around by value, remove any SVGLength* usage.
Bindings work fine, as the SVG POD JS Wrapper stuff is already in svn.

No new regressions, none fixed. But the code itself is much cleaner.
And some problems with width-full-percentage.svg have been fixed, viewport
clipping works in any case now, also for percentual width/height values set on <svg>.

Still unsure if we can simulate window resizes in a layout test,
not through "width/height" property changes, but directly in any way.
If anyone knows if we can do that, please drop me a line.

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

60 files changed:
LayoutTests/ChangeLog
LayoutTests/svg/W3C-SVG-1.1/coords-units-01-b-expected.png
WebCore/ChangeLog
WebCore/bindings/scripts/CodeGenerator.pm
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/ksvg2/misc/KCanvasRenderingStyle.cpp
WebCore/ksvg2/svg/SVGAnimatedTemplate.h
WebCore/ksvg2/svg/SVGCircleElement.cpp
WebCore/ksvg2/svg/SVGCircleElement.h
WebCore/ksvg2/svg/SVGCursorElement.cpp
WebCore/ksvg2/svg/SVGCursorElement.h
WebCore/ksvg2/svg/SVGElement.cpp
WebCore/ksvg2/svg/SVGEllipseElement.cpp
WebCore/ksvg2/svg/SVGEllipseElement.h
WebCore/ksvg2/svg/SVGFilterElement.cpp
WebCore/ksvg2/svg/SVGFilterElement.h
WebCore/ksvg2/svg/SVGFilterPrimitiveStandardAttributes.cpp
WebCore/ksvg2/svg/SVGFilterPrimitiveStandardAttributes.h
WebCore/ksvg2/svg/SVGFitToViewBox.cpp
WebCore/ksvg2/svg/SVGForeignObjectElement.cpp
WebCore/ksvg2/svg/SVGForeignObjectElement.h
WebCore/ksvg2/svg/SVGHelper.cpp
WebCore/ksvg2/svg/SVGHelper.h
WebCore/ksvg2/svg/SVGImageElement.cpp
WebCore/ksvg2/svg/SVGImageElement.h
WebCore/ksvg2/svg/SVGLength.cpp
WebCore/ksvg2/svg/SVGLength.h
WebCore/ksvg2/svg/SVGLength.idl
WebCore/ksvg2/svg/SVGLengthList.cpp
WebCore/ksvg2/svg/SVGLengthList.h
WebCore/ksvg2/svg/SVGLineElement.cpp
WebCore/ksvg2/svg/SVGLineElement.h
WebCore/ksvg2/svg/SVGLinearGradientElement.cpp
WebCore/ksvg2/svg/SVGLinearGradientElement.h
WebCore/ksvg2/svg/SVGMarkerElement.cpp
WebCore/ksvg2/svg/SVGMarkerElement.h
WebCore/ksvg2/svg/SVGMaskElement.cpp
WebCore/ksvg2/svg/SVGMaskElement.h
WebCore/ksvg2/svg/SVGPatternElement.cpp
WebCore/ksvg2/svg/SVGPatternElement.h
WebCore/ksvg2/svg/SVGRadialGradientElement.cpp
WebCore/ksvg2/svg/SVGRadialGradientElement.h
WebCore/ksvg2/svg/SVGRectElement.cpp
WebCore/ksvg2/svg/SVGRectElement.h
WebCore/ksvg2/svg/SVGSVGElement.cpp
WebCore/ksvg2/svg/SVGSVGElement.h
WebCore/ksvg2/svg/SVGStyledElement.cpp
WebCore/ksvg2/svg/SVGStyledElement.h
WebCore/ksvg2/svg/SVGTextContentElement.cpp
WebCore/ksvg2/svg/SVGTextContentElement.h
WebCore/ksvg2/svg/SVGTextElement.cpp
WebCore/ksvg2/svg/SVGTextPositioningElement.cpp
WebCore/ksvg2/svg/SVGUseElement.cpp
WebCore/ksvg2/svg/SVGUseElement.h
WebCore/page/EventHandler.cpp
WebCore/rendering/RenderForeignObject.cpp
WebCore/rendering/RenderSVGContainer.cpp
WebCore/rendering/RenderSVGImage.cpp
WebCore/rendering/RenderSVGText.cpp
WebCore/rendering/SVGInlineFlowBox.cpp

index 0bd1bae..75258a1 100644 (file)
@@ -1,3 +1,12 @@
+2006-12-17  Nikolas Zimmermann  <zimmermann@kde.org>
+
+        Reviewed by Rob.
+
+        Fixes: http://bugs.webkit.org/show_bug.cgi?id=11813
+
+        Update baseline after the SVGLength patch.
+        * svg/W3C-SVG-1.1/coords-units-01-b-expected.png:
+
 2006-12-16  Sam Weinig  <sam@webkit.org>
 
         Reviewed by Maciej.
index 7776e2a..9d03b70 100644 (file)
Binary files a/LayoutTests/svg/W3C-SVG-1.1/coords-units-01-b-expected.png and b/LayoutTests/svg/W3C-SVG-1.1/coords-units-01-b-expected.png differ
index 828b82c..f1423fe 100644 (file)
@@ -1,3 +1,167 @@
+2006-12-17  Nikolas Zimmermann  <zimmermann@kde.org>
+
+        Reviewed by Rob.
+
+        Fixes: http://bugs.webkit.org/show_bug.cgi?id=11813
+
+        Pass SVGLength around by value, remove any SVGLength* usage.
+        Bindings work fine, as the SVG POD JS Wrapper stuff is already in svn.
+
+        No new regressions, none fixed. But the code itself is much cleaner.
+        And some problems with width-full-percentage.svg have been fixed, viewport
+        clipping works in any case now, also for percentual width/height values set on <svg>.
+
+        * bindings/scripts/CodeGenerator.pm:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        * ksvg2/misc/KCanvasRenderingStyle.cpp:
+        (WebCore::KSVGPainterFactory::cssPrimitiveToLength):
+        * ksvg2/svg/SVGAnimatedTemplate.h:
+        * ksvg2/svg/SVGCircleElement.cpp:
+        (WebCore::SVGCircleElement::SVGCircleElement):
+        (WebCore::SVGCircleElement::parseMappedAttribute):
+        (WebCore::SVGCircleElement::toPathData):
+        * ksvg2/svg/SVGCircleElement.h:
+        * ksvg2/svg/SVGCursorElement.cpp:
+        (WebCore::SVGCursorElement::SVGCursorElement):
+        (WebCore::SVGCursorElement::parseMappedAttribute):
+        * ksvg2/svg/SVGCursorElement.h:
+        * ksvg2/svg/SVGElement.cpp:
+        * ksvg2/svg/SVGEllipseElement.cpp:
+        (WebCore::SVGEllipseElement::SVGEllipseElement):
+        (WebCore::SVGEllipseElement::parseMappedAttribute):
+        (WebCore::SVGEllipseElement::toPathData):
+        * ksvg2/svg/SVGEllipseElement.h:
+        * ksvg2/svg/SVGFilterElement.cpp:
+        (WebCore::SVGFilterElement::SVGFilterElement):
+        (WebCore::SVGFilterElement::parseMappedAttribute):
+        (WebCore::SVGFilterElement::canvasResource):
+        * ksvg2/svg/SVGFilterElement.h:
+        * ksvg2/svg/SVGFilterPrimitiveStandardAttributes.cpp:
+        (WebCore::SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::parseMappedAttribute):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::setStandardAttributes):
+        * ksvg2/svg/SVGFilterPrimitiveStandardAttributes.h:
+        * ksvg2/svg/SVGFitToViewBox.cpp:
+        (WebCore::SVGFitToViewBox::parseViewBox):
+        * ksvg2/svg/SVGForeignObjectElement.cpp:
+        (WebCore::SVGForeignObjectElement::SVGForeignObjectElement):
+        (WebCore::SVGForeignObjectElement::parseMappedAttribute):
+        (WebCore::SVGForeignObjectElement::createRenderer):
+        (WebCore::SVGForeignObjectElement::childShouldCreateRenderer):
+        * ksvg2/svg/SVGForeignObjectElement.h:
+        * ksvg2/svg/SVGHelper.cpp:
+        (WebCore::SVGHelper::parseSeparatedList):
+        * ksvg2/svg/SVGHelper.h:
+        * ksvg2/svg/SVGImageElement.cpp:
+        (WebCore::SVGImageElement::SVGImageElement):
+        (WebCore::SVGImageElement::parseMappedAttribute):
+        * ksvg2/svg/SVGImageElement.h:
+        * ksvg2/svg/SVGLength.cpp:
+        (WebCore::storeUnit):
+        (WebCore::extractMode):
+        (WebCore::extractType):
+        (WebCore::lengthTypeToString):
+        (WebCore::stringToLengthType):
+        (WebCore::SVGLength::SVGLength):
+        (WebCore::SVGLength::unitType):
+        (WebCore::SVGLength::value):
+        (WebCore::SVGLength::setValue):
+        (WebCore::SVGLength::setValueInSpecifiedUnits):
+        (WebCore::SVGLength::setValueAsString):
+        (WebCore::SVGLength::valueAsString):
+        (WebCore::SVGLength::newValueSpecifiedUnits):
+        (WebCore::SVGLength::convertToSpecifiedUnits):
+        (WebCore::SVGLength::isFraction):
+        (WebCore::SVGLength::dpi):
+        (WebCore::SVGLength::PercentageOfViewport):
+        * ksvg2/svg/SVGLength.h:
+        (WebCore::):
+        (WebCore::SVGLength::):
+        * ksvg2/svg/SVGLength.idl:
+        * ksvg2/svg/SVGLengthList.cpp:
+        (WebCore::SVGLengthList::SVGLengthList):
+        (WebCore::SVGLengthList::parse):
+        * ksvg2/svg/SVGLengthList.h:
+        * ksvg2/svg/SVGLineElement.cpp:
+        (WebCore::SVGLineElement::SVGLineElement):
+        (WebCore::SVGLineElement::parseMappedAttribute):
+        (WebCore::SVGLineElement::toPathData):
+        * ksvg2/svg/SVGLineElement.h:
+        * ksvg2/svg/SVGLinearGradientElement.cpp:
+        (WebCore::SVGLinearGradientElement::SVGLinearGradientElement):
+        (WebCore::SVGLinearGradientElement::parseMappedAttribute):
+        (WebCore::SVGLinearGradientElement::buildGradient):
+        * ksvg2/svg/SVGLinearGradientElement.h:
+        * ksvg2/svg/SVGMarkerElement.cpp:
+        (WebCore::SVGMarkerElement::SVGMarkerElement):
+        (WebCore::SVGMarkerElement::parseMappedAttribute):
+        (WebCore::SVGMarkerElement::canvasResource):
+        * ksvg2/svg/SVGMarkerElement.h:
+        * ksvg2/svg/SVGMaskElement.cpp:
+        (WebCore::SVGMaskElement::SVGMaskElement):
+        (WebCore::SVGMaskElement::attributeChanged):
+        (WebCore::SVGMaskElement::parseMappedAttribute):
+        (WebCore::SVGMaskElement::drawMaskerContent):
+        * ksvg2/svg/SVGMaskElement.h:
+        * ksvg2/svg/SVGPatternElement.cpp:
+        (WebCore::SVGPatternElement::SVGPatternElement):
+        (WebCore::SVGPatternElement::parseMappedAttribute):
+        (WebCore::SVGPatternElement::drawPatternContentIntoTile):
+        (WebCore::SVGPatternElement::notifyAttributeChange):
+        (WebCore::SVGPatternElement::getCTM):
+        * ksvg2/svg/SVGPatternElement.h:
+        * ksvg2/svg/SVGRadialGradientElement.cpp:
+        (WebCore::SVGRadialGradientElement::SVGRadialGradientElement):
+        (WebCore::SVGRadialGradientElement::parseMappedAttribute):
+        (WebCore::SVGRadialGradientElement::buildGradient):
+        * ksvg2/svg/SVGRadialGradientElement.h:
+        * ksvg2/svg/SVGRectElement.cpp:
+        (WebCore::SVGRectElement::SVGRectElement):
+        (WebCore::SVGRectElement::parseMappedAttribute):
+        (WebCore::SVGRectElement::toPathData):
+        * ksvg2/svg/SVGRectElement.h:
+        * ksvg2/svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::SVGSVGElement):
+        (WebCore::SVGSVGElement::viewport):
+        (WebCore::SVGSVGElement::parseMappedAttribute):
+        (WebCore::SVGSVGElement::createSVGLength):
+        (WebCore::SVGSVGElement::getCTM):
+        (WebCore::SVGSVGElement::getScreenCTM):
+        * ksvg2/svg/SVGSVGElement.h:
+        * ksvg2/svg/SVGStyledElement.cpp:
+        * ksvg2/svg/SVGStyledElement.h:
+        * ksvg2/svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::SVGTextContentElement):
+        (WebCore::SVGTextContentElement::parseMappedAttribute):
+        * ksvg2/svg/SVGTextContentElement.h:
+        * ksvg2/svg/SVGTextElement.cpp:
+        * ksvg2/svg/SVGTextPositioningElement.cpp:
+        (WebCore::SVGTextPositioningElement::parseMappedAttribute):
+        * ksvg2/svg/SVGUseElement.cpp:
+        (WebCore::SVGUseElement::SVGUseElement):
+        (WebCore::SVGUseElement::parseMappedAttribute):
+        (WebCore::SVGUseElement::closeRenderer):
+        * ksvg2/svg/SVGUseElement.h:
+        * page/EventHandler.cpp:
+        (WebCore::selectCursor):
+        * rendering/RenderForeignObject.cpp:
+        (WebCore::RenderForeignObject::translationForAttributes):
+        * rendering/RenderPath.cpp:
+        * rendering/RenderPath.h:
+        * rendering/RenderSVGContainer.cpp:
+        (WebCore::RenderSVGContainer::layout):
+        (WebCore::RenderSVGContainer::calcViewport):
+        * rendering/RenderSVGImage.cpp:
+        (WebCore::RenderSVGImage::relativeBBox):
+        (WebCore::RenderSVGImage::getAbsoluteRepaintRect):
+        (WebCore::RenderSVGImage::translationForAttributes):
+        * rendering/RenderSVGText.cpp:
+        (WebCore::RenderSVGText::layout):
+        * rendering/SVGInlineFlowBox.cpp:
+        (WebCore::translateBox):
+        (WebCore::placePositionedBoxesHorizontally):
+        (WebCore::placeBoxesVerticallyWithAbsBaseline):
+
 2006-12-16  Sam Weinig  <sam@webkit.org>
 
         Reviewed by Maciej.
index 4124f46..3d58399 100644 (file)
@@ -39,7 +39,7 @@ my %primitiveTypeHash = ("int" => 1, "short" => 1, "long" => 1,
                          "unsigned long" => 1, "float" => 1,
                          "double" => 1, "boolean" => 1, "void" => 1);
 
-my %podTypeHash = ("RGBColor" => 1, "SVGPoint" => 1, "SVGRect" => 1, "SVGNumber" => 1, "SVGMatrix" => 1);
+my %podTypeHash = ("RGBColor" => 1, "SVGLength" => 1, "SVGPoint" => 1, "SVGRect" => 1, "SVGNumber" => 1, "SVGMatrix" => 1);
  
 my %stringTypeHash = ("DOMString" => 1, "AtomicString" => 1);
 
index 54034e5..f09ca29 100644 (file)
@@ -1098,6 +1098,7 @@ sub GetNativeType
     return "FloatRect" if $type eq "SVGRect";
     return "FloatPoint" if $type eq "SVGPoint";
     return "AffineTransform" if $type eq "SVGMatrix";
+    return "SVGLength" if $type eq "SVGLength";
     return "double" if $type eq "SVGNumber";
     return "SVGPaint::SVGPaintType" if $type eq "SVGPaintType";
 
index c641c25..94bfbcf 100644 (file)
@@ -31,6 +31,7 @@
 #include "SVGPaintServerSolid.h"
 #include "RenderObject.h"
 #include "RenderPath.h"
+#include "SVGHelper.h"
 #include "SVGLength.h"
 #include "SVGRenderStyle.h"
 #include "SVGStyledElement.h"
@@ -108,11 +109,11 @@ double KSVGPainterFactory::cssPrimitiveToLength(const RenderObject* item, CSSVal
         return defaultValue;
 
     if (cssType == CSSPrimitiveValue::CSS_PERCENTAGE) {
-        SVGElement* element = static_cast<SVGElement*>(item->element());
+        SVGStyledElement* element = static_cast<SVGStyledElement*>(item->element());
         SVGElement* viewportElement = (element ? element->viewportElement() : 0);
         if (viewportElement) {
             double result = primitive->getFloatValue() / 100.0;
-            return SVGHelper::PercentageOfViewport(result, viewportElement, LM_OTHER);
+            return SVGLength::PercentageOfViewport(result, element, LengthModeOther);
         }
     }
 
index 0fe0c96..d361b56 100644 (file)
@@ -55,7 +55,7 @@ namespace WebCore {
     typedef SVGAnimatedTemplate<bool> SVGAnimatedBoolean;
     typedef SVGAnimatedTemplate<int> SVGAnimatedEnumeration;
     typedef SVGAnimatedTemplate<long> SVGAnimatedInteger;
-    typedef SVGAnimatedTemplate<SVGLength*> SVGAnimatedLength;
+    typedef SVGAnimatedTemplate<SVGLength> SVGAnimatedLength;
     typedef SVGAnimatedTemplate<SVGLengthList*> SVGAnimatedLengthList;
     typedef SVGAnimatedTemplate<double> SVGAnimatedNumber;
     typedef SVGAnimatedTemplate<SVGNumberList*> SVGAnimatedNumberList; 
index 0db7a76..bd9b43a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGCircleElement.h"
 
 #include "FloatPoint.h"
 #include "SVGHelper.h"
-#include "SVGLength.h"
 #include "SVGNames.h"
 
 namespace WebCore {
@@ -36,9 +36,9 @@ SVGCircleElement::SVGCircleElement(const QualifiedName& tagName, Document* doc)
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_cx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_cy(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_r(new SVGLength(this, LM_OTHER, viewportElement()))
+    , m_cx(SVGLength(this, LengthModeWidth))
+    , m_cy(SVGLength(this, LengthModeHeight))
+    , m_r(SVGLength(this, LengthModeOther))
 {
 }
 
@@ -46,19 +46,19 @@ SVGCircleElement::~SVGCircleElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength*, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength*, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength*, Length, length, R, r, SVGNames::rAttr.localName(), m_r.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy)
+ANIMATED_PROPERTY_DEFINITIONS(SVGCircleElement, SVGLength, Length, length, R, r, SVGNames::rAttr.localName(), m_r)
 
 void SVGCircleElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::cxAttr)
-        cxBaseValue()->setValueAsString(value);
+        setCxBaseValue(SVGLength(this, LengthModeWidth, value));       
     else if (attr->name() == SVGNames::cyAttr)
-        cyBaseValue()->setValueAsString(value);
+        setCyBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::rAttr)
-        rBaseValue()->setValueAsString(value);
+        setRBaseValue(SVGLength(this, LengthModeOther, value));
     else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
@@ -72,37 +72,21 @@ void SVGCircleElement::parseMappedAttribute(MappedAttribute* attr)
 
 Path SVGCircleElement::toPathData() const
 {
-    float _cx = cx()->value(), _cy = cy()->value();
-    float _r = r()->value();
-
-    return Path::createCircle(FloatPoint(_cx, _cy), _r);
-}
-
-const SVGStyledElement* SVGCircleElement::pushAttributeContext(const SVGStyledElement* context)
-{
-    // All attribute's contexts are equal (so just take the one from 'cx').
-    const SVGStyledElement* restore = cx()->context();
-
-    cx()->setContext(context);
-    cy()->setContext(context);
-    r()->setContext(context);
-    
-    SVGStyledElement::pushAttributeContext(context);
-    return restore;
+    return Path::createCircle(FloatPoint(cx().value(), cy().value()), r().value());
 }
 
 bool SVGCircleElement::hasPercentageValues() const
 {
-    if (cx()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        cy()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        r()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
+    if (cx().unitType() == LengthTypePercentage ||
+        cy().unitType() == LengthTypePercentage ||
+        r().unitType() == LengthTypePercentage)
         return true;
 
     return false;
 }
-
+  
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 27df376..4ed81aa 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGCircleElementImpl_H
-#define KSVG_SVGCircleElementImpl_H
+#ifndef SVGCircleElement_H
+#define SVGCircleElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -31,7 +32,6 @@
 
 namespace WebCore
 {
-    class SVGLength;
     class SVGCircleElement : public SVGStyledTransformableElement,
                              public SVGTests,
                              public SVGLangSpace,
@@ -49,24 +49,21 @@ namespace WebCore
         virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
         virtual Path toPathData() const;
 
-        virtual const SVGStyledElement* pushAttributeContext(const SVGStyledElement* context);
-
     protected:
         virtual const SVGElement* contextElement() const { return this; }
-
         virtual bool hasPercentageValues() const;
 
     private:
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength*, RefPtr<SVGLength>, Cx, cx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength*, RefPtr<SVGLength>, Cy, cy)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength*, RefPtr<SVGLength>, R, r)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength, SVGLength, Cx, cx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength, SVGLength, Cy, cy)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGCircleElement, SVGLength, SVGLength, R, r)
     };
 
 } // namespace WebCore
 
 #endif // SVG_SUPPORT
-#endif
+#endif // SVGCircleElement_H
 
 // vim:ts=4:noet
index a4b027e..a72229f 100644 (file)
@@ -1,6 +1,6 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGCursorElement.h"
 
@@ -40,8 +41,8 @@ SVGCursorElement::SVGCursorElement(const QualifiedName& tagName, Document *doc)
     , SVGExternalResourcesRequired()
     , SVGURIReference()
     , CachedResourceClient()
-    , m_x(new SVGLength(0, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(0, LM_HEIGHT, viewportElement()))
+    , m_x(0, LengthModeWidth)
+    , m_y(0, LengthModeHeight)
 {
     m_cachedImage = 0;
 }
@@ -52,16 +53,16 @@ SVGCursorElement::~SVGCursorElement()
         m_cachedImage->deref(this);
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGCursorElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGCursorElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGCursorElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGCursorElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
 
 void SVGCursorElement::parseMappedAttribute(MappedAttribute *attr)
 {
-     const AtomicString& value = attr->value();
+    const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(0, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(0, LengthModeHeight, value));
     else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
@@ -82,6 +83,6 @@ void SVGCursorElement::parseMappedAttribute(MappedAttribute *attr)
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index bd26694..852761b 100644 (file)
@@ -1,6 +1,6 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
-                  2004, 2005 Rob Buis <buis@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
+                  2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGCursorElementImpl_H
-#define KSVG_SVGCursorElementImpl_H
+#ifndef SVGCursorElement_H
+#define SVGCursorElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "Image.h"
 
+#include "SVGLength.h"
 #include "SVGElement.h"
 #include "SVGTests.h"
 #include "SVGURIReference.h"
@@ -34,8 +36,6 @@
 
 namespace WebCore
 {
-    class SVGLength;
-
     class SVGCursorElement : public SVGElement,
                                  public SVGTests,
                                  public SVGExternalResourcesRequired,
@@ -60,8 +60,8 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGURIReference, String, Href, href)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGLength*, RefPtr<SVGLength>, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGCursorElement, SVGLength, SVGLength, Y, y)
 
         CachedImage *m_cachedImage;
     };
index 7d6158b..43ebed3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGElement.h"
 
index 4c427eb..9ffb6c0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGEllipseElement.h"
 
@@ -36,10 +37,10 @@ SVGEllipseElement::SVGEllipseElement(const QualifiedName& tagName, Document* doc
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_cx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_cy(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_rx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_ry(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_cx(this, LengthModeWidth)
+    , m_cy(this, LengthModeHeight)
+    , m_rx(this, LengthModeWidth)
+    , m_ry(this, LengthModeHeight)
 {
 }    
 
@@ -47,22 +48,22 @@ SVGEllipseElement::~SVGEllipseElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength*, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength*, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength*, Length, length, Rx, rx, SVGNames::rxAttr.localName(), m_rx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength*, Length, length, Ry, ry, SVGNames::ryAttr.localName(), m_ry.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy)
+ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Rx, rx, SVGNames::rxAttr.localName(), m_rx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGEllipseElement, SVGLength, Length, length, Ry, ry, SVGNames::ryAttr.localName(), m_ry)
 
 void SVGEllipseElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::cxAttr)
-        cxBaseValue()->setValueAsString(value);
-    if (attr->name() == SVGNames::cyAttr)
-        cyBaseValue()->setValueAsString(value);
-    if (attr->name() == SVGNames::rxAttr)
-        rxBaseValue()->setValueAsString(value);
-    if (attr->name() == SVGNames::ryAttr)
-        ryBaseValue()->setValueAsString(value);
+        setCxBaseValue(SVGLength(this, LengthModeWidth, value));
+    else if (attr->name() == SVGNames::cyAttr)
+        setCyBaseValue(SVGLength(this, LengthModeHeight, value));
+    else if (attr->name() == SVGNames::rxAttr)
+        setRxBaseValue(SVGLength(this, LengthModeWidth, value));
+    else if (attr->name() == SVGNames::ryAttr)
+        setRyBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
@@ -76,39 +77,23 @@ void SVGEllipseElement::parseMappedAttribute(MappedAttribute* attr)
 
 Path SVGEllipseElement::toPathData() const
 {
-    float _cx = cx()->value(), _cy = cy()->value();
-    float _rx = rx()->value(), _ry = ry()->value();
-
-    return Path::createEllipse(FloatPoint(_cx, _cy), _rx, _ry);
-}
-
-const SVGStyledElement* SVGEllipseElement::pushAttributeContext(const SVGStyledElement* context)
-{
-    // All attribute's contexts are equal (so just take the one from 'cx').
-    const SVGStyledElement* restore = cx()->context();
-
-    cx()->setContext(context);
-    cy()->setContext(context);
-    rx()->setContext(context);
-    ry()->setContext(context);
-
-    SVGStyledElement::pushAttributeContext(context);
-    return restore;
+    return Path::createEllipse(FloatPoint(cx().value(), cy().value()),
+                               rx().value(), ry().value());
 }
 
 bool SVGEllipseElement::hasPercentageValues() const
 {
-    if (cx()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        cy()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        rx()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        ry()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
+    if (cx().unitType() == LengthTypePercentage ||
+        cy().unitType() == LengthTypePercentage ||
+        rx().unitType() == LengthTypePercentage ||
+        ry().unitType() == LengthTypePercentage)
         return true;
 
     return false;
 }
-
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 62d8e1e..6a16364 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGEllipseElementImpl_H
-#define KSVG_SVGEllipseElementImpl_H
+#ifndef SVGEllipseElement_H
+#define SVGEllipseElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -31,7 +32,6 @@
 
 namespace WebCore
 {
-    class SVGLength;
     class SVGEllipseElement : public SVGStyledTransformableElement,
                               public SVGTests,
                               public SVGLangSpace,
@@ -49,20 +49,17 @@ namespace WebCore
         virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
         virtual Path toPathData() const;
 
-        virtual const SVGStyledElement* pushAttributeContext(const SVGStyledElement* context);
-
     protected:
         virtual const SVGElement* contextElement() const { return this; }
-
         virtual bool hasPercentageValues() const;
 
     private:
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
  
-        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength*, RefPtr<SVGLength>, Cx, cx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength*, RefPtr<SVGLength>, Cy, cy)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength*, RefPtr<SVGLength>, Rx, rx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength*, RefPtr<SVGLength>, Ry, ry)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength, SVGLength, Cx, cx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength, SVGLength, Cy, cy)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength, SVGLength, Rx, rx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGEllipseElement, SVGLength, SVGLength, Ry, ry)
     };
 
 } // namespace WebCore
index 5ab6736..9eac895 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
     Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
     Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 
@@ -43,21 +43,20 @@ SVGFilterElement::SVGFilterElement(const QualifiedName& tagName, Document* doc)
     , SVGExternalResourcesRequired()
     , m_filterUnits(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
     , m_primitiveUnits(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE)
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
     , m_filterResX(0)
     , m_filterResY(0)
-
 {
     // Spec: If the attribute is not specified, the effect is as if a value of "-10%" were specified.
-    m_x->setValueAsString("-10%");
-    m_y->setValueAsString("-10%");
-
+    setXBaseValue(SVGLength(this, LengthModeWidth, "-10%"));
+    setYBaseValue(SVGLength(this, LengthModeHeight, "-10%"));
     // Spec: If the attribute is not specified, the effect is as if a value of "120%" were specified.
-    m_width->setValueAsString("120%");
-    m_height->setValueAsString("120%");
+    setWidthBaseValue(SVGLength(this, LengthModeWidth, "120%"));
+    setHeightBaseValue(SVGLength(this, LengthModeHeight, "120%"));
 }
 
 SVGFilterElement::~SVGFilterElement()
@@ -66,10 +65,10 @@ SVGFilterElement::~SVGFilterElement()
 
 ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, int, Enumeration, enumeration, FilterUnits, filterUnits, SVGNames::filterUnitsAttr.localName(), m_filterUnits)
 ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, int, Enumeration, enumeration, PrimitiveUnits, primitiveUnits, SVGNames::primitiveUnitsAttr.localName(), m_primitiveUnits)
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, long, Integer, integer, FilterResX, filterResX, "filterResX", m_filterResX)
 ANIMATED_PROPERTY_DEFINITIONS(SVGFilterElement, long, Integer, integer, FilterResY, filterResY, "filterResY", m_filterResY)
 
@@ -91,13 +90,13 @@ void SVGFilterElement::parseMappedAttribute(MappedAttribute* attr)
         else if (value == "objectBoundingBox")
             setPrimitiveUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
     } else if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGURIReference::parseMappedAttribute(attr)) return;
         if (SVGLangSpace::parseMappedAttribute(attr)) return;
@@ -117,13 +116,31 @@ SVGResource* SVGFilterElement::canvasResource()
 
     bool filterBBoxMode = filterUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
     m_filter->setFilterBoundingBoxMode(filterBBoxMode);
-    
-    x()->setBboxRelative(filterBBoxMode);
-    y()->setBboxRelative(filterBBoxMode);
-    width()->setBboxRelative(filterBBoxMode);
-    height()->setBboxRelative(filterBBoxMode);
-    m_filter->setFilterRect(FloatRect(x()->value(), y()->value(), width()->value(), height()->value()));
-    
+
+    float _x, _y, w, h;
+
+    if (filterBBoxMode && x().unitType() == LengthTypePercentage)
+        _x = x().valueInSpecifiedUnits() / 100.0;
+    else
+        _x = x().value();
+
+    if (filterBBoxMode && y().unitType() == LengthTypePercentage)
+        _y = y().valueInSpecifiedUnits() / 100.0;
+    else
+        _y = y().value();
+
+    if (filterBBoxMode && width().unitType() == LengthTypePercentage)
+        w = width().valueInSpecifiedUnits() / 100.0;
+    else
+        w = width().value();
+
+    if (filterBBoxMode && height().unitType() == LengthTypePercentage)
+        h = height().valueInSpecifiedUnits() / 100.0;
+    else
+        h = height().value();
+
+    m_filter->setFilterRect(FloatRect(_x, _y, w, h));
+
     bool primitiveBBoxMode = primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
     m_filter->setEffectBoundingBoxMode(primitiveBBoxMode);
     // FIXME: When does this info get passed to the filters elements?
@@ -143,6 +160,6 @@ SVGResource* SVGFilterElement::canvasResource()
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index b3da062..c8369a4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
     Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
     Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 
@@ -21,8 +21,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGFilterElementImpl_H
-#define KSVG_SVGFilterElementImpl_H
+#ifndef SVGFilterElement_H
+#define SVGFilterElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGResourceFilter.h"
@@ -59,10 +60,10 @@ namespace WebCore {
  
         ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, int, int, FilterUnits, filterUnits)
         ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, int, int, PrimitiveUnits, primitiveUnits)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, SVGLength, SVGLength, Height, height)
         ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, long, long, FilterResX, filterResX)
         ANIMATED_PROPERTY_DECLARATIONS(SVGFilterElement, long, long, FilterResY, filterResY)
 
index 1257b9f..499513b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGFilterPrimitiveStandardAttributes.h"
 
@@ -35,37 +36,37 @@ namespace WebCore {
 
 SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes(const QualifiedName& tagName, Document* doc)
     : SVGStyledElement(tagName, doc)
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
 {
-    // Spec : If the attribute is not specified, the effect is as if a value of "100%" were specified.
-    m_width->setValueAsString("100%");
-    m_height->setValueAsString("100%");
+    // Spec: If the attribute is not specified, the effect is as if a value of "100%" were specified.
+    setWidthBaseValue(SVGLength(this, LengthModeWidth, "100%"));
+    setHeightBaseValue(SVGLength(this, LengthModeHeight, "100%"));
 }
 
 SVGFilterPrimitiveStandardAttributes::~SVGFilterPrimitiveStandardAttributes()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 ANIMATED_PROPERTY_DEFINITIONS(SVGFilterPrimitiveStandardAttributes, String, String, string, Result, result, SVGNames::resultAttr.localName(), m_result)
 
 void SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::resultAttr)
         setResultBaseValue(value);
     else
@@ -77,26 +78,31 @@ void SVGFilterPrimitiveStandardAttributes::setStandardAttributes(SVGFilterEffect
     ASSERT(filterEffect);
     if (!filterEffect)
         return;
+
     bool bbox = false;
     if (parentNode() && parentNode()->hasTagName(SVGNames::filterTag))
         bbox = static_cast<SVGFilterElement*>(parentNode())->primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
 
-    x()->setBboxRelative(bbox);
-    y()->setBboxRelative(bbox);
-    width()->setBboxRelative(bbox);
-    height()->setBboxRelative(bbox);
-    float _x = x()->value(), _y = y()->value();
-    float _width = width()->value(), _height = height()->value();
-    if (bbox)
-        filterEffect->setSubRegion(FloatRect(_x * 100.f, _y * 100.f, _width * 100.f, _height * 100.f));
-    else
-        filterEffect->setSubRegion(FloatRect(_x, _y, _width, _height));
-
+    float _x, _y, _width, _height;
+  
+    if (bbox) {
+        _x = x().valueInSpecifiedUnits();
+        _y = y().valueInSpecifiedUnits();
+        _width = width().valueInSpecifiedUnits();
+        _height = height().valueInSpecifiedUnits();
+    } else {
+        _x = x().value();
+        _y = y().value();
+        _width = width().value();
+        _height = height().value();
+    } 
+    
+    filterEffect->setSubRegion(FloatRect(_x, _y, _width, _height));
     filterEffect->setResult(result());
 }
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index bb9efe6..d770899 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGFilterPrimitiveStandardAttributesImpl_H
-#define KSVG_SVGFilterPrimitiveStandardAttributesImpl_H
+#ifndef SVGFilterPrimitiveStandardAttributes_H
+#define SVGFilterPrimitiveStandardAttributes_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGStyledElement.h"
 
 namespace WebCore {
     class SVGFilterEffect;
-    class SVGLength;
 
     class SVGFilterPrimitiveStandardAttributes : public SVGStyledElement
     {
@@ -50,10 +50,10 @@ namespace WebCore {
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, SVGLength, SVGLength, Height, height)
         ANIMATED_PROPERTY_DECLARATIONS(SVGFilterPrimitiveStandardAttributes, String, String, Result, result)
     };
 
index c4c265d..4609b72 100644 (file)
@@ -74,7 +74,7 @@ void SVGFitToViewBox::parseViewBox(const String& str)
     
     if (p < end) // nothing should come after the last, fourth number
         goto bail_out;
-
+    
     setViewBoxBaseValue(FloatRect(x, y, w, h));
     return;
 
index abeac27..1d09006 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 
 #include "SVGForeignObjectElement.h"
@@ -40,10 +41,10 @@ SVGForeignObjectElement::SVGForeignObjectElement(const QualifiedName& tagName, D
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
 {
 }
 
@@ -51,23 +52,23 @@ SVGForeignObjectElement::~SVGForeignObjectElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGForeignObjectElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 
 void SVGForeignObjectElement::parseMappedAttribute(MappedAttribute *attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr) {
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
         addCSSProperty(attr, CSS_PROP_WIDTH, value);
     } else if (attr->name() == SVGNames::heightAttr) {
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
         addCSSProperty(attr, CSS_PROP_HEIGHT, value);
     } else {
         if (SVGTests::parseMappedAttribute(attr))
@@ -80,12 +81,12 @@ void SVGForeignObjectElement::parseMappedAttribute(MappedAttribute *attr)
     }
 }
 
-RenderObject *SVGForeignObjectElement::createRenderer(RenderArena *arena, RenderStyle *style)
+RenderObject* SVGForeignObjectElement::createRenderer(RenderArena* arena, RenderStyle* style)
 {
     return new (arena) RenderForeignObject(this);
 }
 
-bool SVGForeignObjectElement::childShouldCreateRenderer(Node *child) const
+bool SVGForeignObjectElement::childShouldCreateRenderer(Nodechild) const
 {
     // Skip over SVG rules which disallow non-SVG kids
     return StyledElement::childShouldCreateRenderer(child);
@@ -93,6 +94,6 @@ bool SVGForeignObjectElement::childShouldCreateRenderer(Node *child) const
 
 } // namespace WebCore
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 56da112..8e29d4b 100644 (file)
@@ -19,8 +19,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGForeignObjectElementImpl_H
-#define KSVG_SVGForeignObjectElementImpl_H
+#ifndef SVGForeignObjectElement_H
+#define SVGForeignObjectElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGTests.h"
@@ -45,11 +46,11 @@ namespace WebCore
         virtual ~SVGForeignObjectElement();
         
         virtual bool isValid() const { return SVGTests::isValid(); }
-        virtual void parseMappedAttribute(MappedAttribute *attr);
+        virtual void parseMappedAttribute(MappedAttribute*);
 
-        virtual bool rendererIsNeeded(RenderStyle *style) { return StyledElement::rendererIsNeeded(style); }
-        bool childShouldCreateRenderer(Node *child) const;
-        virtual RenderObject *createRenderer(RenderArena *arena, RenderStyle *style);
+        virtual bool rendererIsNeeded(RenderStylestyle) { return StyledElement::rendererIsNeeded(style); }
+        bool childShouldCreateRenderer(Node*) const;
+        virtual RenderObject* createRenderer(RenderArena* arena, RenderStyle* style);
 
     protected:
         virtual const SVGElement* contextElement() const { return this; }
@@ -58,10 +59,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired) 
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGURIReference, String, Href, href)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGForeignObjectElement, SVGLength, SVGLength, Height, height)
     };
 
 } // namespace WebCore
index 2d2ef2a..608c0d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGHelper.h"
 
@@ -36,47 +37,7 @@ using namespace std;
 
 namespace WebCore {
 
-float SVGHelper::PercentageOfViewport(float value, const SVGElement* viewportElement, LengthMode mode)
-{
-    float width = 0, height = 0;
-    if (!viewportElement)
-        return 0.0;
-    if (viewportElement->isSVG()) {
-        const SVGSVGElement* svg = static_cast<const SVGSVGElement*>(viewportElement);
-        if (svg->hasAttribute(SVGNames::viewBoxAttr)) {
-            width = svg->viewBox().width();
-            height = svg->viewBox().height();
-        } else if (svg->width()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-                svg->height()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE) {
-            // TODO: Shouldn't w/h be multiplied with the percentage values?!
-            // AFAIK, this assumes width & height == 100%, Rob??
-            Document *doc = svg->document();
-            if (doc->documentElement() == svg) {
-                // We have to ask the canvas for the full "canvas size"...
-                RenderView* view = static_cast<RenderView *>(doc->renderer());
-                if (view) {
-                    width = view->frameView()->visibleWidth(); // TODO: recheck!
-                    height = view->frameView()->visibleHeight(); // TODO: recheck!
-                }
-            }
-        } else {
-            width = svg->width()->value();
-            height = svg->height()->value();
-        }
-    }
-
-    if (mode == LM_WIDTH)
-        return value * width;
-    else if (mode == LM_HEIGHT)
-        return value * height;
-    else if (mode == LM_OTHER)
-        return value * sqrt(pow(double(width), 2) + pow(double(height), 2)) / sqrt(2.0);
-    
-    return 0.0;
-}
-
-void SVGHelper::parseSeparatedList(SVGStringList *list, const String& data, UChar delimiter)
+void SVGHelper::parseSeparatedList(SVGStringList* list, const String& data, UChar delimiter)
 {
     // TODO : more error checking/reporting
     ExceptionCode ec = 0;
@@ -91,6 +52,6 @@ void SVGHelper::parseSeparatedList(SVGStringList *list, const String& data, UCha
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 80c0b77..dbf4fd9 100644 (file)
@@ -24,6 +24,7 @@
 #define KSVG_SVGHelper_H
 #ifdef SVG_SUPPORT
 
+#include "SVGLength.h"
 #include "PlatformString.h"
 
 namespace WebCore {
@@ -32,18 +33,9 @@ namespace WebCore {
     class SVGStringList;
 
     // KSVG extension
-    enum LengthMode {
-        LM_UNKNOWN = 0,
-        LM_WIDTH,
-        LM_HEIGHT,
-        LM_OTHER
-    };
-
     class SVGHelper {
     public:
-        static float PercentageOfViewport(float value, const SVGElement *viewportElement, LengthMode mode);
-
-        static void parseSeparatedList(SVGStringList *list, const String &data, UChar delimiter = ',');
+        static void parseSeparatedList(SVGStringList* list, const String& data, UChar delimiter = ',');
     };
 
     // Lazy creation, template-based
index 6fd8620..1d8b437 100644 (file)
@@ -1,7 +1,7 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
-                  2006       Alexander Kellett <lypanov@kde.org>
+                  2006 Alexander Kellett <lypanov@kde.org>
 
     This file is part of the KDE project
 
@@ -22,6 +22,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGImageElement.h"
 
@@ -45,10 +46,10 @@ SVGImageElement::SVGImageElement(const QualifiedName& tagName, Document* doc)
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
     , SVGURIReference()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
     , m_preserveAspectRatio(new SVGPreserveAspectRatio(this))
     , m_imageLoader(this)
 {
@@ -58,26 +59,26 @@ SVGImageElement::~SVGImageElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 ANIMATED_PROPERTY_DEFINITIONS(SVGImageElement, SVGPreserveAspectRatio*, PreserveAspectRatio, preserveAspectRatio, PreserveAspectRatio, preserveAspectRatio, SVGNames::preserveAspectRatioAttr.localName(), m_preserveAspectRatio.get())
 
 void SVGImageElement::parseMappedAttribute(MappedAttribute *attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::preserveAspectRatioAttr)
         preserveAspectRatioBaseValue()->parsePreserveAspectRatio(value.impl());
     else if (attr->name() == SVGNames::widthAttr) {
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
         addCSSProperty(attr, CSS_PROP_WIDTH, value);
     } else if (attr->name() == SVGNames::heightAttr) {
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
         addCSSProperty(attr, CSS_PROP_HEIGHT, value);
     } else {
         if (SVGTests::parseMappedAttribute(attr))
@@ -114,6 +115,6 @@ void SVGImageElement::attach()
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 48a8fce..1389dac 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGImageElementImpl_H
-#define KSVG_SVGImageElementImpl_H
+#ifndef SVGImageElement_H
+#define SVGImageElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -66,10 +67,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired) 
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGURIReference, String, Href, href)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGLength, SVGLength, Height, height)
         ANIMATED_PROPERTY_DECLARATIONS(SVGImageElement, SVGPreserveAspectRatio*, RefPtr<SVGPreserveAspectRatio>, PreserveAspectRatio, preserveAspectRatio)
 
         SVGImageLoader m_imageLoader;
index c1b2c0e..1a7b393 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGLength.h"
 
-#include "IntRect.h"
-#include "RenderPath.h"
-#include "SVGElement.h"
-#include "SVGLength.h"
+#include "DeprecatedString.h"
+#include "FrameView.h"
+#include "RenderObject.h"
+#include "RenderView.h"
+#include "SVGHelper.h"
 #include "SVGSVGElement.h"
+#include "SVGStyledElement.h"
 #include "svgpathparser.h"
-#include <math.h>
 
-using namespace std;
+#include <wtf/Assertions.h>
+
+namespace WebCore {
 
-// keep track of textual description of the unit type
-static const char* UnitText[] =
+// Helper functions
+inline unsigned int storeUnit(SVGLengthMode mode, SVGLengthType type)
 {
-    "", "",
-    "%", "em",
-    "ex", "px",
-    "cm", "mm",
-    "in", "pt",
-    "pc"
-};
+    return (mode << 4) | type;
+}
 
-namespace WebCore {
+inline SVGLengthMode extractMode(unsigned int unit)
+{
+    unsigned int mode = unit >> 4;    
+    return static_cast<SVGLengthMode>(mode);
+}
 
-SVGLength::SVGLength(const SVGStyledElement* context, LengthMode mode, const SVGElement* viewport)
-    : Shared<SVGLength>()
-    , m_value(0)
-    , m_valueInSpecifiedUnits(0)
-    , m_mode(mode)
-    , m_bboxRelative(false)
-    , m_unitType(SVG_LENGTHTYPE_UNKNOWN)
-    , m_requiresLayout(false)
-    , m_context(context)
-    , m_viewportElement(viewport)
+inline SVGLengthType extractType(unsigned int unit)
 {
+    unsigned int mode = unit >> 4;
+    unsigned int type = unit ^ (mode << 4);
+    return static_cast<SVGLengthType>(type);
 }
 
-SVGLength::~SVGLength()
+inline String lengthTypeToString(SVGLengthType type)
 {
+    switch (type) {
+    case LengthTypeUnknown:
+    case LengthTypeNumber:
+        return "";    
+    case LengthTypePercentage:
+        return "%";
+    case LengthTypeEMS:
+        return "em";
+    case LengthTypeEXS:
+        return "ex";
+    case LengthTypePX:
+        return "px";
+    case LengthTypeCM:
+        return "cm";
+    case LengthTypeMM:
+        return "mm";
+    case LengthTypeIN:
+        return "in";
+    case LengthTypePT:
+        return "pt";
+    case LengthTypePC:
+        return "pc";
+    }
+
+    return String();
 }
 
-SVGLength::SVGLengthType SVGLength::unitType() const
+inline SVGLengthType stringToLengthType(const String& string)
 {
-    return m_unitType;
+    if (string.endsWith("%"))
+        return LengthTypePercentage;
+    else if (string.endsWith("em"))
+        return LengthTypeEMS;
+    else if (string.endsWith("ex"))
+        return LengthTypeEXS;
+    else if (string.endsWith("px"))
+        return LengthTypePX;
+    else if (string.endsWith("cm"))
+        return LengthTypeCM;
+    else if (string.endsWith("mm"))
+        return LengthTypeMM;
+    else if (string.endsWith("in"))
+        return LengthTypeIN;
+    else if (string.endsWith("pt"))
+        return LengthTypePT;
+    else if (string.endsWith("pc"))
+        return LengthTypePC;
+    else if (!string.isEmpty())
+        return LengthTypeNumber;
+
+    return LengthTypeUnknown;
 }
 
-void SVGLength::setValue(float value)
+SVGLength::SVGLength(const SVGStyledElement* context, SVGLengthMode mode, const String& valueAsString)
+    : m_valueInSpecifiedUnits(0.0)
+    , m_unit(storeUnit(mode, LengthTypeNumber))
+    , m_context(context)
 {
-    m_value = value;
-    updateValueInSpecifiedUnits();
+    setValueAsString(valueAsString);
+}
+
+SVGLengthType SVGLength::unitType() const
+{
+    return extractType(m_unit);
 }
 
 float SVGLength::value() const
 {
-    if (m_requiresLayout)
-        const_cast<SVGLength*>(this)->updateValue(false);
+    SVGLengthType type = extractType(m_unit);
+    if (type == LengthTypeUnknown)
+        return 0.0;
+
+    switch (type) {
+    case LengthTypeNumber:
+        return m_valueInSpecifiedUnits;
+    case LengthTypePercentage:
+        return SVGLength::PercentageOfViewport(m_valueInSpecifiedUnits / 100.0, m_context, extractMode(m_unit));
+    case LengthTypeEMS:
+    case LengthTypeEXS:
+    {
+        RenderStyle* style = 0;
+        if (m_context && m_context->renderer())
+            style = m_context->renderer()->style();
+        if (style) {
+            float useSize = style->fontSize();
+            ASSERT(useSize > 0);
+            if (type == LengthTypeEMS)
+                return m_valueInSpecifiedUnits * useSize;
+            else {
+                float xHeight = style->font().xHeight();
+                // Use of ceil allows a pixel match to the W3Cs expected output of coords-units-03-b.svg
+                // if this causes problems in real world cases maybe it would be best to remove this
+                return m_valueInSpecifiedUnits * ceil(xHeight);
+            }
+        }
+        return 0.0;
+    }
+    case LengthTypePX:
+        return m_valueInSpecifiedUnits;
+    case LengthTypeCM:
+        return m_valueInSpecifiedUnits / 2.54 * dpi();
+    case LengthTypeMM:
+        return m_valueInSpecifiedUnits / 25.4 * dpi();
+    case LengthTypeIN:
+        return m_valueInSpecifiedUnits * dpi();
+    case LengthTypePT:
+        return m_valueInSpecifiedUnits / 72.0 * dpi();
+    case LengthTypePC:
+        return m_valueInSpecifiedUnits / 6.0 * dpi();
+    default:
+        break;
+    }
 
-    if (m_unitType != SVG_LENGTHTYPE_PERCENTAGE)
-        return m_value;
+    ASSERT_NOT_REACHED();
+    return 0.0;
+}
 
-    float value = m_valueInSpecifiedUnits / 100.0;
-    if (m_bboxRelative)
-        return value;
+void SVGLength::setValue(float value)
+{
+    SVGLengthType type = extractType(m_unit);
+    ASSERT(type != LengthTypeUnknown);
+
+    switch (type) {
+    case LengthTypeNumber:
+        m_valueInSpecifiedUnits = value;
+        break;
+    case LengthTypePercentage:
+    case LengthTypeEMS:
+    case LengthTypeEXS:
+        ASSERT_NOT_REACHED();
+        break;
+    case LengthTypePX:
+        m_valueInSpecifiedUnits = value;
+        break;
+    case LengthTypeCM:
+        m_valueInSpecifiedUnits = value * 2.54 / dpi();
+        break;
+    case LengthTypeMM:
+        m_valueInSpecifiedUnits = value * 25.4 / dpi();
+        break;
+    case LengthTypeIN:
+        m_valueInSpecifiedUnits = value / dpi();
+        break;
+    case LengthTypePT:
+        m_valueInSpecifiedUnits = value * 72.0 / dpi();
+        break;
+    case LengthTypePC:
+        m_valueInSpecifiedUnits = value / 6.0 * dpi();
+        break;
+    default:
+        break;
+    }
 
-    // Use the manual override "m_viewportElement" when there is no context element off of which to establish the viewport.
-    return SVGHelper::PercentageOfViewport(value, m_context ? m_context->viewportElement() : m_viewportElement, static_cast<LengthMode>(m_mode));
+    if (m_context && m_context->ownerDocument()->documentElement() != m_context)
+        m_context->notifyAttributeChange();
 }
 
-void SVGLength::setValueInSpecifiedUnits(float valueInSpecifiedUnits)
+void SVGLength::setValueInSpecifiedUnits(float value)
 {
-    m_valueInSpecifiedUnits = valueInSpecifiedUnits;
-    updateValue();
+    m_valueInSpecifiedUnits = value;
+
+    if (m_context && m_context->ownerDocument()->documentElement() != m_context)    
+        m_context->notifyAttributeChange();
 }
 
 float SVGLength::valueInSpecifiedUnits() const
@@ -107,71 +234,51 @@ void SVGLength::setValueAsString(const String& s)
     if (s.isEmpty())
         return;
 
-    DeprecatedString valueAsQString = s.deprecatedString();
-
     double convertedNumber = 0;
-    const char* start = valueAsQString.latin1();
-    const char* end = parseCoord(start, convertedNumber);
+    DeprecatedString depString = s.deprecatedString();
+    const char* start = depString.latin1();
+    parseCoord(start, convertedNumber);
+    
+    m_unit = storeUnit(extractMode(m_unit), stringToLengthType(s));
     m_valueInSpecifiedUnits = convertedNumber;
-
-    unsigned int diff = end - start;
-    if (diff < valueAsQString.length()) {
-        if (s.endsWith(UnitText[SVG_LENGTHTYPE_PX]))
-            m_unitType = SVG_LENGTHTYPE_PX;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_CM]))
-            m_unitType = SVG_LENGTHTYPE_CM;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PC]))
-            m_unitType = SVG_LENGTHTYPE_PC;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_MM]))
-            m_unitType = SVG_LENGTHTYPE_MM;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_IN]))
-            m_unitType = SVG_LENGTHTYPE_IN;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PT]))
-            m_unitType = SVG_LENGTHTYPE_PT;
-         else if (s.endsWith(UnitText[SVG_LENGTHTYPE_PERCENTAGE]))
-            m_unitType = SVG_LENGTHTYPE_PERCENTAGE;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_EMS]))
-            m_unitType = SVG_LENGTHTYPE_EMS;
-        else if (s.endsWith(UnitText[SVG_LENGTHTYPE_EXS]))
-            m_unitType = SVG_LENGTHTYPE_EXS;
-        else if (s.isEmpty())
-            m_unitType = SVG_LENGTHTYPE_NUMBER;
-        else
-            m_unitType = SVG_LENGTHTYPE_UNKNOWN;
-    }
-    else
-        m_unitType = SVG_LENGTHTYPE_PX;
-
-    updateValue();
 }
 
 String SVGLength::valueAsString() const
 {
-    return String::number(m_valueInSpecifiedUnits) + UnitText[m_unitType];
+    return String::number(m_valueInSpecifiedUnits) + lengthTypeToString(extractType(m_unit));
+}
+
+void SVGLength::newValueSpecifiedUnits(unsigned short type, float value)
+{
+    ASSERT(type <= LengthTypePC);
+
+    m_unit = storeUnit(extractMode(m_unit), (SVGLengthType) type);
+    m_valueInSpecifiedUnits = value;
 }
 
-void SVGLength::newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits)
+void SVGLength::convertToSpecifiedUnits(unsigned short type)
 {
-    m_valueInSpecifiedUnits = valueInSpecifiedUnits;
-    m_unitType = (SVGLengthType)unitType;
-    updateValue();
+    ASSERT(type <= LengthTypePC);
+
+    float valueInUserUnits = value();
+    m_unit = storeUnit(extractMode(m_unit), (SVGLengthType) type);
+    setValue(valueInUserUnits);
 }
 
-void SVGLength::convertToSpecifiedUnits(unsigned short unitType)
+bool SVGLength::isFraction(const SVGLength& length)
 {
-    m_unitType = (SVGLengthType)unitType;
-    updateValueInSpecifiedUnits();
+    return (length.unitType() == LengthTypeNumber && length.value() >= 0 && length.value() <= 1);
 }
 
 double SVGLength::dpi() const
 {
     /* FIXME: DPI detection
     if (context && context->ownerDoc()) {
-        if (mode == LM_WIDTH)
+        if (mode == LengthModeWidth)
             return 25.4 * context->ownerDoc()->screenPixelsPerMillimeterX();
-        else if (mode == LM_HEIGHT)
+        else if (mode == LengthModeHeight)
             return 25.4 * context->ownerDoc()->screenPixelsPerMillimeterY();
-        else if (mode == LM_OTHER)
+        else if (mode == LengthModeOther)
             return 25.4 * context->ownerDoc()->screenPixelsPerMillimeterX();
     }
     */
@@ -179,126 +286,44 @@ double SVGLength::dpi() const
     return 90.0;
 }
 
-void SVGLength::updateValue(bool notify)
+float SVGLength::PercentageOfViewport(float value, const SVGStyledElement* context, SVGLengthMode mode)
 {
-    switch (m_unitType) {
-        case SVG_LENGTHTYPE_PX:
-            m_value = m_valueInSpecifiedUnits;
-            break;
-        case SVG_LENGTHTYPE_CM:
-            m_value = (m_valueInSpecifiedUnits / 2.54) * dpi();
-            break;
-        case SVG_LENGTHTYPE_MM:
-            m_value = (m_valueInSpecifiedUnits / 25.4) * dpi();
-            break;
-        case SVG_LENGTHTYPE_IN:
-            m_value = m_valueInSpecifiedUnits * dpi();
-            break;
-        case SVG_LENGTHTYPE_PT:
-            m_value = (m_valueInSpecifiedUnits / 72.0) * dpi();
-            break;
-        case SVG_LENGTHTYPE_PC:
-            m_value = (m_valueInSpecifiedUnits / 6.0) * dpi();
-            break;
-        case SVG_LENGTHTYPE_EMS:
-        case SVG_LENGTHTYPE_EXS: {
-            RenderStyle* style = 0;
-            if (m_context && m_context->renderer())
-                style = m_context->renderer()->style();
-            else if (m_viewportElement && m_viewportElement->renderer())
-                style = m_viewportElement->renderer()->style();
-            if (style) {
-                float useSize = style->fontSize();
-                ASSERT(useSize > 0);
-                if (m_unitType == SVG_LENGTHTYPE_EMS)
-                    m_value = m_valueInSpecifiedUnits * useSize;
-                else {
-                    float xHeight = style->font().xHeight();
-                    // Use of ceil allows a pixel match to the W3Cs expected output of coords-units-03-b.svg
-                    // if this causes problems in real world cases maybe it would be best to remove this
-                    m_value = m_valueInSpecifiedUnits * ceil(xHeight);
-                }
-                m_requiresLayout = false;
-            } else {
-                m_requiresLayout = true;
-            }
-            break;
+    ASSERT(context);
+
+    float width = 0, height = 0;
+    SVGElement* viewportElement = context->viewportElement();
+
+    Document* doc = context->document();
+    if (doc->documentElement() == context) {
+        // We have to ask the canvas for the full "canvas size"...
+        RenderView* view = static_cast<RenderView*>(doc->renderer());
+        if (view) {
+            width = view->frameView()->visibleWidth(); // TODO: recheck!
+            height = view->frameView()->visibleHeight(); // TODO: recheck!
+         }
+    } else if (viewportElement && viewportElement->isSVG()) {
+        const SVGSVGElement* svg = static_cast<const SVGSVGElement*>(viewportElement);
+        if (svg->hasAttribute(SVGNames::viewBoxAttr)) {
+            width = svg->viewBox().width();
+            height = svg->viewBox().height();
+        } else {
+            width = svg->width().value();
+            height = svg->height().value();
         }
-        case SVG_LENGTHTYPE_UNKNOWN:
-        case SVG_LENGTHTYPE_NUMBER:
-        case SVG_LENGTHTYPE_PERCENTAGE:
-            break;
     }
-    if (notify && m_context)
-        m_context->notifyAttributeChange();
-}
-
-bool SVGLength::updateValueInSpecifiedUnits(bool notify)
-{
-    if (m_unitType == SVG_LENGTHTYPE_UNKNOWN)
-        return false;
-
-    switch (m_unitType) {
-        case SVG_LENGTHTYPE_PERCENTAGE:
-            //kdError() << "updateValueInSpecifiedUnits() SVG_LENGTHTYPE_PERCENTAGE - UNSUPPORTED! Please report!" << endl;
-            return false;
-        case SVG_LENGTHTYPE_EMS:
-            //kdError() << "updateValueInSpecifiedUnits() SVG_LENGTHTYPE_EMS - UNSUPPORTED! Please report!" << endl;
-            return false;
-        case SVG_LENGTHTYPE_EXS:
-            //kdError() << "updateValueInSpecifiedUnits() SVG_LENGTHTYPE_EXS - UNSUPPORTED! Please report!" << endl;
-            return false;
-        case SVG_LENGTHTYPE_PX:
-            m_valueInSpecifiedUnits = m_value;
-            break;
-        case SVG_LENGTHTYPE_CM:
-            m_valueInSpecifiedUnits = m_value / dpi() * 2.54;
-            break;
-        case SVG_LENGTHTYPE_MM:
-            m_valueInSpecifiedUnits = m_value / dpi() * 25.4;
-            break;
-        case SVG_LENGTHTYPE_IN:
-            m_valueInSpecifiedUnits = m_value / dpi();
-            break;
-        case SVG_LENGTHTYPE_PT:
-            m_valueInSpecifiedUnits = m_value / dpi() * 72.0;
-            break;
-        case SVG_LENGTHTYPE_PC:
-            m_valueInSpecifiedUnits = m_value / dpi() * 6.0;
-            break;
-        case SVG_LENGTHTYPE_UNKNOWN:
-        case SVG_LENGTHTYPE_NUMBER:
-            break;
-    };
-    
-    if (notify && m_context)
-        m_context->notifyAttributeChange();
-
-    return true;
-}
-
-bool SVGLength::bboxRelative() const
-{
-    return m_bboxRelative;
-}
-
-void SVGLength::setBboxRelative(bool relative)
-{
-    m_bboxRelative = relative;
-}
 
-const SVGStyledElement* SVGLength::context() const
-{
-    return m_context;
-}
+    if (mode == LengthModeWidth)
+        return value * width;
+    else if (mode == LengthModeHeight)
+        return value * height;
+    else if (mode == LengthModeOther)
+        return value * sqrt(pow(double(width), 2) + pow(double(height), 2)) / sqrt(2.0);
 
-void SVGLength::setContext(const SVGStyledElement* context)
-{
-    m_context = context;
+    return 0.0;
 }
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 9b754dd..4204ae5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGLengthImpl_H
-#define KSVG_SVGLengthImpl_H
+#ifndef SVGLength_H
+#define SVGLength_H
+
 #ifdef SVG_SUPPORT
 
 #include "PlatformString.h"
-#include "SVGHelper.h"
 
 namespace WebCore {
 
-    class RenderPath;
-    class SVGElement;
     class SVGStyledElement;
 
-    class SVGLength : public Shared<SVGLength> {
+    enum SVGLengthType {
+        LengthTypeUnknown = 0,
+        LengthTypeNumber = 1,
+        LengthTypePercentage = 2,
+        LengthTypeEMS = 3,
+        LengthTypeEXS = 4,
+        LengthTypePX = 5,
+        LengthTypeCM = 6,
+        LengthTypeMM = 7,
+        LengthTypeIN = 8,
+        LengthTypePT = 9,
+        LengthTypePC = 10
+    };
+
+    enum SVGLengthMode {
+        LengthModeWidth = 0,
+        LengthModeHeight,
+        LengthModeOther
+    };
+
+    class SVGLength {
     public:
-        SVGLength(const SVGStyledElement* context, LengthMode mode = LM_UNKNOWN, const SVGElement* viewport = 0);
-        virtual ~SVGLength();
-        
-        enum SVGLengthType {
-            SVG_LENGTHTYPE_UNKNOWN          = 0,
-            SVG_LENGTHTYPE_NUMBER           = 1,
-            SVG_LENGTHTYPE_PERCENTAGE       = 2,
-            SVG_LENGTHTYPE_EMS              = 3,
-            SVG_LENGTHTYPE_EXS              = 4,
-            SVG_LENGTHTYPE_PX               = 5,
-            SVG_LENGTHTYPE_CM               = 6,
-            SVG_LENGTHTYPE_MM               = 7,
-            SVG_LENGTHTYPE_IN               = 8,
-            SVG_LENGTHTYPE_PT               = 9,
-            SVG_LENGTHTYPE_PC               = 10
+        // Forward declare these enums in the w3c naming scheme, for IDL generation
+        enum {
+            SVG_LENGTHTYPE_UNKNOWN = LengthTypeUnknown,
+            SVG_LENGTHTYPE_NUMBER = LengthTypeNumber,
+            SVG_LENGTHTYPE_PERCENTAGE = LengthTypePercentage,
+            SVG_LENGTHTYPE_EMS = LengthTypeEMS,
+            SVG_LENGTHTYPE_EXS = LengthTypeEXS,
+            SVG_LENGTHTYPE_PX = LengthTypePX,
+            SVG_LENGTHTYPE_CM = LengthTypeCM,
+            SVG_LENGTHTYPE_MM = LengthTypeMM,
+            SVG_LENGTHTYPE_IN = LengthTypeIN,
+            SVG_LENGTHTYPE_PT = LengthTypePT,
+            SVG_LENGTHTYPE_PC = LengthTypePC
         };
 
+        SVGLength(const SVGStyledElement* context = 0, SVGLengthMode mode = LengthModeOther, const String& valueAsString = String());
+
         // 'SVGLength' functions
         SVGLengthType unitType() const;
 
         float value() const;
-        void setValue(float value);
+        void setValue(float);
 
         float valueInSpecifiedUnits() const;
-        void setValueInSpecifiedUnits(float valueInSpecifiedUnits);
+        void setValueInSpecifiedUnits(float);
 
         String valueAsString() const;
         void setValueAsString(const String&);
 
-        void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits);
-        void convertToSpecifiedUnits(unsigned short unitType);
-
-        // Helpers
-        bool bboxRelative() const;
-        void setBboxRelative(bool);
+        void newValueSpecifiedUnits(unsigned short, float valueInSpecifiedUnits);
+        void convertToSpecifiedUnits(unsigned short);
 
-        const SVGStyledElement* context() const;
-        void setContext(const SVGStyledElement* context);
+        // Helper functions
+        static bool isFraction(const SVGLength&);
+        static float PercentageOfViewport(float value, const SVGStyledElement*, SVGLengthMode);
 
     private:
-        bool updateValueInSpecifiedUnits(bool notify = true);
-        void updateValue(bool notify = true);
-
         double dpi() const;
 
-        float m_value;
         float m_valueInSpecifiedUnits;
-
-        LengthMode m_mode : 2;
-        bool m_bboxRelative : 1;
-        SVGLengthType m_unitType : 4;
-        bool m_requiresLayout : 1;
+        unsigned int m_unit;
 
         const SVGStyledElement* m_context;
-        const SVGElement* m_viewportElement;
     };
 
 } // namespace WebCore
 
 #endif // SVG_SUPPORT
-#endif // KSVG_SVGLengthImpl_H
+#endif // SVGLength_H
 
 // vim:ts=4:noet
index ca8e83a..4d46e42 100644 (file)
@@ -24,7 +24,7 @@
 
 module svg {
 
-    interface [Conditional=SVG, GenerateConstructor] SVGLength { 
+    interface [Conditional=SVG, GenerateConstructor, PODType=SVGLength] SVGLength { 
         // Length Unit Types
         const unsigned short SVG_LENGTHTYPE_UNKNOWN    = 0;
         const unsigned short SVG_LENGTHTYPE_NUMBER     = 1;
index f73689e..347bfcd 100644 (file)
@@ -29,7 +29,7 @@
 namespace WebCore {
 
 SVGLengthList::SVGLengthList()
-    : SVGList<RefPtr<SVGLength> >()
+    : SVGList<SVGLength>()
 {
 }
 
@@ -37,17 +37,14 @@ SVGLengthList::~SVGLengthList()
 {
 }
 
-void SVGLengthList::parse(const String& value, const SVGStyledElement* context, LengthMode mode)
+void SVGLengthList::parse(const String& value, const SVGStyledElement* context, SVGLengthMode mode)
 {
     ExceptionCode ec = 0;
 
     Vector<String> lengths = value.split(' ');
     Vector<String>::const_iterator end = lengths.end();
-    for (Vector<String>::const_iterator it = lengths.begin(); it != end; ++it) {
-        SVGLength* length = new SVGLength(context, mode);
-        length->setValueAsString(*it);
-        appendItem(length, ec);
-    }
+    for (Vector<String>::const_iterator it = lengths.begin(); it != end; ++it)
+        appendItem(SVGLength(context, mode, *it), ec);
 }
 
 }
index af8670d..d81e287 100644 (file)
 
 namespace WebCore
 {
-    class SVGLengthList : public SVGList<RefPtr<SVGLength> >
+    class SVGLengthList : public SVGList<SVGLength>
     {
     public:
         SVGLengthList();
         virtual ~SVGLengthList();
 
-        void parse(const String& value, const SVGStyledElement* context, LengthMode mode);
+        void parse(const String& value, const SVGStyledElement* context, SVGLengthMode mode);
     };
 
 } // namespace WebCore
index 8a1d5d3..221e778 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGLineElement.h"
 
@@ -36,10 +37,10 @@ SVGLineElement::SVGLineElement(const QualifiedName& tagName, Document* doc)
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_x1(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y1(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_x2(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y2(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x1(this, LengthModeWidth)
+    , m_y1(this, LengthModeHeight)
+    , m_x2(this, LengthModeWidth)
+    , m_y2(this, LengthModeHeight)
 {
 }
 
@@ -47,59 +48,46 @@ SVGLineElement::~SVGLineElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength*, Length, length, X1, x1, SVGNames::x1Attr.localName(), m_x1.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength*, Length, length, Y1, y1, SVGNames::y1Attr.localName(), m_y1.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength*, Length, length, X2, x2, SVGNames::x2Attr.localName(), m_x2.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength*, Length, length, Y2, y2, SVGNames::y2Attr.localName(), m_y2.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength, Length, length, X1, x1, SVGNames::x1Attr.localName(), m_x1)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength, Length, length, Y1, y1, SVGNames::y1Attr.localName(), m_y1)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength, Length, length, X2, x2, SVGNames::x2Attr.localName(), m_x2)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLineElement, SVGLength, Length, length, Y2, y2, SVGNames::y2Attr.localName(), m_y2)
 
 void SVGLineElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::x1Attr)
-        x1BaseValue()->setValueAsString(value);
+        setX1BaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::y1Attr)
-        y1BaseValue()->setValueAsString(value);
+        setY1BaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::x2Attr)
-        x2BaseValue()->setValueAsString(value);
+        setX2BaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::y2Attr)
-        y2BaseValue()->setValueAsString(value);
+        setY2BaseValue(SVGLength(this, LengthModeHeight, value));
     else
     {
-        if (SVGTests::parseMappedAttribute(attr)) return;
-        if (SVGLangSpace::parseMappedAttribute(attr)) return;
-        if (SVGExternalResourcesRequired::parseMappedAttribute(attr)) return;
+        if (SVGTests::parseMappedAttribute(attr))
+            return;
+        if (SVGLangSpace::parseMappedAttribute(attr))
+            return;
+        if (SVGExternalResourcesRequired::parseMappedAttribute(attr))
+            return;
         SVGStyledTransformableElement::parseMappedAttribute(attr);
     }
 }
 
 Path SVGLineElement::toPathData() const
 {
-    float _x1 = x1()->value(), _y1 = y1()->value();
-    float _x2 = x2()->value(), _y2 = y2()->value();
-
-    return Path::createLine(FloatPoint(_x1, _y1), FloatPoint(_x2, _y2));
-}
-
-const SVGStyledElement* SVGLineElement::pushAttributeContext(const SVGStyledElement* context)
-{
-    // All attribute's contexts are equal (so just take the one from 'x1').
-    const SVGStyledElement* restore = x1()->context();
-
-    x1()->setContext(context);
-    y1()->setContext(context);
-    x2()->setContext(context);
-    y2()->setContext(context);
-    
-    SVGStyledElement::pushAttributeContext(context);
-    return restore;
+    return Path::createLine(FloatPoint(x1().value(), y1().value()),
+                            FloatPoint(x2().value(), y2().value()));
 }
 
 bool SVGLineElement::hasPercentageValues() const
 {
-    if (x1()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        y1()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        x2()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        y2()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
+    if (x1().unitType() == LengthTypePercentage ||
+        y1().unitType() == LengthTypePercentage ||
+        x2().unitType() == LengthTypePercentage ||
+        y2().unitType() == LengthTypePercentage)
         return true;
 
     return false;
@@ -107,6 +95,6 @@ bool SVGLineElement::hasPercentageValues() const
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 8deb0e5..1640925 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGLineElementImpl_H
-#define KSVG_SVGLineElementImpl_H
+#ifndef SVGLineElement_H
+#define SVGLineElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -49,20 +50,17 @@ namespace WebCore
         virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
         virtual Path toPathData() const;
 
-        virtual const SVGStyledElement* pushAttributeContext(const SVGStyledElement* context);
-
     protected:
         virtual const SVGElement* contextElement() const { return this; }
-
         virtual bool hasPercentageValues() const;
 
     private:
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
  
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength*, RefPtr<SVGLength>, X1, x1)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength*, RefPtr<SVGLength>, Y1, y1)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength*, RefPtr<SVGLength>, X2, x2)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength*, RefPtr<SVGLength>, Y2, y2)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength, SVGLength, X1, x1)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength, SVGLength, Y1, y1)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength, SVGLength, X2, x2)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLineElement, SVGLength, SVGLength, Y2, y2)
     };
 
 } // namespace WebCore
index 4a4692e..2c40bc9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -37,35 +37,35 @@ namespace WebCore {
 
 SVGLinearGradientElement::SVGLinearGradientElement(const QualifiedName& tagName, Document* doc)
     : SVGGradientElement(tagName, doc)
-    , m_x1(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y1(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_x2(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y2(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x1(this, LengthModeWidth)
+    , m_y1(this, LengthModeHeight)
+    , m_x2(this, LengthModeWidth)
+    , m_y2(this, LengthModeHeight)
 {
-    // Spec : If the attribute is not specified, the effect is as if a value of "100%" were specified.
-    m_x2->setValueAsString("100%");
+    // Spec: If the attribute is not specified, the effect is as if a value of "100%" were specified.
+    setX2BaseValue(SVGLength(this, LengthModeWidth, "100%"));
 }
 
 SVGLinearGradientElement::~SVGLinearGradientElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength*, Length, length, X1, x1, SVGNames::x1Attr.localName(), m_x1.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength*, Length, length, Y1, y1, SVGNames::y1Attr.localName(), m_y1.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength*, Length, length, X2, x2, SVGNames::x2Attr.localName(), m_x2.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength*, Length, length, Y2, y2, SVGNames::y2Attr.localName(), m_y2.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength, Length, length, X1, x1, SVGNames::x1Attr.localName(), m_x1)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength, Length, length, Y1, y1, SVGNames::y1Attr.localName(), m_y1)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength, Length, length, X2, x2, SVGNames::x2Attr.localName(), m_x2)
+ANIMATED_PROPERTY_DEFINITIONS(SVGLinearGradientElement, SVGLength, Length, length, Y2, y2, SVGNames::y2Attr.localName(), m_y2)
 
 void SVGLinearGradientElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::x1Attr)
-        x1BaseValue()->setValueAsString(value);
+        setX1BaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::y1Attr)
-        y1BaseValue()->setValueAsString(value);
+        setY1BaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::x2Attr)
-        x2BaseValue()->setValueAsString(value);
+        setX2BaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::y2Attr)
-        y2BaseValue()->setValueAsString(value);
+        setY2BaseValue(SVGLength(this, LengthModeHeight, value));
     else
         SVGGradientElement::parseMappedAttribute(attr);
 }
@@ -75,15 +75,32 @@ void SVGLinearGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
     rebuildStops(); // rebuild stops before possibly importing them from any referenced gradient.
 
     bool bbox = (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
-    
-    x1()->setBboxRelative(bbox);
-    y1()->setBboxRelative(bbox);
-    x2()->setBboxRelative(bbox);
-    y2()->setBboxRelative(bbox);
-    
-    float _x1 = x1()->value(), _y1 = y1()->value();
-    float _x2 = x2()->value(), _y2 = y2()->value();
 
+    float _x1, _y1, _x2, _y2;
+
+    if (bbox) {
+        _x1 = x1().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(x1()))
+            _x1 *= 100.0;
+
+        _y1 = y1().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(y1()))
+            _y1 *= 100.0;
+
+        _x2 = x2().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(x2()))
+            _x2 *= 100.0;
+
+        _y2 = y2().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(y2()))
+            _y2 *= 100.0;
+    } else {
+        _x1 = x1().value();
+        _y1 = y1().value();
+        _x2 = x2().value();
+        _y2 = y2().value();
+    } 
     RefPtr<SVGPaintServerLinearGradient> grad = WTF::static_pointer_cast<SVGPaintServerLinearGradient>(_grad);
     AffineTransform mat;
     if (gradientTransform()->numberOfItems() > 0)
@@ -91,40 +108,27 @@ void SVGLinearGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
 
     DeprecatedString ref = href().deprecatedString();
     RefPtr<SVGPaintServer> pserver = getPaintServerById(document(), ref.mid(1));
-    
+
     if (pserver && (pserver->type() == RadialGradientPaintServer || pserver->type() == LinearGradientPaintServer)) {
         bool isLinear = pserver->type() == LinearGradientPaintServer;
         SVGPaintServerGradient* gradient = static_cast<SVGPaintServerGradient*>(pserver.get());
 
         if (!hasAttribute(SVGNames::gradientUnitsAttr))
             bbox = gradient->boundingBoxMode();
-            
+
         if (isLinear) {
             SVGPaintServerLinearGradient* linear = static_cast<SVGPaintServerLinearGradient*>(pserver.get());
             if (!hasAttribute(SVGNames::x1Attr))
                 _x1 = linear->gradientStart().x();
-            else if (bbox)
-                _x1 *= 100.;
 
             if (!hasAttribute(SVGNames::y1Attr))
                 _y1 = linear->gradientStart().y();
-            else if (bbox)
-                _y1 *= 100.;
 
             if (!hasAttribute(SVGNames::x2Attr))
                 _x2 = linear->gradientEnd().x();
-            else if (bbox)
-                _x2 *= 100.;
 
             if (!hasAttribute(SVGNames::y2Attr))
                 _y2 = linear->gradientEnd().y();
-            else if (bbox)
-                _y2 *= 100.;
-        } else if (bbox) {
-            _x1 *= 100.0;
-            _y1 *= 100.0;
-            _x2 *= 100.0;
-            _y2 *= 100.0;
         }
 
         if (!hasAttribute(SVGNames::gradientTransformAttr))
@@ -143,13 +147,6 @@ void SVGLinearGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
             grad->setGradientSpreadMethod(SPREADMETHOD_REPEAT);
         else
             grad->setGradientSpreadMethod(SPREADMETHOD_PAD);
-
-        if (bbox) {
-            _x1 *= 100.0;
-            _y1 *= 100.0;
-            _x2 *= 100.0;
-            _y2 *= 100.0;
-        }
     }
 
     grad->setGradientTransform(mat);
@@ -160,6 +157,6 @@ void SVGLinearGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 7c05018..e51bd73 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGLinearGradientElementImpl_H
-#define KSVG_SVGLinearGradientElementImpl_H
+#ifndef SVGLinearGradientElement_H
+#define SVGLinearGRadientElement_H
+
 #ifdef SVG_SUPPORT
 
 #include <SVGGradientElement.h>
@@ -46,10 +47,10 @@ namespace WebCore
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength*, RefPtr<SVGLength>, X1, x1)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength*, RefPtr<SVGLength>, Y1, y1)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength*, RefPtr<SVGLength>, X2, x2)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength*, RefPtr<SVGLength>, Y2, y2)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength, SVGLength, X1, x1)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength, SVGLength, Y1, y1)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength, SVGLength, X2, x2)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGLinearGradientElement, SVGLength, SVGLength, Y2, y2)
     };
 
 } // namespace WebCore
index 4e79ac7..a453026 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -42,10 +42,10 @@ SVGMarkerElement::SVGMarkerElement(const QualifiedName& tagName, Document* doc)
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
     , SVGFitToViewBox()
-    , m_refX(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_refY(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_markerWidth(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_markerHeight(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_refX(this, LengthModeWidth)
+    , m_refY(this, LengthModeHeight)
+    , m_markerWidth(this, LengthModeWidth)
+    , m_markerHeight(this, LengthModeHeight) 
     , m_markerUnits(SVG_MARKERUNITS_STROKEWIDTH)
     , m_orientType(0)
     , m_orientAngle(new SVGAngle(this))
@@ -56,6 +56,14 @@ SVGMarkerElement::~SVGMarkerElement()
 {
 }
 
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength, Length, length, RefX, refX, SVGNames::refXAttr.localName(), m_refX)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength, Length, length, RefY, refY, SVGNames::refYAttr.localName(), m_refY)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, int, Enumeration, enumeration, MarkerUnits, markerUnits, SVGNames::markerUnitsAttr.localName(), m_markerUnits)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength, Length, length, MarkerWidth, markerWidth, SVGNames::markerWidthAttr.localName(), m_markerWidth)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength, Length, length, MarkerHeight, markerHeight, SVGNames::markerHeightAttr.localName(), m_markerHeight)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, int, Enumeration, enumeration, OrientType, orientType, "orientType", m_orientType)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGAngle*, Angle, angle, OrientAngle, orientAngle, "orientAngle", m_orientAngle.get())
+
 void SVGMarkerElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
@@ -63,13 +71,13 @@ void SVGMarkerElement::parseMappedAttribute(MappedAttribute* attr)
         if (value == "userSpaceOnUse")
             setMarkerUnitsBaseValue(SVG_MARKERUNITS_USERSPACEONUSE);
     } else if (attr->name() == SVGNames::refXAttr)
-        refXBaseValue()->setValueAsString(value);
+        setRefXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::refYAttr)
-        refYBaseValue()->setValueAsString(value);
+        setRefYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::markerWidthAttr)
-        markerWidthBaseValue()->setValueAsString(value);
+        setMarkerWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::markerHeightAttr)
-        markerHeightBaseValue()->setValueAsString(value);
+        setMarkerHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::orientAttr) {
         if (value == "auto")
             setOrientToAuto();
@@ -90,14 +98,6 @@ void SVGMarkerElement::parseMappedAttribute(MappedAttribute* attr)
     }
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength*, Length, length, RefX, refX, SVGNames::refXAttr.localName(), m_refX.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength*, Length, length, RefY, refY, SVGNames::refYAttr.localName(), m_refY.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, int, Enumeration, enumeration, MarkerUnits, markerUnits, SVGNames::markerUnitsAttr.localName(), m_markerUnits)
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength*, Length, length, MarkerWidth, markerWidth, SVGNames::markerWidthAttr.localName(), m_markerWidth.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGLength*, Length, length, MarkerHeight, markerHeight, SVGNames::markerHeightAttr.localName(), m_markerHeight.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, int, Enumeration, enumeration, OrientType, orientType, "orientType", m_orientType)
-ANIMATED_PROPERTY_DEFINITIONS(SVGMarkerElement, SVGAngle*, Angle, angle, OrientAngle, orientAngle, "orientAngle", m_orientAngle.get())
-
 void SVGMarkerElement::setOrientToAuto()
 {
     setOrientTypeBaseValue(SVG_MARKER_ORIENT_AUTO);
@@ -126,7 +126,7 @@ SVGResource* SVGMarkerElement::canvasResource()
     else
         m_marker->setAutoAngle();
 
-    m_marker->setRef(refX()->value(), refY()->value());
+    m_marker->setRef(refX().value(), refY().value());
     m_marker->setUseStrokeWidth(markerUnits() == SVG_MARKERUNITS_STROKEWIDTH);
     
     return m_marker.get();
@@ -144,6 +144,6 @@ RenderObject* SVGMarkerElement::createRenderer(RenderArena* arena, RenderStyle*
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 2159ef5..e36e71a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -22,6 +22,7 @@
 
 #ifndef SVGMarkerElement_H
 #define SVGMarkerElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGResourceMarker.h"
@@ -34,8 +35,7 @@ namespace WebCore
 {
     class Document;
     class SVGAngle;
-    class SVGAngle;
-    class SVGLength;
+    
     class SVGMarkerElement : public SVGStyledElement,
                              public SVGLangSpace,
                              public SVGExternalResourcesRequired,
@@ -75,10 +75,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, FloatRect, ViewBox, viewBox)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, SVGPreserveAspectRatio*, PreserveAspectRatio, preserveAspectRatio)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength*, RefPtr<SVGLength>, RefX, refX)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength*, RefPtr<SVGLength>, RefY, refY)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength*, RefPtr<SVGLength>, MarkerWidth, markerWidth)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength*, RefPtr<SVGLength>, MarkerHeight, markerHeight)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength, SVGLength, RefX, refX)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength, SVGLength, RefY, refY)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength, SVGLength, MarkerWidth, markerWidth)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGLength, SVGLength, MarkerHeight, markerHeight)
         ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, int, int, MarkerUnits, markerUnits)
         ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, int, int, OrientType, orientType)
         ANIMATED_PROPERTY_DECLARATIONS(SVGMarkerElement, SVGAngle*, RefPtr<SVGAngle>, OrientAngle, orientAngle)
index 1a1278b..a1b9a29 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
                   2005 Alexander Kellett <lypanov@kde.org>
 
@@ -45,10 +45,10 @@ SVGMaskElement::SVGMaskElement(const QualifiedName& tagName, Document* doc)
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
     , m_dirty(true)
 {
 }
@@ -57,14 +57,14 @@ SVGMaskElement::~SVGMaskElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGMaskElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 
 void SVGMaskElement::attributeChanged(Attribute* attr, bool preserveDecls)
 {
-    IntSize newSize = IntSize(lroundf(width()->value()), lroundf(height()->value()));
+    IntSize newSize = IntSize(lroundf(width().value()), lroundf(height().value()));
     if (!m_masker || !m_masker->mask() || (m_masker->mask()->size() != newSize))
         m_dirty = true;
     SVGStyledLocatableElement::attributeChanged(attr, preserveDecls);
@@ -80,13 +80,13 @@ void SVGMaskElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGURIReference::parseMappedAttribute(attr))
             return;
@@ -107,7 +107,7 @@ SVGResourceImage* SVGMaskElement::drawMaskerContent()
     return 0;
     SVGResourceImage* maskImage = new SVGResourceImage();
 
-    IntSize size = IntSize(lroundf(width()->value()), lroundf(height()->value()));
+    IntSize size = IntSize(lroundf(width().value()), lroundf(height().value()));
     maskImage->init(size);
 
     OwnPtr<GraphicsContext> context(contextForImage(maskImage));
@@ -144,6 +144,6 @@ SVGResource* SVGMaskElement::canvasResource()
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 26fcb2f..b09e7e7 100644 (file)
@@ -21,6 +21,7 @@
 
 #ifndef SVGMaskElement_H
 #define SVGMaskElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGResourceMasker.h"
@@ -60,10 +61,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGURIReference, String, Href, href)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
  
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGMaskElement, SVGLength, SVGLength, Height, height)
 
         virtual const SVGElement* contextElement() const { return this; }
 
index 058fcfb..7130ab9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -52,10 +52,10 @@ SVGPatternElement::SVGPatternElement(const QualifiedName& tagName, Document* doc
     , SVGExternalResourcesRequired()
     , SVGFitToViewBox()
     , SVGResourceListener()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
     , m_patternUnits(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
     , m_patternContentUnits(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE)
     , m_patternTransform(new SVGTransformList)
@@ -69,10 +69,10 @@ SVGPatternElement::~SVGPatternElement()
 
 ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, int, Enumeration, enumeration, PatternUnits, patternUnits, SVGNames::patternUnitsAttr.localName(), m_patternUnits)
 ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, int, Enumeration, enumeration, PatternContentUnits, patternContentUnits, SVGNames::patternContentUnitsAttr.localName(), m_patternContentUnits)
-ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 ANIMATED_PROPERTY_DEFINITIONS(SVGPatternElement, SVGTransformList*, TransformList, transformList, PatternTransform, patternTransform, SVGNames::patternTransformAttr.localName(), m_patternTransform.get())
 
 void SVGPatternElement::parseMappedAttribute(MappedAttribute* attr)
@@ -95,13 +95,13 @@ void SVGPatternElement::parseMappedAttribute(MappedAttribute* attr)
             patternTransforms->clear(ec);
         }
     } else if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGURIReference::parseMappedAttribute(attr))
             return;
@@ -118,19 +118,6 @@ void SVGPatternElement::parseMappedAttribute(MappedAttribute* attr)
     }
 }
 
-const SVGStyledElement* SVGPatternElement::pushAttributeContext(const SVGStyledElement* context)
-{
-    // All attribute's contexts are equal (so just take the one from 'x').
-    const SVGStyledElement* restore = x()->context();
-
-    x()->setContext(context);
-    y()->setContext(context);
-    width()->setContext(context);
-    height()->setContext(context);
-
-    return restore;
-}
-
 void SVGPatternElement::resourceNotification() const
 {
     // We're referenced by a "client", calculate the tile now...
@@ -169,26 +156,38 @@ void SVGPatternElement::fillAttributesFromReferencePattern(const SVGPatternEleme
 
 void SVGPatternElement::drawPatternContentIntoTile(const SVGPatternElement* target, const IntSize& newSize, AffineTransform patternTransformMatrix)
 {
-    SVGStyledElement* activeElement = static_cast<SVGStyledElement*>(m_paintServer->activeClient()->element());
-
     bool bbox = (patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
 
-    const SVGStyledElement* savedContext = 0;
+    float _x, _y, w, h;
     if (bbox) {
-        if (width()->unitType() != SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
-            width()->newValueSpecifiedUnits(SVGLength::SVG_LENGTHTYPE_PERCENTAGE, width()->value() * 100.);
-        if (height()->unitType() != SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
-            height()->newValueSpecifiedUnits(SVGLength::SVG_LENGTHTYPE_PERCENTAGE, height()->value() * 100.);
-        if (activeElement)
-            savedContext = const_cast<SVGPatternElement*>(this)->pushAttributeContext(activeElement);
+        _x = x().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(x()))
+            _x *= 100.0;
+
+        _y = y().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(y()))
+            _y *= 100.0;
+
+        w = width().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(width()))
+            w *= 100.0;
+
+        h = height().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(height()))
+            h *= 100.0;
+    } else {
+        _x = x().value();
+        _y = y().value();
+        w = width().value();
+        h = height().value();
     }
-    
+
     m_tile = new SVGResourceImage();
     m_tile->init(newSize);
 
     OwnPtr<GraphicsContext> patternContext(contextForImage(m_tile.get()));
 
-    FloatRect rect(x()->value(), y()->value(), width()->value(), height()->value());
+    FloatRect rect(_x, _y, w, h);
     m_paintServer->setBbox(rect);
     m_paintServer->setPatternTransform(patternTransformMatrix);
     m_paintServer->setTile(m_tile.get());
@@ -243,9 +242,6 @@ void SVGPatternElement::drawPatternContentIntoTile(const SVGPatternElement* targ
         item->setLocalTransform(savedMatrix.matrix());
 #endif
     }
-
-    if (savedContext)
-        const_cast<SVGPatternElement*>(this)->pushAttributeContext(savedContext);
 }
 
 void SVGPatternElement::notifyClientsToRepaint() const
@@ -271,7 +267,7 @@ void SVGPatternElement::notifyAttributeChange() const
     if (!m_paintServer || !m_paintServer->activeClient() || m_ignoreAttributeChanges)
         return;
 
-    IntSize newSize = IntSize(lroundf(width()->value()), lroundf(height()->value()));
+    IntSize newSize = IntSize(lroundf(width().value()), lroundf(height().value()));
     if (m_tile && (m_tile->size() == newSize) || newSize.width() < 1 || newSize.height() < 1)
         return;
 
@@ -331,12 +327,13 @@ SVGResource* SVGPatternElement::canvasResource()
 AffineTransform SVGPatternElement::getCTM() const
 {
     AffineTransform mat;
-    AffineTransform viewBox = viewBoxToViewTransform(width()->value(), height()->value());
+    AffineTransform viewBox = viewBoxToViewTransform(width().value(), height().value());
     mat *= viewBox;
     return mat;
 }
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
+
+// vim:ts=4:noet
index d15f644..e8d1173 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGPatternElementImpl_H
-#define KSVG_SVGPatternElementImpl_H
+#ifndef SVGPatternElement_H
+#define SVGPatternElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGPaintServerPattern.h"
@@ -74,10 +75,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, FloatRect, ViewBox, viewBox)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, SVGPreserveAspectRatio*, PreserveAspectRatio, preserveAspectRatio)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGLength, SVGLength, Height, height)
         ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, int, int, PatternUnits, patternUnits)
         ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, int, int, PatternContentUnits, patternContentUnits)
         ANIMATED_PROPERTY_DECLARATIONS(SVGPatternElement, SVGTransformList*, RefPtr<SVGTransformList>, PatternTransform, patternTransform)
index 413f129..0b11bdc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGRadialGradientElement.h"
 
@@ -37,41 +38,41 @@ namespace WebCore {
 
 SVGRadialGradientElement::SVGRadialGradientElement(const QualifiedName& tagName, Document* doc)
     : SVGGradientElement(tagName, doc)
-    , m_cx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_cy(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_r(new SVGLength(this, LM_OTHER, viewportElement()))
-    , m_fx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_fy(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_cx(this, LengthModeWidth)
+    , m_cy(this, LengthModeHeight)
+    , m_r(this, LengthModeOther)
+    , m_fx(this, LengthModeWidth)
+    , m_fy(this, LengthModeHeight)
 {
     // Spec: If the attribute is not specified, the effect is as if a value of "50%" were specified.
-    m_cx->setValueAsString("50%");
-    m_cy->setValueAsString("50%");
-    m_r->setValueAsString("50%");
+    setCxBaseValue(SVGLength(this, LengthModeWidth, "50%"));
+    setCyBaseValue(SVGLength(this, LengthModeHeight, "50%"));
+    setRBaseValue(SVGLength(this, LengthModeOther, "50%"));
 }
 
 SVGRadialGradientElement::~SVGRadialGradientElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength*, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength*, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength*, Length, length, Fx, fx, SVGNames::fxAttr.localName(), m_fx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength*, Length, length, Fy, fy, SVGNames::fyAttr.localName(), m_fy.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength*, Length, length, R, r, SVGNames::rAttr.localName(), m_r.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength, Length, length, Cx, cx, SVGNames::cxAttr.localName(), m_cx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength, Length, length, Cy, cy, SVGNames::cyAttr.localName(), m_cy)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength, Length, length, Fx, fx, SVGNames::fxAttr.localName(), m_fx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength, Length, length, Fy, fy, SVGNames::fyAttr.localName(), m_fy)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRadialGradientElement, SVGLength, Length, length, R, r, SVGNames::rAttr.localName(), m_r)
 
 void SVGRadialGradientElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::cxAttr)
-        cxBaseValue()->setValueAsString(value);
+        setCxBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::cyAttr)
-        cyBaseValue()->setValueAsString(value);
+        setCyBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::rAttr)
-        rBaseValue()->setValueAsString(value);
+        setRBaseValue(SVGLength(this, LengthModeOther, value));
     else if (attr->name() == SVGNames::fxAttr)
-        fxBaseValue()->setValueAsString(value);
+        setFxBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::fyAttr)
-        fyBaseValue()->setValueAsString(value);
+        setFyBaseValue(SVGLength(this, LengthModeHeight, value));
     else
         SVGGradientElement::parseMappedAttribute(attr);
 }
@@ -83,15 +84,42 @@ void SVGRadialGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
     bool bbox = (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
     bool fxSet = hasAttribute(SVGNames::fxAttr);
     bool fySet = hasAttribute(SVGNames::fyAttr);
-    cx()->setBboxRelative(bbox);
-    cy()->setBboxRelative(bbox);
-    r()->setBboxRelative(bbox);
-    fx()->setBboxRelative(bbox);
-    fy()->setBboxRelative(bbox);
-    float _cx = cx()->value(), _cy = cy()->value();
-    float _r = r()->value();
-    float _fx = fxSet ? fx()->value() : _cx;
-    float _fy = fySet ? fy()->value() : _cy;
+    float _cx, _cy, _r, _fx, _fy;
+
+    if (bbox) {
+        _cx = cx().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(cx()))
+            _cx *= 100.0;
+
+        _cy = cy().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(cy()))
+            _cy *= 100.0;
+
+        _r = r().valueInSpecifiedUnits();
+        if (SVGLength::isFraction(r()))
+            _r *= 100.0;
+
+        if (fxSet) {
+            _fx = fx().valueInSpecifiedUnits();
+            if (SVGLength::isFraction(fx()))
+                _fx *= 100.0;
+        } else
+            _fx = _cx;
+        
+        if (fySet) {
+            _fy = fy().valueInSpecifiedUnits();
+            if (SVGLength::isFraction(fy()))
+                _fy *= 100.0;
+        } else
+            _fy = _cy;
+    } else {
+        _cx = cx().value();
+        _cy = cy().value();
+        _r = r().value();
+        _fx = fxSet ? fx().value() : _cx;
+        _fy = fySet ? fy().value() : _cy;
+    }
 
     RefPtr<SVGPaintServerRadialGradient> grad = WTF::static_pointer_cast<SVGPaintServerRadialGradient>(_grad);
     AffineTransform mat;
@@ -112,32 +140,18 @@ void SVGRadialGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
             RefPtr<SVGPaintServerRadialGradient> radial = WTF::static_pointer_cast<SVGPaintServerRadialGradient>(pserver);
             if (!hasAttribute(SVGNames::cxAttr))
                 _cx = radial->gradientCenter().x();
-            else if (bbox)
-                _cx *= 100.;
+
             if (!hasAttribute(SVGNames::cyAttr))
                 _cy = radial->gradientCenter().y();
-            else if (bbox)
-                _cy *= 100.;
 
             if (!fxSet)
                 _fx = radial->gradientFocal().x();
-            else if (bbox)
-                _fx *= 100.;
+
             if (!fySet)
                 _fy = radial->gradientFocal().y();
-            else if (bbox)
-                _fy *= 100.;
 
             if (!hasAttribute(SVGNames::rAttr))
                 _r = radial->gradientRadius();
-            else if (bbox)
-                _r *= 100.;
-        } else if (bbox) {
-            _cx *= 100.0;
-            _cy *= 100.0;
-            _fx *= 100.0;
-            _fy *= 100.0;
-            _r *= 100.0;
         }
 
         if (!hasAttribute(SVGNames::gradientTransformAttr))
@@ -156,14 +170,6 @@ void SVGRadialGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
             grad->setGradientSpreadMethod(SPREADMETHOD_REPEAT);
         else
             grad->setGradientSpreadMethod(SPREADMETHOD_PAD);
-
-        if (bbox) {
-            _cx *= 100.0;
-            _cy *= 100.0;
-            _fx *= 100.0;
-            _fy *= 100.0;
-            _r *= 100.0;
-        }
     }
 
     grad->setGradientTransform(mat);
@@ -175,6 +181,6 @@ void SVGRadialGradientElement::buildGradient(PassRefPtr<SVGPaintServerGradient>
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index fa4adda..3c27c8c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGRadialGradientElementImpl_H
-#define KSVG_SVGRadialGradientElementImpl_H
+#ifndef SVGRadialGradientElement_H
+#define SVGRadialGradientElement_H
+
 #ifdef SVG_SUPPORT
 
 #include <SVGGradientElement.h>
@@ -46,11 +47,11 @@ namespace WebCore
         virtual const SVGElement* contextElement() const { return this; }
 
     private:
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength*, RefPtr<SVGLength>, Cx, cx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength*, RefPtr<SVGLength>, Cy, cy)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength*, RefPtr<SVGLength>, R, r)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength*, RefPtr<SVGLength>, Fx, fx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength*, RefPtr<SVGLength>, Fy, fy)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength, SVGLength, Cx, cx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength, SVGLength, Cy, cy)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength, SVGLength, R, r)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength, SVGLength, Fx, fx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRadialGradientElement, SVGLength, SVGLength, Fy, fy)
     };
 
 } // namespace WebCore
index a56eb9f..bec88d8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -35,12 +35,12 @@ SVGRectElement::SVGRectElement(const QualifiedName& tagName, Document *doc)
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_rx(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_ry(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
+    , m_rx(this, LengthModeWidth)
+    , m_ry(this, LengthModeHeight)
 {
 }
 
@@ -48,28 +48,28 @@ SVGRectElement::~SVGRectElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, Rx, rx, SVGNames::rxAttr.localName(), m_rx.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength*, Length, length, Ry, ry, SVGNames::ryAttr.localName(), m_ry.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, Rx, rx, SVGNames::rxAttr.localName(), m_rx)
+ANIMATED_PROPERTY_DEFINITIONS(SVGRectElement, SVGLength, Length, length, Ry, ry, SVGNames::ryAttr.localName(), m_ry)
 
 void SVGRectElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::rxAttr)
-        rxBaseValue()->setValueAsString(value);
+         setRxBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::ryAttr)
-        ryBaseValue()->setValueAsString(value);
+         setRyBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
@@ -83,41 +83,25 @@ void SVGRectElement::parseMappedAttribute(MappedAttribute* attr)
 
 Path SVGRectElement::toPathData() const
 {
-    FloatRect rect(x()->value(), y()->value(), width()->value(), height()->value());
+    FloatRect rect(x().value(), y().value(), width().value(), height().value());
 
-    bool hasRx = hasAttribute("rx");
-    bool hasRy = hasAttribute("ry");
+    bool hasRx = hasAttribute(SVGNames::rxAttr);
+    bool hasRy = hasAttribute(SVGNames::ryAttr);
     if (hasRx || hasRy) {
-        float _rx = hasRx ? rx()->value() : ry()->value();
-        float _ry = hasRy ? ry()->value() : rx()->value();
+        float _rx = hasRx ? rx().value() : ry().value();
+        float _ry = hasRy ? ry().value() : rx().value();
         return Path::createRoundedRectangle(rect, FloatSize(_rx, _ry));
     }
 
     return Path::createRectangle(rect);
 }
 
-const SVGStyledElement* SVGRectElement::pushAttributeContext(const SVGStyledElement* context)
-{
-    // All attribute's contexts are equal (so just take the one from 'x').
-    const SVGStyledElement* restore = x()->context();
-
-    x()->setContext(context);
-    y()->setContext(context);
-    width()->setContext(context);
-    height()->setContext(context);
-    
-    SVGStyledElement::pushAttributeContext(context);
-    return restore;
-}
-
 bool SVGRectElement::hasPercentageValues() const
 {
-    if (x()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        y()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        width()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        height()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        rx()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE ||
-        ry()->unitType() == SVGLength::SVG_LENGTHTYPE_PERCENTAGE)
+    if (x().unitType() == LengthTypePercentage ||
+        y().unitType() == LengthTypePercentage ||
+        width().unitType() == LengthTypePercentage ||
+        height().unitType() == LengthTypePercentage)
         return true;
 
     return false;
@@ -125,6 +109,6 @@ bool SVGRectElement::hasPercentageValues() const
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 4d69427..e8aca3c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGRectElementImpl_H
-#define KSVG_SVGRectElementImpl_H
+#ifndef SVGRectElement_H
+#define SVGRectElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -31,7 +32,6 @@
 
 namespace WebCore
 {
-    class SVGLength;
     class SVGRectElement : public SVGStyledTransformableElement,
                            public SVGTests,
                            public SVGLangSpace,
@@ -49,22 +49,19 @@ namespace WebCore
         virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
         virtual Path toPathData() const;
 
-        virtual const SVGStyledElement* pushAttributeContext(const SVGStyledElement* context);
-
     protected:
         virtual const SVGElement* contextElement() const { return this; }
-
         virtual bool hasPercentageValues() const;
 
     private:
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, Height, height)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, Rx, rx)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength*, RefPtr<SVGLength>, Ry, ry)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, Rx, rx)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGRectElement, SVGLength, SVGLength, Ry, ry)
     };
 
 } // namespace WebCore
index 2459280..9d15d1e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGSVGElement.h"
 
@@ -53,19 +54,15 @@ SVGSVGElement::SVGSVGElement(const QualifiedName& tagName, Document* doc)
     , SVGExternalResourcesRequired()
     , SVGFitToViewBox()
     , SVGZoomAndPan()
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
     , m_useCurrentView(false)
     , m_timeScheduler(new TimeScheduler(doc))
 {
-    const SVGElement* viewport = ownerDocument()->documentElement() == this ? this : viewportElement();
-    const SVGStyledElement* context = ownerDocument()->documentElement() == this ? 0 : this;
-
-    m_x = new SVGLength(context, LM_WIDTH, viewport);
-    m_y = new SVGLength(context, LM_HEIGHT, viewport);
-    m_width = new SVGLength(context, LM_WIDTH, viewport);
-    m_height = new SVGLength(context, LM_HEIGHT, viewport);
-
-    m_width->setValueAsString("100%");
-    m_height->setValueAsString("100%");
+    setWidthBaseValue(SVGLength(this, LengthModeWidth, "100%"));
+    setHeightBaseValue(SVGLength(this, LengthModeHeight, "100%"));
 }
 
 SVGSVGElement::~SVGSVGElement()
@@ -73,10 +70,10 @@ SVGSVGElement::~SVGSVGElement()
     delete m_timeScheduler;
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGSVGElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 
 const AtomicString& SVGSVGElement::contentScriptType() const
 {
@@ -104,10 +101,10 @@ void SVGSVGElement::setContentStyleType(const AtomicString& type)
 
 FloatRect SVGSVGElement::viewport() const
 {
-    double _x = x()->value();
-    double _y = y()->value();
-    double w = width()->value();
-    double h = height()->value();
+    double _x = x().value();
+    double _y = y().value();
+    double w = width().value();
+    double h = height().value();
     AffineTransform viewBox = viewBoxToViewTransform(w, h);
     viewBox.map(_x, _y, &_x, &_y);
     viewBox.map(w, h, &w, &h);
@@ -190,15 +187,15 @@ void SVGSVGElement::parseMappedAttribute(MappedAttribute* attr)
         else if (attr->name() == SVGNames::onzoomAttr)
             addSVGWindowEventListner(zoomEvent, attr);
     }
-    if (attr->name() == SVGNames::xAttr) {
-        xBaseValue()->setValueAsString(value);
-    } else if (attr->name() == SVGNames::yAttr) {
-        yBaseValue()->setValueAsString(value);
-    else if (attr->name() == SVGNames::widthAttr) {
-        widthBaseValue()->setValueAsString(value);
+    if (attr->name() == SVGNames::xAttr)
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
+    else if (attr->name() == SVGNames::yAttr)
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
+    else if (attr->name() == SVGNames::widthAttr) {
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
         addCSSProperty(attr, CSS_PROP_WIDTH, value);
     } else if (attr->name() == SVGNames::heightAttr) {
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
         addCSSProperty(attr, CSS_PROP_HEIGHT, value);
     } else {
         if (SVGTests::parseMappedAttribute(attr))
@@ -276,9 +273,9 @@ double SVGSVGElement::createSVGNumber()
     return 0.0;
 }
 
-SVGLength* SVGSVGElement::createSVGLength()
+SVGLength SVGSVGElement::createSVGLength()
 {
-    return new SVGLength(0);
+    return SVGLength();
 }
 
 SVGAngle* SVGSVGElement::createSVGAngle()
@@ -316,10 +313,10 @@ SVGTransform* SVGSVGElement::createSVGTransformFromMatrix(const AffineTransform&
 AffineTransform SVGSVGElement::getCTM() const
 {
     AffineTransform mat;
-    mat.translate(x()->value(), y()->value());
+    mat.translate(x().value(), y().value());
 
     if (attributes()->getNamedItem(SVGNames::viewBoxAttr)) {
-        AffineTransform viewBox = viewBoxToViewTransform(width()->value(), height()->value());
+        AffineTransform viewBox = viewBoxToViewTransform(width().value(), height().value());
         mat = viewBox * mat;
     }
 
@@ -329,10 +326,10 @@ AffineTransform SVGSVGElement::getCTM() const
 AffineTransform SVGSVGElement::getScreenCTM() const
 {
     AffineTransform mat = SVGStyledLocatableElement::getScreenCTM();
-    mat.translate(x()->value(), y()->value());
+    mat.translate(x().value(), y().value());
 
     if (attributes()->getNamedItem(SVGNames::viewBoxAttr)) {
-        AffineTransform viewBox = viewBoxToViewTransform(width()->value(), height()->value());
+        AffineTransform viewBox = viewBoxToViewTransform(width().value(), height().value());
         mat = viewBox * mat;
     }
 
@@ -396,6 +393,17 @@ void SVGSVGElement::setCurrentTime(float /* seconds */)
     // FIXME: Implement me
 }
 
+bool SVGSVGElement::hasPercentageValues() const
+{
+    if (x().unitType() == LengthTypePercentage ||
+        y().unitType() == LengthTypePercentage ||
+        width().unitType() == LengthTypePercentage ||
+        height().unitType() == LengthTypePercentage) 
+        return true;
+
+    return false;
+}
+
 void SVGSVGElement::attributeChanged(Attribute* attr, bool preserveDecls)
 {
     if (attr->name() == SVGNames::xAttr ||
@@ -410,6 +418,6 @@ void SVGSVGElement::attributeChanged(Attribute* attr, bool preserveDecls)
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index 61001ce..37804c3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -22,6 +22,7 @@
 
 #ifndef SVGSVGElement_H
 #define SVGSVGElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -104,7 +105,7 @@ namespace WebCore
         void deselectAll();
 
         static double createSVGNumber();
-        static SVGLength* createSVGLength();
+        static SVGLength createSVGLength();
         static SVGAngle* createSVGAngle();
         static FloatPoint createSVGPoint();
         static AffineTransform createSVGMatrix();
@@ -132,6 +133,9 @@ namespace WebCore
     protected:
         virtual const SVGElement* contextElement() const { return this; }
 
+        friend class RenderSVGContainer;
+        virtual bool hasPercentageValues() const;
+
     private:
         void addSVGWindowEventListner(const AtomicString& eventType, const Attribute* attr);   
 
@@ -139,10 +143,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, FloatRect, ViewBox, viewBox)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGFitToViewBox, SVGPreserveAspectRatio*, PreserveAspectRatio, preserveAspectRatio)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGSVGElement, SVGLength, SVGLength, Height, height)
 
         bool m_useCurrentView;
         TimeScheduler* m_timeScheduler;
index 8a38aab..ed971b9 100644 (file)
@@ -133,14 +133,6 @@ void SVGStyledElement::updateCanvasItem()
     m_updateVectorial = false;
 }
 
-const SVGStyledElement* SVGStyledElement::pushAttributeContext(const SVGStyledElement*)
-{
-    if (view())
-        static_cast<RenderPath*>(renderer())->setPath(toPathData());
-
-    return 0;
-}
-
 }
 
 // vim:ts=4:noet
index 26a3d69..1f52eb9 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "AffineTransform.h"
 #include "SVGElement.h"
+#include "SVGLength.h"
 #include "SVGStylable.h"
 #include "SVGResource.h"
 #include "Path.h"
@@ -56,17 +57,12 @@ namespace WebCore {
         virtual void notifyAttributeChange() const;
         virtual void attributeChanged(Attribute*, bool preserveDecls = false);
 
-        // Imagine we're a <rect> inside of a <pattern> section with patternContentUnits="objectBoundingBox"
-        // and our 'width' attribute is set to 50%. When the pattern gets referenced it knows the "bbox"
-        // of it's user and has to push the "active client's bbox" as new attribute context to all attributes
-        // of the 'rect'. This function also returns the old attribute context, to be able to restore it...
-        virtual const SVGStyledElement* pushAttributeContext(const SVGStyledElement* context);
-
-        virtual bool hasPercentageValues() const { return false; }
-
     protected:
         void updateCanvasItem(); // Handles "path data" object changes... (not for style/transform!)
 
+        friend class RenderPath;
+        virtual bool hasPercentageValues() const { return false; }
+
     private:
         mutable RefPtr<CSSStyleDeclaration> m_pa;
         ANIMATED_PROPERTY_DECLARATIONS(SVGStyledElement, String, String, ClassName, className)
index e2ab7d8..fc4c736 100644 (file)
@@ -37,7 +37,7 @@ SVGTextContentElement::SVGTextContentElement(const QualifiedName& tagName, Docum
     , SVGTests()
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
-    , m_textLength(new SVGLength(this, LM_WIDTH))
+    , m_textLength(this, LengthModeWidth)
     , m_lengthAdjust(0)
 {
 }
@@ -46,7 +46,7 @@ SVGTextContentElement::~SVGTextContentElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGTextContentElement, SVGLength*, Length, length, TextLength, textLength, SVGNames::textLengthAttr.localName(), m_textLength.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGTextContentElement, SVGLength, Length, length, TextLength, textLength, SVGNames::textLengthAttr.localName(), m_textLength)
 ANIMATED_PROPERTY_DEFINITIONS(SVGTextContentElement, int, Enumeration, enumeration, LengthAdjust, lengthAdjust, SVGNames::lengthAdjustAttr.localName(), m_lengthAdjust)
 
 long SVGTextContentElement::getNumberOfChars() const
@@ -96,7 +96,7 @@ void SVGTextContentElement::selectSubString(unsigned long charnum, unsigned long
 void SVGTextContentElement::parseMappedAttribute(MappedAttribute* attr)
 {
     //if (attr->name() == SVGNames::lengthAdjustAttr)
-    //    xBaseValue()->setValueAsString(value);
+    //    setXBaseValue(SVGLength(this, LengthModeWidth, value));
     //else
     {
         if (SVGTests::parseMappedAttribute(attr))
index 6add370..c833b4a 100644 (file)
@@ -65,7 +65,7 @@ namespace WebCore {
     private:
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, SVGLength*, RefPtr<SVGLength>, TextLength, textLength)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, SVGLength, SVGLength, TextLength, textLength)
         ANIMATED_PROPERTY_DECLARATIONS(SVGTextContentElement, int, int, LengthAdjust, lengthAdjust)
     };
 
index 2183bd1..62cc5cd 100644 (file)
@@ -27,6 +27,7 @@
 #include "AffineTransform.h"
 #include "FloatRect.h"
 #include "RenderSVGText.h"
+#include "SVGHelper.h"
 #include "SVGLengthList.h"
 #include "SVGRenderStyle.h"
 #include "SVGTSpanElement.h"
index c094b75..f9e855c 100644 (file)
@@ -56,13 +56,13 @@ void SVGTextPositioningElement::parseMappedAttribute(MappedAttribute* attr)
     const String& value = attr->value();
     
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->parse(value.deprecatedString(), this, LM_WIDTH);
+        xBaseValue()->parse(value.deprecatedString(), this, LengthModeWidth);
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->parse(value.deprecatedString(), this, LM_HEIGHT);
+        yBaseValue()->parse(value.deprecatedString(), this, LengthModeHeight);
     else if (attr->name() == SVGNames::dxAttr)
-        dxBaseValue()->parse(value.deprecatedString(), this, LM_WIDTH);
+        dxBaseValue()->parse(value.deprecatedString(), this, LengthModeWidth);
     else if (attr->name() == SVGNames::dyAttr)
-        dyBaseValue()->parse(value.deprecatedString(), this, LM_HEIGHT);
+        dyBaseValue()->parse(value.deprecatedString(), this, LengthModeHeight);
     else if (attr->name() == SVGNames::rotateAttr)
         rotateBaseValue()->parse(value.deprecatedString());
     else
index 7ccbf5b..ed0c64e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -21,6 +21,7 @@
 */
 
 #include "config.h"
+
 #ifdef SVG_SUPPORT
 #include "SVGUseElement.h"
 
@@ -42,10 +43,10 @@ SVGUseElement::SVGUseElement(const QualifiedName& tagName, Document* doc)
     , SVGLangSpace()
     , SVGExternalResourcesRequired()
     , SVGURIReference()
-    , m_x(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_y(new SVGLength(this, LM_HEIGHT, viewportElement()))
-    , m_width(new SVGLength(this, LM_WIDTH, viewportElement()))
-    , m_height(new SVGLength(this, LM_HEIGHT, viewportElement()))
+    , m_x(this, LengthModeWidth)
+    , m_y(this, LengthModeHeight)
+    , m_width(this, LengthModeWidth)
+    , m_height(this, LengthModeHeight)
 {
 }
 
@@ -53,23 +54,23 @@ SVGUseElement::~SVGUseElement()
 {
 }
 
-ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength*, Length, length, X, x, SVGNames::xAttr.localName(), m_x.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength*, Length, length, Y, y, SVGNames::yAttr.localName(), m_y.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength*, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width.get())
-ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength*, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height.get())
+ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength, Length, length, X, x, SVGNames::xAttr.localName(), m_x)
+ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength, Length, length, Y, y, SVGNames::yAttr.localName(), m_y)
+ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength, Length, length, Width, width, SVGNames::widthAttr.localName(), m_width)
+ANIMATED_PROPERTY_DEFINITIONS(SVGUseElement, SVGLength, Length, length, Height, height, SVGNames::heightAttr.localName(), m_height)
 
 void SVGUseElement::parseMappedAttribute(MappedAttribute* attr)
 {
     const AtomicString& value = attr->value();
     
     if (attr->name() == SVGNames::xAttr)
-        xBaseValue()->setValueAsString(value);
+        setXBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
-        yBaseValue()->setValueAsString(value);
+        setYBaseValue(SVGLength(this, LengthModeHeight, value));
     else if (attr->name() == SVGNames::widthAttr)
-        widthBaseValue()->setValueAsString(value);
+        setWidthBaseValue(SVGLength(this, LengthModeWidth, value));
     else if (attr->name() == SVGNames::heightAttr)
-        heightBaseValue()->setValueAsString(value);
+        setHeightBaseValue(SVGLength(this, LengthModeHeight, value));
     else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
@@ -93,8 +94,8 @@ void SVGUseElement::closeRenderer()
         return;
     }
 
-    float _x = x()->value(), _y = y()->value();
-    float _w = width()->value(), _h = height()->value();
+    float _x = x().value(), _y = y().value();
+    float _w = width().value(), _h = height().value();
     
     String wString = String::number(_w);
     String hString = String::number(_h);
@@ -158,6 +159,6 @@ RenderObject* SVGUseElement::createRenderer(RenderArena* arena, RenderStyle*)
 
 }
 
-// vim:ts=4:noet
 #endif // SVG_SUPPORT
 
+// vim:ts=4:noet
index e4daa71..308a18c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
                   2004, 2005, 2006 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
@@ -20,8 +20,9 @@
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGUseElementImpl_H
-#define KSVG_SVGUseElementImpl_H
+#ifndef SVGUseElement_H
+#define SVGUseElement_H
+
 #ifdef SVG_SUPPORT
 
 #include "SVGExternalResourcesRequired.h"
@@ -63,10 +64,10 @@ namespace WebCore
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGExternalResourcesRequired, bool, ExternalResourcesRequired, externalResourcesRequired)
         ANIMATED_PROPERTY_FORWARD_DECLARATIONS(SVGURIReference, String, Href, href)
 
-        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength*, RefPtr<SVGLength>, X, x)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength*, RefPtr<SVGLength>, Y, y)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength*, RefPtr<SVGLength>, Width, width)
-        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength*, RefPtr<SVGLength>, Height, height)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength, SVGLength, X, x)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength, SVGLength, Y, y)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength, SVGLength, Width, width)
+        ANIMATED_PROPERTY_DECLARATIONS(SVGUseElement, SVGLength, SVGLength, Height, height)
     };
 
 } // namespace WebCore
index 8fd4150..05e303b 100644 (file)
@@ -564,8 +564,8 @@ static Cursor selectCursor(const MouseEventWithHitTestResults& event, Frame* fra
             if (!cimage) {
                 Element* e = node->document()->getElementById((*cursors)[i].cursorFragmentId);
                 if (e && e->hasTagName(cursorTag)) {
-                    hotSpot.setX(int(static_cast<SVGCursorElement*>(e)->x()->value()));
-                    hotSpot.setY(int(static_cast<SVGCursorElement*>(e)->y()->value()));
+                    hotSpot.setX(int(static_cast<SVGCursorElement*>(e)->x().value()));
+                    hotSpot.setY(int(static_cast<SVGCursorElement*>(e)->y().value()));
                     cimage = static_cast<SVGCursorElement*>(e)->cachedImage();
                 }
             }
index b9aef67..f2a262d 100644 (file)
@@ -40,7 +40,7 @@ RenderForeignObject::RenderForeignObject(SVGForeignObjectElement* node)
 AffineTransform RenderForeignObject::translationForAttributes()
 {
     SVGForeignObjectElement* foreign = static_cast<SVGForeignObjectElement*>(element());
-    return AffineTransform().translate(foreign->x()->value(), foreign->y()->value());
+    return AffineTransform().translate(foreign->x().value(), foreign->y().value());
 }
 
 void RenderForeignObject::paint(PaintInfo& paintInfo, int parentX, int parentY)
index 48b68f6..6b376b2 100644 (file)
@@ -101,8 +101,7 @@ void RenderSVGContainer::layout()
     ASSERT(needsLayout());
     ASSERT(minMaxKnown());
 
-    if (selfNeedsLayout())
-        calcViewport();
+    calcViewport();
 
     IntRect oldBounds;
     bool checkForRepaint = checkForRepaintDuringLayout();
@@ -115,7 +114,9 @@ void RenderSVGContainer::layout()
             child->setNeedsLayout(true);
         child = child->nextSibling();
     }
+
     RenderContainer::layout();
+
     calcWidth();
     calcHeight();
 
@@ -154,7 +155,7 @@ void RenderSVGContainer::paint(PaintInfo& paintInfo, int parentX, int parentY)
         paintInfo.context->concatCTM(AffineTransform().translate(parentX, parentY));
         parentX = parentY = 0;
     }
-    
+
     if (!viewport().isEmpty()) {
         if (style()->overflowX() != OVISIBLE)
             paintInfo.context->clip(enclosingIntRect(viewport())); // FIXME: Eventually we'll want float-precision clipping
@@ -206,15 +207,22 @@ void RenderSVGContainer::calcViewport()
     SVGElement* svgelem = static_cast<SVGElement*>(element());
     if (svgelem->hasTagName(SVGNames::svgTag)) {
         SVGSVGElement* svg = static_cast<SVGSVGElement*>(element());
-        double x = svg->x()->value();
-        double y = svg->y()->value();
-        double w = svg->width()->value();
-        double h = svg->height()->value();
+
+        if (!selfNeedsLayout() && !svg->hasPercentageValues())
+            return;
+
+        double x = svg->x().value();
+        double y = svg->y().value();
+        double w = svg->width().value();
+        double h = svg->height().value();
         m_viewport = FloatRect(x, y, w, h);
     } else if (svgelem->hasTagName(SVGNames::markerTag)) {
+        if (!selfNeedsLayout())
+            return;
+
         SVGMarkerElement* svg = static_cast<SVGMarkerElement*>(element());
-            double w = svg->markerWidth()->value();
-        double h = svg->markerHeight()->value();
+        double w = svg->markerWidth().value();
+        double h = svg->markerHeight().value();
         m_viewport = FloatRect(0, 0, w, h);
     }
 }
index 80b2064..cb00477 100644 (file)
@@ -224,7 +224,7 @@ void RenderSVGImage::layout()
 FloatRect RenderSVGImage::relativeBBox(bool includeStroke) const
 {
     SVGImageElement *image = static_cast<SVGImageElement*>(node());
-    return FloatRect(image->x()->value(), image->y()->value(), width(), height());
+    return FloatRect(image->x().value(), image->y().value(), width(), height());
 }
 
 void RenderSVGImage::imageChanged(CachedImage* image)
@@ -237,7 +237,7 @@ void RenderSVGImage::imageChanged(CachedImage* image)
 IntRect RenderSVGImage::getAbsoluteRepaintRect()
 {
     SVGImageElement *image = static_cast<SVGImageElement*>(node());
-    FloatRect repaintRect = absoluteTransform().mapRect(FloatRect(image->x()->value(), image->y()->value(), width(), height()));
+    FloatRect repaintRect = absoluteTransform().mapRect(FloatRect(image->x().value(), image->y().value(), width(), height()));
 
     // Filters can expand the bounding box
     SVGResourceFilter *filter = getFilterById(document(), style()->svgStyle()->filter().substring(1));
@@ -256,7 +256,7 @@ void RenderSVGImage::absoluteRects(Vector<IntRect>& rects, int tx, int ty)
 AffineTransform RenderSVGImage::translationForAttributes()
 {
     SVGImageElement *image = static_cast<SVGImageElement*>(node());
-    return AffineTransform().translate(image->x()->value(), image->y()->value());
+    return AffineTransform().translate(image->x().value(), image->y().value());
 }
 
 }
index bc15d89..ff19f30 100644 (file)
@@ -66,8 +66,8 @@ void RenderSVGText::layout()
         oldBounds = m_absoluteBounds;
     SVGTextElement* text = static_cast<SVGTextElement*>(element());
     //FIXME:  need to allow floating point positions
-    int xOffset = (int)(text->x()->getFirst() ? text->x()->getFirst()->value() : 0);
-    int yOffset = (int)(text->y()->getFirst() ? text->y()->getFirst()->value() : 0);
+    int xOffset = (int)(text->x()->getFirst().value());
+    int yOffset = (int)(text->y()->getFirst().value());
     setPos(xOffset, yOffset);
     RenderBlock::layout();
     
index a63f2ed..88421c7 100644 (file)
@@ -126,10 +126,9 @@ static bool translateBox(InlineBox* box, int x, int y, bool topLevel = true)
     } else {
         InlineFlowBox* flow = static_cast<InlineFlowBox*>(box);
         SVGTextPositioningElement* text = static_cast<SVGTextPositioningElement*>(box->object()->element());
-
-        if (topLevel || !(text->x()->getFirst() || text->y()->getFirst() ||
-                          (text->dx()->getFirst() && text->dx()->getFirst()->value()) ||
-                          (text->dy()->getFirst() && text->dy()->getFirst()->value()))) {
+        
+        if (topLevel || !(text->x()->getFirst().value() || text->y()->getFirst().value() ||
+                          text->dx()->getFirst().value() || text->dy()->getFirst().value())) {
             box->setXPos(box->xPos() + x);
             box->setYPos(box->yPos() + y);
             for (InlineBox* curr = flow->firstChild(); curr; curr = curr->nextOnLine()) {
@@ -169,12 +168,13 @@ static int placePositionedBoxesHorizontally(InlineFlowBox* flow, int x, int& lef
             assert(curr->object()->isInlineFlow());
             InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr);
             SVGTextPositioningElement* text = static_cast<SVGTextPositioningElement*>(flow->object()->element());
-            x += text->dx()->getFirst() ? static_cast<int>(text->dx()->getFirst()->value()) : 0;
-            if (text->x()->getFirst())
-                x = static_cast<int>(text->x()->getFirst()->value() - xPos);
-            if (text->x()->getFirst() || text->y()->getFirst() ||
-                (text->dx()->getFirst() && text->dx()->getFirst()->value()) ||
-                (text->dy()->getFirst() && text->dy()->getFirst()->value())) {
+            x += (int)(text->dx()->getFirst().value());
+            if (text->x()->numberOfItems() > 0)
+                x = (int)(text->x()->getFirst().value() - xPos);
+            if (text->x()->numberOfItems() > 0 ||
+                text->y()->numberOfItems() > 0 ||
+                text->dx()->numberOfItems() > 0 ||
+                text->dy()->numberOfItems() > 0) {
                 seenPositionedElement = true;
                 needsWordSpacing = false;
                 int ignoreX, ignoreY;
@@ -239,9 +239,11 @@ static void placeBoxesVerticallyWithAbsBaseline(InlineFlowBox* flow, int& height
     for (InlineBox* curr = flow->firstChild(); curr; curr = curr->nextOnLine()) {
         if (curr->isInlineFlowBox()) {
             SVGTextPositioningElement* text = static_cast<SVGTextPositioningElement*>(curr->object()->element());
-            baseline += text->dy()->getFirst() ? static_cast<int>(text->dy()->getFirst()->value()) : 0;
-            if (text->y()->getFirst())
-                baseline = static_cast<int>(text->y()->getFirst()->value() - yPos);
+            baseline += (int)(text->dy()->getFirst().value());
+
+            if (text->y()->numberOfItems() > 0)
+                baseline = (int)(text->y()->getFirst().value() - yPos);
+
             placeBoxesVerticallyWithAbsBaseline(static_cast<InlineFlowBox*>(curr), heightOfBlock, minY, maxY, baseline, yPos);
         }
         const Font& font = curr->object()->font(true);