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 { |
| 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 |