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, 2007 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
5 * Copyright (C) 2008 Apple Inc. All rights reserved. | 5 * Copyright (C) 2008 Apple Inc. All rights reserved. |
6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> | 6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> |
7 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 7 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "core/svg/SVGAnimateElement.h" | 30 #include "core/svg/SVGAnimateElement.h" |
31 #include "core/svg/SVGParserUtilities.h" | 31 #include "core/svg/SVGParserUtilities.h" |
32 #include "wtf/MathExtras.h" | 32 #include "wtf/MathExtras.h" |
33 | 33 |
34 namespace blink { | 34 namespace blink { |
35 | 35 |
36 SVGAnimationElement::SVGAnimationElement(const QualifiedName& tagName, | 36 SVGAnimationElement::SVGAnimationElement(const QualifiedName& tagName, |
37 Document& document) | 37 Document& document) |
38 : SVGSMILElement(tagName, document), | 38 : SVGSMILElement(tagName, document), |
39 m_animationValid(false), | 39 m_animationValid(false), |
40 m_attributeType(AttributeTypeAuto), | |
41 m_hasInvalidCSSAttributeType(false), | |
42 m_calcMode(CalcModeLinear), | 40 m_calcMode(CalcModeLinear), |
43 m_animationMode(NoAnimation) { | 41 m_animationMode(NoAnimation) { |
44 ASSERT(RuntimeEnabledFeatures::smilEnabled()); | 42 ASSERT(RuntimeEnabledFeatures::smilEnabled()); |
45 UseCounter::count(document, UseCounter::SVGAnimationElement); | 43 UseCounter::count(document, UseCounter::SVGAnimationElement); |
46 } | 44 } |
47 | 45 |
48 bool SVGAnimationElement::parseValues(const String& value, | 46 bool SVGAnimationElement::parseValues(const String& value, |
49 Vector<String>& result) { | 47 Vector<String>& result) { |
50 // Per the SMIL specification, leading and trailing white space, and white | 48 // Per the SMIL specification, leading and trailing white space, and white |
51 // space before and after semicolon separators, is allowed and will be | 49 // space before and after semicolon separators, is allowed and will be |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 179 } |
182 return; | 180 return; |
183 } | 181 } |
184 | 182 |
185 if (name == SVGNames::keySplinesAttr) { | 183 if (name == SVGNames::keySplinesAttr) { |
186 if (!parseKeySplines(value, m_keySplines)) | 184 if (!parseKeySplines(value, m_keySplines)) |
187 reportAttributeParsingError(SVGParseStatus::ParsingFailed, name, value); | 185 reportAttributeParsingError(SVGParseStatus::ParsingFailed, name, value); |
188 return; | 186 return; |
189 } | 187 } |
190 | 188 |
191 if (name == SVGNames::attributeTypeAttr) { | |
192 setAttributeType(value); | |
193 return; | |
194 } | |
195 | |
196 if (name == SVGNames::calcModeAttr) { | 189 if (name == SVGNames::calcModeAttr) { |
197 setCalcMode(value); | 190 setCalcMode(value); |
198 return; | 191 return; |
199 } | 192 } |
200 | 193 |
201 if (name == SVGNames::fromAttr || name == SVGNames::toAttr || | 194 if (name == SVGNames::fromAttr || name == SVGNames::toAttr || |
202 name == SVGNames::byAttr) { | 195 name == SVGNames::byAttr) { |
203 updateAnimationMode(); | 196 updateAnimationMode(); |
204 return; | 197 return; |
205 } | 198 } |
206 | 199 |
207 SVGSMILElement::parseAttribute(name, oldValue, value); | 200 SVGSMILElement::parseAttribute(name, oldValue, value); |
208 } | 201 } |
209 | 202 |
210 void SVGAnimationElement::svgAttributeChanged(const QualifiedName& attrName) { | 203 void SVGAnimationElement::svgAttributeChanged(const QualifiedName& attrName) { |
211 if (attrName == SVGNames::valuesAttr || attrName == SVGNames::byAttr || | 204 if (attrName == SVGNames::valuesAttr || attrName == SVGNames::byAttr || |
212 attrName == SVGNames::fromAttr || attrName == SVGNames::toAttr || | 205 attrName == SVGNames::fromAttr || attrName == SVGNames::toAttr || |
213 attrName == SVGNames::calcModeAttr || | 206 attrName == SVGNames::calcModeAttr || |
214 attrName == SVGNames::attributeTypeAttr || | |
215 attrName == SVGNames::keySplinesAttr || | 207 attrName == SVGNames::keySplinesAttr || |
216 attrName == SVGNames::keyPointsAttr || | 208 attrName == SVGNames::keyPointsAttr || |
217 attrName == SVGNames::keyTimesAttr) { | 209 attrName == SVGNames::keyTimesAttr) { |
218 animationAttributeChanged(); | 210 animationAttributeChanged(); |
219 return; | 211 return; |
220 } | 212 } |
221 | 213 |
222 SVGSMILElement::svgAttributeChanged(attrName); | 214 SVGSMILElement::svgAttributeChanged(attrName); |
223 } | 215 } |
224 | 216 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 // else paced is the default. | 297 // else paced is the default. |
306 setCalcMode(CalcModePaced); | 298 setCalcMode(CalcModePaced); |
307 } else if (calcMode == spline) { | 299 } else if (calcMode == spline) { |
308 UseCounter::count(document(), UseCounter::SVGCalcModeSpline); | 300 UseCounter::count(document(), UseCounter::SVGCalcModeSpline); |
309 setCalcMode(CalcModeSpline); | 301 setCalcMode(CalcModeSpline); |
310 } else | 302 } else |
311 setCalcMode(isSVGAnimateMotionElement(*this) ? CalcModePaced | 303 setCalcMode(isSVGAnimateMotionElement(*this) ? CalcModePaced |
312 : CalcModeLinear); | 304 : CalcModeLinear); |
313 } | 305 } |
314 | 306 |
315 void SVGAnimationElement::setAttributeType(const AtomicString& attributeType) { | |
316 DEFINE_STATIC_LOCAL(const AtomicString, css, ("CSS")); | |
317 DEFINE_STATIC_LOCAL(const AtomicString, xml, ("XML")); | |
318 if (attributeType == css) | |
319 m_attributeType = AttributeTypeCSS; | |
320 else if (attributeType == xml) | |
321 m_attributeType = AttributeTypeXML; | |
322 else | |
323 m_attributeType = AttributeTypeAuto; | |
324 checkInvalidCSSAttributeType(); | |
325 } | |
326 | |
327 String SVGAnimationElement::toValue() const { | 307 String SVGAnimationElement::toValue() const { |
328 return fastGetAttribute(SVGNames::toAttr); | 308 return fastGetAttribute(SVGNames::toAttr); |
329 } | 309 } |
330 | 310 |
331 String SVGAnimationElement::byValue() const { | 311 String SVGAnimationElement::byValue() const { |
332 return fastGetAttribute(SVGNames::byAttr); | 312 return fastGetAttribute(SVGNames::byAttr); |
333 } | 313 } |
334 | 314 |
335 String SVGAnimationElement::fromValue() const { | 315 String SVGAnimationElement::fromValue() const { |
336 return fastGetAttribute(SVGNames::fromAttr); | 316 return fastGetAttribute(SVGNames::fromAttr); |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 effectivePercent = | 630 effectivePercent = |
651 calculatePercentForSpline(percent, calculateKeyTimesIndex(percent)); | 631 calculatePercentForSpline(percent, calculateKeyTimesIndex(percent)); |
652 else if (animationMode == FromToAnimation || animationMode == ToAnimation) | 632 else if (animationMode == FromToAnimation || animationMode == ToAnimation) |
653 effectivePercent = calculatePercentForFromTo(percent); | 633 effectivePercent = calculatePercentForFromTo(percent); |
654 else | 634 else |
655 effectivePercent = percent; | 635 effectivePercent = percent; |
656 | 636 |
657 calculateAnimatedValue(effectivePercent, repeatCount, resultElement); | 637 calculateAnimatedValue(effectivePercent, repeatCount, resultElement); |
658 } | 638 } |
659 | 639 |
660 void SVGAnimationElement::setTargetElement(SVGElement* target) { | |
661 SVGSMILElement::setTargetElement(target); | |
662 checkInvalidCSSAttributeType(); | |
663 } | |
664 | |
665 void SVGAnimationElement::setAttributeName(const QualifiedName& attributeName) { | |
666 SVGSMILElement::setAttributeName(attributeName); | |
667 checkInvalidCSSAttributeType(); | |
668 } | |
669 | |
670 void SVGAnimationElement::checkInvalidCSSAttributeType() { | |
671 bool hasInvalidCSSAttributeType = | |
672 targetElement() && hasValidAttributeName() && | |
673 getAttributeType() == AttributeTypeCSS && | |
674 !isTargetAttributeCSSProperty(targetElement(), attributeName()); | |
675 | |
676 if (hasInvalidCSSAttributeType != m_hasInvalidCSSAttributeType) { | |
677 if (hasInvalidCSSAttributeType) | |
678 unscheduleIfScheduled(); | |
679 | |
680 m_hasInvalidCSSAttributeType = hasInvalidCSSAttributeType; | |
681 | |
682 if (!hasInvalidCSSAttributeType) | |
683 schedule(); | |
684 } | |
685 | |
686 // Clear values that may depend on the previous target. | |
687 if (targetElement()) | |
688 clearAnimatedType(); | |
689 } | |
690 | |
691 } // namespace blink | 640 } // namespace blink |
OLD | NEW |