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