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 InterpolationType, typename NonInterpolableData> | |
| 16 class ListStyleInterpolationImpl : public StyleInterpolation { | |
| 17 public: | |
| 18 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<InterpolationType, NonInterpolableData>> maybeCreateFromList(const CSSValue& start, const CSSValue& end, CSSPropertyID id, InterpolationRange range = RangeAll) | |
| 19 { | |
| 20 if (start.isValueList() && end.isValueList() && toCSSValueList(start).le ngth() == toCSSValueList(end).length()) { | |
| 21 const CSSValueList& startList = toCSSValueList(start); | |
| 22 const CSSValueList& endList = toCSSValueList(end); | |
| 23 | |
| 24 for (size_t i = 0; i < toCSSValueList(start).length(); i++) { | |
| 25 if (!InterpolationType::canCreateFrom(*startList.item(i), *endLi st.item(i))) { | |
| 26 return nullptr; | |
| 27 } | |
| 28 } | |
| 29 | |
| 30 OwnPtrWillBeRawPtr<Vector<typename InterpolationType::NonInterpolabl eType>> endNonInterpolableData = adoptPtrWillBeNoop(new Vector<typename Interpol ationType::NonInterpolableType>()); | |
|
dstockwell
2015/02/03 02:22:18
I think end/startNonInterpolableData can be just O
evemj (not active)
2015/02/03 03:45:50
Done.
Changed to own ptr and was getting compile
dstockwell
2015/02/03 05:20:40
Ahh, I see! I don't think that's a change we shoul
evemj (not active)
2015/02/03 05:58:45
Hopefully done!
| |
| 31 OwnPtrWillBeRawPtr<Vector<typename InterpolationType::NonInterpolabl eType>> startNonInterpolableData = adoptPtrWillBeNoop(new Vector<typename Interp olationType::NonInterpolableType>()); | |
| 32 | |
| 33 OwnPtrWillBeRawPtr<InterpolableValue> startValue = listToInterpolabl eValue(start, *startNonInterpolableData.get()); | |
| 34 OwnPtrWillBeRawPtr<InterpolableValue> endValue = listToInterpolableV alue(end, *endNonInterpolableData.get()); | |
|
dstockwell
2015/02/03 02:22:18
It seems like we just throw away the endNonInterpo
evemj (not active)
2015/02/03 03:45:50
Done.
Sam and I added a default parameter to list
| |
| 35 | |
| 36 return adoptRefWillBeNoop(new ListStyleInterpolationImpl<Interpolati onType, NonInterpolableData>(startValue.release(), endValue.release(), id, start NonInterpolableData.release(), range)); | |
| 37 } | |
| 38 return nullptr; | |
| 39 } | |
| 40 | |
| 41 virtual void apply(StyleResolverState& state) const override | |
| 42 { | |
| 43 StyleBuilder::applyProperty(m_id, state, interpolableValueToList(m_cache dValue.get(), *m_nonInterpolableData.get(), m_range).get()); | |
| 44 } | |
| 45 | |
| 46 private: | |
| 47 ListStyleInterpolationImpl(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, CSSPropertyID id, | |
| 48 PassOwnPtrWillBeRawPtr<Vector<typename InterpolationType::NonInterpolabl eType>> nonInterpolableData, InterpolationRange range = RangeAll) | |
| 49 : StyleInterpolation(start, end, id) | |
| 50 , m_range(range) | |
| 51 , m_nonInterpolableData(nonInterpolableData) | |
| 52 { | |
| 53 } | |
| 54 | |
| 55 InterpolationRange m_range; | |
| 56 | |
| 57 OwnPtrWillBeRawPtr<Vector<typename InterpolationType::NonInterpolableType>> m_nonInterpolableData; | |
| 58 | |
| 59 static PassOwnPtrWillBeRawPtr<InterpolableValue> listToInterpolableValue(con st CSSValue& value, Vector<typename InterpolationType::NonInterpolableType>& non InterpolableData) | |
| 60 { | |
| 61 const CSSValueList& listValue = toCSSValueList(value); | |
| 62 nonInterpolableData.reserveCapacity(listValue.length()); | |
| 63 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(l istValue.length()); | |
| 64 typename InterpolationType::NonInterpolableType elementData; | |
| 65 for (size_t i = 0; i < listValue.length(); i++) { | |
| 66 result->set(i, InterpolationType::toInterpolableValue(*listValue.ite m(i), elementData)); | |
| 67 nonInterpolableData.append(elementData); | |
| 68 } | |
| 69 return result.release(); | |
| 70 } | |
| 71 | |
| 72 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToList(Interpolable Value* value, const Vector<typename InterpolationType::NonInterpolableType>& non InterpolableData, InterpolationRange range = RangeAll) | |
| 73 { | |
| 74 InterpolableList* listValue = toInterpolableList(value); | |
| 75 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createCommaSepar ated(); | |
| 76 | |
| 77 ASSERT(nonInterpolableData.size() == listValue->length()); | |
| 78 | |
| 79 for (size_t i = 0; i < listValue->length(); i++) | |
| 80 result->append(InterpolationType::fromInterpolableValue(*(listValue- >get(i)), nonInterpolableData[i], range)); | |
| 81 return result.release(); | |
| 82 } | |
| 83 | |
| 84 friend class ListStyleInterpolationTest; | |
| 85 }; | |
| 86 | |
| 87 template<typename InterpolationType> | |
| 88 class ListStyleInterpolationImpl<InterpolationType, void> : public StyleInterpol ation { | |
| 89 public: | |
| 90 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<InterpolationType, void>> maybeCreateFromList(const CSSValue& start, const CSSValue& end, CSSProper tyID id, InterpolationRange range = RangeAll) | |
| 91 { | |
| 92 if (start.isValueList() && end.isValueList() && toCSSValueList(start).le ngth() == toCSSValueList(end).length()) | |
| 93 return adoptRefWillBeNoop(new ListStyleInterpolationImpl<Interpolati onType, void>(listToInterpolableValue(start), listToInterpolableValue(end), id, range)); | |
| 94 return nullptr; | |
| 95 } | |
| 96 | |
| 97 private: | |
| 98 ListStyleInterpolationImpl(PassOwnPtrWillBeRawPtr<InterpolableValue> start, PassOwnPtrWillBeRawPtr<InterpolableValue> end, CSSPropertyID id, InterpolationRa nge range = RangeAll) | |
| 99 : StyleInterpolation(start, end, id), m_range(range) | |
| 100 { | |
| 101 } | |
| 102 | |
| 103 InterpolationRange m_range; | |
| 104 | |
| 105 static PassOwnPtrWillBeRawPtr<InterpolableValue> listToInterpolableValue(con st CSSValue& value) | |
| 106 { | |
| 107 const CSSValueList& listValue = toCSSValueList(value); | |
| 108 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(l istValue.length()); | |
| 109 for (size_t i = 0; i < listValue.length(); i++) | |
| 110 result->set(i, InterpolationType::toInterpolableValue(*listValue.ite m(i))); | |
| 111 return result.release(); | |
| 112 } | |
| 113 | |
| 114 static PassRefPtrWillBeRawPtr<CSSValue> interpolableValueToList(Interpolable Value* value, InterpolationRange range = RangeAll) | |
| 115 { | |
| 116 InterpolableList* listValue = toInterpolableList(value); | |
| 117 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createCommaSepar ated(); | |
| 118 | |
| 119 for (size_t i = 0; i < listValue->length(); i++) | |
| 120 result->append(InterpolationType::fromInterpolableValue(*(listValue- >get(i)), range)); | |
| 121 return result.release(); | |
| 122 } | |
| 123 | |
| 124 virtual void apply(StyleResolverState& state) const override | |
| 125 { | |
| 126 StyleBuilder::applyProperty(m_id, state, interpolableValueToList(m_cache dValue.get(), m_range).get()); | |
| 127 } | |
| 128 | |
| 129 friend class ListStyleInterpolationTest; | |
| 130 | |
| 131 }; | |
| 132 | |
| 133 template<typename InterpolationType> | |
| 134 class ListStyleInterpolation { | |
| 135 public: | |
| 136 static PassRefPtrWillBeRawPtr<ListStyleInterpolationImpl<InterpolationType, typename InterpolationType::NonInterpolableType>> maybeCreateFromList(const CSS Value& start, const CSSValue& end, CSSPropertyID id, InterpolationRange range = RangeAll) | |
| 137 { | |
| 138 return ListStyleInterpolationImpl<InterpolationType, typename Interpolat ionType::NonInterpolableType>::maybeCreateFromList(start, end, id, range); | |
| 139 } | |
| 140 }; | |
| 141 | |
| 142 } // namespace blink | |
| 143 | |
| 144 #endif // ListStyleInterpolation_h | |
| OLD | NEW |