diff options
Diffstat (limited to 'Source/WebCore/svg/SVGTransformList.h')
-rw-r--r-- | Source/WebCore/svg/SVGTransformList.h | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/Source/WebCore/svg/SVGTransformList.h b/Source/WebCore/svg/SVGTransformList.h index 14aba3bf4..d329fd38b 100644 --- a/Source/WebCore/svg/SVGTransformList.h +++ b/Source/WebCore/svg/SVGTransformList.h @@ -18,38 +18,60 @@ * Boston, MA 02110-1301, USA. */ -#ifndef SVGTransformList_h -#define SVGTransformList_h +#pragma once -#if ENABLE(SVG) -#include "SVGPropertyTraits.h" -#include "SVGTransform.h" -#include <wtf/Vector.h> +#include "SVGAnimatedListPropertyTearOff.h" +#include "SVGListPropertyTearOff.h" +#include "SVGTransformListValues.h" namespace WebCore { -class SVGTransformList : public Vector<SVGTransform> { +class SVGTransformList final : public SVGListPropertyTearOff<SVGTransformListValues> { public: - SVGTransformList() { } + using AnimatedListPropertyTearOff = SVGAnimatedListPropertyTearOff<SVGTransformListValues>; + using ListWrapperCache = AnimatedListPropertyTearOff::ListWrapperCache; - SVGTransform createSVGTransformFromMatrix(const SVGMatrix&) const; - SVGTransform consolidate(); + static Ref<SVGTransformList> create(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGTransformListValues& values, ListWrapperCache& wrappers) + { + return adoptRef(*new SVGTransformList(animatedProperty, role, values, wrappers)); + } - // Internal use only - bool concatenate(AffineTransform& result) const; - - String valueAsString() const; - void parse(const String&); -}; + ExceptionOr<Ref<SVGTransform>> createSVGTransformFromMatrix(SVGMatrix& matrix) + { + ASSERT(m_values); + return m_values->createSVGTransformFromMatrix(matrix); + } + + ExceptionOr<RefPtr<SVGTransform>> consolidate() + { + ASSERT(m_values); + ASSERT(m_wrappers); + + auto result = canAlterList(); + if (result.hasException()) + return result.releaseException(); + ASSERT(result.releaseReturnValue()); + + ASSERT(m_values->size() == m_wrappers->size()); -template<> -struct SVGPropertyTraits<SVGTransformList> { - static SVGTransformList initialValue() { return SVGTransformList(); } - static String toString(const SVGTransformList& type) { return type.valueAsString(); } - typedef SVGTransform ListItemType; + // Spec: If the list was empty, then a value of null is returned. + if (m_values->isEmpty()) + return nullptr; + + detachListWrappers(0); + + RefPtr<SVGTransform> wrapper = m_values->consolidate(); + m_wrappers->append(wrapper.get()); + + ASSERT(m_values->size() == m_wrappers->size()); + return WTFMove(wrapper); + } + +private: + SVGTransformList(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGTransformListValues& values, ListWrapperCache& wrappers) + : SVGListPropertyTearOff<SVGTransformListValues>(animatedProperty, role, values, wrappers) + { + } }; } // namespace WebCore - -#endif // ENABLE(SVG) -#endif // SVGTransformList_h |