Reviewed by Oliver.
authorzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Jul 2008 12:55:47 +0000 (12:55 +0000)
committerzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 7 Jul 2008 12:55:47 +0000 (12:55 +0000)
Working on: http://bugs.webkit.org/show_bug.cgi?id=17779 (SVG 1.1 Errata demands "SVG JavaScript Liveness" support)

Splitting up large patch in small chunk: Land valueAsString() implementation on it's own.

Added valueAsString() conversion for all SVG primitive types, needed by the SVG<->XML synchronization layer.
Unify "null value for a SVG animated type" concept, which was implemented in SVGDocumentExtensions before, in SVGAnimatedTemplate.

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

WebCore/ChangeLog
WebCore/svg/SVGAnimatedTemplate.h
WebCore/svg/SVGDocumentExtensions.h
WebCore/svg/SVGLengthList.cpp
WebCore/svg/SVGLengthList.h
WebCore/svg/SVGNumberList.cpp
WebCore/svg/SVGNumberList.h
WebCore/svg/SVGPreserveAspectRatio.cpp
WebCore/svg/SVGPreserveAspectRatio.h
WebCore/svg/SVGTransformList.cpp
WebCore/svg/SVGTransformList.h

index 6a3cb3d..cb1958e 100644 (file)
@@ -1,3 +1,36 @@
+2008-07-07  Nikolas Zimmermann  <zimmermann@kde.org>
+
+        Reviewed by Oliver.
+
+        Working on: http://bugs.webkit.org/show_bug.cgi?id=17779 (SVG 1.1 Errata demands "SVG JavaScript Liveness" support)
+
+        Splitting up large patch in small chunk: Land valueAsString() implementation on it's own.
+
+        Added valueAsString() conversion for all SVG primitive types, needed by the SVG<->XML synchronization layer.
+        Unify "null value for a SVG animated type" concept, which was implemented in SVGDocumentExtensions before,
+        in SVGAnimatedTemplate.
+
+        * svg/SVGAnimatedTemplate.h:
+        (WebCore::SVGAnimatedTemplate::associatedAttributeName):
+        (WebCore::lookupOrCreateWrapper):
+        (WebCore::SVGAnimatedTypeValue::null):
+        (WebCore::SVGAnimatedTypeValue::toString):
+        (WebCore::):
+        * svg/SVGDocumentExtensions.h:
+        (WebCore::SVGDocumentExtensions::baseValue):
+        * svg/SVGLengthList.cpp:
+        (WebCore::SVGLengthList::valueAsString):
+        * svg/SVGLengthList.h:
+        * svg/SVGNumberList.cpp:
+        (WebCore::SVGNumberList::valueAsString):
+        * svg/SVGNumberList.h:
+        * svg/SVGPreserveAspectRatio.cpp:
+        (WebCore::SVGPreserveAspectRatio::valueAsString):
+        * svg/SVGPreserveAspectRatio.h:
+        * svg/SVGTransformList.cpp:
+        (SVGTransformList::valueAsString):
+        * svg/SVGTransformList.h:
+
 2008-07-06  Sam Weinig  <sam@webkit.org>
 
         Reviewed by Dan Bernstein.
index b30bc69..78778c4 100644 (file)
 #define SVGAnimatedTemplate_h
 
 #if ENABLE(SVG)
-#include <wtf/RefCounted.h>
 #include "AtomicString.h"
-#include "Attribute.h"
+#include "FloatRect.h"
+#include "SVGLength.h"
 
 namespace WebCore {
-
-    class FloatRect;
+   
     class SVGAngle;
     class SVGElement;
-    class SVGLength;
     class SVGLengthList;
     class SVGNumberList;
     class SVGPreserveAspectRatio;
@@ -45,17 +43,18 @@ namespace WebCore {
             : element(0)
             , attributeName(0)
         { }
-        
+
         // Deleted value
         SVGAnimatedTypeWrapperKey(WTF::HashTableDeletedValueType)
             : element(reinterpret_cast<SVGElement*>(-1))
         {
         }
+
         bool isHashTableDeletedValue() const
         {
             return element == reinterpret_cast<SVGElement*>(-1);
         }
-        
+
         SVGAnimatedTypeWrapperKey(const SVGElement* _element, const AtomicString& _attributeName)
             : element(_element)
             , attributeName(_attributeName.impl())
@@ -63,12 +62,12 @@ namespace WebCore {
             ASSERT(element);
             ASSERT(attributeName);
         }
-        
+
         bool operator==(const SVGAnimatedTypeWrapperKey& other) const
         {
             return element == other.element && attributeName == other.attributeName;
         }
-        
+
         const SVGElement* element;
         AtomicStringImpl* attributeName;
     };
@@ -78,7 +77,7 @@ namespace WebCore {
         {
             return StringImpl::computeHash(reinterpret_cast<const UChar*>(&key), sizeof(SVGAnimatedTypeWrapperKey) / sizeof(UChar));
         }
-            
+
         static bool equal(const SVGAnimatedTypeWrapperKey& a, const SVGAnimatedTypeWrapperKey& b)
         {
             return a == b;
@@ -86,30 +85,31 @@ namespace WebCore {
 
         static const bool safeToCompareToEmptyOrDeleted = true;
     };
-    
+
     struct SVGAnimatedTypeWrapperKeyHashTraits : WTF::GenericHashTraits<SVGAnimatedTypeWrapperKey> {
         static const bool emptyValueIsZero = true;
-        
+
         static void constructDeletedValue(SVGAnimatedTypeWrapperKey& slot)
         {
             new (&slot) SVGAnimatedTypeWrapperKey(WTF::HashTableDeletedValue);
         }
+
         static bool isDeletedValue(const SVGAnimatedTypeWrapperKey& value)
         {
             return value.isHashTableDeletedValue();
         }
     };
-    
     template<typename BareType>
     class SVGAnimatedTemplate : public RefCounted<SVGAnimatedTemplate<BareType> > {
     public:
         virtual ~SVGAnimatedTemplate() { forgetWrapper(this); }
 
         virtual BareType baseVal() const = 0;
-        virtual void setBaseVal(BareType newBaseVal) = 0;
+        virtual void setBaseVal(BareType) = 0;
 
         virtual BareType animVal() const = 0;
-        virtual void setAnimVal(BareType newAnimVal) = 0;
+        virtual void setAnimVal(BareType) = 0;
 
         typedef HashMap<SVGAnimatedTypeWrapperKey, SVGAnimatedTemplate<BareType>*, SVGAnimatedTypeWrapperKeyHash, SVGAnimatedTypeWrapperKeyHashTraits > ElementToWrapperMap;
         typedef typename ElementToWrapperMap::const_iterator ElementToWrapperMapIterator;
@@ -119,7 +119,7 @@ namespace WebCore {
             static ElementToWrapperMap* s_wrapperCache = new ElementToWrapperMap;                
             return s_wrapperCache;
         }
-        
+
         static void forgetWrapper(SVGAnimatedTemplate<BareType>* wrapper)
         {
             ElementToWrapperMap* cache = wrapperCache();
@@ -133,7 +133,7 @@ namespace WebCore {
             }
         }
 
-       const QualifiedName& associatedAttributeName() const { return m_associatedAttributeName; }
+        const QualifiedName& associatedAttributeName() const { return m_associatedAttributeName; }
 
     protected:
         SVGAnimatedTemplate(const QualifiedName& attributeName)
@@ -142,7 +142,7 @@ namespace WebCore {
         }
 
     private:
-       const QualifiedName& m_associatedAttributeName;
+        const QualifiedName& m_associatedAttributeName;
     };
 
     template <class Type, class SVGElementSubClass>
@@ -150,13 +150,64 @@ namespace WebCore {
     {
         SVGAnimatedTypeWrapperKey key(element, attrIdentifier);
         RefPtr<Type> wrapper = static_cast<Type*>(Type::wrapperCache()->get(key));
+
         if (!wrapper) {
             wrapper = Type::create(element, domAttrName);
             Type::wrapperCache()->set(key, wrapper.get());
         }
+
         return wrapper.release();
     }
 
+    // Default implementation for pointer types
+    template<typename Type>
+    struct SVGAnimatedTypeValue : Noncopyable {
+        static Type null() { return 0; }
+        static AtomicString toString(Type type) { return type ? AtomicString(type->valueAsString()) : nullAtom; }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<bool> : Noncopyable {
+        static bool null() { return false; }
+        static AtomicString toString(bool type) { return type ? "true" : "false"; }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<int> : Noncopyable {
+        static int null() { return 0; }
+        static AtomicString toString(int type) { return String::number(type); }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<long> : Noncopyable {
+        static long null() { return 0l; }
+        static AtomicString toString(long type) { return String::number(type); }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<SVGLength> : Noncopyable {
+        static SVGLength null() { return SVGLength(); }
+        static AtomicString toString(const SVGLength& type) { return type.valueAsString(); }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<float> : Noncopyable {
+        static float null() { return 0.0f; }
+        static AtomicString toString(float type) { return String::number(type); }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<FloatRect> : Noncopyable {
+        static FloatRect null() { return FloatRect(); }
+        static AtomicString toString(const FloatRect& type) { return String::format("%f %f %f %f", type.x(), type.y(), type.width(), type.height()); }
+    };
+
+    template<>
+    struct SVGAnimatedTypeValue<String> : Noncopyable {
+        static String null() { return String(); }
+        static AtomicString toString(const String& type) { return type; }
+    };
+
     // Common type definitions, to ease IDL generation.
     typedef SVGAnimatedTemplate<SVGAngle*> SVGAnimatedAngle;
     typedef SVGAnimatedTemplate<bool> SVGAnimatedBoolean;
@@ -170,6 +221,7 @@ namespace WebCore {
     typedef SVGAnimatedTemplate<FloatRect> SVGAnimatedRect;
     typedef SVGAnimatedTemplate<String> SVGAnimatedString;
     typedef SVGAnimatedTemplate<SVGTransformList*> SVGAnimatedTransformList;
+
 }
 
 #endif // ENABLE(SVG)
index 0b1ed89..882190d 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2006 Apple Computer, Inc.
-                  2006 Nikolas Zimmermann <zimmermann@kde.org>
+                  2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
 
     This file is part of the WebKit project
 
 #define SVGDocumentExtensions_h
 
 #if ENABLE(SVG)
-
 #include <memory>
-#include <wtf/Forward.h>
+
 #include <wtf/HashSet.h>
 #include <wtf/HashMap.h>
 
-#include "FloatRect.h"
 #include "StringHash.h"
 #include "StringImpl.h"
-#include "AtomicString.h"
+#include "SVGAnimatedTemplate.h"
 
 namespace WebCore {
 
-class AtomicString;
 class Document;
 class EventListener;
 class Node;
 class String;
-class SVGElement;
 class SVGElementInstance;
 class SVGStyledElement;
 class SVGSVGElement;
-class TimeScheduler;
 
 class SVGDocumentExtensions {
 public:
@@ -103,7 +98,7 @@ public:
         if (propertyMap)
             return propertyMap->get(propertyName.impl());
 
-        return 0;
+        return SVGAnimatedTypeValue<ValueType>::null();
     }
 
     template<typename ValueType>
@@ -139,52 +134,7 @@ public:
     }
 };
 
-// Special handling for WebCore::String
-template<>
-inline String SVGDocumentExtensions::baseValue<String>(const SVGElement* element, const AtomicString& propertyName) const
-{
-    HashMap<StringImpl*, String>* propertyMap = baseValueMap<String>()->get(element);
-    if (propertyMap)
-        return propertyMap->get(propertyName.impl());
-
-    return String();
-}
-
-// Special handling for WebCore::FloatRect
-template<>
-inline FloatRect SVGDocumentExtensions::baseValue<FloatRect>(const SVGElement* element, const AtomicString& propertyName) const
-{
-    HashMap<StringImpl*, FloatRect>* propertyMap = baseValueMap<FloatRect>()->get(element);
-    if (propertyMap)
-        return propertyMap->get(propertyName.impl());
-
-    return FloatRect();
-}
-
-// Special handling for booleans
-template<>
-inline bool SVGDocumentExtensions::baseValue<bool>(const SVGElement* element, const AtomicString& propertyName) const
-{
-    HashMap<StringImpl*, bool>* propertyMap = baseValueMap<bool>()->get(element);
-    if (propertyMap)
-        return propertyMap->get(propertyName.impl());
-
-    return false;
-}
-
-// Special handling for doubles
-template<>
-inline double SVGDocumentExtensions::baseValue<double>(const SVGElement* element, const AtomicString& propertyName) const
-{
-    HashMap<StringImpl*, double>* propertyMap = baseValueMap<double>()->get(element);
-    if (propertyMap)
-        return propertyMap->get(propertyName.impl());
-
-    return 0.0;
-}
-
 }
 
 #endif // ENABLE(SVG)
-
 #endif
index c2d8160..dfff47f 100644 (file)
@@ -59,6 +59,22 @@ void SVGLengthList::parse(const String& value, const SVGStyledElement* context,
     }
 }
 
+String SVGLengthList::valueAsString() const
+{
+    String result;
+
+    ExceptionCode ec = 0;
+    for (unsigned int i = 0; i < numberOfItems(); ++i) {
+        if (i > 0)
+            result += ", ";
+
+        result += getItem(i, ec).valueAsString();
+        ASSERT(ec == 0);
+    }
+
+    return result;
+}
+
 }
 
 #endif // ENABLE(SVG)
index a2c615d..d295a79 100644 (file)
@@ -35,7 +35,9 @@ namespace WebCore {
         virtual ~SVGLengthList();
 
         void parse(const String& value, const SVGStyledElement* context, SVGLengthMode mode);
-        
+        String valueAsString() const;
+
     private:
         SVGLengthList(const QualifiedName&);
     };
index 7931eca..be1e895 100644 (file)
@@ -54,6 +54,22 @@ void SVGNumberList::parse(const String& value)
     }
 }
 
+String SVGNumberList::valueAsString() const
+{
+    String result;
+
+    ExceptionCode ec = 0;
+    for (unsigned int i = 0; i < numberOfItems(); ++i) {
+        if (i > 0)
+            result += ", ";
+
+        result += String::number(getItem(i, ec));
+        ASSERT(ec == 0);
+    }
+
+    return result;
+}
+
 }
 
 #endif // ENABLE(SVG)
index cd5957b..6cd43ff 100644 (file)
@@ -37,7 +37,9 @@ namespace WebCore {
         virtual ~SVGNumberList();
 
         void parse(const String& value);
-        
+        String valueAsString() const;
+
     private:
         SVGNumberList(const QualifiedName&);
     };
index 0709b9d..0388939 100644 (file)
@@ -202,6 +202,59 @@ AffineTransform SVGPreserveAspectRatio::getCTM(double logicX, double logicY,
     return temp;
 }
 
+String SVGPreserveAspectRatio::valueAsString() const
+{
+    String result;
+
+    switch ((SVGPreserveAspectRatioType) align()) {
+    default:
+    case SVG_PRESERVEASPECTRATIO_NONE:
+        result = "none";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMINYMIN:
+        result = "xMinYMin";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMIDYMIN:
+        result = "xMidYMin";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMAXYMIN:
+        result = "xMaxYMin";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMINYMID:
+        result = "xMinYMid";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMIDYMID:
+        result = "xMidYMid";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMAXYMID:
+        result = "xMaxYMid";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMINYMAX:
+        result = "xMinYMax";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMIDYMAX:
+        result = "xMidYMax";
+        break;
+    case SVG_PRESERVEASPECTRATIO_XMAXYMAX:
+        result = "xMaxYMax";
+        break;
+    };
+
+    switch ((SVGMeetOrSliceType) meetOrSlice()) {
+    default:
+    case SVG_MEETORSLICE_UNKNOWN:
+        break;
+    case SVG_MEETORSLICE_MEET:
+        result += " meet";
+        break;
+    case SVG_MEETORSLICE_SLICE:
+        result += " slice";
+        break;
+    };
+
+    return result;
+}
+
 }
 
 #endif // ENABLE(SVG)
index a1bed65..0dfe940 100644 (file)
@@ -74,6 +74,7 @@ namespace WebCore {
 
         // Helper
         bool parsePreserveAspectRatio(const UChar*& currParam, const UChar* end, bool validate = true);
+        String valueAsString() const;
 
         const QualifiedName& associatedAttributeName() const { return SVGNames::preserveAspectRatioAttr; }
 
index 9b75848..9800922 100644 (file)
@@ -82,4 +82,16 @@ SVGTransform SVGTransformList::concatenateForType(SVGTransform::SVGTransformType
     return totalTransform.addToSVGTransform(SVGTransform());
 }
 
+String SVGTransformList::valueAsString() const
+{
+    // TODO: We may want to build a real transform string, instead of concatting to a matrix(...).
+    SVGTransform transform = concatenate();
+    if (transform.type() == SVGTransform::SVG_TRANSFORM_MATRIX) {
+        AffineTransform matrix = transform.matrix();
+        return String::format("matrix(%f %f %f %f %f %f)", matrix.a(), matrix.b(), matrix.c(), matrix.d(), matrix.e(), matrix.f());
+    }
+
+    return String();
+}
+
 #endif // ENABLE(SVG)
index be72f9d..a405c58 100644 (file)
@@ -30,6 +30,8 @@
 
 namespace WebCore {
 
+    class String;
+
     class SVGTransformList : public SVGPODList<SVGTransform> {
     public:
         static PassRefPtr<SVGTransformList> create(const QualifiedName& attributeName) { return adoptRef(new SVGTransformList(attributeName)); }
@@ -41,7 +43,9 @@ namespace WebCore {
         // Internal use only
         SVGTransform concatenate() const;
         SVGTransform concatenateForType(SVGTransform::SVGTransformType) const;
-        
+        String valueAsString() const;
+
     private:
         SVGTransformList(const QualifiedName&);
     };