Revision control

Copy as Markdown

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "qsvgabstractanimation_p.h"
QT_BEGIN_NAMESPACE
QSvgAbstractAnimation::~QSvgAbstractAnimation()
{
for (const QSvgAbstractAnimatedProperty *prop : std::as_const(m_properties))
delete prop;
}
void QSvgAbstractAnimation::appendProperty(QSvgAbstractAnimatedProperty *property)
{
m_properties.append(property);
}
QList<QSvgAbstractAnimatedProperty *> QSvgAbstractAnimation::properties() const
{
return m_properties;
}
bool QSvgAbstractAnimation::finished() const
{
return m_finished;
}
bool QSvgAbstractAnimation::isActive() const
{
return !finished();
}
void QSvgAbstractAnimation::evaluateAnimation(qreal elapsedTime)
{
if (m_duration == 0 || m_start > elapsedTime)
return;
qreal fractionOfTotalTime = (elapsedTime - m_start) / m_duration;
if (m_iterationCount >= 0 && m_iterationCount < fractionOfTotalTime)
m_finished = true;
else
m_finished = false;
if (m_finished)
return;
qreal fractionOfCurrentIterationTime = fractionOfTotalTime - std::trunc(fractionOfTotalTime);
for (const QSvgAbstractAnimatedProperty *animProperty : std::as_const(m_properties)) {
const QList<qreal> keyFrames = animProperty->keyFrames();
for (int i = 1; i < keyFrames.size(); i++) {
qreal from = keyFrames.at(i - 1);
qreal to = keyFrames.at(i);
if (fractionOfCurrentIterationTime >= from && fractionOfCurrentIterationTime < to) {
qreal currFraction = (fractionOfCurrentIterationTime - from) / (to - from);
const QSvgEasingInterface *easing = animProperty->easingAt(i - 1);
qreal effectiveFraction = 0;
if (easing)
effectiveFraction = easing->progress(currFraction);
else
effectiveFraction = m_easing->progress(currFraction);
animProperty->interpolate(i, effectiveFraction);
}
}
}
}
void QSvgAbstractAnimation::setRunningTime(int startMs, int durationMs)
{
m_start = (startMs > 0) ? startMs : 0;
m_duration = (durationMs > 0) ? durationMs : 0;
}
int QSvgAbstractAnimation::start() const
{
return m_start;
}
int QSvgAbstractAnimation::duration() const
{
return m_duration;
}
void QSvgAbstractAnimation::setIterationCount(int count)
{
m_iterationCount = count;
}
int QSvgAbstractAnimation::iterationCount() const
{
return m_iterationCount;
}
void QSvgAbstractAnimation::setEasing(QSvgEasingInterfacePtr easing)
{
m_easing = std::move(easing);
}
QSvgEasingInterface *QSvgAbstractAnimation::easing() const
{
return m_easing.get();
}
QT_END_NAMESPACE