Index: Source/core/animation/InterpolationEffect.cpp |
diff --git a/Source/core/animation/InterpolationEffect.cpp b/Source/core/animation/InterpolationEffect.cpp |
index b2db74a1a4f98f348a282cb3abe4aa17bbf80564..900036a06ec18d6dda6413ecf4d5f34793178e3f 100644 |
--- a/Source/core/animation/InterpolationEffect.cpp |
+++ b/Source/core/animation/InterpolationEffect.cpp |
@@ -7,10 +7,13 @@ |
namespace blink { |
-PassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > InterpolationEffect::getActiveInterpolations(double fraction, double iterationDuration) const |
+void InterpolationEffect::getActiveInterpolations(double fraction, double iterationDuration, OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>>& result) const |
{ |
+ if (!result) |
+ result = adoptPtrWillBeNoop(new WillBeHeapVector<RefPtrWillBeMember<Interpolation> >()); |
- WillBeHeapVector<RefPtrWillBeMember<Interpolation> >* result = new WillBeHeapVector<RefPtrWillBeMember<Interpolation> >(); |
+ size_t existingSize = result->size(); |
+ size_t resultIndex = 0; |
for (size_t i = 0; i < m_interpolations.size(); ++i) { |
const InterpolationRecord* record = m_interpolations[i].get(); |
@@ -20,11 +23,14 @@ PassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > In |
if (record->m_easing) |
localFraction = record->m_easing->evaluate(localFraction, accuracyForDuration(iterationDuration)); |
interpolation->interpolate(0, localFraction); |
- result->append(interpolation); |
+ if (resultIndex < existingSize) |
+ (*result)[resultIndex++] = interpolation; |
+ else |
+ result->append(interpolation); |
} |
} |
- |
- return adoptPtrWillBeNoop(result); |
+ if (resultIndex < existingSize) |
+ result->shrink(resultIndex); |
} |
void InterpolationEffect::InterpolationRecord::trace(Visitor* visitor) |