| 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 |