Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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 #include "core/animation/CSSTranslateInterpolationType.h" | |
| 6 | |
| 7 #include "core/animation/CSSLengthInterpolationType.h" | |
| 8 #include "core/css/CSSValueList.h" | |
| 9 #include "core/css/resolver/StyleResolverState.h" | |
| 10 #include "platform/transforms/TranslateTransformOperation.h" | |
| 11 | |
| 12 namespace blink { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 class ParentTranslateChecker : public InterpolationType::ConversionChecker { | |
| 17 public: | |
| 18 ~ParentTranslateChecker() {} | |
| 19 | |
| 20 static PassOwnPtr<ParentTranslateChecker> create(PassRefPtr<TranslateTransfo rmOperation> parentTranslate) | |
| 21 { | |
| 22 return adoptPtr(new ParentTranslateChecker(parentTranslate)); | |
| 23 } | |
| 24 | |
| 25 bool isValid(const InterpolationEnvironment& environment, const Interpolatio nValue& underlying) const final | |
| 26 { | |
| 27 const TransformOperation* parentTranslate = environment.state().parentSt yle()->translate(); | |
| 28 if (m_parentTranslate == parentTranslate) | |
| 29 return true; | |
| 30 if (!m_parentTranslate || !parentTranslate) | |
| 31 return false; | |
| 32 return *m_parentTranslate == *parentTranslate; | |
| 33 } | |
| 34 | |
| 35 private: | |
| 36 ParentTranslateChecker(PassRefPtr<TranslateTransformOperation> parentTransla te) | |
| 37 : m_parentTranslate(parentTranslate) | |
| 38 { } | |
| 39 | |
| 40 RefPtr<TransformOperation> m_parentTranslate; | |
| 41 }; | |
| 42 | |
| 43 enum TranslateComponentIndex { | |
| 44 TranslateX, | |
| 45 TranslateY, | |
| 46 TranslateZ, | |
| 47 TranslateComponentIndexCount, | |
| 48 }; | |
| 49 | |
| 50 InterpolationValue createNeutralValue() | |
| 51 { | |
| 52 OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponen tIndexCount); | |
| 53 result->set(TranslateX, CSSLengthInterpolationType::createNeutralInterpolabl eValue()); | |
| 54 result->set(TranslateY, CSSLengthInterpolationType::createNeutralInterpolabl eValue()); | |
| 55 result->set(TranslateZ, CSSLengthInterpolationType::createNeutralInterpolabl eValue()); | |
| 56 return InterpolationValue(result.release()); | |
| 57 } | |
| 58 | |
| 59 InterpolationValue convertTranslateOperation(const TranslateTransformOperation* translate, double zoom) | |
| 60 { | |
| 61 if (!translate) | |
| 62 return createNeutralValue(); | |
| 63 | |
| 64 OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponen tIndexCount); | |
| 65 result->set(TranslateX, CSSLengthInterpolationType::maybeConvertLength(trans late->x(), zoom).interpolableValue.release()); | |
| 66 result->set(TranslateY, CSSLengthInterpolationType::maybeConvertLength(trans late->y(), zoom).interpolableValue.release()); | |
| 67 result->set(TranslateZ, CSSLengthInterpolationType::maybeConvertLength(Lengt h(translate->z(), Fixed), zoom).interpolableValue.release()); | |
| 68 return InterpolationValue(result.release()); | |
| 69 } | |
| 70 | |
| 71 } // namespace | |
| 72 | |
| 73 InterpolationValue CSSTranslateInterpolationType::maybeConvertNeutral(const Inte rpolationValue& underlying, ConversionCheckers&) const | |
| 74 { | |
| 75 return createNeutralValue(); | |
| 76 } | |
| 77 | |
| 78 InterpolationValue CSSTranslateInterpolationType::maybeConvertInitial() const | |
| 79 { | |
| 80 return createNeutralValue(); | |
| 81 } | |
| 82 | |
| 83 InterpolationValue CSSTranslateInterpolationType::maybeConvertInherit(const Styl eResolverState& state, ConversionCheckers& conversionCheckers) const | |
| 84 { | |
|
Eric Willigers
2016/02/17 07:15:50
Do we need
if (!state.parentStyle()) return nullpt
alancutter (OOO until 2018)
2016/02/17 23:50:22
This check is no longer needed, I will make a clea
| |
| 85 TranslateTransformOperation* parentTranslate = state.parentStyle()->translat e(); | |
| 86 conversionCheckers.append(ParentTranslateChecker::create(parentTranslate)); | |
| 87 return convertTranslateOperation(parentTranslate, state.parentStyle()->effec tiveZoom()); | |
| 88 } | |
| 89 | |
| 90 InterpolationValue CSSTranslateInterpolationType::maybeConvertValue(const CSSVal ue& value, const StyleResolverState&, ConversionCheckers&) const | |
| 91 { | |
| 92 if (!value.isBaseValueList()) | |
| 93 return nullptr; | |
| 94 | |
| 95 const CSSValueList& list = toCSSValueList(value); | |
| 96 if (list.length() < 1 || list.length() > 3) | |
| 97 return nullptr; | |
| 98 | |
| 99 OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponen tIndexCount); | |
| 100 for (size_t i = 0; i < TranslateComponentIndexCount; i++) { | |
| 101 InterpolationValue component = nullptr; | |
| 102 if (i < list.length()) { | |
| 103 component = CSSLengthInterpolationType::maybeConvertCSSValue(*list.i tem(i)); | |
| 104 if (!component) | |
| 105 return nullptr; | |
| 106 } else { | |
| 107 component = InterpolationValue(CSSLengthInterpolationType::createNeu tralInterpolableValue()); | |
| 108 } | |
| 109 result->set(i, component.interpolableValue.release()); | |
| 110 } | |
| 111 return InterpolationValue(result.release()); | |
| 112 } | |
| 113 | |
| 114 InterpolationValue CSSTranslateInterpolationType::maybeConvertUnderlyingValue(co nst InterpolationEnvironment& environment) const | |
| 115 { | |
| 116 return convertTranslateOperation(environment.state().style()->translate(), e nvironment.state().style()->effectiveZoom()); | |
| 117 } | |
| 118 | |
| 119 void CSSTranslateInterpolationType::apply(const InterpolableValue& interpolableV alue, const NonInterpolableValue*, InterpolationEnvironment& environment) const | |
| 120 { | |
| 121 const InterpolableList& list = toInterpolableList(interpolableValue); | |
| 122 const CSSToLengthConversionData& conversionData = environment.state().cssToL engthConversionData(); | |
| 123 Length x = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(T ranslateX), nullptr, conversionData, ValueRangeAll); | |
| 124 Length y = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(T ranslateY), nullptr, conversionData, ValueRangeAll); | |
| 125 float z = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(Tr anslateZ), nullptr, conversionData, ValueRangeAll).pixels(); | |
| 126 | |
| 127 RefPtr<TranslateTransformOperation> result = nullptr; | |
| 128 if (!x.isZero() || !y.isZero() || z != 0) | |
| 129 result = TranslateTransformOperation::create(x, y, z, TransformOperation ::Translate3D); | |
| 130 environment.state().style()->setTranslate(result.release()); | |
| 131 } | |
| 132 | |
| 133 } // namespace blink | |
| OLD | NEW |