15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * modification, are permitted provided that the following conditions are 6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * in the documentation and/or other materials provided with the 13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * distribution. 14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SVGPathSegList_h 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SVGPathSegList_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/svg/SVGPathByteStream.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGPathSeg.h" 3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/svg/properties/SVGAnimatedProperty.h" 3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/svg/properties/SVGListPropertyHelper.h" 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/WeakPtr.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class SVGPathElement; 43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class SVGPathSegListTearOff; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass SVGPathSegList : public SVGListPropertyHelper<SVGPathSegList, SVGPathSeg> { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) typedef void PrimitiveType; 48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) typedef SVGPathSeg ItemPropertyType; 49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) typedef SVGPathSegListTearOff TearOffType; 5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch typedef SVGListPropertyHelper<SVGPathSegList, SVGPathSeg> Base; 51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) static PassRefPtr<SVGPathSegList> create(SVGPathElement* contextElement) 53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 54e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return adoptRef(new SVGPathSegList(contextElement)); 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch static PassRefPtr<SVGPathSegList> create() { ASSERT_NOT_REACHED(); return nullptr; } 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual ~SVGPathSegList(); 59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const SVGPathByteStream* byteStream() const; 61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void clearByteStream() { m_byteStream.clear(); } 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 6307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // SVGListPropertyHelper methods with |m_byteStream| sync: 64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ItemPropertyType* at(size_t index) 66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::at(index); 69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) size_t length() 72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::length(); 75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool isEmpty() const 78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_listSyncedToByteStream) 80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::isEmpty(); 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return !m_byteStream || m_byteStream->isEmpty(); 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void clear() 86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Base::clear(); 89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void append(PassRefPtr<ItemPropertyType> passNewItem) 92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Base::append(passNewItem); 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> initialize(PassRefPtr<ItemPropertyType> passItem) 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::initialize(passItem); 102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> getItem(size_t index, ExceptionState& exceptionState) 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::getItem(index, exceptionState); 108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> insertItemBefore(PassRefPtr<ItemPropertyType> passItem, size_t index) 111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 113d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::insertItemBefore(passItem, index); 115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> replaceItem(PassRefPtr<ItemPropertyType> passItem, size_t index, ExceptionState& exceptionState) 118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::replaceItem(passItem, index, exceptionState); 122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> removeItem(size_t index, ExceptionState& exceptionState) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateListFromByteStream(); 127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) clearByteStream(); 128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return Base::removeItem(index, exceptionState); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PassRefPtr<ItemPropertyType> appendItem(PassRefPtr<ItemPropertyType> passItem); 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // SVGPropertyBase: 13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch virtual PassRefPtr<SVGPropertyBase> cloneForAnimation(const String&) const OVERRIDE; 135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch virtual PassRefPtr<SVGPathSegList> clone() OVERRIDE; 136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) virtual String valueAsString() const OVERRIDE; 137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void setValueAsString(const String&, ExceptionState&); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) virtual void add(PassRefPtrWillBeRawPtr<SVGPropertyBase>, SVGElement*) OVERRIDE; 14007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch virtual void calculateAnimatedValue(SVGAnimationElement*, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> fromValue, PassRefPtr<SVGPropertyBase> toValue, PassRefPtr<SVGPropertyBase> toAtEndOfDurationValue, SVGElement*) OVERRIDE; 14107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch virtual float calculateDistance(PassRefPtr<SVGPropertyBase> to, SVGElement*) OVERRIDE; 142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) static AnimatedPropertyType classType() { return AnimatedPath; } 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 146e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) SVGPathSegList(SVGPathElement*); 147e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) SVGPathSegList(SVGPathElement*, PassOwnPtr<SVGPathByteStream>); 148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) friend class SVGPathSegListBuilder; 150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // This is only to be called from SVGPathSegListBuilder. 151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void appendWithoutByteStreamSync(PassRefPtr<ItemPropertyType> passNewItem) 152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Base::append(passNewItem); 154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void updateListFromByteStream(); 157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void invalidateList(); 158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // FIXME: This pointer should be removed after SVGPathSeg has a tear-off. 160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // FIXME: oilpan: This is raw-ptr to avoid reference cycles. 161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // SVGPathSegList is either owned by SVGAnimatedPath or 162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // SVGPathSegListTearOff. Both keep |contextElement| alive, 163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // so this ptr is always valid. 164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) SVGPathElement* m_contextElement; 165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) mutable OwnPtr<SVGPathByteStream> m_byteStream; 167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool m_listSyncedToByteStream; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochinline PassRefPtr<SVGPathSegList> toSVGPathSegList(PassRefPtr<SVGPropertyBase> passBase) 171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtr<SVGPropertyBase> base = passBase; 173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(base->type() == SVGPathSegList::classType()); 174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return static_pointer_cast<SVGPathSegList>(base.release()); 175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 180