| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 return animation->affects(targetElement, CSSPropertyTransform) | 106 return animation->affects(targetElement, CSSPropertyTransform) |
| 107 || animation->affects(targetElement, CSSPropertyRotate) | 107 || animation->affects(targetElement, CSSPropertyRotate) |
| 108 || animation->affects(targetElement, CSSPropertyScale) | 108 || animation->affects(targetElement, CSSPropertyScale) |
| 109 || animation->affects(targetElement, CSSPropertyTranslate); | 109 || animation->affects(targetElement, CSSPropertyTranslate); |
| 110 } | 110 } |
| 111 | 111 |
| 112 bool hasIncompatibleAnimations(const Element& targetElement, const Animation& an
imationToAdd, const EffectModel& effectToAdd) | 112 bool hasIncompatibleAnimations(const Element& targetElement, const Animation& an
imationToAdd, const EffectModel& effectToAdd) |
| 113 { | 113 { |
| 114 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); | 114 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); |
| 115 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); | 115 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); |
| 116 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyWeb
kitFilter)); | 116 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyFil
ter)); |
| 117 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); | 117 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); |
| 118 | 118 |
| 119 if (!targetElement.hasAnimations()) | 119 if (!targetElement.hasAnimations()) |
| 120 return false; | 120 return false; |
| 121 | 121 |
| 122 ElementAnimations* elementAnimations = targetElement.elementAnimations(); | 122 ElementAnimations* elementAnimations = targetElement.elementAnimations(); |
| 123 ASSERT(elementAnimations); | 123 ASSERT(elementAnimations); |
| 124 | 124 |
| 125 for (const auto& entry : elementAnimations->animations()) { | 125 for (const auto& entry : elementAnimations->animations()) { |
| 126 const Animation* attachedAnimation = entry.key; | 126 const Animation* attachedAnimation = entry.key; |
| 127 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) | 127 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) |
| 128 continue; | 128 continue; |
| 129 | 129 |
| 130 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) | 130 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) |
| 131 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) | 131 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) |
| 132 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyWebkitFilter)) | 132 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyFilter)) |
| 133 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) | 133 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) |
| 134 return true; | 134 return true; |
| 135 } | 135 } |
| 136 | 136 |
| 137 return false; | 137 return false; |
| 138 } | 138 } |
| 139 | 139 |
| 140 } // namespace | 140 } // namespace |
| 141 | 141 |
| 142 bool CompositorAnimations::isCompositableProperty(CSSPropertyID property) | 142 bool CompositorAnimations::isCompositableProperty(CSSPropertyID property) |
| 143 { | 143 { |
| 144 for (CSSPropertyID id : compositableProperties) { | 144 for (CSSPropertyID id : compositableProperties) { |
| 145 if (property == id) | 145 if (property == id) |
| 146 return true; | 146 return true; |
| 147 } | 147 } |
| 148 return false; | 148 return false; |
| 149 } | 149 } |
| 150 | 150 |
| 151 const CSSPropertyID CompositorAnimations::compositableProperties[7] = { | 151 const CSSPropertyID CompositorAnimations::compositableProperties[7] = { |
| 152 CSSPropertyOpacity, | 152 CSSPropertyOpacity, |
| 153 CSSPropertyRotate, | 153 CSSPropertyRotate, |
| 154 CSSPropertyScale, | 154 CSSPropertyScale, |
| 155 CSSPropertyTransform, | 155 CSSPropertyTransform, |
| 156 CSSPropertyTranslate, | 156 CSSPropertyTranslate, |
| 157 CSSPropertyWebkitFilter, | 157 CSSPropertyFilter, |
| 158 CSSPropertyBackdropFilter | 158 CSSPropertyBackdropFilter |
| 159 }; | 159 }; |
| 160 | 160 |
| 161 bool CompositorAnimations::getAnimatedBoundingBox(FloatBox& box, const EffectMod
el& effect, double minValue, double maxValue) | 161 bool CompositorAnimations::getAnimatedBoundingBox(FloatBox& box, const EffectMod
el& effect, double minValue, double maxValue) |
| 162 { | 162 { |
| 163 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); | 163 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); |
| 164 | 164 |
| 165 PropertyHandleSet properties = keyframeEffect.properties(); | 165 PropertyHandleSet properties = keyframeEffect.properties(); |
| 166 | 166 |
| 167 if (properties.isEmpty()) | 167 if (properties.isEmpty()) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 switch (property.cssProperty()) { | 256 switch (property.cssProperty()) { |
| 257 case CSSPropertyOpacity: | 257 case CSSPropertyOpacity: |
| 258 break; | 258 break; |
| 259 case CSSPropertyRotate: | 259 case CSSPropertyRotate: |
| 260 case CSSPropertyScale: | 260 case CSSPropertyScale: |
| 261 case CSSPropertyTranslate: | 261 case CSSPropertyTranslate: |
| 262 case CSSPropertyTransform: | 262 case CSSPropertyTransform: |
| 263 if (toAnimatableTransform(keyframe->getAnimatableValue().get())-
>transformOperations().dependsOnBoxSize()) | 263 if (toAnimatableTransform(keyframe->getAnimatableValue().get())-
>transformOperations().dependsOnBoxSize()) |
| 264 return false; | 264 return false; |
| 265 break; | 265 break; |
| 266 case CSSPropertyWebkitFilter: | 266 case CSSPropertyFilter: |
| 267 case CSSPropertyBackdropFilter: { | 267 case CSSPropertyBackdropFilter: { |
| 268 const FilterOperations& operations = toAnimatableFilterOperation
s(keyframe->getAnimatableValue().get())->operations(); | 268 const FilterOperations& operations = toAnimatableFilterOperation
s(keyframe->getAnimatableValue().get())->operations(); |
| 269 if (operations.hasFilterThatMovesPixels()) | 269 if (operations.hasFilterThatMovesPixels()) |
| 270 return false; | 270 return false; |
| 271 break; | 271 break; |
| 272 } | 272 } |
| 273 default: | 273 default: |
| 274 // any other types are not allowed to run on compositor. | 274 // any other types are not allowed to run on compositor. |
| 275 return false; | 275 return false; |
| 276 } | 276 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 288 if (!convertTimingForCompositor(timing, 0, out, animationPlaybackRate)) | 288 if (!convertTimingForCompositor(timing, 0, out, animationPlaybackRate)) |
| 289 return false; | 289 return false; |
| 290 | 290 |
| 291 return true; | 291 return true; |
| 292 } | 292 } |
| 293 | 293 |
| 294 void CompositorAnimations::cancelIncompatibleAnimationsOnCompositor(const Elemen
t& targetElement, const Animation& animationToAdd, const EffectModel& effectToAd
d) | 294 void CompositorAnimations::cancelIncompatibleAnimationsOnCompositor(const Elemen
t& targetElement, const Animation& animationToAdd, const EffectModel& effectToAd
d) |
| 295 { | 295 { |
| 296 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); | 296 const bool affectsOpacity = effectToAdd.affects(PropertyHandle(CSSPropertyOp
acity)); |
| 297 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); | 297 const bool affectsTransform = effectToAdd.isTransformRelatedEffect(); |
| 298 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyWeb
kitFilter)); | 298 const bool affectsFilter = effectToAdd.affects(PropertyHandle(CSSPropertyFil
ter)); |
| 299 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); | 299 const bool affectsBackdropFilter = effectToAdd.affects(PropertyHandle(CSSPro
pertyBackdropFilter)); |
| 300 | 300 |
| 301 if (!targetElement.hasAnimations()) | 301 if (!targetElement.hasAnimations()) |
| 302 return; | 302 return; |
| 303 | 303 |
| 304 ElementAnimations* elementAnimations = targetElement.elementAnimations(); | 304 ElementAnimations* elementAnimations = targetElement.elementAnimations(); |
| 305 ASSERT(elementAnimations); | 305 ASSERT(elementAnimations); |
| 306 | 306 |
| 307 for (const auto& entry : elementAnimations->animations()) { | 307 for (const auto& entry : elementAnimations->animations()) { |
| 308 Animation* attachedAnimation = entry.key; | 308 Animation* attachedAnimation = entry.key; |
| 309 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) | 309 if (!considerAnimationAsIncompatible(*attachedAnimation, animationToAdd)
) |
| 310 continue; | 310 continue; |
| 311 | 311 |
| 312 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) | 312 if ((affectsOpacity && attachedAnimation->affects(targetElement, CSSProp
ertyOpacity)) |
| 313 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) | 313 || (affectsTransform && isTransformRelatedAnimation(targetElement, a
ttachedAnimation)) |
| 314 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyWebkitFilter)) | 314 || (affectsFilter && attachedAnimation->affects(targetElement, CSSPr
opertyFilter)) |
| 315 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) | 315 || (affectsBackdropFilter && attachedAnimation->affects(targetElemen
t, CSSPropertyBackdropFilter))) |
| 316 attachedAnimation->cancelAnimationOnCompositor(); | 316 attachedAnimation->cancelAnimationOnCompositor(); |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 | 319 |
| 320 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) | 320 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) |
| 321 { | 321 { |
| 322 if (!Platform::current()->isThreadedAnimationEnabled()) | 322 if (!Platform::current()->isThreadedAnimationEnabled()) |
| 323 return false; | 323 return false; |
| 324 return element.layoutObject() && element.layoutObject()->compositingState()
== PaintsIntoOwnBacking; | 324 return element.layoutObject() && element.layoutObject()->compositingState()
== PaintsIntoOwnBacking; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 OwnPtr<CompositorAnimationCurve> curve; | 579 OwnPtr<CompositorAnimationCurve> curve; |
| 580 switch (property.cssProperty()) { | 580 switch (property.cssProperty()) { |
| 581 case CSSPropertyOpacity: { | 581 case CSSPropertyOpacity: { |
| 582 targetProperty = CompositorTargetProperty::OPACITY; | 582 targetProperty = CompositorTargetProperty::OPACITY; |
| 583 OwnPtr<CompositorFloatAnimationCurve> floatCurve = CompositorFloatAn
imationCurve::create(); | 583 OwnPtr<CompositorFloatAnimationCurve> floatCurve = CompositorFloatAn
imationCurve::create(); |
| 584 addKeyframesToCurve(*floatCurve, values); | 584 addKeyframesToCurve(*floatCurve, values); |
| 585 setTimingFunctionOnCurve(*floatCurve, timing.timingFunction.get()); | 585 setTimingFunctionOnCurve(*floatCurve, timing.timingFunction.get()); |
| 586 curve = std::move(floatCurve); | 586 curve = std::move(floatCurve); |
| 587 break; | 587 break; |
| 588 } | 588 } |
| 589 case CSSPropertyWebkitFilter: | 589 case CSSPropertyFilter: |
| 590 case CSSPropertyBackdropFilter: { | 590 case CSSPropertyBackdropFilter: { |
| 591 targetProperty = CompositorTargetProperty::FILTER; | 591 targetProperty = CompositorTargetProperty::FILTER; |
| 592 OwnPtr<CompositorFilterAnimationCurve> filterCurve = CompositorFilte
rAnimationCurve::create(); | 592 OwnPtr<CompositorFilterAnimationCurve> filterCurve = CompositorFilte
rAnimationCurve::create(); |
| 593 addKeyframesToCurve(*filterCurve, values); | 593 addKeyframesToCurve(*filterCurve, values); |
| 594 setTimingFunctionOnCurve(*filterCurve, timing.timingFunction.get()); | 594 setTimingFunctionOnCurve(*filterCurve, timing.timingFunction.get()); |
| 595 curve = std::move(filterCurve); | 595 curve = std::move(filterCurve); |
| 596 break; | 596 break; |
| 597 } | 597 } |
| 598 case CSSPropertyRotate: | 598 case CSSPropertyRotate: |
| 599 case CSSPropertyScale: | 599 case CSSPropertyScale: |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 break; | 654 break; |
| 655 default: | 655 default: |
| 656 ASSERT_NOT_REACHED(); | 656 ASSERT_NOT_REACHED(); |
| 657 } | 657 } |
| 658 animations.append(std::move(animation)); | 658 animations.append(std::move(animation)); |
| 659 } | 659 } |
| 660 ASSERT(!animations.isEmpty()); | 660 ASSERT(!animations.isEmpty()); |
| 661 } | 661 } |
| 662 | 662 |
| 663 } // namespace blink | 663 } // namespace blink |
| OLD | NEW |