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 |