OLD | NEW |
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 18 matching lines...) Expand all Loading... |
29 #include "core/css/StylePropertySet.h" | 29 #include "core/css/StylePropertySet.h" |
30 #include "core/dom/QualifiedName.h" | 30 #include "core/dom/QualifiedName.h" |
31 #include "core/svg/SVGAnimatedTypeAnimator.h" | 31 #include "core/svg/SVGAnimatedTypeAnimator.h" |
32 #include "core/svg/SVGDocumentExtensions.h" | 32 #include "core/svg/SVGDocumentExtensions.h" |
33 #include "core/svg/SVGElementInstance.h" | 33 #include "core/svg/SVGElementInstance.h" |
34 | 34 |
35 namespace WebCore { | 35 namespace WebCore { |
36 | 36 |
37 SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, Document& doc
ument) | 37 SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, Document& doc
ument) |
38 : SVGAnimationElement(tagName, document) | 38 : SVGAnimationElement(tagName, document) |
39 , m_animatedPropertyType(AnimatedString) | |
40 { | 39 { |
41 ASSERT(isSVGAnimateElement(*this)); | 40 ASSERT(isSVGAnimateElement(*this)); |
42 ScriptWrappable::init(this); | 41 ScriptWrappable::init(this); |
43 } | 42 } |
44 | 43 |
45 PassRefPtrWillBeRawPtr<SVGAnimateElement> SVGAnimateElement::create(Document& do
cument) | 44 PassRefPtrWillBeRawPtr<SVGAnimateElement> SVGAnimateElement::create(Document& do
cument) |
46 { | 45 { |
47 return adoptRefWillBeRefCountedGarbageCollected(new SVGAnimateElement(SVGNam
es::animateTag, document)); | 46 return adoptRefWillBeRefCountedGarbageCollected(new SVGAnimateElement(SVGNam
es::animateTag, document)); |
48 } | 47 } |
49 | 48 |
50 SVGAnimateElement::~SVGAnimateElement() | 49 SVGAnimateElement::~SVGAnimateElement() |
51 { | 50 { |
52 // FIXME: Oilpan: Below prevent stopAnimValAnimation being called on |target
Element|. This should be moved to |removeFrom| equivalent. | 51 // FIXME: Oilpan: Below prevent stopAnimValAnimation being called on |target
Element|. This should be moved to |removeFrom| equivalent. |
53 #if !ENABLE(OILPAN) | 52 #if !ENABLE(OILPAN) |
54 if (targetElement()) | 53 if (targetElement()) |
55 clearAnimatedType(targetElement()); | 54 clearAnimatedType(targetElement()); |
56 #endif | 55 #endif |
57 } | 56 } |
58 | 57 |
| 58 AnimatedPropertyType SVGAnimateElement::animatedPropertyType() |
| 59 { |
| 60 return ensureAnimator()->type(); |
| 61 } |
| 62 |
59 bool SVGAnimateElement::hasValidAttributeType() | 63 bool SVGAnimateElement::hasValidAttributeType() |
60 { | 64 { |
61 SVGElement* targetElement = this->targetElement(); | 65 SVGElement* targetElement = this->targetElement(); |
62 if (!targetElement) | 66 if (!targetElement) |
63 return false; | 67 return false; |
64 | 68 |
65 return m_animatedPropertyType != AnimatedUnknown && !hasInvalidCSSAttributeT
ype(); | 69 return animatedPropertyType() != AnimatedUnknown && !hasInvalidCSSAttributeT
ype(); |
66 } | 70 } |
67 | 71 |
68 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat
Count, SVGSMILElement* resultElement) | 72 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat
Count, SVGSMILElement* resultElement) |
69 { | 73 { |
70 ASSERT(resultElement); | 74 ASSERT(resultElement); |
71 SVGElement* targetElement = this->targetElement(); | 75 SVGElement* targetElement = this->targetElement(); |
72 if (!targetElement || !isSVGAnimateElement(*resultElement)) | 76 if (!targetElement || !isSVGAnimateElement(*resultElement)) |
73 return; | 77 return; |
74 | 78 |
75 ASSERT(m_animatedPropertyType == determineAnimatedPropertyType()); | |
76 | |
77 ASSERT(percentage >= 0 && percentage <= 1); | 79 ASSERT(percentage >= 0 && percentage <= 1); |
78 ASSERT(m_animatedPropertyType != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); | |
79 ASSERT(m_animatedPropertyType != AnimatedUnknown); | |
80 ASSERT(m_animator); | 80 ASSERT(m_animator); |
81 ASSERT(m_animator->type() == m_animatedPropertyType); | 81 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); |
| 82 ASSERT(animatedPropertyType() != AnimatedUnknown); |
82 ASSERT(m_fromProperty); | 83 ASSERT(m_fromProperty); |
83 ASSERT(m_fromProperty->type() == m_animatedPropertyType); | 84 ASSERT(m_fromProperty->type() == animatedPropertyType()); |
84 ASSERT(m_toProperty); | 85 ASSERT(m_toProperty); |
85 | 86 |
86 SVGAnimateElement* resultAnimationElement = toSVGAnimateElement(resultElemen
t); | 87 SVGAnimateElement* resultAnimationElement = toSVGAnimateElement(resultElemen
t); |
87 ASSERT(resultAnimationElement->m_animatedProperty); | 88 ASSERT(resultAnimationElement->m_animatedProperty); |
88 ASSERT(resultAnimationElement->m_animatedPropertyType == m_animatedPropertyT
ype); | 89 ASSERT(resultAnimationElement->animatedPropertyType() == animatedPropertyTyp
e()); |
89 | 90 |
90 if (isSVGSetElement(*this)) | 91 if (isSVGSetElement(*this)) |
91 percentage = 1; | 92 percentage = 1; |
92 | 93 |
93 if (calcMode() == CalcModeDiscrete) | 94 if (calcMode() == CalcModeDiscrete) |
94 percentage = percentage < 0.5 ? 0 : 1; | 95 percentage = percentage < 0.5 ? 0 : 1; |
95 | 96 |
96 // Target element might have changed. | 97 // Target element might have changed. |
97 m_animator->setContextElement(targetElement); | 98 m_animator->setContextElement(targetElement); |
98 | 99 |
(...skipping 11 matching lines...) Expand all Loading... |
110 } | 111 } |
111 | 112 |
112 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const
String& toString) | 113 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const
String& toString) |
113 { | 114 { |
114 SVGElement* targetElement = this->targetElement(); | 115 SVGElement* targetElement = this->targetElement(); |
115 if (!targetElement) | 116 if (!targetElement) |
116 return false; | 117 return false; |
117 | 118 |
118 determinePropertyValueTypes(fromString, toString); | 119 determinePropertyValueTypes(fromString, toString); |
119 ensureAnimator()->calculateFromAndToValues(m_fromProperty, m_toProperty, fro
mString, toString); | 120 ensureAnimator()->calculateFromAndToValues(m_fromProperty, m_toProperty, fro
mString, toString); |
120 ASSERT(m_animatedPropertyType == m_animator->type()); | |
121 return true; | 121 return true; |
122 } | 122 } |
123 | 123 |
124 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const
String& byString) | 124 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const
String& byString) |
125 { | 125 { |
126 SVGElement* targetElement = this->targetElement(); | 126 SVGElement* targetElement = this->targetElement(); |
127 if (!targetElement) | 127 if (!targetElement) |
128 return false; | 128 return false; |
129 | 129 |
130 if (animationMode() == ByAnimation && !isAdditive()) | 130 if (animationMode() == ByAnimation && !isAdditive()) |
131 return false; | 131 return false; |
132 | 132 |
133 // from-by animation may only be used with attributes that support addition
(e.g. most numeric attributes). | 133 // from-by animation may only be used with attributes that support addition
(e.g. most numeric attributes). |
134 if (animationMode() == FromByAnimation && !animatedPropertyTypeSupportsAddit
ion()) | 134 if (animationMode() == FromByAnimation && !animatedPropertyTypeSupportsAddit
ion()) |
135 return false; | 135 return false; |
136 | 136 |
137 ASSERT(!isSVGSetElement(*this)); | 137 ASSERT(!isSVGSetElement(*this)); |
138 | 138 |
139 determinePropertyValueTypes(fromString, byString); | 139 determinePropertyValueTypes(fromString, byString); |
140 ensureAnimator()->calculateFromAndByValues(m_fromProperty, m_toProperty, fro
mString, byString); | 140 ensureAnimator()->calculateFromAndByValues(m_fromProperty, m_toProperty, fro
mString, byString); |
141 ASSERT(m_animatedPropertyType == m_animator->type()); | |
142 return true; | 141 return true; |
143 } | 142 } |
144 | 143 |
145 namespace { | 144 namespace { |
146 | 145 |
147 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > findElementInstances(SVGElemen
t* targetElement) | 146 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > findElementInstances(SVGElemen
t* targetElement) |
148 { | 147 { |
149 ASSERT(targetElement); | 148 ASSERT(targetElement); |
150 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > animatedElements; | 149 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > animatedElements; |
151 | 150 |
152 animatedElements.append(targetElement); | 151 animatedElements.append(targetElement); |
153 | 152 |
154 const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >& instances = ta
rgetElement->instancesForElement(); | 153 const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >& instances = ta
rgetElement->instancesForElement(); |
155 const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >::const_iterator
end = instances.end(); | 154 const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >::const_iterator
end = instances.end(); |
156 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >::const_iterator
it = instances.begin(); it != end; ++it) { | 155 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement> >::const_iterator
it = instances.begin(); it != end; ++it) { |
157 if (SVGElement* shadowTreeElement = *it) | 156 if (SVGElement* shadowTreeElement = *it) |
158 animatedElements.append(shadowTreeElement); | 157 animatedElements.append(shadowTreeElement); |
159 } | 158 } |
160 | 159 |
161 return animatedElements; | 160 return animatedElements; |
162 } | 161 } |
163 | 162 |
164 } | 163 } |
165 | 164 |
166 void SVGAnimateElement::resetAnimatedType() | 165 void SVGAnimateElement::resetAnimatedType() |
167 { | 166 { |
168 SVGAnimatedTypeAnimator* animator = ensureAnimator(); | 167 SVGAnimatedTypeAnimator* animator = ensureAnimator(); |
169 ASSERT(m_animatedPropertyType == animator->type()); | |
170 | 168 |
171 SVGElement* targetElement = this->targetElement(); | 169 SVGElement* targetElement = this->targetElement(); |
172 const QualifiedName& attributeName = this->attributeName(); | 170 const QualifiedName& attributeName = this->attributeName(); |
173 ShouldApplyAnimation shouldApply = shouldApplyAnimation(targetElement, attri
buteName); | 171 ShouldApplyAnimation shouldApply = shouldApplyAnimation(targetElement, attri
buteName); |
174 | 172 |
175 if (shouldApply == DontApplyAnimation) | 173 if (shouldApply == DontApplyAnimation) |
176 return; | 174 return; |
177 | 175 |
178 if (shouldApply == ApplyXMLAnimation) { | 176 if (shouldApply == ApplyXMLAnimation) { |
179 // SVG DOM animVal animation code-path. | 177 // SVG DOM animVal animation code-path. |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > animatedElements = fin
dElementInstances(targetElement); | 311 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > animatedElements = fin
dElementInstances(targetElement); |
314 m_animator->stopAnimValAnimation(animatedElements); | 312 m_animator->stopAnimValAnimation(animatedElements); |
315 notifyTargetAndInstancesAboutAnimValChange(targetElement, attributeName(
)); | 313 notifyTargetAndInstancesAboutAnimValChange(targetElement, attributeName(
)); |
316 } | 314 } |
317 | 315 |
318 m_animatedProperty.clear(); | 316 m_animatedProperty.clear(); |
319 } | 317 } |
320 | 318 |
321 void SVGAnimateElement::applyResultsToTarget() | 319 void SVGAnimateElement::applyResultsToTarget() |
322 { | 320 { |
323 ASSERT(m_animatedPropertyType != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); | |
324 ASSERT(m_animatedPropertyType != AnimatedUnknown); | |
325 ASSERT(m_animator); | 321 ASSERT(m_animator); |
| 322 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); |
| 323 ASSERT(animatedPropertyType() != AnimatedUnknown); |
326 | 324 |
327 // Early exit if our animated type got destructed by a previous endedActiveI
nterval(). | 325 // Early exit if our animated type got destructed by a previous endedActiveI
nterval(). |
328 if (!m_animatedProperty) | 326 if (!m_animatedProperty) |
329 return; | 327 return; |
330 | 328 |
331 if (ensureAnimator()->isAnimatingCSSProperty()) { | 329 if (m_animator->isAnimatingCSSProperty()) { |
332 // CSS properties animation code-path. | 330 // CSS properties animation code-path. |
333 // Convert the result of the animation to a String and apply it as CSS p
roperty on the target & all instances. | 331 // Convert the result of the animation to a String and apply it as CSS p
roperty on the target & all instances. |
334 applyCSSPropertyToTargetAndInstances(targetElement(), attributeName(), m
_animatedProperty->valueAsString()); | 332 applyCSSPropertyToTargetAndInstances(targetElement(), attributeName(), m
_animatedProperty->valueAsString()); |
335 return; | 333 return; |
336 } | 334 } |
337 | 335 |
338 // SVG DOM animVal animation code-path. | 336 // SVG DOM animVal animation code-path. |
339 // At this point the SVG DOM values are already changed, unlike for CSS. | 337 // At this point the SVG DOM values are already changed, unlike for CSS. |
340 // We only have to trigger update notifications here. | 338 // We only have to trigger update notifications here. |
341 notifyTargetAndInstancesAboutAnimValChange(targetElement(), attributeName())
; | 339 notifyTargetAndInstancesAboutAnimValChange(targetElement(), attributeName())
; |
342 } | 340 } |
343 | 341 |
344 bool SVGAnimateElement::animatedPropertyTypeSupportsAddition() const | 342 bool SVGAnimateElement::animatedPropertyTypeSupportsAddition() |
345 { | 343 { |
346 // Spec: http://www.w3.org/TR/SVG/animate.html#AnimationAttributesAndPropert
ies. | 344 // Spec: http://www.w3.org/TR/SVG/animate.html#AnimationAttributesAndPropert
ies. |
347 switch (m_animatedPropertyType) { | 345 switch (animatedPropertyType()) { |
348 case AnimatedBoolean: | 346 case AnimatedBoolean: |
349 case AnimatedEnumeration: | 347 case AnimatedEnumeration: |
350 case AnimatedPreserveAspectRatio: | 348 case AnimatedPreserveAspectRatio: |
351 case AnimatedString: | 349 case AnimatedString: |
352 case AnimatedUnknown: | 350 case AnimatedUnknown: |
353 return false; | 351 return false; |
354 default: | 352 default: |
355 return true; | 353 return true; |
356 } | 354 } |
357 } | 355 } |
358 | 356 |
359 bool SVGAnimateElement::isAdditive() const | 357 bool SVGAnimateElement::isAdditive() |
360 { | 358 { |
361 if (animationMode() == ByAnimation || animationMode() == FromByAnimation) | 359 if (animationMode() == ByAnimation || animationMode() == FromByAnimation) |
362 if (!animatedPropertyTypeSupportsAddition()) | 360 if (!animatedPropertyTypeSupportsAddition()) |
363 return false; | 361 return false; |
364 | 362 |
365 return SVGAnimationElement::isAdditive(); | 363 return SVGAnimationElement::isAdditive(); |
366 } | 364 } |
367 | 365 |
368 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin
g& toString) | 366 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin
g& toString) |
369 { | 367 { |
(...skipping 17 matching lines...) Expand all Loading... |
387 resetAnimatedPropertyType(); | 385 resetAnimatedPropertyType(); |
388 } | 386 } |
389 | 387 |
390 void SVGAnimateElement::resetAnimatedPropertyType() | 388 void SVGAnimateElement::resetAnimatedPropertyType() |
391 { | 389 { |
392 ASSERT(!m_animatedProperty); | 390 ASSERT(!m_animatedProperty); |
393 m_fromProperty.clear(); | 391 m_fromProperty.clear(); |
394 m_toProperty.clear(); | 392 m_toProperty.clear(); |
395 m_toAtEndOfDurationProperty.clear(); | 393 m_toAtEndOfDurationProperty.clear(); |
396 m_animator.clear(); | 394 m_animator.clear(); |
397 m_animatedPropertyType = determineAnimatedPropertyType(); | |
398 } | 395 } |
399 | 396 |
400 SVGAnimatedTypeAnimator* SVGAnimateElement::ensureAnimator() | 397 SVGAnimatedTypeAnimator* SVGAnimateElement::ensureAnimator() |
401 { | 398 { |
402 if (!m_animator) | 399 if (!m_animator) |
403 m_animator = SVGAnimatedTypeAnimator::create(m_animatedPropertyType, thi
s, targetElement()); | 400 m_animator = SVGAnimatedTypeAnimator::create(this, targetElement()); |
404 ASSERT(m_animatedPropertyType == m_animator->type()); | |
405 return m_animator.get(); | 401 return m_animator.get(); |
406 } | 402 } |
407 | 403 |
408 void SVGAnimateElement::trace(Visitor* visitor) | 404 void SVGAnimateElement::trace(Visitor* visitor) |
409 { | 405 { |
410 visitor->trace(m_animator); | 406 visitor->trace(m_animator); |
411 SVGAnimationElement::trace(visitor); | 407 SVGAnimationElement::trace(visitor); |
412 } | 408 } |
413 | 409 |
414 } | 410 } |
OLD | NEW |