QskGradient::effectiveGradient added

This commit is contained in:
Uwe Rathmann 2022-12-22 20:13:45 +01:00
parent a7a0510c21
commit 82cb6e6811
7 changed files with 43 additions and 89 deletions

View File

@ -51,17 +51,18 @@ namespace
private:
QQuickShapeGradient* createShapeGradient(
const QRectF& rect, QskGradient gradient ) const
const QRectF& rect, const QskGradient& gradient ) const
{
QQuickShapeGradient* shapeGradient = nullptr;
gradient.stretchTo( rect );
auto effectiveGradient = gradient.effectiveGradient();
effectiveGradient.stretchTo( rect );
switch( static_cast< int >( gradient.type() ) )
{
case QskGradient::Linear:
{
const auto dir = gradient.linearDirection();
const auto dir = effectiveGradient.linearDirection();
auto g = new QQuickShapeLinearGradient();
@ -76,7 +77,7 @@ namespace
case QskGradient::Radial:
{
const auto dir = gradient.radialDirection();
const auto dir = effectiveGradient.radialDirection();
auto g = new QQuickShapeRadialGradient();
@ -94,7 +95,7 @@ namespace
case QskGradient::Conic:
{
const auto dir = gradient.conicDirection();
const auto dir = effectiveGradient.conicDirection();
auto g = new QQuickShapeConicalGradient();

View File

@ -699,6 +699,21 @@ void QskGradient::resetDirection()
m_values[0] = m_values[1] = m_values[2] = m_values[3] = 0.0;
}
QskGradient QskGradient::effectiveGradient() const
{
if ( ( m_type == QskGradient::Stops ) || isMonochrome() )
{
// the shader for linear gradients is the fastest
QskGradient g = *this;
g.setDirection( QskGradient::Linear );
return g;
}
return *this;
}
QGradient QskGradient::toQGradient() const
{
QGradient g;

View File

@ -149,6 +149,8 @@ class QSK_EXPORT QskGradient
QskGradient stretchedTo( const QSizeF& ) const;
QskGradient stretchedTo( const QRectF& ) const;
QskGradient effectiveGradient() const;
static QVariant interpolate( const QskGradient&,
const QskGradient&, qreal progress );

View File

@ -27,21 +27,6 @@ static inline QskHashValue qskMetricsHash(
return borderMetrics.hash( hash );
}
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
if ( gradient.type() == QskGradient::Stops || gradient.isMonochrome() )
{
// the shader for linear gradients is the fastest
QskGradient g;
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.stops() );
return g;
}
return gradient;
}
class QskBoxFillNodePrivate final : public QSGGeometryNodePrivate
{
public:
@ -137,7 +122,7 @@ void QskBoxFillNode::updateNode(
if ( dirtyColors || dirtyMetrics )
{
const auto effectiveGradient = qskEffectiveGradient( gradient );
const auto effectiveGradient = gradient.effectiveGradient();
const auto gradientType = effectiveGradient.type();
if ( ( material() == nullptr ) || ( gradientType != d->gradientType ) )

View File

@ -42,19 +42,9 @@ static inline QskHashValue qskColorsHash(
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
QskGradient g;
auto g = gradient.effectiveGradient();
if ( gradient.isVisible() )
{
if ( gradient.isMonochrome() )
{
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.rgbStart() );
}
else
{
switch( gradient.type() )
switch( static_cast< int >( g.type() ) )
{
case QskGradient::Linear:
{
@ -64,9 +54,9 @@ static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
dir.setStart( 0.0, 0.0 );
dir.setStop( 1.0, 1.0 );
}
g.setLinearDirection( dir );
}
break;
}
@ -74,19 +64,10 @@ static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
case QskGradient::Conic:
{
qWarning() << "QskBoxRectangleNode does not support radial/conic gradients";
g.setLinearDirection( Qt::Vertical );
g.setDirection( QskGradient::Linear );
break;
}
case QskGradient::Stops:
{
g.setLinearDirection( Qt::Vertical );
break;
}
}
g.setStops( gradient.stops() );
}
}
return g;

View File

@ -22,21 +22,6 @@ QSK_QT_PRIVATE_END
Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialColorVertex )
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
if ( gradient.type() == QskGradient::Stops || gradient.isMonochrome() )
{
// the shader for linear gradients is the fastest
QskGradient g;
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.stops() );
return g;
}
return gradient;
}
static inline void qskUpdateColoredPoint2D( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskGradient& gradient,
QSGGeometry& geometry )
@ -111,7 +96,7 @@ void QskRectangleNode::updateNode(
return;
}
const auto effectiveGradient = qskEffectiveGradient( gradient );
const auto effectiveGradient = gradient.effectiveGradient();
const auto effectiveShape = shape.toAbsolute( rect.size() );
const auto gradientHash = effectiveGradient.hash( 54228 );

View File

@ -17,21 +17,6 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qtriangulator_p.h>
QSK_QT_PRIVATE_END
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
if ( gradient.type() == QskGradient::Stops || gradient.isMonochrome() )
{
// the shader for linear gradients is the fastest
QskGradient g;
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.stops() );
return g;
}
return gradient;
}
static void qskUpdateGeometry( const QPainterPath& path,
const QTransform& transform, QSGGeometry& geometry )
{
@ -146,7 +131,7 @@ void QskShapeNode::updateNode( const QPainterPath& path,
}
else
{
const auto effectiveGradient = qskEffectiveGradient( gradient );
const auto effectiveGradient = gradient.effectiveGradient();
const auto gradientType = effectiveGradient.type();
if ( ( material() == nullptr ) || ( gradientType != d->gradientType ) )