OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. |
3 * Copyright (C) 2013 Samsung Electronics. All rights reserved. | 3 * Copyright (C) 2013 Samsung Electronics. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Library General Public License for more details. | 13 * Library General Public License for more details. |
14 * | 14 * |
15 * You should have received a copy of the GNU Library General Public License | 15 * You should have received a copy of the GNU Library General Public License |
16 * along with this library; see the file COPYING.LIB. If not, write to | 16 * along with this library; see the file COPYING.LIB. If not, write to |
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
18 * Boston, MA 02110-1301, USA. | 18 * Boston, MA 02110-1301, USA. |
19 */ | 19 */ |
20 | 20 |
21 #include "config.h" | 21 #include "config.h" |
22 #include "core/svg/SVGAnimatedTypeAnimator.h" | 22 #include "core/svg/SVGAnimatedTypeAnimator.h" |
23 | 23 |
24 #include "core/css/parser/CSSParser.h" | 24 #include "core/css/parser/CSSParser.h" |
25 #include "core/svg/SVGAnimateTransformElement.h" | 25 #include "core/svg/SVGAnimateTransformElement.h" |
26 #include "core/svg/SVGAnimatedColor.h" | 26 #include "core/svg/SVGAnimatedColor.h" |
27 #include "core/svg/SVGAnimationElement.h" | 27 #include "core/svg/SVGAnimationElement.h" |
28 #include "core/svg/SVGElement.h" | |
29 #include "core/svg/SVGLength.h" | 28 #include "core/svg/SVGLength.h" |
30 #include "core/svg/SVGLengthList.h" | 29 #include "core/svg/SVGLengthList.h" |
31 #include "core/svg/SVGNumber.h" | 30 #include "core/svg/SVGNumber.h" |
32 #include "core/svg/SVGPointList.h" | 31 #include "core/svg/SVGPointList.h" |
33 #include "core/svg/SVGString.h" | 32 #include "core/svg/SVGString.h" |
34 #include "core/svg/SVGTransformList.h" | 33 #include "core/svg/SVGTransformList.h" |
35 | 34 |
36 namespace blink { | 35 namespace blink { |
37 | 36 |
38 SVGAnimatedTypeAnimator::SVGAnimatedTypeAnimator(SVGAnimationElement* animationE
lement, SVGElement* contextElement) | 37 SVGAnimatedTypeAnimator::SVGAnimatedTypeAnimator(SVGAnimationElement* animationE
lement, SVGElement* contextElement) |
(...skipping 15 matching lines...) Expand all Loading... |
54 | 53 |
55 ASSERT(m_type != AnimatedPoint | 54 ASSERT(m_type != AnimatedPoint |
56 && m_type != AnimatedStringList | 55 && m_type != AnimatedStringList |
57 && m_type != AnimatedTransform); | 56 && m_type != AnimatedTransform); |
58 } | 57 } |
59 | 58 |
60 SVGAnimatedTypeAnimator::~SVGAnimatedTypeAnimator() | 59 SVGAnimatedTypeAnimator::~SVGAnimatedTypeAnimator() |
61 { | 60 { |
62 } | 61 } |
63 | 62 |
64 PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::createPropertyForAnimation(
const String& value) | 63 PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::createPropertyF
orAnimation(const String& value) |
65 { | 64 { |
66 if (isAnimatingSVGDom()) { | 65 if (isAnimatingSVGDom()) { |
67 // SVG DOM animVal animation code-path. | 66 // SVG DOM animVal animation code-path. |
68 | 67 |
69 if (m_type == AnimatedTransformList) { | 68 if (m_type == AnimatedTransformList) { |
70 // TransformList must be animated via <animateTransform>, | 69 // TransformList must be animated via <animateTransform>, |
71 // and its {from,by,to} attribute values needs to be parsed w.r.t. i
ts "type" attribute. | 70 // and its {from,by,to} attribute values needs to be parsed w.r.t. i
ts "type" attribute. |
72 // Spec: http://www.w3.org/TR/SVG/single-page.html#animate-AnimateTr
ansformElement | 71 // Spec: http://www.w3.org/TR/SVG/single-page.html#animate-AnimateTr
ansformElement |
73 ASSERT(m_animationElement); | 72 ASSERT(m_animationElement); |
74 SVGTransformType transformType = toSVGAnimateTransformElement(m_anim
ationElement)->transformType(); | 73 SVGTransformType transformType = toSVGAnimateTransformElement(m_anim
ationElement)->transformType(); |
75 return SVGTransformList::create(transformType, value); | 74 return SVGTransformList::create(transformType, value); |
76 } | 75 } |
77 | 76 |
78 ASSERT(m_animatedProperty); | 77 ASSERT(m_animatedProperty); |
79 return m_animatedProperty->currentValueBase()->cloneForAnimation(value); | 78 return m_animatedProperty->currentValueBase()->cloneForAnimation(value); |
80 } | 79 } |
81 | 80 |
82 ASSERT(isAnimatingCSSProperty()); | 81 ASSERT(isAnimatingCSSProperty()); |
83 | 82 |
84 // CSS properties animation code-path. | 83 // CSS properties animation code-path. |
85 // Create a basic instance of the corresponding SVG property. | 84 // Create a basic instance of the corresponding SVG property. |
86 // The instance will not have full context info. (e.g. SVGLengthMode) | 85 // The instance will not have full context info. (e.g. SVGLengthMode) |
87 | 86 |
88 switch (m_type) { | 87 switch (m_type) { |
89 case AnimatedColor: | 88 case AnimatedColor: |
90 return SVGColorProperty::create(value.isEmpty() ? StyleColor::currentCol
or() : CSSParser::colorFromRGBColorString(value)); | 89 return SVGColorProperty::create(value.isEmpty() ? StyleColor::currentCol
or() : CSSParser::colorFromRGBColorString(value)); |
91 case AnimatedNumber: { | 90 case AnimatedNumber: { |
92 RefPtr<SVGNumber> property = SVGNumber::create(); | 91 RefPtrWillBeRawPtr<SVGNumber> property = SVGNumber::create(); |
93 property->setValueAsString(value, IGNORE_EXCEPTION); | 92 property->setValueAsString(value, IGNORE_EXCEPTION); |
94 return property.release(); | 93 return property.release(); |
95 } | 94 } |
96 case AnimatedLength: { | 95 case AnimatedLength: { |
97 RefPtr<SVGLength> property = SVGLength::create(LengthModeOther); | 96 RefPtrWillBeRawPtr<SVGLength> property = SVGLength::create(LengthModeOth
er); |
98 property->setValueAsString(value, IGNORE_EXCEPTION); | 97 property->setValueAsString(value, IGNORE_EXCEPTION); |
99 return property.release(); | 98 return property.release(); |
100 } | 99 } |
101 case AnimatedLengthList: { | 100 case AnimatedLengthList: { |
102 RefPtr<SVGLengthList> property = SVGLengthList::create(LengthModeOther); | 101 RefPtrWillBeRawPtr<SVGLengthList> property = SVGLengthList::create(Lengt
hModeOther); |
103 property->setValueAsString(value, IGNORE_EXCEPTION); | 102 property->setValueAsString(value, IGNORE_EXCEPTION); |
104 return property.release(); | 103 return property.release(); |
105 } | 104 } |
106 case AnimatedString: { | 105 case AnimatedString: { |
107 RefPtr<SVGString> property = SVGString::create(); | 106 RefPtrWillBeRawPtr<SVGString> property = SVGString::create(); |
108 property->setValueAsString(value, IGNORE_EXCEPTION); | 107 property->setValueAsString(value, IGNORE_EXCEPTION); |
109 return property.release(); | 108 return property.release(); |
110 } | 109 } |
111 | 110 |
112 // These types don't appear in the table in SVGElement::animatedPropertyType
ForCSSAttribute() and thus don't need support. | 111 // These types don't appear in the table in SVGElement::animatedPropertyType
ForCSSAttribute() and thus don't need support. |
113 case AnimatedAngle: | 112 case AnimatedAngle: |
114 case AnimatedBoolean: | 113 case AnimatedBoolean: |
115 case AnimatedEnumeration: | 114 case AnimatedEnumeration: |
116 case AnimatedInteger: | 115 case AnimatedInteger: |
117 case AnimatedIntegerOptionalInteger: | 116 case AnimatedIntegerOptionalInteger: |
(...skipping 10 matching lines...) Expand all Loading... |
128 ASSERT_NOT_REACHED(); | 127 ASSERT_NOT_REACHED(); |
129 | 128 |
130 case AnimatedUnknown: | 129 case AnimatedUnknown: |
131 ASSERT_NOT_REACHED(); | 130 ASSERT_NOT_REACHED(); |
132 }; | 131 }; |
133 | 132 |
134 ASSERT_NOT_REACHED(); | 133 ASSERT_NOT_REACHED(); |
135 return nullptr; | 134 return nullptr; |
136 } | 135 } |
137 | 136 |
138 PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::constructFromString(const S
tring& value) | 137 PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::constructFromSt
ring(const String& value) |
139 { | 138 { |
140 return createPropertyForAnimation(value); | 139 return createPropertyForAnimation(value); |
141 } | 140 } |
142 | 141 |
143 void SVGAnimatedTypeAnimator::calculateFromAndToValues(RefPtr<SVGPropertyBase>&
from, RefPtr<SVGPropertyBase>& to, const String& fromString, const String& toStr
ing) | 142 void SVGAnimatedTypeAnimator::calculateFromAndToValues(RefPtrWillBeMember<SVGPro
pertyBase>& from, RefPtrWillBeMember<SVGPropertyBase>& to, const String& fromStr
ing, const String& toString) |
144 { | 143 { |
145 from = constructFromString(fromString); | 144 from = constructFromString(fromString); |
146 to = constructFromString(toString); | 145 to = constructFromString(toString); |
147 } | 146 } |
148 | 147 |
149 void SVGAnimatedTypeAnimator::calculateFromAndByValues(RefPtr<SVGPropertyBase>&
from, RefPtr<SVGPropertyBase>& to, const String& fromString, const String& byStr
ing) | 148 void SVGAnimatedTypeAnimator::calculateFromAndByValues(RefPtrWillBeMember<SVGPro
pertyBase>& from, RefPtrWillBeMember<SVGPropertyBase>& to, const String& fromStr
ing, const String& byString) |
150 { | 149 { |
151 from = constructFromString(fromString); | 150 from = constructFromString(fromString); |
152 to = constructFromString(byString); | 151 to = constructFromString(byString); |
153 // FIXME(oilpan): Below .get() should be removed after transition types are
gone. | 152 // FIXME(oilpan): Below .get() should be removed after transition types are
gone. |
154 to->add(from.get(), m_contextElement); | 153 to->add(from.get(), m_contextElement); |
155 } | 154 } |
156 | 155 |
157 namespace { | 156 namespace { |
158 | 157 |
159 void setAnimatedValueOnAllTargetProperties(const WillBeHeapVector<RawPtrWillBeMe
mber<SVGElement> >& list, const QualifiedName& attributeName, PassRefPtr<SVGProp
ertyBase> passValue) | 158 void setAnimatedValueOnAllTargetProperties(const WillBeHeapVector<RawPtrWillBeMe
mber<SVGElement> >& list, const QualifiedName& attributeName, PassRefPtrWillBeRa
wPtr<SVGPropertyBase> passValue) |
160 { | 159 { |
161 RefPtr<SVGPropertyBase> value = passValue; | 160 RefPtrWillBeRawPtr<SVGPropertyBase> value = passValue; |
162 | 161 |
163 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator it = list.
begin(); | 162 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator it = list.
begin(); |
164 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator itEnd = li
st.end(); | 163 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator itEnd = li
st.end(); |
165 for (; it != itEnd; ++it) { | 164 for (; it != itEnd; ++it) { |
166 RefPtr<SVGAnimatedPropertyBase> animatedProperty = (*it)->propertyFromAt
tribute(attributeName); | 165 RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> animatedProperty = (*it)->pr
opertyFromAttribute(attributeName); |
167 if (animatedProperty) | 166 if (animatedProperty) |
168 animatedProperty->setAnimatedValue(value); | 167 animatedProperty->setAnimatedValue(value); |
169 } | 168 } |
170 } | 169 } |
171 | 170 |
172 } | 171 } |
173 | 172 |
174 PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::resetAnimation(const WillBe
HeapVector<RawPtrWillBeMember<SVGElement> >& list) | 173 PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::resetAnimation(
const WillBeHeapVector<RawPtrWillBeMember<SVGElement> >& list) |
175 { | 174 { |
176 ASSERT(isAnimatingSVGDom()); | 175 ASSERT(isAnimatingSVGDom()); |
177 RefPtr<SVGPropertyBase> animatedValue = m_animatedProperty->createAnimatedVa
lue(); | 176 RefPtrWillBeRawPtr<SVGPropertyBase> animatedValue = m_animatedProperty->crea
teAnimatedValue(); |
178 ASSERT(animatedValue->type() == m_type); | 177 ASSERT(animatedValue->type() == m_type); |
179 setAnimatedValueOnAllTargetProperties(list, m_animatedProperty->attributeNam
e(), animatedValue); | 178 setAnimatedValueOnAllTargetProperties(list, m_animatedProperty->attributeNam
e(), animatedValue); |
180 | 179 |
181 return animatedValue.release(); | 180 return animatedValue.release(); |
182 } | 181 } |
183 | 182 |
184 PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::startAnimValAnimation(const
WillBeHeapVector<RawPtrWillBeMember<SVGElement> >& list) | 183 PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::startAnimValAni
mation(const WillBeHeapVector<RawPtrWillBeMember<SVGElement> >& list) |
185 { | 184 { |
186 ASSERT(isAnimatingSVGDom()); | 185 ASSERT(isAnimatingSVGDom()); |
187 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); | 186 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); |
188 | 187 |
189 return resetAnimation(list); | 188 return resetAnimation(list); |
190 } | 189 } |
191 | 190 |
192 void SVGAnimatedTypeAnimator::stopAnimValAnimation(const WillBeHeapVector<RawPtr
WillBeMember<SVGElement> >& list) | 191 void SVGAnimatedTypeAnimator::stopAnimValAnimation(const WillBeHeapVector<RawPtr
WillBeMember<SVGElement> >& list) |
193 { | 192 { |
194 ASSERT(isAnimatingSVGDom()); | 193 ASSERT(isAnimatingSVGDom()); |
195 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); | 194 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); |
196 | 195 |
197 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator it = list.
begin(); | 196 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator it = list.
begin(); |
198 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator itEnd = li
st.end(); | 197 WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::const_iterator itEnd = li
st.end(); |
199 for (; it != itEnd; ++it) { | 198 for (; it != itEnd; ++it) { |
200 RefPtr<SVGAnimatedPropertyBase> animatedProperty = (*it)->propertyFromAt
tribute(m_animatedProperty->attributeName()); | 199 RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> animatedProperty = (*it)->pr
opertyFromAttribute(m_animatedProperty->attributeName()); |
201 if (animatedProperty) | 200 if (animatedProperty) |
202 animatedProperty->animationEnded(); | 201 animatedProperty->animationEnded(); |
203 } | 202 } |
204 } | 203 } |
205 | 204 |
206 PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::resetAnimValToBaseVal(const
WillBeHeapVector<RawPtrWillBeMember<SVGElement> >& list) | 205 PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::resetAnimValToB
aseVal(const WillBeHeapVector<RawPtrWillBeMember<SVGElement> >& list) |
207 { | 206 { |
208 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); | 207 SVGElement::InstanceUpdateBlocker blocker(m_contextElement); |
209 | 208 |
210 return resetAnimation(list); | 209 return resetAnimation(list); |
211 } | 210 } |
212 | 211 |
213 class ParsePropertyFromString { | 212 class ParsePropertyFromString { |
| 213 STACK_ALLOCATED(); |
214 public: | 214 public: |
215 explicit ParsePropertyFromString(SVGAnimatedTypeAnimator* animator) | 215 explicit ParsePropertyFromString(SVGAnimatedTypeAnimator* animator) |
216 : m_animator(animator) | 216 : m_animator(animator) |
217 { | 217 { |
218 } | 218 } |
219 | 219 |
220 PassRefPtr<SVGPropertyBase> operator()(SVGAnimationElement*, const String& v
alue) | 220 PassRefPtrWillBeRawPtr<SVGPropertyBase> operator()(SVGAnimationElement*, con
st String& value) |
221 { | 221 { |
222 return m_animator->createPropertyForAnimation(value); | 222 return m_animator->createPropertyForAnimation(value); |
223 } | 223 } |
224 | 224 |
225 private: | 225 private: |
226 SVGAnimatedTypeAnimator* m_animator; | 226 RawPtrWillBeMember<SVGAnimatedTypeAnimator> m_animator; |
227 }; | 227 }; |
228 | 228 |
229 void SVGAnimatedTypeAnimator::calculateAnimatedValue(float percentage, unsigned
repeatCount, SVGPropertyBase* from, SVGPropertyBase* to, SVGPropertyBase* toAtEn
dOfDuration, SVGPropertyBase* animated) | 229 void SVGAnimatedTypeAnimator::calculateAnimatedValue(float percentage, unsigned
repeatCount, SVGPropertyBase* from, SVGPropertyBase* to, SVGPropertyBase* toAtEn
dOfDuration, SVGPropertyBase* animated) |
230 { | 230 { |
231 ASSERT(m_animationElement); | 231 ASSERT(m_animationElement); |
232 ASSERT(m_contextElement); | 232 ASSERT(m_contextElement); |
233 | 233 |
234 RefPtr<SVGPropertyBase> fromValue = m_animationElement->animationMode() == T
oAnimation ? animated : from; | 234 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = m_animationElement->animatio
nMode() == ToAnimation ? animated : from; |
235 RefPtr<SVGPropertyBase> toValue = to; | 235 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = to; |
236 RefPtr<SVGPropertyBase> toAtEndOfDurationValue = toAtEndOfDuration; | 236 RefPtrWillBeRawPtr<SVGPropertyBase> toAtEndOfDurationValue = toAtEndOfDurati
on; |
237 RefPtr<SVGPropertyBase> animatedValue = animated; | 237 RefPtrWillBeRawPtr<SVGPropertyBase> animatedValue = animated; |
238 | 238 |
239 // Apply CSS inheritance rules. | 239 // Apply CSS inheritance rules. |
240 ParsePropertyFromString parsePropertyFromString(this); | 240 ParsePropertyFromString parsePropertyFromString(this); |
241 m_animationElement->adjustForInheritance<RefPtr<SVGPropertyBase>, ParsePrope
rtyFromString>(parsePropertyFromString, m_animationElement->fromPropertyValueTyp
e(), fromValue, m_contextElement); | 241 m_animationElement->adjustForInheritance<RefPtrWillBeRawPtr<SVGPropertyBase>
, ParsePropertyFromString>(parsePropertyFromString, m_animationElement->fromProp
ertyValueType(), fromValue, m_contextElement); |
242 m_animationElement->adjustForInheritance<RefPtr<SVGPropertyBase>, ParsePrope
rtyFromString>(parsePropertyFromString, m_animationElement->toPropertyValueType(
), toValue, m_contextElement); | 242 m_animationElement->adjustForInheritance<RefPtrWillBeRawPtr<SVGPropertyBase>
, ParsePropertyFromString>(parsePropertyFromString, m_animationElement->toProper
tyValueType(), toValue, m_contextElement); |
243 | 243 |
244 animatedValue->calculateAnimatedValue(m_animationElement, percentage, repeat
Count, fromValue, toValue, toAtEndOfDurationValue, m_contextElement); | 244 animatedValue->calculateAnimatedValue(m_animationElement, percentage, repeat
Count, fromValue, toValue, toAtEndOfDurationValue, m_contextElement); |
245 } | 245 } |
246 | 246 |
247 float SVGAnimatedTypeAnimator::calculateDistance(const String& fromString, const
String& toString) | 247 float SVGAnimatedTypeAnimator::calculateDistance(const String& fromString, const
String& toString) |
248 { | 248 { |
249 ASSERT(m_animationElement); | 249 ASSERT(m_animationElement); |
250 ASSERT(m_contextElement); | 250 ASSERT(m_contextElement); |
251 RefPtr<SVGPropertyBase> fromValue = createPropertyForAnimation(fromString); | 251 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = createPropertyForAnimation(f
romString); |
252 RefPtr<SVGPropertyBase> toValue = createPropertyForAnimation(toString); | 252 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = createPropertyForAnimation(toS
tring); |
253 return fromValue->calculateDistance(toValue, m_contextElement); | 253 return fromValue->calculateDistance(toValue, m_contextElement); |
254 } | 254 } |
255 | 255 |
256 void SVGAnimatedTypeAnimator::trace(Visitor* visitor) | 256 void SVGAnimatedTypeAnimator::trace(Visitor* visitor) |
257 { | 257 { |
258 visitor->trace(m_animationElement); | 258 visitor->trace(m_animationElement); |
259 visitor->trace(m_contextElement); | 259 visitor->trace(m_contextElement); |
| 260 visitor->trace(m_animatedProperty); |
260 } | 261 } |
261 | 262 |
262 } | 263 } |
OLD | NEW |