| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/animation/StringKeyframe.h" | 6 #include "core/animation/StringKeyframe.h" |
| 7 | 7 |
| 8 #include "core/animation/AngleSVGInterpolation.h" | 8 #include "core/animation/AngleSVGInterpolation.h" |
| 9 #include "core/animation/ColorStyleInterpolation.h" | 9 #include "core/animation/ColorStyleInterpolation.h" |
| 10 #include "core/animation/CompositorAnimations.h" | 10 #include "core/animation/CompositorAnimations.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 PropertyHandleSet properties; | 75 PropertyHandleSet properties; |
| 76 for (unsigned i = 0; i < m_propertySet->propertyCount(); ++i) | 76 for (unsigned i = 0; i < m_propertySet->propertyCount(); ++i) |
| 77 properties.add(PropertyHandle(m_propertySet->propertyAt(i).id())); | 77 properties.add(PropertyHandle(m_propertySet->propertyAt(i).id())); |
| 78 | 78 |
| 79 for (const auto& key: m_svgPropertyMap.keys()) | 79 for (const auto& key: m_svgPropertyMap.keys()) |
| 80 properties.add(PropertyHandle(*key)); | 80 properties.add(PropertyHandle(*key)); |
| 81 | 81 |
| 82 return properties; | 82 return properties; |
| 83 } | 83 } |
| 84 | 84 |
| 85 PassRefPtrWillBeRawPtr<Keyframe> StringKeyframe::clone() const | 85 Keyframe* StringKeyframe::clone() const |
| 86 { | 86 { |
| 87 return adoptRefWillBeNoop(new StringKeyframe(*this)); | 87 return new StringKeyframe(*this); |
| 88 } | 88 } |
| 89 | 89 |
| 90 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::creat
ePropertySpecificKeyframe(PropertyHandle property) const | 90 Keyframe::PropertySpecificKeyframe* StringKeyframe::createPropertySpecificKeyfra
me(PropertyHandle property) const |
| 91 { | 91 { |
| 92 if (property.isCSSProperty()) | 92 if (property.isCSSProperty()) |
| 93 return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset(), &eas
ing(), cssPropertyValue(property.cssProperty()), composite())); | 93 return new CSSPropertySpecificKeyframe(offset(), &easing(), cssPropertyV
alue(property.cssProperty()), composite()); |
| 94 | 94 |
| 95 ASSERT(property.isSVGAttribute()); | 95 ASSERT(property.isSVGAttribute()); |
| 96 return adoptPtrWillBeNoop(new SVGPropertySpecificKeyframe(offset(), &easing(
), svgPropertyValue(*property.svgAttribute()), composite())); | 96 return new SVGPropertySpecificKeyframe(offset(), &easing(), svgPropertyValue
(*property.svgAttribute()), composite()); |
| 97 } | 97 } |
| 98 | 98 |
| 99 DEFINE_TRACE(StringKeyframe) | 99 DEFINE_TRACE(StringKeyframe) |
| 100 { | 100 { |
| 101 visitor->trace(m_propertySet); | 101 visitor->trace(m_propertySet); |
| 102 Keyframe::trace(visitor); | 102 Keyframe::trace(visitor); |
| 103 } | 103 } |
| 104 | 104 |
| 105 StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double
offset, PassRefPtr<TimingFunction> easing, CSSValue* value, AnimationEffect::Com
positeOperation op) | 105 StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double
offset, PassRefPtr<TimingFunction> easing, CSSValue* value, AnimationEffect::Com
positeOperation op) |
| 106 : Keyframe::PropertySpecificKeyframe(offset, easing, op) | 106 : Keyframe::PropertySpecificKeyframe(offset, easing, op) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 case CSSPropertyFontSizeAdjust: | 144 case CSSPropertyFontSizeAdjust: |
| 145 return RangeNonNegative; | 145 return RangeNonNegative; |
| 146 default: | 146 default: |
| 147 ASSERT_NOT_REACHED(); | 147 ASSERT_NOT_REACHED(); |
| 148 return RangeAll; | 148 return RangeAll; |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 | 151 |
| 152 } // namespace | 152 } // namespace |
| 153 | 153 |
| 154 PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
e::maybeCreateInterpolation(PropertyHandle propertyHandle, Keyframe::PropertySpe
cificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const | 154 Interpolation* StringKeyframe::CSSPropertySpecificKeyframe::maybeCreateInterpola
tion(PropertyHandle propertyHandle, Keyframe::PropertySpecificKeyframe& end, Ele
ment* element, const ComputedStyle* baseStyle) const |
| 155 { | 155 { |
| 156 CSSPropertyID property = propertyHandle.cssProperty(); | 156 CSSPropertyID property = propertyHandle.cssProperty(); |
| 157 | 157 |
| 158 // FIXME: Refactor this into a generic piece that lives in InterpolationEffe
ct, and a template parameter specific converter. | 158 // FIXME: Refactor this into a generic piece that lives in InterpolationEffe
ct, and a template parameter specific converter. |
| 159 CSSValue* fromCSSValue = m_value.get(); | 159 CSSValue* fromCSSValue = m_value.get(); |
| 160 CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value(); | 160 CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value(); |
| 161 InterpolationRange range = RangeAll; | 161 InterpolationRange range = RangeAll; |
| 162 bool fallBackToLegacy = false; | 162 bool fallBackToLegacy = false; |
| 163 | 163 |
| 164 // FIXME: Remove this flag once we can rely on legacy's behaviour being corr
ect. | 164 // FIXME: Remove this flag once we can rely on legacy's behaviour being corr
ect. |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 case CSSPropertyFontSizeAdjust: | 263 case CSSPropertyFontSizeAdjust: |
| 264 case CSSPropertyOpacity: | 264 case CSSPropertyOpacity: |
| 265 case CSSPropertyStopOpacity: | 265 case CSSPropertyStopOpacity: |
| 266 case CSSPropertyStrokeOpacity: | 266 case CSSPropertyStrokeOpacity: |
| 267 case CSSPropertyStrokeMiterlimit: | 267 case CSSPropertyStrokeMiterlimit: |
| 268 if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyl
eInterpolation::canCreateFrom(*toCSSValue)) | 268 if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyl
eInterpolation::canCreateFrom(*toCSSValue)) |
| 269 return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, toCSSPrimitiveValue(fromCSSValue)->primitiveType(), setRange(property)
); | 269 return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, toCSSPrimitiveValue(fromCSSValue)->primitiveType(), setRange(property)
); |
| 270 break; | 270 break; |
| 271 | 271 |
| 272 case CSSPropertyMotionRotation: { | 272 case CSSPropertyMotionRotation: { |
| 273 RefPtrWillBeRawPtr<Interpolation> interpolation = DoubleStyleInterpolati
on::maybeCreateFromMotionRotation(*fromCSSValue, *toCSSValue, property); | 273 Interpolation* interpolation = DoubleStyleInterpolation::maybeCreateFrom
MotionRotation(*fromCSSValue, *toCSSValue, property); |
| 274 if (interpolation) | 274 if (interpolation) |
| 275 return interpolation.release(); | 275 return interpolation; |
| 276 break; | 276 break; |
| 277 } | 277 } |
| 278 case CSSPropertyVisibility: | 278 case CSSPropertyVisibility: |
| 279 if (VisibilityStyleInterpolation::canCreateFrom(*fromCSSValue) && Visibi
lityStyleInterpolation::canCreateFrom(*toCSSValue) && (VisibilityStyleInterpolat
ion::isVisible(*fromCSSValue) || VisibilityStyleInterpolation::isVisible(*toCSSV
alue))) | 279 if (VisibilityStyleInterpolation::canCreateFrom(*fromCSSValue) && Visibi
lityStyleInterpolation::canCreateFrom(*toCSSValue) && (VisibilityStyleInterpolat
ion::isVisible(*fromCSSValue) || VisibilityStyleInterpolation::isVisible(*toCSSV
alue))) |
| 280 return VisibilityStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property); | 280 return VisibilityStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property); |
| 281 | 281 |
| 282 break; | 282 break; |
| 283 | 283 |
| 284 case CSSPropertyBackgroundColor: | 284 case CSSPropertyBackgroundColor: |
| 285 case CSSPropertyBorderBottomColor: | 285 case CSSPropertyBorderBottomColor: |
| 286 case CSSPropertyBorderLeftColor: | 286 case CSSPropertyBorderLeftColor: |
| 287 case CSSPropertyBorderRightColor: | 287 case CSSPropertyBorderRightColor: |
| 288 case CSSPropertyBorderTopColor: | 288 case CSSPropertyBorderTopColor: |
| 289 case CSSPropertyColor: | 289 case CSSPropertyColor: |
| 290 case CSSPropertyFill: | 290 case CSSPropertyFill: |
| 291 case CSSPropertyFloodColor: | 291 case CSSPropertyFloodColor: |
| 292 case CSSPropertyLightingColor: | 292 case CSSPropertyLightingColor: |
| 293 case CSSPropertyOutlineColor: | 293 case CSSPropertyOutlineColor: |
| 294 case CSSPropertyStopColor: | 294 case CSSPropertyStopColor: |
| 295 case CSSPropertyStroke: | 295 case CSSPropertyStroke: |
| 296 case CSSPropertyTextDecorationColor: | 296 case CSSPropertyTextDecorationColor: |
| 297 case CSSPropertyWebkitColumnRuleColor: | 297 case CSSPropertyWebkitColumnRuleColor: |
| 298 case CSSPropertyWebkitTextStrokeColor: | 298 case CSSPropertyWebkitTextStrokeColor: |
| 299 { | 299 { |
| 300 RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpol
ation::maybeCreateFromColor(*fromCSSValue, *toCSSValue, property); | 300 Interpolation* interpolation = ColorStyleInterpolation::maybeCreateF
romColor(*fromCSSValue, *toCSSValue, property); |
| 301 if (interpolation) | 301 if (interpolation) |
| 302 return interpolation.release(); | 302 return interpolation; |
| 303 | 303 |
| 304 // Current color should use LegacyStyleInterpolation | 304 // Current color should use LegacyStyleInterpolation |
| 305 if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*from
CSSValue, *toCSSValue)) | 305 if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*from
CSSValue, *toCSSValue)) |
| 306 fallBackToLegacy = true; | 306 fallBackToLegacy = true; |
| 307 | 307 |
| 308 break; | 308 break; |
| 309 } | 309 } |
| 310 | 310 |
| 311 case CSSPropertyBorderImageSource: | 311 case CSSPropertyBorderImageSource: |
| 312 case CSSPropertyListStyleImage: | 312 case CSSPropertyListStyleImage: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 325 case CSSPropertyBorderTopRightRadius: | 325 case CSSPropertyBorderTopRightRadius: |
| 326 range = RangeNonNegative; | 326 range = RangeNonNegative; |
| 327 // Fall through | 327 // Fall through |
| 328 case CSSPropertyObjectPosition: | 328 case CSSPropertyObjectPosition: |
| 329 if (LengthPairStyleInterpolation::canCreateFrom(*fromCSSValue) && Length
PairStyleInterpolation::canCreateFrom(*toCSSValue)) | 329 if (LengthPairStyleInterpolation::canCreateFrom(*fromCSSValue) && Length
PairStyleInterpolation::canCreateFrom(*toCSSValue)) |
| 330 return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property, range); | 330 return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property, range); |
| 331 break; | 331 break; |
| 332 | 332 |
| 333 case CSSPropertyPerspectiveOrigin: | 333 case CSSPropertyPerspectiveOrigin: |
| 334 case CSSPropertyTransformOrigin: { | 334 case CSSPropertyTransformOrigin: { |
| 335 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); | 335 Interpolation* interpolation = ListStyleInterpolation<LengthStyleInterpo
lation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property, range); |
| 336 if (interpolation) | 336 if (interpolation) |
| 337 return interpolation.release(); | 337 return interpolation; |
| 338 | 338 |
| 339 // FIXME: Handle keywords: top, right, left, center, bottom | 339 // FIXME: Handle keywords: top, right, left, center, bottom |
| 340 fallBackToLegacy = true; | 340 fallBackToLegacy = true; |
| 341 | 341 |
| 342 break; | 342 break; |
| 343 } | 343 } |
| 344 | 344 |
| 345 case CSSPropertyBoxShadow: | 345 case CSSPropertyBoxShadow: |
| 346 case CSSPropertyTextShadow: { | 346 case CSSPropertyTextShadow: { |
| 347 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<ShadowStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty); | 347 Interpolation* interpolation = ListStyleInterpolation<ShadowStyleInterpo
lation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property); |
| 348 if (interpolation) | 348 if (interpolation) |
| 349 return interpolation.release(); | 349 return interpolation; |
| 350 | 350 |
| 351 // FIXME: AnimatableShadow incorrectly animates between inset and non-in
set values so it will never indicate it needs default interpolation | 351 // FIXME: AnimatableShadow incorrectly animates between inset and non-in
set values so it will never indicate it needs default interpolation |
| 352 if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValu
e, *toCSSValue)) { | 352 if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValu
e, *toCSSValue)) { |
| 353 forceDefaultInterpolation = true; | 353 forceDefaultInterpolation = true; |
| 354 break; | 354 break; |
| 355 } | 355 } |
| 356 | 356 |
| 357 // FIXME: Handle interpolation from/to none, unspecified color values | 357 // FIXME: Handle interpolation from/to none, unspecified color values |
| 358 fallBackToLegacy = true; | 358 fallBackToLegacy = true; |
| 359 | 359 |
| 360 break; | 360 break; |
| 361 | 361 |
| 362 } | 362 } |
| 363 | 363 |
| 364 case CSSPropertyClip: { | 364 case CSSPropertyClip: { |
| 365 if (LengthBoxStyleInterpolation::usesDefaultInterpolation(*fromCSSValue,
*toCSSValue)) { | 365 if (LengthBoxStyleInterpolation::usesDefaultInterpolation(*fromCSSValue,
*toCSSValue)) { |
| 366 forceDefaultInterpolation = true; | 366 forceDefaultInterpolation = true; |
| 367 break; | 367 break; |
| 368 } | 368 } |
| 369 RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpol
ation::maybeCreateFrom(*fromCSSValue, *toCSSValue, property); | 369 Interpolation* interpolation = LengthBoxStyleInterpolation::maybeCreateF
rom(*fromCSSValue, *toCSSValue, property); |
| 370 if (interpolation) | 370 if (interpolation) |
| 371 return interpolation.release(); | 371 return interpolation; |
| 372 break; | 372 break; |
| 373 } | 373 } |
| 374 | 374 |
| 375 case CSSPropertyBorderImageSlice: | 375 case CSSPropertyBorderImageSlice: |
| 376 case CSSPropertyWebkitMaskBoxImageSlice: { | 376 case CSSPropertyWebkitMaskBoxImageSlice: { |
| 377 RefPtrWillBeRawPtr<Interpolation> interpolation = ImageSliceStyleInterpo
lation::maybeCreate(*fromCSSValue, *toCSSValue, property); | 377 Interpolation* interpolation = ImageSliceStyleInterpolation::maybeCreate
(*fromCSSValue, *toCSSValue, property); |
| 378 if (interpolation) | 378 if (interpolation) |
| 379 return interpolation.release(); | 379 return interpolation; |
| 380 if (ImageSliceStyleInterpolation::usesDefaultInterpolation(*fromCSSValue
, *toCSSValue)) | 380 if (ImageSliceStyleInterpolation::usesDefaultInterpolation(*fromCSSValue
, *toCSSValue)) |
| 381 forceDefaultInterpolation = true; | 381 forceDefaultInterpolation = true; |
| 382 | 382 |
| 383 break; | 383 break; |
| 384 } | 384 } |
| 385 | 385 |
| 386 case CSSPropertyStrokeDasharray: { | 386 case CSSPropertyStrokeDasharray: { |
| 387 RefPtrWillBeRawPtr<Interpolation> interpolation = SVGStrokeDasharrayStyl
eInterpolation::maybeCreate(*fromCSSValue, *toCSSValue, property); | 387 Interpolation* interpolation = SVGStrokeDasharrayStyleInterpolation::may
beCreate(*fromCSSValue, *toCSSValue, property); |
| 388 if (interpolation) | 388 if (interpolation) |
| 389 return interpolation.release(); | 389 return interpolation; |
| 390 | 390 |
| 391 break; | 391 break; |
| 392 } | 392 } |
| 393 | 393 |
| 394 default: | 394 default: |
| 395 // Fall back to LegacyStyleInterpolation. | 395 // Fall back to LegacyStyleInterpolation. |
| 396 fallBackToLegacy = true; | 396 fallBackToLegacy = true; |
| 397 break; | 397 break; |
| 398 } | 398 } |
| 399 | 399 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 410 if (fallBackToLegacy) { | 410 if (fallBackToLegacy) { |
| 411 if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(
*fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleRe
solve(*toCSSValue)) { | 411 if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(
*fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleRe
solve(*toCSSValue)) { |
| 412 // FIXME: Handle these cases outside of DeferredLegacyStyleInterpola
tion. | 412 // FIXME: Handle these cases outside of DeferredLegacyStyleInterpola
tion. |
| 413 return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSV
alue, property); | 413 return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSV
alue, property); |
| 414 } | 414 } |
| 415 | 415 |
| 416 // FIXME: Remove the use of AnimatableValues and Elements here. | 416 // FIXME: Remove the use of AnimatableValues and Elements here. |
| 417 ASSERT(element); | 417 ASSERT(element); |
| 418 populateAnimatableValue(property, *element, baseStyle); | 418 populateAnimatableValue(property, *element, baseStyle); |
| 419 end.populateAnimatableValue(property, *element, baseStyle); | 419 end.populateAnimatableValue(property, *element, baseStyle); |
| 420 return LegacyStyleInterpolation::create(getAnimatableValue(), end.getAni
matableValue(), property); | 420 return LegacyStyleInterpolation::create(const_cast<AnimatableValue*>(get
AnimatableValue()), const_cast<AnimatableValue*>(end.getAnimatableValue()), prop
erty); |
| 421 } | 421 } |
| 422 | 422 |
| 423 ASSERT(AnimatableValue::usesDefaultInterpolation( | 423 ASSERT(AnimatableValue::usesDefaultInterpolation( |
| 424 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, fromCSSValue).get(), | 424 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, fromCSSValue), |
| 425 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, toCSSValue).get())); | 425 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, toCSSValue))); |
| 426 | 426 |
| 427 return nullptr; | 427 return nullptr; |
| 428 | 428 |
| 429 } | 429 } |
| 430 | 430 |
| 431 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction
> easing) const | 431 Keyframe::PropertySpecificKeyframe* StringKeyframe::CSSPropertySpecificKeyframe:
:neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const |
| 432 { | 432 { |
| 433 return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset, easing, st
atic_cast<CSSValue*>(0), AnimationEffect::CompositeAdd)); | 433 return new CSSPropertySpecificKeyframe(offset, easing, static_cast<CSSValue*
>(0), AnimationEffect::CompositeAdd); |
| 434 } | 434 } |
| 435 | 435 |
| 436 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::cloneWithOffset(double offset) const | 436 Keyframe::PropertySpecificKeyframe* StringKeyframe::CSSPropertySpecificKeyframe:
:cloneWithOffset(double offset) const |
| 437 { | 437 { |
| 438 Keyframe::PropertySpecificKeyframe* theClone = new CSSPropertySpecificKeyfra
me(offset, m_easing, m_value.get()); | 438 Keyframe::PropertySpecificKeyframe* theClone = new CSSPropertySpecificKeyfra
me(offset, m_easing, m_value.get()); |
| 439 toCSSPropertySpecificKeyframe(theClone)->m_animatableValueCache = m_animatab
leValueCache; | 439 toCSSPropertySpecificKeyframe(theClone)->m_animatableValueCache = m_animatab
leValueCache; |
| 440 return adoptPtrWillBeNoop(theClone); | 440 return theClone; |
| 441 } | 441 } |
| 442 | 442 |
| 443 DEFINE_TRACE(StringKeyframe::CSSPropertySpecificKeyframe) | 443 DEFINE_TRACE(StringKeyframe::CSSPropertySpecificKeyframe) |
| 444 { | 444 { |
| 445 visitor->trace(m_value); | 445 visitor->trace(m_value); |
| 446 visitor->trace(m_animatableValueCache); | 446 visitor->trace(m_animatableValueCache); |
| 447 Keyframe::PropertySpecificKeyframe::trace(visitor); | 447 Keyframe::PropertySpecificKeyframe::trace(visitor); |
| 448 } | 448 } |
| 449 | 449 |
| 450 SVGPropertySpecificKeyframe::SVGPropertySpecificKeyframe(double offset, PassRefP
tr<TimingFunction> easing, const String& value, AnimationEffect::CompositeOperat
ion op) | 450 SVGPropertySpecificKeyframe::SVGPropertySpecificKeyframe(double offset, PassRefP
tr<TimingFunction> easing, const String& value, AnimationEffect::CompositeOperat
ion op) |
| 451 : Keyframe::PropertySpecificKeyframe(offset, easing, op) | 451 : Keyframe::PropertySpecificKeyframe(offset, easing, op) |
| 452 , m_value(value) | 452 , m_value(value) |
| 453 { | 453 { |
| 454 } | 454 } |
| 455 | 455 |
| 456 SVGPropertySpecificKeyframe::SVGPropertySpecificKeyframe(double offset, PassRefP
tr<TimingFunction> easing, const String& value) | 456 SVGPropertySpecificKeyframe::SVGPropertySpecificKeyframe(double offset, PassRefP
tr<TimingFunction> easing, const String& value) |
| 457 : Keyframe::PropertySpecificKeyframe(offset, easing, AnimationEffect::Compos
iteReplace) | 457 : Keyframe::PropertySpecificKeyframe(offset, easing, AnimationEffect::Compos
iteReplace) |
| 458 , m_value(value) | 458 , m_value(value) |
| 459 { | 459 { |
| 460 ASSERT(!isNull(m_offset)); | 460 ASSERT(!isNull(m_offset)); |
| 461 } | 461 } |
| 462 | 462 |
| 463 DEFINE_TRACE(StringKeyframe::SVGPropertySpecificKeyframe) | 463 DEFINE_TRACE(StringKeyframe::SVGPropertySpecificKeyframe) |
| 464 { | 464 { |
| 465 Keyframe::PropertySpecificKeyframe::trace(visitor); | 465 Keyframe::PropertySpecificKeyframe::trace(visitor); |
| 466 } | 466 } |
| 467 | 467 |
| 468 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> SVGPropertySpecificKe
yframe::cloneWithOffset(double offset) const | 468 Keyframe::PropertySpecificKeyframe* SVGPropertySpecificKeyframe::cloneWithOffset
(double offset) const |
| 469 { | 469 { |
| 470 return adoptPtrWillBeNoop(new SVGPropertySpecificKeyframe(offset, m_easing,
m_value)); | 470 return new SVGPropertySpecificKeyframe(offset, m_easing, m_value); |
| 471 } | 471 } |
| 472 | 472 |
| 473 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> SVGPropertySpecificKe
yframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const | 473 Keyframe::PropertySpecificKeyframe* SVGPropertySpecificKeyframe::neutralKeyframe
(double offset, PassRefPtr<TimingFunction> easing) const |
| 474 { | 474 { |
| 475 return adoptPtrWillBeNoop(new SVGPropertySpecificKeyframe(offset, easing, ""
, AnimationEffect::CompositeAdd)); | 475 return new SVGPropertySpecificKeyframe(offset, easing, "", AnimationEffect::
CompositeAdd); |
| 476 } | 476 } |
| 477 | 477 |
| 478 namespace { | 478 namespace { |
| 479 | 479 |
| 480 PassRefPtrWillBeRawPtr<Interpolation> createSVGInterpolation(SVGPropertyBase* fr
omValue, SVGPropertyBase* toValue, SVGAnimatedPropertyBase* attribute) | 480 Interpolation* createSVGInterpolation(SVGPropertyBase* fromValue, SVGPropertyBas
e* toValue, SVGAnimatedPropertyBase* attribute) |
| 481 { | 481 { |
| 482 RefPtrWillBeRawPtr<Interpolation> interpolation = nullptr; | 482 Interpolation* interpolation = nullptr; |
| 483 ASSERT(fromValue->type() == toValue->type()); | 483 ASSERT(fromValue->type() == toValue->type()); |
| 484 switch (fromValue->type()) { | 484 switch (fromValue->type()) { |
| 485 case AnimatedAngle: | 485 case AnimatedAngle: |
| 486 if (AngleSVGInterpolation::canCreateFrom(fromValue) && AngleSVGInterpola
tion::canCreateFrom(toValue)) | 486 if (AngleSVGInterpolation::canCreateFrom(fromValue) && AngleSVGInterpola
tion::canCreateFrom(toValue)) |
| 487 return AngleSVGInterpolation::create(fromValue, toValue, attribute); | 487 return AngleSVGInterpolation::create(fromValue, toValue, attribute); |
| 488 break; | 488 break; |
| 489 case AnimatedInteger: | 489 case AnimatedInteger: |
| 490 return IntegerSVGInterpolation::create(fromValue, toValue, attribute); | 490 return IntegerSVGInterpolation::create(fromValue, toValue, attribute); |
| 491 case AnimatedIntegerOptionalInteger: { | 491 case AnimatedIntegerOptionalInteger: { |
| 492 int min = &attribute->attributeName() == &SVGNames::orderAttr ? 1 : 0; | 492 int min = &attribute->attributeName() == &SVGNames::orderAttr ? 1 : 0; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 516 return RectSVGInterpolation::create(fromValue, toValue, attribute); | 516 return RectSVGInterpolation::create(fromValue, toValue, attribute); |
| 517 case AnimatedTransformList: | 517 case AnimatedTransformList: |
| 518 interpolation = ListSVGInterpolation<TransformSVGInterpolation>::maybeCr
eate(fromValue, toValue, attribute); | 518 interpolation = ListSVGInterpolation<TransformSVGInterpolation>::maybeCr
eate(fromValue, toValue, attribute); |
| 519 break; | 519 break; |
| 520 | 520 |
| 521 // TODO(ericwilligers): Support more animation types. | 521 // TODO(ericwilligers): Support more animation types. |
| 522 default: | 522 default: |
| 523 break; | 523 break; |
| 524 } | 524 } |
| 525 if (interpolation) | 525 if (interpolation) |
| 526 return interpolation.release(); | 526 return interpolation; |
| 527 | 527 |
| 528 return DefaultSVGInterpolation::create(fromValue, toValue, attribute); | 528 return DefaultSVGInterpolation::create(fromValue, toValue, attribute); |
| 529 } | 529 } |
| 530 | 530 |
| 531 } // namespace | 531 } // namespace |
| 532 | 532 |
| 533 PassRefPtrWillBeRawPtr<Interpolation> SVGPropertySpecificKeyframe::maybeCreateIn
terpolation(PropertyHandle propertyHandle, Keyframe::PropertySpecificKeyframe& e
nd, Element* element, const ComputedStyle* baseStyle) const | 533 Interpolation* SVGPropertySpecificKeyframe::maybeCreateInterpolation(PropertyHan
dle propertyHandle, Keyframe::PropertySpecificKeyframe& end, Element* element, c
onst ComputedStyle* baseStyle) const |
| 534 { | 534 { |
| 535 ASSERT(element); | 535 ASSERT(element); |
| 536 RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> attribute = toSVGElement(element
)->propertyFromAttribute(*propertyHandle.svgAttribute()); | 536 RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> attribute = toSVGElement(element
)->propertyFromAttribute(*propertyHandle.svgAttribute()); |
| 537 ASSERT(attribute); | 537 ASSERT(attribute); |
| 538 | 538 |
| 539 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = attribute->currentValueBase(
)->cloneForAnimation(m_value); | 539 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = attribute->currentValueBase(
)->cloneForAnimation(m_value); |
| 540 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = attribute->currentValueBase()-
>cloneForAnimation(toSVGPropertySpecificKeyframe(end).value()); | 540 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = attribute->currentValueBase()-
>cloneForAnimation(toSVGPropertySpecificKeyframe(end).value()); |
| 541 | 541 |
| 542 if (!fromValue || !toValue) | 542 if (!fromValue || !toValue) |
| 543 return nullptr; | 543 return nullptr; |
| 544 | 544 |
| 545 return createSVGInterpolation(fromValue.get(), toValue.get(), attribute.get(
)); | 545 return createSVGInterpolation(fromValue.get(), toValue.get(), attribute.get(
)); |
| 546 } | 546 } |
| 547 | 547 |
| 548 } // namespace blink | 548 } // namespace blink |
| OLD | NEW |