Revision control
Copy as Markdown
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "qlottiegradientholder_p.h"
QT_BEGIN_NAMESPACE
QGradient::Type QLottieGradientHolderContent::gradientType() const
{
if (m_gradient)
return m_gradient->type();
else
return QGradient::NoGradient;
}
void QLottieGradientHolderContent::updateGradientProperties(int frame)
{
QGradient::Type type = gradientType();
if (type != QGradient::LinearGradient && type != QGradient::RadialGradient)
return;
m_startPoint.update(frame);
m_endPoint.update(frame);
m_highlightLength.update(frame);
m_highlightAngle.update(frame);
QHash<qreal, QLottieProperty4D<QVector4D>>::iterator colorIt = m_colors.begin();
while (colorIt != m_colors.end()) {
(*colorIt).update(frame);
++colorIt;
}
}
QPointF QLottieGradientHolderContent::startPoint() const
{
return m_startPoint.value();
}
QPointF QLottieGradientHolderContent::endPoint() const
{
return m_endPoint.value();
}
qreal QLottieGradientHolderContent::highlightLength() const
{
return m_highlightLength.value();
}
qreal QLottieGradientHolderContent::highlightAngle() const
{
return m_highlightAngle.value();
}
QGradient *QLottieGradientHolderContent::value() const
{
return m_gradient;
}
void QLottieGradientHolderContent::setGradient(qreal opacity)
{
if (!m_gradient)
return;
QHash<qreal, QLottieProperty4D<QVector4D>>::iterator colorIt = m_colors.begin();
while (colorIt != m_colors.end()) {
QVector4D colorPos = (*colorIt).value();
qreal pos = colorIt.key();
QColor color;
color.setRedF(static_cast<qreal>(colorPos[0]));
color.setGreenF(static_cast<qreal>(colorPos[1]));
color.setBlueF(static_cast<qreal>(colorPos[2]));
qreal o = static_cast<qreal>(colorPos[3]) * opacity;
color.setAlphaF(o);
m_gradient->setColorAt(pos, color);
++colorIt;
}
switch (gradientType()) {
case QGradient::LinearGradient:
{
QLinearGradient *g = static_cast<QLinearGradient*>(m_gradient);
g->setStart(m_startPoint.value());
g->setFinalStop(m_endPoint.value());
break;
}
case QGradient::RadialGradient:
{
QRadialGradient *g = static_cast<QRadialGradient*>(m_gradient);
QLineF radLine(m_startPoint.value(), m_endPoint.value());
g->setCenter(radLine.p1());
g->setRadius(radLine.length());
radLine.setAngle(radLine.angle() - m_highlightAngle.value());
// QRadialGradient needs focalPoint to be inside (and not on) radius circle
qreal radFraction = qMin((m_highlightLength.value() / 100.0), 0.999);
g->setFocalPoint(radLine.pointAt(radFraction));
break;
}
default:
break;
}
}
QT_END_NAMESPACE