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 8namespace blink { 9 10DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); 11 12PassOwnPtrWillBeRawPtr<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 22PassOwnPtrWillBeRawPtr<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 30PassOwnPtrWillBeRawPtr<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 51void InterpolableList::trace(Visitor* visitor) 52{ 53#if ENABLE_OILPAN 54 visitor->trace(m_values); 55#endif 56 InterpolableValue::trace(visitor); 57} 58 59PassOwnPtrWillBeRawPtr<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 69void InterpolableAnimatableValue::trace(Visitor* visitor) 70{ 71 visitor->trace(m_value); 72 InterpolableValue::trace(visitor); 73} 74 75} 76