Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: third_party/WebKit/Source/core/animation/CSSVisibilityInterpolationType.cpp

Issue 1548873002: Port CSS visibility animations to CSSInterpolationTypes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added deferred interpolation comment Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 #include "core/animation/CSSVisibilityInterpolationType.h"
6
7 #include "core/css/CSSPrimitiveValueMappings.h"
8 #include "core/css/resolver/StyleResolverState.h"
9
10 namespace blink {
11
12 class CSSVisibilityNonInterpolableValue : public NonInterpolableValue {
13 public:
14 ~CSSVisibilityNonInterpolableValue() final { }
15
16 static PassRefPtr<CSSVisibilityNonInterpolableValue> create(EVisibility star t, EVisibility end)
17 {
18 return adoptRef(new CSSVisibilityNonInterpolableValue(start, end));
19 }
20
21 EVisibility visibility() const
22 {
23 ASSERT(m_isSingle);
24 return m_start;
25 }
26
27 EVisibility visibility(double fraction) const
28 {
29 if (m_isSingle || fraction <= 0)
30 return m_start;
31 if (fraction >= 1)
32 return m_end;
33 if (m_start == VISIBLE || m_end == VISIBLE)
34 return VISIBLE;
35 return fraction < 0.5 ? m_start : m_end;
36 }
37
38 DECLARE_NON_INTERPOLABLE_VALUE_TYPE();
39
40 private:
41 CSSVisibilityNonInterpolableValue(EVisibility start, EVisibility end)
42 : m_start(start)
43 , m_end(end)
44 , m_isSingle(m_start == m_end)
45 { }
46
47 const EVisibility m_start;
48 const EVisibility m_end;
49 const bool m_isSingle;
50 };
51
52 DEFINE_NON_INTERPOLABLE_VALUE_TYPE(CSSVisibilityNonInterpolableValue);
53 DEFINE_NON_INTERPOLABLE_VALUE_TYPE_CASTS(CSSVisibilityNonInterpolableValue);
54
55 class UnderlyingVisibilityChecker : public InterpolationType::ConversionChecker {
56 public:
57 ~UnderlyingVisibilityChecker() final {}
58
59 static PassOwnPtr<UnderlyingVisibilityChecker> create(const InterpolationTyp e& type, EVisibility visibility)
60 {
61 return adoptPtr(new UnderlyingVisibilityChecker(type, visibility));
62 }
63
64 private:
65 UnderlyingVisibilityChecker(const InterpolationType& type, EVisibility visib ility)
66 : ConversionChecker(type)
67 , m_visibility(visibility)
68 { }
69
70 bool isValid(const InterpolationEnvironment&, const UnderlyingValue& underly ingValue) const final
71 {
72 double underlyingFraction = toInterpolableNumber(underlyingValue->interp olableValue()).value();
73 EVisibility underlyingVisibility = toCSSVisibilityNonInterpolableValue(u nderlyingValue->nonInterpolableValue())->visibility(underlyingFraction);
74 return m_visibility == underlyingVisibility;
75 }
76
77 const EVisibility m_visibility;
78 };
79
80 class ParentVisibilityChecker : public InterpolationType::ConversionChecker {
81 public:
82 static PassOwnPtr<ParentVisibilityChecker> create(const InterpolationType& t ype, EVisibility visibility)
83 {
84 return adoptPtr(new ParentVisibilityChecker(type, visibility));
85 }
86
87 private:
88 ParentVisibilityChecker(const InterpolationType& type, EVisibility visibilit y)
89 : ConversionChecker(type)
90 , m_visibility(visibility)
91 { }
92
93 bool isValid(const InterpolationEnvironment& environment, const UnderlyingVa lue&) const final
94 {
95 return m_visibility == environment.state().parentStyle()->visibility();
96 }
97
98 DEFINE_INLINE_VIRTUAL_TRACE() { ConversionChecker::trace(visitor); }
99
100 const double m_visibility;
101 };
102
103 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::createVisibilityV alue(EVisibility visibility) const
104 {
105 return InterpolationValue::create(*this, InterpolableNumber::create(0), CSSV isibilityNonInterpolableValue::create(visibility, visibility));
106 }
107
108 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::maybeConvertNeutr al(const UnderlyingValue& underlyingValue, ConversionCheckers& conversionChecker s) const
109 {
110 double underlyingFraction = toInterpolableNumber(underlyingValue->interpolab leValue()).value();
111 EVisibility underlyingVisibility = toCSSVisibilityNonInterpolableValue(under lyingValue->nonInterpolableValue())->visibility(underlyingFraction);
112 conversionCheckers.append(UnderlyingVisibilityChecker::create(*this, underly ingVisibility));
113 return createVisibilityValue(underlyingVisibility);
114 }
115
116 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::maybeConvertIniti al() const
117 {
118 return createVisibilityValue(VISIBLE);
119 }
120
121 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::maybeConvertInher it(const StyleResolverState& state, ConversionCheckers& conversionCheckers) cons t
122 {
123 if (!state.parentStyle())
124 return nullptr;
125 EVisibility inheritedVisibility = state.parentStyle()->visibility();
126 conversionCheckers.append(ParentVisibilityChecker::create(*this, inheritedVi sibility));
127 return createVisibilityValue(inheritedVisibility);
128 }
129
130 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::maybeConvertValue (const CSSValue& value, const StyleResolverState& state, ConversionCheckers& con versionCheckers) const
131 {
132 if (!value.isPrimitiveValue())
133 return nullptr;
134
135 const CSSPrimitiveValue& primitiveValue = toCSSPrimitiveValue(value);
136 CSSValueID keyword = primitiveValue.getValueID();
137
138 switch (keyword) {
139 case CSSValueHidden:
140 case CSSValueVisible:
141 case CSSValueCollapse:
142 return createVisibilityValue(primitiveValue.convertTo<EVisibility>());
143 default:
144 return nullptr;
145 }
146 }
147
148 PassOwnPtr<InterpolationValue> CSSVisibilityInterpolationType::maybeConvertUnder lyingValue(const InterpolationEnvironment& environment) const
149 {
150 return createVisibilityValue(environment.state().style()->visibility());
151 }
152
153 PassOwnPtr<PairwisePrimitiveInterpolation> CSSVisibilityInterpolationType::merge SingleConversions(InterpolationValue& startValue, InterpolationValue& endValue) const
154 {
155 return PairwisePrimitiveInterpolation::create(
156 *this,
157 InterpolableNumber::create(0),
158 InterpolableNumber::create(1),
159 CSSVisibilityNonInterpolableValue::create(
160 toCSSVisibilityNonInterpolableValue(startValue.nonInterpolableValue( ))->visibility(),
161 toCSSVisibilityNonInterpolableValue(endValue.nonInterpolableValue()) ->visibility()));
162 }
163
164 void CSSVisibilityInterpolationType::composite(UnderlyingValue& underlyingValue, double underlyingFraction, const InterpolationValue& value) const
165 {
166 underlyingValue.set(&value);
167 }
168
169 void CSSVisibilityInterpolationType::apply(const InterpolableValue& interpolable Value, const NonInterpolableValue* nonInterpolableValue, InterpolationEnvironmen t& environment) const
170 {
171 // Visibility interpolation has been deferred to application time here due t o its non-linear behaviour.
172 double fraction = toInterpolableNumber(interpolableValue).value();
173 EVisibility visibility = toCSSVisibilityNonInterpolableValue(nonInterpolable Value)->visibility(fraction);
174 environment.state().style()->setVisibility(visibility);
175 }
176
177 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698