| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 return animation->affects(targetElement, CSSPropertyTransform) | 108 return animation->affects(targetElement, CSSPropertyTransform) |
| 109 || animation->affects(targetElement, CSSPropertyRotate) | 109 || animation->affects(targetElement, CSSPropertyRotate) |
| 110 || animation->affects(targetElement, CSSPropertyScale) | 110 || animation->affects(targetElement, CSSPropertyScale) |
| 111 || animation->affects(targetElement, CSSPropertyTranslate); | 111 || animation->affects(targetElement, CSSPropertyTranslate); |
| 112 } | 112 } |
| 113 | 113 |
| 114 bool hasIncompatibleAnimations(const Element& targetElement, const Animation& an
imationToAdd, const EffectModel& effectToAdd) | 114 bool hasIncompatibleAnimations(const Element& targetElement, const Animation& an
imationToAdd, const EffectModel& effectToAdd) |
| 115 { | 115 { |
| 116 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); | 116 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); |
| 117 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); | 117 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); |
| 118 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyWeb
kitFilter)); | 118 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyFil
ter)); |
| 119 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); | 119 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); |
| 120 | 120 |
| 121 if (!targetElement.hasAnimations()) | 121 if (!targetElement.hasAnimations()) |
| 122 return false; | 122 return false; |
| 123 | 123 |
| 124 ElementAnimations* elementAnimations = targetElement.elementAnimations(); | 124 ElementAnimations* elementAnimations = targetElement.elementAnimations(); |
| 125 ASSERT(elementAnimations); | 125 ASSERT(elementAnimations); |
| 126 | 126 |
| 127 for (const auto& entry : elementAnimations->animations()) { | 127 for (const auto& entry : elementAnimations->animations()) { |
| 128 const Animation* attachedAnimation = entry.key; | 128 const Animation* attachedAnimation = entry.key; |
| 129 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) | 129 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) |
| 130 continue; | 130 continue; |
| 131 | 131 |
| 132 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) | 132 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) |
| 133 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) | 133 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) |
| 134 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyWebkitFilter)) | 134 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyFilter)) |
| 135 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) | 135 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) |
| 136 return true; | 136 return true; |
| 137 } | 137 } |
| 138 | 138 |
| 139 return false; | 139 return false; |
| 140 } | 140 } |
| 141 | 141 |
| 142 } // namespace | 142 } // namespace |
| 143 | 143 |
| 144 CompositorAnimations::CompositorAnimations() | 144 CompositorAnimations::CompositorAnimations() |
| (...skipping 17 matching lines...) Expand all Loading... |
| 162 } | 162 } |
| 163 return false; | 163 return false; |
| 164 } | 164 } |
| 165 | 165 |
| 166 const CSSPropertyID CompositorAnimations::compositableProperties[7] = { | 166 const CSSPropertyID CompositorAnimations::compositableProperties[7] = { |
| 167 CSSPropertyOpacity, | 167 CSSPropertyOpacity, |
| 168 CSSPropertyRotate, | 168 CSSPropertyRotate, |
| 169 CSSPropertyScale, | 169 CSSPropertyScale, |
| 170 CSSPropertyTransform, | 170 CSSPropertyTransform, |
| 171 CSSPropertyTranslate, | 171 CSSPropertyTranslate, |
| 172 CSSPropertyWebkitFilter, | 172 CSSPropertyFilter, |
| 173 CSSPropertyBackdropFilter | 173 CSSPropertyBackdropFilter |
| 174 }; | 174 }; |
| 175 | 175 |
| 176 bool CompositorAnimations::getAnimatedBoundingBox(FloatBox& box, const EffectMod
el& effect, double minValue, double maxValue) const | 176 bool CompositorAnimations::getAnimatedBoundingBox(FloatBox& box, const EffectMod
el& effect, double minValue, double maxValue) const |
| 177 { | 177 { |
| 178 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); | 178 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); |
| 179 | 179 |
| 180 PropertyHandleSet properties = keyframeEffect.properties(); | 180 PropertyHandleSet properties = keyframeEffect.properties(); |
| 181 | 181 |
| 182 if (properties.isEmpty()) | 182 if (properties.isEmpty()) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 switch (property.cssProperty()) { | 271 switch (property.cssProperty()) { |
| 272 case CSSPropertyOpacity: | 272 case CSSPropertyOpacity: |
| 273 break; | 273 break; |
| 274 case CSSPropertyRotate: | 274 case CSSPropertyRotate: |
| 275 case CSSPropertyScale: | 275 case CSSPropertyScale: |
| 276 case CSSPropertyTranslate: | 276 case CSSPropertyTranslate: |
| 277 case CSSPropertyTransform: | 277 case CSSPropertyTransform: |
| 278 if (toAnimatableTransform(keyframe->getAnimatableValue().get())-
>transformOperations().dependsOnBoxSize()) | 278 if (toAnimatableTransform(keyframe->getAnimatableValue().get())-
>transformOperations().dependsOnBoxSize()) |
| 279 return false; | 279 return false; |
| 280 break; | 280 break; |
| 281 case CSSPropertyWebkitFilter: | 281 case CSSPropertyFilter: |
| 282 case CSSPropertyBackdropFilter: { | 282 case CSSPropertyBackdropFilter: { |
| 283 const FilterOperations& operations = toAnimatableFilterOperation
s(keyframe->getAnimatableValue().get())->operations(); | 283 const FilterOperations& operations = toAnimatableFilterOperation
s(keyframe->getAnimatableValue().get())->operations(); |
| 284 if (operations.hasFilterThatMovesPixels()) | 284 if (operations.hasFilterThatMovesPixels()) |
| 285 return false; | 285 return false; |
| 286 break; | 286 break; |
| 287 } | 287 } |
| 288 default: | 288 default: |
| 289 // any other types are not allowed to run on compositor. | 289 // any other types are not allowed to run on compositor. |
| 290 return false; | 290 return false; |
| 291 } | 291 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 303 if (!CompositorAnimationsImpl::convertTimingForCompositor(timing, 0, out, an
imationPlaybackRate)) | 303 if (!CompositorAnimationsImpl::convertTimingForCompositor(timing, 0, out, an
imationPlaybackRate)) |
| 304 return false; | 304 return false; |
| 305 | 305 |
| 306 return true; | 306 return true; |
| 307 } | 307 } |
| 308 | 308 |
| 309 void CompositorAnimations::cancelIncompatibleAnimationsOnCompositor(const Elemen
t& targetElement, const Animation& animationToAdd, const EffectModel& effectToAd
d) | 309 void CompositorAnimations::cancelIncompatibleAnimationsOnCompositor(const Elemen
t& targetElement, const Animation& animationToAdd, const EffectModel& effectToAd
d) |
| 310 { | 310 { |
| 311 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); | 311 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); |
| 312 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); | 312 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); |
| 313 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyWeb
kitFilter)); | 313 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyFil
ter)); |
| 314 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); | 314 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); |
| 315 | 315 |
| 316 if (!targetElement.hasAnimations()) | 316 if (!targetElement.hasAnimations()) |
| 317 return; | 317 return; |
| 318 | 318 |
| 319 ElementAnimations* elementAnimations = targetElement.elementAnimations(); | 319 ElementAnimations* elementAnimations = targetElement.elementAnimations(); |
| 320 ASSERT(elementAnimations); | 320 ASSERT(elementAnimations); |
| 321 | 321 |
| 322 for (const auto& entry : elementAnimations->animations()) { | 322 for (const auto& entry : elementAnimations->animations()) { |
| 323 Animation* attachedAnimation = entry.key; | 323 Animation* attachedAnimation = entry.key; |
| 324 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) | 324 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) |
| 325 continue; | 325 continue; |
| 326 | 326 |
| 327 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) | 327 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) |
| 328 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) | 328 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) |
| 329 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyWebkitFilter)) | 329 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyFilter)) |
| 330 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) | 330 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) |
| 331 attachedAnimation->cancelAnimationOnCompositor(); | 331 attachedAnimation->cancelAnimationOnCompositor(); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| 335 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) | 335 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) |
| 336 { | 336 { |
| 337 if (!Platform::current()->isThreadedAnimationEnabled()) | 337 if (!Platform::current()->isThreadedAnimationEnabled()) |
| 338 return false; | 338 return false; |
| 339 return element.layoutObject() && element.layoutObject()->compositingState()
== PaintsIntoOwnBacking; | 339 return element.layoutObject() && element.layoutObject()->compositingState()
== PaintsIntoOwnBacking; |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 switch (property.cssProperty()) { | 640 switch (property.cssProperty()) { |
| 641 case CSSPropertyOpacity: { | 641 case CSSPropertyOpacity: { |
| 642 targetProperty = CompositorTargetProperty::OPACITY; | 642 targetProperty = CompositorTargetProperty::OPACITY; |
| 643 | 643 |
| 644 CompositorFloatAnimationCurve* floatCurve = CompositorFactory::curre
nt().createFloatAnimationCurve(); | 644 CompositorFloatAnimationCurve* floatCurve = CompositorFactory::curre
nt().createFloatAnimationCurve(); |
| 645 addKeyframesToCurve(*floatCurve, values); | 645 addKeyframesToCurve(*floatCurve, values); |
| 646 setTimingFunctionOnCurve(*floatCurve, timing.timingFunction.get()); | 646 setTimingFunctionOnCurve(*floatCurve, timing.timingFunction.get()); |
| 647 curve = adoptPtr(floatCurve); | 647 curve = adoptPtr(floatCurve); |
| 648 break; | 648 break; |
| 649 } | 649 } |
| 650 case CSSPropertyWebkitFilter: | 650 case CSSPropertyFilter: |
| 651 case CSSPropertyBackdropFilter: { | 651 case CSSPropertyBackdropFilter: { |
| 652 targetProperty = CompositorTargetProperty::FILTER; | 652 targetProperty = CompositorTargetProperty::FILTER; |
| 653 CompositorFilterAnimationCurve* filterCurve = CompositorFactory::cur
rent().createFilterAnimationCurve(); | 653 CompositorFilterAnimationCurve* filterCurve = CompositorFactory::cur
rent().createFilterAnimationCurve(); |
| 654 addKeyframesToCurve(*filterCurve, values); | 654 addKeyframesToCurve(*filterCurve, values); |
| 655 setTimingFunctionOnCurve(*filterCurve, timing.timingFunction.get()); | 655 setTimingFunctionOnCurve(*filterCurve, timing.timingFunction.get()); |
| 656 curve = adoptPtr(filterCurve); | 656 curve = adoptPtr(filterCurve); |
| 657 break; | 657 break; |
| 658 } | 658 } |
| 659 case CSSPropertyRotate: | 659 case CSSPropertyRotate: |
| 660 case CSSPropertyScale: | 660 case CSSPropertyScale: |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 break; | 715 break; |
| 716 default: | 716 default: |
| 717 ASSERT_NOT_REACHED(); | 717 ASSERT_NOT_REACHED(); |
| 718 } | 718 } |
| 719 animations.append(std::move(animation)); | 719 animations.append(std::move(animation)); |
| 720 } | 720 } |
| 721 ASSERT(!animations.isEmpty()); | 721 ASSERT(!animations.isEmpty()); |
| 722 } | 722 } |
| 723 | 723 |
| 724 } // namespace blink | 724 } // namespace blink |
| OLD | NEW |