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

Side by Side Diff: Source/core/animation/LengthStyleInterpolation.cpp

Issue 982913003: Web Animations: Add a fast path for LengthStyleIntepolation application (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Review changes. Created 5 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/animation/LengthStyleInterpolation.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/animation/LengthStyleInterpolation.h" 6 #include "core/animation/LengthStyleInterpolation.h"
7 7
8 #include "core/animation/css/CSSAnimatableValueFactory.h"
8 #include "core/css/CSSCalculationValue.h" 9 #include "core/css/CSSCalculationValue.h"
9 #include "core/css/resolver/StyleBuilder.h" 10 #include "core/css/resolver/StyleBuilder.h"
11 #include "core/css/resolver/StyleResolverState.h"
12 #include "platform/CalculationValue.h"
10 13
11 namespace blink { 14 namespace blink {
12 15
13 bool LengthStyleInterpolation::canCreateFrom(const CSSValue& value) 16 bool LengthStyleInterpolation::canCreateFrom(const CSSValue& value)
14 { 17 {
15 if (value.isPrimitiveValue()) { 18 if (value.isPrimitiveValue()) {
16 const CSSPrimitiveValue& primitiveValue = blink::toCSSPrimitiveValue(val ue); 19 const CSSPrimitiveValue& primitiveValue = blink::toCSSPrimitiveValue(val ue);
17 if (primitiveValue.cssCalcValue()) 20 if (primitiveValue.cssCalcValue())
18 return true; 21 return true;
19 22
(...skipping 25 matching lines...) Expand all
45 listOfValues->set(i, InterpolableNumber::create(arrayOfValues.at(i))); 48 listOfValues->set(i, InterpolableNumber::create(arrayOfValues.at(i)));
46 listOfTypes->set(i, InterpolableNumber::create(arrayOfTypes.get(i))); 49 listOfTypes->set(i, InterpolableNumber::create(arrayOfTypes.get(i)));
47 } 50 }
48 51
49 listOfValuesAndTypes->set(0, listOfValues.release()); 52 listOfValuesAndTypes->set(0, listOfValues.release());
50 listOfValuesAndTypes->set(1, listOfTypes.release()); 53 listOfValuesAndTypes->set(1, listOfTypes.release());
51 54
52 return listOfValuesAndTypes.release(); 55 return listOfValuesAndTypes.release();
53 } 56 }
54 57
58 bool LengthStyleInterpolation::isPixelsOrPercentOnly(const InterpolableValue& va lue)
59 {
60 const InterpolableList& types = *toInterpolableList(toInterpolableList(value ).get(1));
61 bool result = false;
62 for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
63 bool typeIsPresent = toInterpolableNumber(types.get(i))->value();
64 if (i == CSSPrimitiveValue::UnitTypePixels)
65 result |= typeIsPresent;
66 else if (i == CSSPrimitiveValue::UnitTypePercentage)
67 result |= typeIsPresent;
68 else if (typeIsPresent)
69 return false;
70 }
71 return result;
72 }
73
74 LengthStyleInterpolation::LengthSetter LengthStyleInterpolation::lengthSetterFor Property(CSSPropertyID property)
75 {
76 switch (property) {
77 case CSSPropertyBottom:
78 return &LayoutStyle::setBottom;
79 case CSSPropertyFlexBasis:
80 return &LayoutStyle::setFlexBasis;
81 case CSSPropertyHeight:
82 return &LayoutStyle::setHeight;
83 case CSSPropertyLeft:
84 return &LayoutStyle::setLeft;
85 case CSSPropertyLineHeight:
86 return &LayoutStyle::setLineHeight;
87 case CSSPropertyMarginBottom:
88 return &LayoutStyle::setMarginBottom;
89 case CSSPropertyMarginLeft:
90 return &LayoutStyle::setMarginLeft;
91 case CSSPropertyMarginRight:
92 return &LayoutStyle::setMarginRight;
93 case CSSPropertyMarginTop:
94 return &LayoutStyle::setMarginTop;
95 case CSSPropertyMaxHeight:
96 return &LayoutStyle::setMaxHeight;
97 case CSSPropertyMaxWidth:
98 return &LayoutStyle::setMaxWidth;
99 case CSSPropertyMinHeight:
100 return &LayoutStyle::setMinHeight;
101 case CSSPropertyMinWidth:
102 return &LayoutStyle::setMinWidth;
103 case CSSPropertyMotionOffset:
104 return &LayoutStyle::setMotionOffset;
105 case CSSPropertyPaddingBottom:
106 return &LayoutStyle::setPaddingBottom;
107 case CSSPropertyPaddingLeft:
108 return &LayoutStyle::setPaddingLeft;
109 case CSSPropertyPaddingRight:
110 return &LayoutStyle::setPaddingRight;
111 case CSSPropertyPaddingTop:
112 return &LayoutStyle::setPaddingTop;
113 case CSSPropertyRight:
114 return &LayoutStyle::setRight;
115 case CSSPropertyShapeMargin:
116 return &LayoutStyle::setShapeMargin;
117 case CSSPropertyTop:
118 return &LayoutStyle::setTop;
119 case CSSPropertyWidth:
120 return &LayoutStyle::setWidth;
121 default:
122 return nullptr;
123 }
124 }
125
55 namespace { 126 namespace {
56 127
57 static CSSPrimitiveValue::UnitType toUnitType(int lengthUnitType) 128 static CSSPrimitiveValue::UnitType toUnitType(int lengthUnitType)
58 { 129 {
59 return static_cast<CSSPrimitiveValue::UnitType>(CSSPrimitiveValue::lengthUni tTypeToUnitType(static_cast<CSSPrimitiveValue::LengthUnitType>(lengthUnitType))) ; 130 return static_cast<CSSPrimitiveValue::UnitType>(CSSPrimitiveValue::lengthUni tTypeToUnitType(static_cast<CSSPrimitiveValue::LengthUnitType>(lengthUnitType))) ;
60 } 131 }
61 132
62 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(Pas sRefPtrWillBeRawPtr<CSSCalcExpressionNode> previous, const InterpolableList* lis t, size_t position) 133 static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(Pas sRefPtrWillBeRawPtr<CSSCalcExpressionNode> previous, const InterpolableList* lis t, size_t position)
63 { 134 {
64 const InterpolableList* listOfValues = toInterpolableList(list->get(0)); 135 const InterpolableList* listOfValues = toInterpolableList(list->get(0));
65 const InterpolableList* listOfTypes = toInterpolableList(list->get(1)); 136 const InterpolableList* listOfTypes = toInterpolableList(list->get(1));
66 while (position != CSSPrimitiveValue::LengthUnitTypeCount) { 137 while (position != CSSPrimitiveValue::LengthUnitTypeCount) {
67 const InterpolableNumber *subValueType = toInterpolableNumber(listOfType s->get(position)); 138 const InterpolableNumber *subValueType = toInterpolableNumber(listOfType s->get(position));
68 if (subValueType->value()) { 139 if (subValueType->value()) {
69 RefPtrWillBeRawPtr<CSSCalcExpressionNode> next; 140 RefPtrWillBeRawPtr<CSSCalcExpressionNode> next;
70 double value = toInterpolableNumber(listOfValues->get(position))->va lue(); 141 double value = toInterpolableNumber(listOfValues->get(position))->va lue();
71 if (previous) 142 if (previous)
72 next = CSSCalcValue::createExpressionNode(previous, CSSCalcValue ::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position))), CalcAdd); 143 next = CSSCalcValue::createExpressionNode(previous, CSSCalcValue ::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position))), CalcAdd);
73 else 144 else
74 next = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::cre ate(value, toUnitType(position))); 145 next = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::cre ate(value, toUnitType(position)));
75 return constructCalcExpression(next, list, position + 1); 146 return constructCalcExpression(next, list, position + 1);
76 } 147 }
77 position++; 148 position++;
78 } 149 }
79 return previous; 150 return previous;
80 } 151 }
81 152
153 static double clampToRange(double x, ValueRange range)
154 {
155 return (range == ValueRangeNonNegative && x < 0) ? 0 : x;
156 }
157
158 static Length lengthFromInterpolableValue(const InterpolableValue& value, Interp olationRange interpolationRange, float zoom)
159 {
160 const InterpolableList& values = *toInterpolableList(toInterpolableList(valu e).get(0));
161 const InterpolableList& types = *toInterpolableList(toInterpolableList(value ).get(1));
162 bool hasPixels = toInterpolableNumber(types.get(CSSPrimitiveValue::UnitTypeP ixels))->value();
163 bool hasPercent = toInterpolableNumber(types.get(CSSPrimitiveValue::UnitType Percentage))->value();
164
165 ValueRange range = (interpolationRange == RangeNonNegative) ? ValueRangeNonN egative : ValueRangeAll;
166 PixelsAndPercent pixelsAndPercent(0, 0);
167 if (hasPixels)
168 pixelsAndPercent.pixels = toInterpolableNumber(values.get(CSSPrimitiveVa lue::UnitTypePixels))->value() * zoom;
169 if (hasPercent)
170 pixelsAndPercent.percent = toInterpolableNumber(values.get(CSSPrimitiveV alue::UnitTypePercentage))->value();
171
172 if (hasPixels && hasPercent)
173 return Length(CalculationValue::create(pixelsAndPercent, range));
174 if (hasPixels)
175 return Length(clampToRange(pixelsAndPercent.pixels, range), Fixed);
176 if (hasPercent)
177 return Length(clampToRange(pixelsAndPercent.percent, range), Percent);
178 ASSERT_NOT_REACHED();
179 return Length(0, Fixed);
180 }
181
82 } 182 }
83 183
84 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> LengthStyleInterpolation::fromInterpol ableValue(const InterpolableValue& value, InterpolationRange range) 184 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> LengthStyleInterpolation::fromInterpol ableValue(const InterpolableValue& value, InterpolationRange range)
85 { 185 {
86 const InterpolableList* listOfValuesAndTypes = toInterpolableList(&value); 186 const InterpolableList* listOfValuesAndTypes = toInterpolableList(&value);
87 const InterpolableList* listOfValues = toInterpolableList(listOfValuesAndTyp es->get(0)); 187 const InterpolableList* listOfValues = toInterpolableList(listOfValuesAndTyp es->get(0));
88 const InterpolableList* listOfTypes = toInterpolableList(listOfValuesAndType s->get(1)); 188 const InterpolableList* listOfTypes = toInterpolableList(listOfValuesAndType s->get(1));
89 unsigned unitTypeCount = 0; 189 unsigned unitTypeCount = 0;
90 for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) { 190 for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
91 const InterpolableNumber* subType = toInterpolableNumber(listOfTypes->ge t(i)); 191 const InterpolableNumber* subType = toInterpolableNumber(listOfTypes->ge t(i));
(...skipping 18 matching lines...) Expand all
110 } 210 }
111 ASSERT_NOT_REACHED(); 211 ASSERT_NOT_REACHED();
112 default: 212 default:
113 ValueRange valueRange = (range == RangeNonNegative) ? ValueRangeNonNegat ive : ValueRangeAll; 213 ValueRange valueRange = (range == RangeNonNegative) ? ValueRangeNonNegat ive : ValueRangeAll;
114 return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpre ssion(nullptr, listOfValuesAndTypes, 0), valueRange)); 214 return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpre ssion(nullptr, listOfValuesAndTypes, 0), valueRange));
115 } 215 }
116 } 216 }
117 217
118 void LengthStyleInterpolation::apply(StyleResolverState& state) const 218 void LengthStyleInterpolation::apply(StyleResolverState& state) const
119 { 219 {
120 StyleBuilder::applyProperty(m_id, state, fromInterpolableValue(*m_cachedValu e.get(), m_range).get()); 220 if (m_lengthSetter) {
221 (state.style()->*m_lengthSetter)(lengthFromInterpolableValue(*m_cachedVa lue, m_range, state.style()->effectiveZoom()));
222 RefPtrWillBeRawPtr<AnimatableValue> before, after;
dstockwell 2015/03/09 02:39:25 I think this would be simpler with ENABLE(ASSERT)
alancutter (OOO until 2018) 2015/03/09 03:09:00 Done.
223 ASSERT((\
224 before = CSSAnimatableValueFactory::create(m_id, *state.style()), \
225 StyleBuilder::applyProperty(m_id, state, fromInterpolableValue(*m_ca chedValue, m_range).get()), \
226 after = CSSAnimatableValueFactory::create(m_id, *state.style()), \
227 before->equals(*after)));
228 } else {
229 StyleBuilder::applyProperty(m_id, state, fromInterpolableValue(*m_cached Value, m_range).get());
230 }
121 } 231 }
122 232
123 DEFINE_TRACE(LengthStyleInterpolation) 233 DEFINE_TRACE(LengthStyleInterpolation)
124 { 234 {
125 StyleInterpolation::trace(visitor); 235 StyleInterpolation::trace(visitor);
126 } 236 }
127 237
128 } 238 }
OLDNEW
« no previous file with comments | « Source/core/animation/LengthStyleInterpolation.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698