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

Side by Side Diff: third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp

Issue 2387513002: Fold bits of SVGAnimatedTypeAnimator into SVGAnimateElement (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/svg/SVGAnimatedTypeAnimator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4 * Copyright (C) 2008 Apple Inc. All rights reserved. 4 * Copyright (C) 2008 Apple Inc. All rights reserved.
5 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 5 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 bool SVGAnimateElement::hasValidAttributeType() 79 bool SVGAnimateElement::hasValidAttributeType()
80 { 80 {
81 SVGElement* targetElement = this->targetElement(); 81 SVGElement* targetElement = this->targetElement();
82 if (!targetElement) 82 if (!targetElement)
83 return false; 83 return false;
84 84
85 return animatedPropertyType() != AnimatedUnknown && !hasInvalidCSSAttributeT ype(); 85 return animatedPropertyType() != AnimatedUnknown && !hasInvalidCSSAttributeT ype();
86 } 86 }
87 87
88 namespace {
89
90 class ParsePropertyFromString {
91 STACK_ALLOCATED();
92 public:
93 explicit ParsePropertyFromString(SVGAnimatedTypeAnimator* animator)
94 : m_animator(animator)
95 {
96 }
97
98 SVGPropertyBase* operator()(SVGAnimationElement*, const String& value)
99 {
100 return m_animator->createPropertyForAnimation(value);
101 }
102
103 private:
104 SVGAnimatedTypeAnimator* m_animator;
105 };
106
107 }
108
88 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat Count, SVGSMILElement* resultElement) 109 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat Count, SVGSMILElement* resultElement)
89 { 110 {
90 ASSERT(resultElement); 111 ASSERT(resultElement);
91 SVGElement* targetElement = this->targetElement(); 112 SVGElement* targetElement = this->targetElement();
92 if (!targetElement || !isSVGAnimateElement(*resultElement)) 113 if (!targetElement || !isSVGAnimateElement(*resultElement))
93 return; 114 return;
94 115
95 ASSERT(percentage >= 0 && percentage <= 1); 116 ASSERT(percentage >= 0 && percentage <= 1);
96 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf ormElement(*this)); 117 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf ormElement(*this));
97 ASSERT(animatedPropertyType() != AnimatedUnknown); 118 ASSERT(animatedPropertyType() != AnimatedUnknown);
98 ASSERT(m_fromProperty); 119 ASSERT(m_fromProperty);
99 ASSERT(m_fromProperty->type() == animatedPropertyType()); 120 ASSERT(m_fromProperty->type() == animatedPropertyType());
100 ASSERT(m_toProperty); 121 ASSERT(m_toProperty);
101 122
102 SVGAnimateElement* resultAnimationElement = toSVGAnimateElement(resultElemen t); 123 SVGAnimateElement* resultAnimationElement = toSVGAnimateElement(resultElemen t);
103 ASSERT(resultAnimationElement->m_animatedProperty); 124 ASSERT(resultAnimationElement->m_animatedProperty);
104 ASSERT(resultAnimationElement->animatedPropertyType() == animatedPropertyTyp e()); 125 ASSERT(resultAnimationElement->animatedPropertyType() == animatedPropertyTyp e());
105 126
106 if (isSVGSetElement(*this)) 127 if (isSVGSetElement(*this))
107 percentage = 1; 128 percentage = 1;
108 129
109 if (getCalcMode() == CalcModeDiscrete) 130 if (getCalcMode() == CalcModeDiscrete)
110 percentage = percentage < 0.5 ? 0 : 1; 131 percentage = percentage < 0.5 ? 0 : 1;
111 132
112 // Target element might have changed. 133 // Target element might have changed.
113 m_animator.setContextElement(targetElement); 134 m_animator.setContextElement(targetElement);
114 135
115 // Values-animation accumulates using the last values entry corresponding to the end of duration time. 136 // Values-animation accumulates using the last values entry corresponding to
116 SVGPropertyBase* toAtEndOfDurationProperty = m_toAtEndOfDurationProperty ? m _toAtEndOfDurationProperty.get() : m_toProperty.get(); 137 // the end of duration time.
117 m_animator.calculateAnimatedValue(percentage, repeatCount, m_fromProperty.ge t(), m_toProperty.get(), toAtEndOfDurationProperty, resultAnimationElement->m_an imatedProperty.get()); 138 SVGPropertyBase* animatedValue = resultAnimationElement->m_animatedProperty;
139 SVGPropertyBase* toAtEndOfDurationValue =
140 m_toAtEndOfDurationProperty ? m_toAtEndOfDurationProperty : m_toProperty ;
141 SVGPropertyBase* fromValue =
142 getAnimationMode() == ToAnimation ? animatedValue : m_fromProperty.get() ;
143 SVGPropertyBase* toValue = m_toProperty;
144
145 // Apply CSS inheritance rules.
146 ParsePropertyFromString parsePropertyFromString(&m_animator);
147 adjustForInheritance<SVGPropertyBase*, ParsePropertyFromString>(
pdr. 2016/09/30 19:32:19 These are the only users of ParsePropertyFromStrin
fs 2016/09/30 19:39:07 You're way ahead of me it seems ;-) - that was goi
148 parsePropertyFromString, fromPropertyValueType(), fromValue, targetEleme nt);
149 adjustForInheritance<SVGPropertyBase*, ParsePropertyFromString>(
150 parsePropertyFromString, toPropertyValueType(), toValue, targetElement);
151
152 animatedValue->calculateAnimatedValue(
153 this, percentage, repeatCount, fromValue, toValue, toAtEndOfDurationValu e, targetElement);
118 } 154 }
119 155
120 bool SVGAnimateElement::calculateToAtEndOfDurationValue(const String& toAtEndOfD urationString) 156 bool SVGAnimateElement::calculateToAtEndOfDurationValue(const String& toAtEndOfD urationString)
121 { 157 {
122 if (toAtEndOfDurationString.isEmpty()) 158 if (toAtEndOfDurationString.isEmpty())
123 return false; 159 return false;
124 m_toAtEndOfDurationProperty = m_animator.createAnimatedValueFromString(toAtE ndOfDurationString); 160 m_toAtEndOfDurationProperty = m_animator.createPropertyForAnimation(toAtEndO fDurationString);
125 return true; 161 return true;
126 } 162 }
127 163
128 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const String& toString) 164 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const String& toString)
129 { 165 {
130 SVGElement* targetElement = this->targetElement(); 166 SVGElement* targetElement = this->targetElement();
131 if (!targetElement) 167 if (!targetElement)
132 return false; 168 return false;
133 169
134 determinePropertyValueTypes(fromString, toString); 170 determinePropertyValueTypes(fromString, toString);
135 m_animator.calculateFromAndToValues(m_fromProperty, m_toProperty, fromString , toString); 171 m_fromProperty = m_animator.createPropertyForAnimation(fromString);
172 m_toProperty = m_animator.createPropertyForAnimation(toString);
136 return true; 173 return true;
137 } 174 }
138 175
139 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const String& byString) 176 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const String& byString)
140 { 177 {
141 SVGElement* targetElement = this->targetElement(); 178 SVGElement* targetElement = this->targetElement();
142 if (!targetElement) 179 if (!targetElement)
143 return false; 180 return false;
144 181
145 if (getAnimationMode() == ByAnimation && !isAdditive()) 182 if (getAnimationMode() == ByAnimation && !isAdditive())
146 return false; 183 return false;
147 184
148 // from-by animation may only be used with attributes that support addition (e.g. most numeric attributes). 185 // from-by animation may only be used with attributes that support addition (e.g. most numeric attributes).
149 if (getAnimationMode() == FromByAnimation && !animatedPropertyTypeSupportsAd dition()) 186 if (getAnimationMode() == FromByAnimation && !animatedPropertyTypeSupportsAd dition())
150 return false; 187 return false;
151 188
152 ASSERT(!isSVGSetElement(*this)); 189 ASSERT(!isSVGSetElement(*this));
153 190
154 determinePropertyValueTypes(fromString, byString); 191 determinePropertyValueTypes(fromString, byString);
155 m_animator.calculateFromAndByValues(m_fromProperty, m_toProperty, fromString , byString); 192 m_fromProperty = m_animator.createPropertyForAnimation(fromString);
193 m_toProperty = m_animator.createPropertyForAnimation(byString);
194 m_toProperty->add(m_fromProperty, targetElement);
156 return true; 195 return true;
157 } 196 }
158 197
159 void SVGAnimateElement::resetAnimatedType() 198 void SVGAnimateElement::resetAnimatedType()
160 { 199 {
161 SVGElement* targetElement = this->targetElement(); 200 SVGElement* targetElement = this->targetElement();
162 const QualifiedName& attributeName = this->attributeName(); 201 const QualifiedName& attributeName = this->attributeName();
163 202
164 m_animator.reset(targetElement); 203 m_animator.reset(targetElement);
165 204
166 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a ttributeName); 205 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a ttributeName);
167 if (shouldApply == DontApplyAnimation) 206 if (shouldApply == DontApplyAnimation)
168 return; 207 return;
169 if (shouldApply == ApplyXMLAnimation || shouldApply == ApplyXMLandCSSAnimati on) { 208 if (shouldApply == ApplyXMLAnimation || shouldApply == ApplyXMLandCSSAnimati on) {
170 // SVG DOM animVal animation code-path. 209 // SVG DOM animVal animation code-path.
171 m_animatedProperty = m_animator.createAnimatedValue(); 210 m_animatedProperty = m_animator.createAnimatedValue();
172 targetElement->setAnimatedAttribute(attributeName, m_animatedProperty); 211 targetElement->setAnimatedAttribute(attributeName, m_animatedProperty);
173 return; 212 return;
174 } 213 }
175 DCHECK_EQ(shouldApply, ApplyCSSAnimation); 214 DCHECK_EQ(shouldApply, ApplyCSSAnimation);
176 215
177 // CSS properties animation code-path. 216 // CSS properties animation code-path.
178 String baseValue; 217 String baseValue;
179 DCHECK(isTargetAttributeCSSProperty(targetElement, attributeName)); 218 DCHECK(isTargetAttributeCSSProperty(targetElement, attributeName));
180 computeCSSPropertyValue(targetElement, cssPropertyID(attributeName.localName ()), baseValue); 219 computeCSSPropertyValue(targetElement, cssPropertyID(attributeName.localName ()), baseValue);
181 220
182 m_animatedProperty = m_animator.createAnimatedValueFromString(baseValue); 221 m_animatedProperty = m_animator.createPropertyForAnimation(baseValue);
183 } 222 }
184 223
185 void SVGAnimateElement::clearAnimatedType() 224 void SVGAnimateElement::clearAnimatedType()
186 { 225 {
187 if (!m_animatedProperty) 226 if (!m_animatedProperty)
188 return; 227 return;
189 228
190 // The animated property lock is held for the "result animation" (see SMILTi meContainer::updateAnimations()) 229 // The animated property lock is held for the "result animation" (see SMILTi meContainer::updateAnimations())
191 // while we're processing an animation group. We will very likely crash late r if we clear the animated type 230 // while we're processing an animation group. We will very likely crash late r if we clear the animated type
192 // while the lock is held. See crbug.com/581546. 231 // while the lock is held. See crbug.com/581546.
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 310
272 return SVGAnimationElement::isAdditive(); 311 return SVGAnimationElement::isAdditive();
273 } 312 }
274 313
275 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin g& toString) 314 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin g& toString)
276 { 315 {
277 // FIXME: A return value of float is not enough to support paced animations on lists. 316 // FIXME: A return value of float is not enough to support paced animations on lists.
278 SVGElement* targetElement = this->targetElement(); 317 SVGElement* targetElement = this->targetElement();
279 if (!targetElement) 318 if (!targetElement)
280 return -1; 319 return -1;
281 320 SVGPropertyBase* fromValue = m_animator.createPropertyForAnimation(fromStrin g);
282 return m_animator.calculateDistance(fromString, toString); 321 SVGPropertyBase* toValue = m_animator.createPropertyForAnimation(toString);
322 return fromValue->calculateDistance(toValue, targetElement);
283 } 323 }
284 324
285 void SVGAnimateElement::setTargetElement(SVGElement* target) 325 void SVGAnimateElement::setTargetElement(SVGElement* target)
286 { 326 {
287 SVGAnimationElement::setTargetElement(target); 327 SVGAnimationElement::setTargetElement(target);
288 resetAnimatedPropertyType(); 328 resetAnimatedPropertyType();
289 } 329 }
290 330
291 void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName) 331 void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName)
292 { 332 {
(...skipping 14 matching lines...) Expand all
307 { 347 {
308 visitor->trace(m_fromProperty); 348 visitor->trace(m_fromProperty);
309 visitor->trace(m_toProperty); 349 visitor->trace(m_toProperty);
310 visitor->trace(m_toAtEndOfDurationProperty); 350 visitor->trace(m_toAtEndOfDurationProperty);
311 visitor->trace(m_animatedProperty); 351 visitor->trace(m_animatedProperty);
312 visitor->trace(m_animator); 352 visitor->trace(m_animator);
313 SVGAnimationElement::trace(visitor); 353 SVGAnimationElement::trace(visitor);
314 } 354 }
315 355
316 } // namespace blink 356 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/svg/SVGAnimatedTypeAnimator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698