blob: fce255ae4397fb5028ea4a46304da3913dec4b62 [file] [log] [blame]
// 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 "core/animation/Interpolation.h"
#include <memory>
namespace blink {
namespace {
bool typesMatch(const InterpolableValue* start, const InterpolableValue* end) {
if (start == end)
return true;
if (start->isNumber())
return end->isNumber();
if (start->isBool())
return end->isBool();
if (start->isAnimatableValue())
return end->isAnimatableValue();
if (!(start->isList() && end->isList()))
return false;
const InterpolableList* startList = toInterpolableList(start);
const InterpolableList* endList = toInterpolableList(end);
if (startList->length() != endList->length())
return false;
for (size_t i = 0; i < startList->length(); ++i) {
if (!typesMatch(startList->get(i), endList->get(i)))
return false;
}
return true;
}
} // namespace
Interpolation::Interpolation(std::unique_ptr<InterpolableValue> start,
std::unique_ptr<InterpolableValue> end)
: m_start(std::move(start)),
m_end(std::move(end)),
m_cachedFraction(0),
m_cachedIteration(0),
m_cachedValue(m_start ? m_start->clone() : nullptr) {
RELEASE_ASSERT(typesMatch(m_start.get(), m_end.get()));
}
Interpolation::~Interpolation() {}
void Interpolation::interpolate(int iteration, double fraction) {
if (m_cachedFraction != fraction || m_cachedIteration != iteration) {
m_start->interpolate(*m_end, fraction, *m_cachedValue);
m_cachedIteration = iteration;
m_cachedFraction = fraction;
}
}
} // namespace blink