From 82cb6e68116a33f2deec1fe4dd39b99e9f26b8b3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 22 Dec 2022 20:13:45 +0100 Subject: [PATCH] QskGradient::effectiveGradient added --- playground/gradients/GradientQuickShape.cpp | 11 +++-- src/common/QskGradient.cpp | 15 ++++++ src/common/QskGradient.h | 2 + src/nodes/QskBoxFillNode.cpp | 17 +------ src/nodes/QskBoxRectangleNode.cpp | 53 +++++++-------------- src/nodes/QskRectangleNode.cpp | 17 +------ src/nodes/QskShapeNode.cpp | 17 +------ 7 files changed, 43 insertions(+), 89 deletions(-) diff --git a/playground/gradients/GradientQuickShape.cpp b/playground/gradients/GradientQuickShape.cpp index 9bf8b9a0..76a00c15 100644 --- a/playground/gradients/GradientQuickShape.cpp +++ b/playground/gradients/GradientQuickShape.cpp @@ -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(); diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 77acd0c3..e1405771 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -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; diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index 2b8d866d..5e6a33bb 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -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 ); diff --git a/src/nodes/QskBoxFillNode.cpp b/src/nodes/QskBoxFillNode.cpp index 66ce0796..ed9dcaa1 100644 --- a/src/nodes/QskBoxFillNode.cpp +++ b/src/nodes/QskBoxFillNode.cpp @@ -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 ) ) diff --git a/src/nodes/QskBoxRectangleNode.cpp b/src/nodes/QskBoxRectangleNode.cpp index 2efb67f2..82dbd3e1 100644 --- a/src/nodes/QskBoxRectangleNode.cpp +++ b/src/nodes/QskBoxRectangleNode.cpp @@ -42,50 +42,31 @@ static inline QskHashValue qskColorsHash( static inline QskGradient qskEffectiveGradient( const QskGradient& gradient ) { - QskGradient g; + auto g = gradient.effectiveGradient(); - if ( gradient.isVisible() ) + switch( static_cast< int >( g.type() ) ) { - if ( gradient.isMonochrome() ) - { - g.setLinearDirection( Qt::Vertical ); - g.setStops( gradient.rgbStart() ); - } - else + case QskGradient::Linear: { + auto dir = gradient.linearDirection(); - switch( gradient.type() ) + if ( dir.isTilted() ) { - case QskGradient::Linear: - { - auto dir = gradient.linearDirection(); + dir.setStart( 0.0, 0.0 ); + dir.setStop( 1.0, 1.0 ); - if ( dir.isTilted() ) - { - dir.setStart( 0.0, 0.0 ); - dir.setStop( 1.0, 1.0 ); - } - - g.setLinearDirection( dir ); - - break; - } - case QskGradient::Radial: - case QskGradient::Conic: - { - qWarning() << "QskBoxRectangleNode does not support radial/conic gradients"; - g.setLinearDirection( Qt::Vertical ); - - break; - } - case QskGradient::Stops: - { - g.setLinearDirection( Qt::Vertical ); - break; - } + g.setLinearDirection( dir ); } - g.setStops( gradient.stops() ); + break; + } + case QskGradient::Radial: + case QskGradient::Conic: + { + qWarning() << "QskBoxRectangleNode does not support radial/conic gradients"; + g.setDirection( QskGradient::Linear ); + + break; } } diff --git a/src/nodes/QskRectangleNode.cpp b/src/nodes/QskRectangleNode.cpp index ab2ecb38..aad931b3 100644 --- a/src/nodes/QskRectangleNode.cpp +++ b/src/nodes/QskRectangleNode.cpp @@ -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 ); diff --git a/src/nodes/QskShapeNode.cpp b/src/nodes/QskShapeNode.cpp index 016d6431..9f181d42 100644 --- a/src/nodes/QskShapeNode.cpp +++ b/src/nodes/QskShapeNode.cpp @@ -17,21 +17,6 @@ QSK_QT_PRIVATE_BEGIN #include 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 ) )