Index: Source/core/animation/AnimationStack.cpp |
diff --git a/Source/core/animation/AnimationStack.cpp b/Source/core/animation/AnimationStack.cpp |
index d6b55eccc798768cb4eb0664a90a322f9c3fbca4..07200fa7445d52177e07a971d425856ab45cd183 100644 |
--- a/Source/core/animation/AnimationStack.cpp |
+++ b/Source/core/animation/AnimationStack.cpp |
@@ -32,8 +32,9 @@ |
#include "core/animation/AnimationStack.h" |
#include "core/animation/CompositorAnimations.h" |
-#include "core/animation/StyleInterpolation.h" |
+#include "core/animation/InvalidatableStyleInterpolation.h" |
#include "core/animation/css/CSSAnimations.h" |
+#include "platform/RuntimeEnabledFeatures.h" |
#include "wtf/BitArray.h" |
#include "wtf/NonCopyingSort.h" |
#include <algorithm> |
@@ -42,10 +43,19 @@ namespace blink { |
namespace { |
-void copyToActiveInterpolationMap(const Vector<RefPtr<Interpolation>>& source, ActiveInterpolationMap& target) |
+void copyToActiveInterpolationsMap(const Vector<RefPtr<Interpolation>>& source, ActiveInterpolationsMap& target) |
{ |
for (const auto& interpolation : source) { |
- target.set(interpolation->property(), interpolation.get()); |
+ ActiveInterpolationsMap::AddResult entry = target.add(interpolation->property(), ActiveInterpolations(1)); |
+ ActiveInterpolations& activeInterpolations = entry.storedValue->value; |
+ if (!entry.isNewEntry |
+ && RuntimeEnabledFeatures::stackedCSSPropertyAnimationsEnabled() |
+ && interpolation->isInvalidatableStyleInterpolation() |
+ && toInvalidatableStyleInterpolation(*interpolation).dependsOnUnderlyingValue()) { |
+ activeInterpolations.append(interpolation.get()); |
+ } else { |
+ activeInterpolations.at(0) = interpolation.get(); |
+ } |
} |
} |
@@ -55,13 +65,13 @@ bool compareEffects(const Member<SampledEffect>& effect1, const Member<SampledEf |
return effect1->sequenceNumber() < effect2->sequenceNumber(); |
} |
-void copyNewAnimationsToActiveInterpolationMap(const HeapVector<Member<InertEffect>>& newAnimations, ActiveInterpolationMap& result) |
+void copyNewAnimationsToActiveInterpolationsMap(const HeapVector<Member<InertEffect>>& newAnimations, ActiveInterpolationsMap& result) |
{ |
for (const auto& newAnimation : newAnimations) { |
OwnPtr<Vector<RefPtr<Interpolation>>> sample; |
newAnimation->sample(sample); |
if (sample) |
- copyToActiveInterpolationMap(*sample, result); |
+ copyToActiveInterpolationsMap(*sample, result); |
} |
} |
@@ -81,11 +91,11 @@ bool AnimationStack::hasActiveAnimationsOnCompositor(CSSPropertyID property) con |
return false; |
} |
-ActiveInterpolationMap AnimationStack::activeInterpolations(AnimationStack* animationStack, const HeapVector<Member<InertEffect>>* newAnimations, const HeapHashSet<Member<const Animation>>* suppressedAnimations, KeyframeEffect::Priority priority, double timelineCurrentTime) |
+ActiveInterpolationsMap AnimationStack::activeInterpolations(AnimationStack* animationStack, const HeapVector<Member<InertEffect>>* newAnimations, const HeapHashSet<Member<const Animation>>* suppressedAnimations, KeyframeEffect::Priority priority, double timelineCurrentTime) |
{ |
// We don't exactly know when new animations will start, but timelineCurrentTime is a good estimate. |
- ActiveInterpolationMap result; |
+ ActiveInterpolationsMap result; |
if (animationStack) { |
HeapVector<Member<SampledEffect>>& effects = animationStack->m_effects; |
@@ -95,12 +105,12 @@ ActiveInterpolationMap AnimationStack::activeInterpolations(AnimationStack* anim |
for (const auto& effect : effects) { |
if (effect->priority() != priority || (suppressedAnimations && effect->effect() && suppressedAnimations->contains(effect->effect()->animation()))) |
continue; |
- copyToActiveInterpolationMap(effect->interpolations(), result); |
+ copyToActiveInterpolationsMap(effect->interpolations(), result); |
} |
} |
if (newAnimations) |
- copyNewAnimationsToActiveInterpolationMap(*newAnimations, result); |
+ copyNewAnimationsToActiveInterpolationsMap(*newAnimations, result); |
return result; |
} |