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 * | 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 else if (value == "skewX") | 107 else if (value == "skewX") |
108 m_type = SVGTransform::SVG_TRANSFORM_SKEWX; | 108 m_type = SVGTransform::SVG_TRANSFORM_SKEWX; |
109 else if (value == "skewY") | 109 else if (value == "skewY") |
110 m_type = SVGTransform::SVG_TRANSFORM_SKEWY; | 110 m_type = SVGTransform::SVG_TRANSFORM_SKEWY; |
111 return; | 111 return; |
112 } | 112 } |
113 | 113 |
114 ASSERT_NOT_REACHED(); | 114 ASSERT_NOT_REACHED(); |
115 } | 115 } |
116 | 116 |
117 static SVGTransformList* transformListFor(SVGElement* element) | 117 static PassRefPtr<SVGAnimatedTransformList> animatedTransformListFor(SVGElement*
element) |
118 { | 118 { |
119 ASSERT(element); | 119 ASSERT(element); |
120 if (element->isStyledTransformable()) | 120 if (element->isStyledTransformable()) |
121 return &static_cast<SVGStyledTransformableElement*>(element)->transform(
); | 121 return static_cast<SVGStyledTransformableElement*>(element)->transformAn
imated(); |
122 if (element->hasTagName(SVGNames::textTag)) | 122 if (element->hasTagName(SVGNames::textTag)) |
123 return &static_cast<SVGTextElement*>(element)->transform(); | 123 return static_cast<SVGTextElement*>(element)->transformAnimated(); |
124 if (element->hasTagName(SVGNames::linearGradientTag) || element->hasTagName(
SVGNames::radialGradientTag)) | 124 if (element->hasTagName(SVGNames::linearGradientTag) || element->hasTagName(
SVGNames::radialGradientTag)) |
125 return &static_cast<SVGGradientElement*>(element)->gradientTransform(); | 125 return static_cast<SVGGradientElement*>(element)->gradientTransformAnima
ted(); |
126 // FIXME: Handle patternTransform, which is obviously missing! | 126 // FIXME: Handle patternTransform, which is obviously missing! |
127 return 0; | 127 return 0; |
128 } | 128 } |
129 | 129 |
130 void SVGAnimateTransformElement::resetToBaseValue(const String& baseValue) | 130 void SVGAnimateTransformElement::resetToBaseValue(const String& baseValue) |
131 { | 131 { |
132 SVGElement* targetElement = this->targetElement(); | 132 SVGElement* targetElement = this->targetElement(); |
133 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) | 133 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) |
134 return; | 134 return; |
135 | 135 |
136 if (targetElement->hasTagName(SVGNames::linearGradientTag) || targetElement-
>hasTagName(SVGNames::radialGradientTag)) { | 136 if (targetElement->hasTagName(SVGNames::linearGradientTag) || targetElement-
>hasTagName(SVGNames::radialGradientTag)) { |
137 targetElement->setAttribute(SVGNames::gradientTransformAttr, baseValue.i
sEmpty() ? "matrix(1 0 0 1 0 0)" : baseValue); | 137 targetElement->setAttribute(SVGNames::gradientTransformAttr, baseValue.i
sEmpty() ? "matrix(1 0 0 1 0 0)" : baseValue); |
138 return; | 138 return; |
139 } | 139 } |
140 | 140 |
141 if (baseValue.isEmpty()) { | 141 if (baseValue.isEmpty()) { |
142 if (SVGTransformList* list = transformListFor(targetElement)) | 142 if (RefPtr<SVGAnimatedTransformList> list = animatedTransformListFor(tar
getElement)) { |
143 list->clear(); | 143 list->detachListWrappers(0); |
| 144 list->values().clear(); |
| 145 } |
144 } else | 146 } else |
145 targetElement->setAttribute(SVGNames::transformAttr, baseValue); | 147 targetElement->setAttribute(SVGNames::transformAttr, baseValue); |
146 } | 148 } |
147 | 149 |
148 void SVGAnimateTransformElement::calculateAnimatedValue(float percentage, unsign
ed repeat, SVGSMILElement*) | 150 void SVGAnimateTransformElement::calculateAnimatedValue(float percentage, unsign
ed repeat, SVGSMILElement*) |
149 { | 151 { |
150 SVGElement* targetElement = this->targetElement(); | 152 SVGElement* targetElement = this->targetElement(); |
151 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) | 153 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) |
152 return; | 154 return; |
153 SVGTransformList* transformList = transformListFor(targetElement); | 155 RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(tar
getElement); |
154 ASSERT(transformList); | 156 ASSERT(animatedList); |
155 | 157 |
156 if (!isAdditive()) | 158 if (!isAdditive()) { |
157 transformList->clear(); | 159 animatedList->detachListWrappers(0); |
| 160 animatedList->values().clear(); |
| 161 } |
158 if (isAccumulated() && repeat) { | 162 if (isAccumulated() && repeat) { |
159 SVGTransform accumulatedTransform = SVGTransformDistance(m_fromTransform
, m_toTransform).scaledDistance(repeat).addToSVGTransform(SVGTransform()); | 163 SVGTransform accumulatedTransform = SVGTransformDistance(m_fromTransform
, m_toTransform).scaledDistance(repeat).addToSVGTransform(SVGTransform()); |
160 transformList->append(accumulatedTransform); | 164 transformList->append(accumulatedTransform); |
161 } | 165 } |
162 SVGTransform transform = SVGTransformDistance(m_fromTransform, m_toTransform
).scaledDistance(percentage).addToSVGTransform(m_fromTransform); | 166 SVGTransform transform = SVGTransformDistance(m_fromTransform, m_toTransform
).scaledDistance(percentage).addToSVGTransform(m_fromTransform); |
163 transformList->append(transform); | 167 animatedList->values().append(transform); |
| 168 animatedList->wrappers().append(RefPtr<SVGPropertyTearOff<SVGTransform> >())
; |
164 } | 169 } |
165 | 170 |
166 bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromStri
ng, const String& toString) | 171 bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromStri
ng, const String& toString) |
167 { | 172 { |
168 m_fromTransform = parseTransformValue(fromString); | 173 m_fromTransform = parseTransformValue(fromString); |
169 if (!m_fromTransform.isValid()) | 174 if (!m_fromTransform.isValid()) |
170 return false; | 175 return false; |
171 m_toTransform = parseTransformValue(toString); | 176 m_toTransform = parseTransformValue(toString); |
172 return m_toTransform.isValid(); | 177 return m_toTransform.isValid(); |
173 } | 178 } |
(...skipping 25 matching lines...) Expand all Loading... |
199 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) | 204 if (!targetElement || determineAnimatedAttributeType(targetElement) == Anima
tedUnknown) |
200 return; | 205 return; |
201 | 206 |
202 // We accumulate to the target element transform list so there is not much t
o do here. | 207 // We accumulate to the target element transform list so there is not much t
o do here. |
203 if (RenderObject* renderer = targetElement->renderer()) { | 208 if (RenderObject* renderer = targetElement->renderer()) { |
204 renderer->setNeedsTransformUpdate(); | 209 renderer->setNeedsTransformUpdate(); |
205 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); | 210 RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); |
206 } | 211 } |
207 | 212 |
208 // ...except in case where we have additional instances in <use> trees. | 213 // ...except in case where we have additional instances in <use> trees. |
209 SVGTransformList* transformList = transformListFor(targetElement); | 214 RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(tar
getElement); |
210 if (!transformList) | 215 if (!animatedList) |
211 return; | 216 return; |
| 217 SVGTransformList* transformList = &animatedList->values(); |
212 | 218 |
213 const HashSet<SVGElementInstance*>& instances = targetElement->instancesForE
lement(); | 219 const HashSet<SVGElementInstance*>& instances = targetElement->instancesForE
lement(); |
214 const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); | 220 const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); |
215 for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it
!= end; ++it) { | 221 for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it
!= end; ++it) { |
216 SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); | 222 SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); |
217 ASSERT(shadowTreeElement); | 223 ASSERT(shadowTreeElement); |
218 if (shadowTreeElement->isStyledTransformable()) | 224 if (shadowTreeElement->isStyledTransformable()) |
219 static_cast<SVGStyledTransformableElement*>(shadowTreeElement)->setT
ransformBaseValue(*transformList); | 225 static_cast<SVGStyledTransformableElement*>(shadowTreeElement)->setT
ransformBaseValue(*transformList); |
220 else if (shadowTreeElement->hasTagName(SVGNames::textTag)) | 226 else if (shadowTreeElement->hasTagName(SVGNames::textTag)) |
221 static_cast<SVGTextElement*>(shadowTreeElement)->setTransformBaseVal
ue(*transformList); | 227 static_cast<SVGTextElement*>(shadowTreeElement)->setTransformBaseVal
ue(*transformList); |
(...skipping 25 matching lines...) Expand all Loading... |
247 return fabsf(to.angle() - from.angle()); | 253 return fabsf(to.angle() - from.angle()); |
248 if (to.type() == SVGTransform::SVG_TRANSFORM_SCALE) { | 254 if (to.type() == SVGTransform::SVG_TRANSFORM_SCALE) { |
249 FloatSize diff = to.scale() - from.scale(); | 255 FloatSize diff = to.scale() - from.scale(); |
250 return sqrtf(diff.width() * diff.width() + diff.height() * diff.height()
); | 256 return sqrtf(diff.width() * diff.width() + diff.height() * diff.height()
); |
251 } | 257 } |
252 return -1; | 258 return -1; |
253 } | 259 } |
254 | 260 |
255 } | 261 } |
256 #endif // ENABLE(SVG) | 262 #endif // ENABLE(SVG) |
OLD | NEW |