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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 if (svgParent->isStyled()) | 102 if (svgParent->isStyled()) |
103 getPropertyValue(svgParent, attributeName, value); | 103 getPropertyValue(svgParent, attributeName, value); |
104 } | 104 } |
105 | 105 |
106 bool SVGAnimateElement::hasValidAttributeType() | 106 bool SVGAnimateElement::hasValidAttributeType() |
107 { | 107 { |
108 SVGElement* targetElement = this->targetElement(); | 108 SVGElement* targetElement = this->targetElement(); |
109 if (!targetElement) | 109 if (!targetElement) |
110 return false; | 110 return false; |
111 | 111 |
112 return determineAnimatedPropertyType(targetElement) != AnimatedUnknown; | 112 return m_animatedPropertyType != AnimatedUnknown; |
113 } | 113 } |
114 | 114 |
115 AnimatedPropertyType SVGAnimateElement::determineAnimatedPropertyType(SVGElement
* targetElement) const | 115 AnimatedPropertyType SVGAnimateElement::determineAnimatedPropertyType(SVGElement
* targetElement) const |
116 { | 116 { |
117 ASSERT(targetElement); | 117 ASSERT(targetElement); |
118 | 118 |
119 Vector<AnimatedPropertyType> propertyTypes; | 119 Vector<AnimatedPropertyType> propertyTypes; |
120 targetElement->animatedPropertyTypeForAttribute(attributeName(), propertyTyp
es); | 120 targetElement->animatedPropertyTypeForAttribute(attributeName(), propertyTyp
es); |
121 if (propertyTypes.isEmpty()) | 121 if (propertyTypes.isEmpty()) |
122 return AnimatedUnknown; | 122 return AnimatedUnknown; |
(...skipping 29 matching lines...) Expand all Loading... |
152 | 152 |
153 if (attributeValueIsCurrentColor(from)) | 153 if (attributeValueIsCurrentColor(from)) |
154 m_fromPropertyValueType = CurrentColorValue; | 154 m_fromPropertyValueType = CurrentColorValue; |
155 if (attributeValueIsCurrentColor(to)) | 155 if (attributeValueIsCurrentColor(to)) |
156 m_toPropertyValueType = CurrentColorValue; | 156 m_toPropertyValueType = CurrentColorValue; |
157 } | 157 } |
158 | 158 |
159 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat
, SVGSMILElement* resultElement) | 159 void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeat
, SVGSMILElement* resultElement) |
160 { | 160 { |
161 ASSERT(resultElement); | 161 ASSERT(resultElement); |
| 162 SVGElement* targetElement = this->targetElement(); |
| 163 if (!targetElement) |
| 164 return; |
| 165 |
| 166 ASSERT(m_animatedPropertyType == determineAnimatedPropertyType(targetElement
)); |
| 167 |
162 ASSERT(percentage >= 0 && percentage <= 1); | 168 ASSERT(percentage >= 0 && percentage <= 1); |
163 ASSERT(m_animatedPropertyType != AnimatedEnumeration); | 169 ASSERT(m_animatedPropertyType != AnimatedEnumeration); |
164 ASSERT(m_animatedPropertyType != AnimatedTransformList); | 170 ASSERT(m_animatedPropertyType != AnimatedTransformList); |
165 ASSERT(m_animatedPropertyType != AnimatedUnknown); | 171 ASSERT(m_animatedPropertyType != AnimatedUnknown); |
166 ASSERT(m_animator); | 172 ASSERT(m_animator); |
| 173 ASSERT(m_animator->type() == m_animatedPropertyType); |
167 ASSERT(m_fromType); | 174 ASSERT(m_fromType); |
| 175 ASSERT(m_fromType->type() == m_animatedPropertyType); |
168 ASSERT(m_toType); | 176 ASSERT(m_toType); |
169 | 177 |
170 SVGAnimateElement* resultAnimationElement = static_cast<SVGAnimateElement*>(
resultElement); | 178 SVGAnimateElement* resultAnimationElement = static_cast<SVGAnimateElement*>(
resultElement); |
171 ASSERT(resultAnimationElement->m_animatedType); | 179 ASSERT(resultAnimationElement->m_animatedType); |
172 ASSERT(resultAnimationElement->m_animatedPropertyType == m_animatedPropertyT
ype); | 180 ASSERT(resultAnimationElement->m_animatedPropertyType == m_animatedPropertyT
ype); |
173 ASSERT(resultAnimationElement->hasTagName(SVGNames::animateTag) | 181 ASSERT(resultAnimationElement->hasTagName(SVGNames::animateTag) |
174 || resultAnimationElement->hasTagName(SVGNames::animateColorTag) | 182 || resultAnimationElement->hasTagName(SVGNames::animateColorTag) |
175 || resultAnimationElement->hasTagName(SVGNames::setTag)); | 183 || resultAnimationElement->hasTagName(SVGNames::setTag)); |
176 | 184 |
177 if (hasTagName(SVGNames::setTag)) | 185 if (hasTagName(SVGNames::setTag)) |
178 percentage = 1; | 186 percentage = 1; |
179 | 187 |
180 SVGElement* targetElement = this->targetElement(); | |
181 if (!targetElement) | |
182 return; | |
183 | |
184 // Target element might have changed. | 188 // Target element might have changed. |
185 m_animator->setContextElement(targetElement); | 189 m_animator->setContextElement(targetElement); |
186 m_animator->calculateAnimatedValue(percentage, repeat, m_fromType, m_toType,
resultAnimationElement->m_animatedType); | 190 m_animator->calculateAnimatedValue(percentage, repeat, m_fromType, m_toType,
resultAnimationElement->m_animatedType); |
187 } | 191 } |
188 | 192 |
189 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const
String& toString) | 193 bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const
String& toString) |
190 { | 194 { |
191 SVGElement* targetElement = this->targetElement(); | 195 SVGElement* targetElement = this->targetElement(); |
192 if (!targetElement) | 196 if (!targetElement) |
193 return false; | 197 return false; |
194 | 198 |
195 m_animatedPropertyType = determineAnimatedPropertyType(targetElement); | |
196 | |
197 ensureAnimator()->calculateFromAndToValues(m_fromType, m_toType, fromString,
toString); | 199 ensureAnimator()->calculateFromAndToValues(m_fromType, m_toType, fromString,
toString); |
| 200 ASSERT(m_animatedPropertyType == m_animator->type()); |
198 return true; | 201 return true; |
199 } | 202 } |
200 | 203 |
201 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const
String& byString) | 204 bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const
String& byString) |
202 { | 205 { |
203 SVGElement* targetElement = this->targetElement(); | 206 SVGElement* targetElement = this->targetElement(); |
204 if (!targetElement) | 207 if (!targetElement) |
205 return false; | 208 return false; |
206 | 209 |
207 ASSERT(!hasTagName(SVGNames::setTag)); | 210 ASSERT(!hasTagName(SVGNames::setTag)); |
208 m_animatedPropertyType = determineAnimatedPropertyType(targetElement); | |
209 | 211 |
210 ensureAnimator()->calculateFromAndByValues(m_fromType, m_toType, fromString,
byString); | 212 ensureAnimator()->calculateFromAndByValues(m_fromType, m_toType, fromString,
byString); |
| 213 ASSERT(m_animatedPropertyType == m_animator->type()); |
211 return true; | 214 return true; |
212 } | 215 } |
213 | 216 |
214 void SVGAnimateElement::resetToBaseValue(const String& baseString) | 217 void SVGAnimateElement::resetToBaseValue(const String& baseString) |
215 { | 218 { |
216 SVGElement* targetElement = this->targetElement(); | |
217 ASSERT(targetElement); | |
218 m_animatedPropertyType = determineAnimatedPropertyType(targetElement); | |
219 | |
220 if (!m_animatedType) | 219 if (!m_animatedType) |
221 m_animatedType = ensureAnimator()->constructFromString(baseString); | 220 m_animatedType = ensureAnimator()->constructFromString(baseString); |
222 else | 221 else |
223 m_animatedType->setValueAsString(attributeName(), baseString); | 222 m_animatedType->setValueAsString(attributeName(), baseString); |
| 223 ASSERT(m_animatedPropertyType == m_animator->type()); |
224 } | 224 } |
225 | 225 |
226 void SVGAnimateElement::applyResultsToTarget() | 226 void SVGAnimateElement::applyResultsToTarget() |
227 { | 227 { |
228 ASSERT(m_animatedPropertyType != AnimatedEnumeration); | 228 ASSERT(m_animatedPropertyType != AnimatedEnumeration); |
229 ASSERT(m_animatedPropertyType != AnimatedTransformList); | 229 ASSERT(m_animatedPropertyType != AnimatedTransformList); |
230 ASSERT(m_animatedPropertyType != AnimatedUnknown); | 230 ASSERT(m_animatedPropertyType != AnimatedUnknown); |
231 ASSERT(m_animatedType); | 231 ASSERT(m_animatedType); |
232 | 232 |
233 setTargetAttributeAnimatedValue(m_animatedType->valueAsString()); | 233 setTargetAttributeAnimatedValue(m_animatedType->valueAsString()); |
234 } | 234 } |
235 | 235 |
236 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin
g& toString) | 236 float SVGAnimateElement::calculateDistance(const String& fromString, const Strin
g& toString) |
237 { | 237 { |
238 // FIXME: A return value of float is not enough to support paced animations
on lists. | 238 // FIXME: A return value of float is not enough to support paced animations
on lists. |
239 SVGElement* targetElement = this->targetElement(); | 239 SVGElement* targetElement = this->targetElement(); |
240 if (!targetElement) | 240 if (!targetElement) |
241 return -1; | 241 return -1; |
242 m_animatedPropertyType = determineAnimatedPropertyType(targetElement); | 242 |
243 | |
244 return ensureAnimator()->calculateDistance(fromString, toString); | 243 return ensureAnimator()->calculateDistance(fromString, toString); |
245 } | 244 } |
246 | 245 |
| 246 void SVGAnimateElement::targetElementDidChange(SVGElement* targetElement) |
| 247 { |
| 248 m_animatedType.clear(); |
| 249 m_fromType.clear(); |
| 250 m_toType.clear(); |
| 251 m_animator.clear(); |
| 252 m_animatedPropertyType = targetElement ? determineAnimatedPropertyType(targe
tElement) : AnimatedString; |
| 253 } |
| 254 |
247 SVGAnimatedTypeAnimator* SVGAnimateElement::ensureAnimator() | 255 SVGAnimatedTypeAnimator* SVGAnimateElement::ensureAnimator() |
248 { | 256 { |
249 if (!m_animator) | 257 if (!m_animator) |
250 m_animator = SVGAnimatorFactory::create(this, targetElement(), m_animate
dPropertyType); | 258 m_animator = SVGAnimatorFactory::create(this, targetElement(), m_animate
dPropertyType); |
| 259 ASSERT(m_animatedPropertyType == m_animator->type()); |
251 return m_animator.get(); | 260 return m_animator.get(); |
252 } | 261 } |
253 | 262 |
254 } | 263 } |
255 #endif // ENABLE(SVG) | 264 #endif // ENABLE(SVG) |
OLD | NEW |