1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/animation/InterpolableValue.h"
namespace blink {
DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue);
void InterpolableNumber::interpolate(const InterpolableValue &to, const double progress, InterpolableValue& result) const
{
const InterpolableNumber& toNumber = toInterpolableNumber(to);
InterpolableNumber& resultNumber = toInterpolableNumber(result);
if (progress == 0)
resultNumber.m_value = m_value;
else if (progress == 1)
resultNumber.m_value = toNumber.m_value;
else
resultNumber.m_value = m_value * (1 - progress) + toNumber.m_value * progress;
}
void InterpolableBool::interpolate(const InterpolableValue &to, const double progress, InterpolableValue& result) const
{
const InterpolableBool& toBool = toInterpolableBool(to);
InterpolableBool& resultBool = toInterpolableBool(result);
if (progress < 0.5)
resultBool.m_value = m_value;
else
resultBool.m_value = toBool.m_value;
}
void InterpolableList::interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const
{
const InterpolableList& toList = toInterpolableList(to);
InterpolableList& resultList = toInterpolableList(result);
ASSERT(toList.m_size == m_size);
ASSERT(resultList.m_size == m_size);
for (size_t i = 0; i < m_size; i++) {
ASSERT(m_values[i]);
ASSERT(toList.m_values[i]);
m_values[i]->interpolate(*(toList.m_values[i]), progress, *(resultList.m_values[i]));
}
}
void InterpolableNumber::add(const InterpolableValue& rhs, InterpolableValue& result) const
{
const InterpolableNumber& rhsNumber = toInterpolableNumber(rhs);
InterpolableNumber& resultNumber = toInterpolableNumber(result);
resultNumber.m_value = m_value + rhsNumber.m_value;
}
void InterpolableNumber::multiply(double scalar, InterpolableValue& result) const
{
InterpolableNumber& resultNumber = toInterpolableNumber(result);
resultNumber.m_value = scalar * m_value;
}
void InterpolableBool::add(const InterpolableValue& rhs, InterpolableValue& result) const
{
const InterpolableBool& rhsBool = toInterpolableBool(rhs);
InterpolableBool& resultBool = toInterpolableBool(result);
resultBool.m_value = m_value || rhsBool.m_value;
}
void InterpolableList::add(const InterpolableValue& rhs, InterpolableValue& result) const
{
const InterpolableList& rhsList = toInterpolableList(rhs);
InterpolableList& resultList = toInterpolableList(result);
ASSERT(rhsList.m_size == m_size);
ASSERT(resultList.m_size == m_size);
for (size_t i = 0; i < m_size; i++) {
ASSERT(m_values[i]);
ASSERT(rhsList.m_values[i]);
m_values[i]->add(*(rhsList.m_values[i]), *(resultList.m_values[i]));
}
}
void InterpolableList::multiply(double scalar, InterpolableValue& result) const
{
InterpolableList& resultList = toInterpolableList(result);
ASSERT(resultList.m_size == m_size);
for (size_t i = 0; i < m_size; i++) {
ASSERT(m_values[i]);
m_values[i]->multiply(scalar, *(resultList.m_values[i]));
}
}
void InterpolableList::trace(Visitor* visitor)
{
#if ENABLE_OILPAN
visitor->trace(m_values);
#endif
InterpolableValue::trace(visitor);
}
void InterpolableAnimatableValue::interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const
{
const InterpolableAnimatableValue& toValue = toInterpolableAnimatableValue(to);
InterpolableAnimatableValue& resultValue = toInterpolableAnimatableValue(result);
if (progress == 0)
resultValue.m_value = m_value;
if (progress == 1)
resultValue.m_value = toValue.m_value;
resultValue.m_value = AnimatableValue::interpolate(m_value.get(), toValue.m_value.get(), progress);
}
void InterpolableAnimatableValue::trace(Visitor* visitor)
{
visitor->trace(m_value);
InterpolableValue::trace(visitor);
}
}
|