Home | History | Annotate | Download | only in animation
      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 WebCore {
      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