OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
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, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 } | 129 } |
130 | 130 |
131 if (!valid) | 131 if (!valid) |
132 exceptionState.throwDOMException(SyntaxError, "Problem parsing points=\"
"+value+"\""); | 132 exceptionState.throwDOMException(SyntaxError, "Problem parsing points=\"
"+value+"\""); |
133 } | 133 } |
134 | 134 |
135 void SVGPointList::add(PassRefPtr<NewSVGPropertyBase> other, SVGElement* context
Element) | 135 void SVGPointList::add(PassRefPtr<NewSVGPropertyBase> other, SVGElement* context
Element) |
136 { | 136 { |
137 RefPtr<SVGPointList> otherList = toSVGPointList(other); | 137 RefPtr<SVGPointList> otherList = toSVGPointList(other); |
138 | 138 |
139 if (numberOfItems() != otherList->numberOfItems()) | 139 if (length() != otherList->length()) |
140 return; | 140 return; |
141 | 141 |
142 for (size_t i = 0; i < numberOfItems(); ++i) | 142 for (size_t i = 0; i < length(); ++i) |
143 at(i)->setValue(at(i)->value() + otherList->at(i)->value()); | 143 at(i)->setValue(at(i)->value() + otherList->at(i)->value()); |
144 } | 144 } |
145 | 145 |
146 bool SVGPointList::adjustFromToListValues(PassRefPtr<SVGPointList> passFromList,
PassRefPtr<SVGPointList> passToList, float percentage, bool isToAnimation, bool
resizeAnimatedListIfNeeded) | 146 bool SVGPointList::adjustFromToListValues(PassRefPtr<SVGPointList> passFromList,
PassRefPtr<SVGPointList> passToList, float percentage, bool isToAnimation, bool
resizeAnimatedListIfNeeded) |
147 { | 147 { |
148 RefPtr<SVGPointList> fromList = passFromList; | 148 RefPtr<SVGPointList> fromList = passFromList; |
149 RefPtr<SVGPointList> toList = passToList; | 149 RefPtr<SVGPointList> toList = passToList; |
150 | 150 |
151 // If no 'to' value is given, nothing to animate. | 151 // If no 'to' value is given, nothing to animate. |
152 size_t toListSize = toList->numberOfItems(); | 152 size_t toListSize = toList->length(); |
153 if (!toListSize) | 153 if (!toListSize) |
154 return false; | 154 return false; |
155 | 155 |
156 // If the 'from' value is given and it's length doesn't match the 'to' value
list length, fallback to a discrete animation. | 156 // If the 'from' value is given and it's length doesn't match the 'to' value
list length, fallback to a discrete animation. |
157 size_t fromListSize = fromList->numberOfItems(); | 157 size_t fromListSize = fromList->length(); |
158 if (fromListSize != toListSize && fromListSize) { | 158 if (fromListSize != toListSize && fromListSize) { |
159 if (percentage < 0.5) { | 159 if (percentage < 0.5) { |
160 if (!isToAnimation) | 160 if (!isToAnimation) |
161 deepCopy(fromList); | 161 deepCopy(fromList); |
162 } else { | 162 } else { |
163 deepCopy(toList); | 163 deepCopy(toList); |
164 } | 164 } |
165 | 165 |
166 return false; | 166 return false; |
167 } | 167 } |
168 | 168 |
169 ASSERT(!fromListSize || fromListSize == toListSize); | 169 ASSERT(!fromListSize || fromListSize == toListSize); |
170 if (resizeAnimatedListIfNeeded && numberOfItems() < toListSize) { | 170 if (resizeAnimatedListIfNeeded && length() < toListSize) { |
171 size_t paddingCount = toListSize - numberOfItems(); | 171 size_t paddingCount = toListSize - length(); |
172 for (size_t i = 0; i < paddingCount; ++i) | 172 for (size_t i = 0; i < paddingCount; ++i) |
173 append(SVGPoint::create()); | 173 append(SVGPoint::create()); |
174 } | 174 } |
175 | 175 |
176 return true; | 176 return true; |
177 } | 177 } |
178 | 178 |
179 void SVGPointList::calculateAnimatedValue(SVGAnimationElement* animationElement,
float percentage, unsigned repeatCount, PassRefPtr<NewSVGPropertyBase> fromValu
e, PassRefPtr<NewSVGPropertyBase> toValue, PassRefPtr<NewSVGPropertyBase> toAtEn
dOfDurationValue, SVGElement* contextElement) | 179 void SVGPointList::calculateAnimatedValue(SVGAnimationElement* animationElement,
float percentage, unsigned repeatCount, PassRefPtr<NewSVGPropertyBase> fromValu
e, PassRefPtr<NewSVGPropertyBase> toValue, PassRefPtr<NewSVGPropertyBase> toAtEn
dOfDurationValue, SVGElement* contextElement) |
180 { | 180 { |
181 RefPtr<SVGPointList> fromList = toSVGPointList(fromValue); | 181 RefPtr<SVGPointList> fromList = toSVGPointList(fromValue); |
182 RefPtr<SVGPointList> toList = toSVGPointList(toValue); | 182 RefPtr<SVGPointList> toList = toSVGPointList(toValue); |
183 RefPtr<SVGPointList> toAtEndOfDurationList = toSVGPointList(toAtEndOfDuratio
nValue); | 183 RefPtr<SVGPointList> toAtEndOfDurationList = toSVGPointList(toAtEndOfDuratio
nValue); |
184 | 184 |
185 size_t fromPointListSize = fromList->numberOfItems(); | 185 size_t fromPointListSize = fromList->length(); |
186 size_t toPointListSize = toList->numberOfItems(); | 186 size_t toPointListSize = toList->length(); |
187 size_t toAtEndOfDurationListSize = toAtEndOfDurationList->numberOfItems(); | 187 size_t toAtEndOfDurationListSize = toAtEndOfDurationList->length(); |
188 | 188 |
189 if (!adjustFromToListValues(fromList, toList, percentage, animationElement->
animationMode() == ToAnimation, true)) | 189 if (!adjustFromToListValues(fromList, toList, percentage, animationElement->
animationMode() == ToAnimation, true)) |
190 return; | 190 return; |
191 | 191 |
192 for (size_t i = 0; i < toPointListSize; ++i) { | 192 for (size_t i = 0; i < toPointListSize; ++i) { |
193 float animatedX = at(i)->x(); | 193 float animatedX = at(i)->x(); |
194 float animatedY = at(i)->y(); | 194 float animatedY = at(i)->y(); |
195 | 195 |
196 FloatPoint effectiveFrom; | 196 FloatPoint effectiveFrom; |
197 if (fromPointListSize) | 197 if (fromPointListSize) |
198 effectiveFrom = fromList->at(i)->value(); | 198 effectiveFrom = fromList->at(i)->value(); |
199 FloatPoint effectiveTo = toList->at(i)->value(); | 199 FloatPoint effectiveTo = toList->at(i)->value(); |
200 FloatPoint effectiveToAtEnd; | 200 FloatPoint effectiveToAtEnd; |
201 if (i < toAtEndOfDurationListSize) | 201 if (i < toAtEndOfDurationListSize) |
202 effectiveToAtEnd = toAtEndOfDurationList->at(i)->value(); | 202 effectiveToAtEnd = toAtEndOfDurationList->at(i)->value(); |
203 | 203 |
204 animationElement->animateAdditiveNumber(percentage, repeatCount, effecti
veFrom.x(), effectiveTo.x(), effectiveToAtEnd.x(), animatedX); | 204 animationElement->animateAdditiveNumber(percentage, repeatCount, effecti
veFrom.x(), effectiveTo.x(), effectiveToAtEnd.x(), animatedX); |
205 animationElement->animateAdditiveNumber(percentage, repeatCount, effecti
veFrom.y(), effectiveTo.y(), effectiveToAtEnd.y(), animatedY); | 205 animationElement->animateAdditiveNumber(percentage, repeatCount, effecti
veFrom.y(), effectiveTo.y(), effectiveToAtEnd.y(), animatedY); |
206 at(i)->setValue(FloatPoint(animatedX, animatedY)); | 206 at(i)->setValue(FloatPoint(animatedX, animatedY)); |
207 } | 207 } |
208 } | 208 } |
209 | 209 |
210 float SVGPointList::calculateDistance(PassRefPtr<NewSVGPropertyBase> to, SVGElem
ent*) | 210 float SVGPointList::calculateDistance(PassRefPtr<NewSVGPropertyBase> to, SVGElem
ent*) |
211 { | 211 { |
212 // FIXME: Distance calculation is not possible for SVGPointList right now. W
e need the distance for every single value. | 212 // FIXME: Distance calculation is not possible for SVGPointList right now. W
e need the distance for every single value. |
213 return -1; | 213 return -1; |
214 } | 214 } |
215 | 215 |
216 } | 216 } |
OLD | NEW |