Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef ListStyleInterpolation_h | |
| 6 #define ListStyleInterpolation_h | |
| 7 | |
| 8 #include "core/animation/StyleInterpolation.h" | |
| 9 #include "core/css/CSSPrimitiveValue.h" | |
| 10 #include "core/css/CSSValueList.h" | |
| 11 #include "core/css/resolver/StyleBuilder.h" | |
| 12 | |
| 13 namespace blink { | |
| 14 | |
| 15 template<typename T, typename NI> | |
|
shans
2015/01/29 03:13:11
the 'NI' parameter doesn't appear to be used. It l
evemj (not active)
2015/02/02 03:56:01
Need the NI parameter so that template can be spec
| |
| 16 class ListStyleInterpolationImpl : public StyleInterpolation { | |
| 17 public: | |
| 18 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<T, NI>> create(cons t CSSValue& start, const CSSValue& end, CSSPropertyID id, InterpolationRange ran ge = RangeAll) | |
| 19 { | |
| 20 Vector<typename T::NonInterpolableType> startNonInterpolableData; | |
| 21 Vector<typename T::NonInterpolableType> endNonInterpolableData; | |
| 22 | |
| 23 const CSSValueList& startList = toCSSValueList(start); | |
| 24 const CSSValueList& endList = toCSSValueList(end); | |
| 25 | |
| 26 for (size_t i = 0; i < toCSSValueList(start).length(); i++) { | |
| 27 if (!T::canCreateFrom(*startList.item(i), *endList.item(i))) { | |
| 28 return nullptr; | |
| 29 } | |
| 30 } | |
| 31 return adoptRefWillBeNoop(new ListStyleInterpolationImpl<T, NI>(listToIn terpolableValue(start, startNonInterpolableData), listToInterpolableValue(end, e ndNonInterpolableData), id, startNonInterpolableData, range)); | |
| 32 } | |
| 33 | |
| 34 virtual void apply(StyleResolverState& state) const override | |
| 35 { | |
| 36 StyleBuilder::applyProperty(m_id, state, interpolableValueToList(m_cache dValue.get(), m_nonInterpolableData, m_range).get()); | |
| 37 } | |
| 38 | |
| 39 private: | |
| 40 ListStyleInterpolationImpl(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, CSSPropertyID id, Vector<typename T::NonInterpolableType> nonInterpolableData, InterpolationRange range = RangeAl l) | |
| 41 : StyleInterpolation(start, end, id), m_range(range), m_nonInterpolableD ata(nonInterpolableData) | |
| 42 { | |
| 43 } | |
| 44 | |
| 45 InterpolationRange m_range; | |
| 46 | |
| 47 Vector<typename T::NonInterpolableType> m_nonInterpolableData; | |
| 48 | |
| 49 static PassOwnPtrWillBeRawPtr<InterpolableValue> listToInterpolableValue(con st CSSValue& value, Vector<typename T::NonInterpolableType> &nonInterpolableData ) | |
| 50 { | |
| 51 const CSSValueList& listValue = toCSSValueList(value); | |
| 52 nonInterpolableData.reserveCapacity(listValue.length()); | |
| 53 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(l istValue.length()); | |
| 54 typename T::NonInterpolableType elementData; | |
| 55 for (size_t i = 0; i < listValue.length(); i++) { | |
| 56 result->set(i, T::toInterpolableValue(*listValue.item(i), elementDat a)); | |
| 57 nonInterpolableData.append(elementData); | |
| 58 } | |
| 59 return result.release(); | |
| 60 } | |
| 61 | |
| 62 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToList(Interpolable Value* value, const Vector<typename T::NonInterpolableType>& nonInterpolableDat a, InterpolationRange range = RangeAll) | |
| 63 { | |
| 64 InterpolableList* listValue = toInterpolableList(value); | |
| 65 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createCommaSepar ated(); | |
| 66 | |
| 67 for (size_t i = 0; i < listValue->length(); i++) | |
| 68 result->append(T::fromInterpolableValue(*(listValue->get(i)), nonInt erpolableData[i], range)); | |
| 69 return result.release(); | |
| 70 } | |
| 71 | |
| 72 friend class ListStyleInterpolationTest; | |
| 73 }; | |
| 74 | |
| 75 template<typename T> | |
| 76 class ListStyleInterpolationImpl<T, void> : public StyleInterpolation { | |
| 77 public: | |
| 78 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<T, void>> create(co nst CSSValue& start, const CSSValue& end, CSSPropertyID id, InterpolationRange r ange = RangeAll) | |
| 79 { | |
| 80 return adoptRefWillBeNoop(new ListStyleInterpolationImpl<T, void>(listTo InterpolableValue(start), listToInterpolableValue(end), id, range)); | |
| 81 } | |
| 82 | |
| 83 private: | |
| 84 ListStyleInterpolationImpl(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, CSSPropertyID id, InterpolationRa nge range = RangeAll) | |
| 85 : StyleInterpolation(start, end, id), m_range(range) | |
| 86 { | |
| 87 } | |
| 88 | |
| 89 InterpolationRange m_range; | |
| 90 | |
| 91 static PassOwnPtrWillBeRawPtr<InterpolableValue> listToInterpolableValue(con st CSSValue& value) | |
| 92 { | |
| 93 const CSSValueList& listValue = toCSSValueList(value); | |
| 94 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(l istValue.length()); | |
| 95 for (size_t i = 0; i < listValue.length(); i++) | |
| 96 result->set(i, T::toInterpolableValue(*listValue.item(i))); | |
| 97 return result.release(); | |
| 98 } | |
| 99 | |
| 100 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToList(Interpolable Value* value, InterpolationRange range = RangeAll) | |
| 101 { | |
| 102 InterpolableList* listValue = toInterpolableList(value); | |
| 103 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createCommaSepar ated(); | |
| 104 | |
| 105 for (size_t i = 0; i < listValue->length(); i++) | |
| 106 result->append(T::fromInterpolableValue(*(listValue->get(i)), range) ); | |
| 107 return result.release(); | |
| 108 } | |
| 109 | |
| 110 virtual void apply(StyleResolverState& state) const override | |
| 111 { | |
| 112 StyleBuilder::applyProperty(m_id, state, interpolableValueToList(m_cache dValue.get(), m_range).get()); | |
| 113 } | |
| 114 | |
| 115 friend class ListStyleInterpolationTest; | |
| 116 | |
| 117 }; | |
| 118 | |
| 119 template<typename T> | |
| 120 class ListStyleInterpolation { | |
| 121 public: | |
| 122 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<T, typename T::NonI nterpolableType>> maybeCreateFromList(const CSSValue& start, const CSSValue& en d, CSSPropertyID id, InterpolationRange range = RangeAll) | |
| 123 { | |
| 124 if (start.isValueList() && end.isValueList() && toCSSValueList(start).le ngth() == toCSSValueList(end).length()) | |
| 125 return ListStyleInterpolationImpl<T, typename T::NonInterpolableType >::create(start, end, id, range); | |
| 126 return nullptr; | |
| 127 } | |
| 128 }; | |
| 129 | |
| 130 } // namespace blink | |
| 131 | |
| 132 #endif // ListStyleInterpolation_h | |
| OLD | NEW |