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 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "core/animation/InterpolableValue.h" 7 8 namespace blink { 9 10 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); 11 12 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableNumber::interpolate(const InterpolableValue &to, const double progress) const 13 { 14 const InterpolableNumber& toNumber = toInterpolableNumber(to); 15 if (!progress) 16 return create(m_value); 17 if (progress == 1) 18 return create(toNumber.m_value); 19 return create(m_value * (1 - progress) + toNumber.m_value * progress); 20 } 21 22 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableBool::interpolate(const InterpolableValue &to, const double progress) const 23 { 24 if (progress < 0.5) { 25 return clone(); 26 } 27 return to.clone(); 28 } 29 30 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableList::interpolate(const InterpolableValue &to, const double progress) const 31 { 32 const InterpolableList& toList = toInterpolableList(to); 33 ASSERT(toList.m_size == m_size); 34 35 if (!progress) { 36 return create(*this); 37 } 38 if (progress == 1) { 39 return InterpolableList::create(toList); 40 } 41 42 OwnPtrWillBeRawPtr<InterpolableList> result = create(m_size); 43 for (size_t i = 0; i < m_size; i++) { 44 ASSERT(m_values[i]); 45 ASSERT(toList.m_values[i]); 46 result->set(i, m_values[i]->interpolate(*(toList.m_values[i]), progress)); 47 } 48 return result.release(); 49 } 50 51 void InterpolableList::trace(Visitor* visitor) 52 { 53 #if ENABLE_OILPAN 54 visitor->trace(m_values); 55 #endif 56 InterpolableValue::trace(visitor); 57 } 58 59 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableAnimatableValue::interpolate(const InterpolableValue &other, const double percentage) const 60 { 61 const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValue(other); 62 if (!percentage) 63 return create(m_value); 64 if (percentage == 1) 65 return create(otherValue.m_value); 66 return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value.get(), percentage)); 67 } 68 69 void InterpolableAnimatableValue::trace(Visitor* visitor) 70 { 71 visitor->trace(m_value); 72 InterpolableValue::trace(visitor); 73 } 74 75 } 76