From 4038f52cdf4c1e9f16e391a5b7dff2cec14a10d0 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 10 Jan 2023 12:17:56 +0100 Subject: [PATCH] inverted gradient vectors for horizontal/vertical gradients supported --- src/common/QskGradientStop.cpp | 11 +++++++++++ src/common/QskGradientStop.h | 2 ++ src/nodes/QskBoxRenderer.cpp | 32 ++++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/common/QskGradientStop.cpp b/src/common/QskGradientStop.cpp index 9874c683..4455d5c8 100644 --- a/src/common/QskGradientStop.cpp +++ b/src/common/QskGradientStop.cpp @@ -312,6 +312,17 @@ QskGradientStops qskExtractedGradientStops( return extracted; } +QskGradientStops qskRevertedGradientStops( const QskGradientStops& stops ) +{ + QVector< QskGradientStop > s; + s.reserve( stops.count() ); + + for ( auto it = stops.crbegin(); it != stops.crend(); ++it ) + s += QskGradientStop( 1.0 - it->position(), it->color() ); + + return s; +} + QVector< QskGradientStop > qskBuildGradientStops( const QGradientStops& qtStops ) { QVector< QskGradientStop > stops; diff --git a/src/common/QskGradientStop.h b/src/common/QskGradientStop.h index 22dbc397..b58a0d77 100644 --- a/src/common/QskGradientStop.h +++ b/src/common/QskGradientStop.h @@ -145,6 +145,8 @@ QSK_EXPORT QskGradientStops qskBuildGradientStops( QSK_EXPORT QskGradientStops qskBuildGradientStops( const QVector< QColor >&, bool discrete = false ); +QSK_EXPORT QskGradientStops qskRevertedGradientStops( const QskGradientStops& ); + QSK_EXPORT QskGradientStops qskBuildGradientStops( const QVector< QGradientStop >& ); QSK_EXPORT QVector< QGradientStop > qskToQGradientStops( const QVector< QskGradientStop >& ); diff --git a/src/nodes/QskBoxRenderer.cpp b/src/nodes/QskBoxRenderer.cpp index 4d02c61c..23670380 100644 --- a/src/nodes/QskBoxRenderer.cpp +++ b/src/nodes/QskBoxRenderer.cpp @@ -11,6 +11,30 @@ #include "QskGradient.h" #include "QskGradientDirection.h" +static inline QskGradient qskNormalizedGradient( const QskGradient gradient ) +{ + const auto dir = gradient.linearDirection(); + if ( !dir.isTilted() ) + { + /* + Dealing with inverted gradient vectors makes the code even + more unreadable. So we simply invert stops/vector instead. + */ + if ( ( dir.x1() > dir.x2() ) || ( dir.y1() > dir.y2() ) ) + { + QskGradient g = gradient; + g.setLinearDirection( dir.x2(), dir.y2(), dir.x1(), dir.y1() ); + + if ( !g.isMonochrome() ) + g.setStops( qskRevertedGradientStops( gradient.stops() ) ); + + return g; + } + } + + return gradient; +} + void QskBoxRenderer::renderBorder( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) @@ -36,15 +60,17 @@ void QskBoxRenderer::renderBox( const QRectF& rect, const QskBoxBorderColors& borderColors, const QskGradient& gradient, QSGGeometry& geometry ) { + const auto gradientN = qskNormalizedGradient( gradient ); + if ( shape.isRectangle() ) { QskRectRenderer::renderRect( - rect, border, borderColors, gradient, geometry ); + rect, border, borderColors, gradientN, geometry ); } else { QskRoundedRectRenderer::renderRectellipse( - rect, shape, border, borderColors, gradient, geometry ); + rect, shape, border, borderColors, gradientN, geometry ); } } @@ -70,8 +96,6 @@ bool QskBoxRenderer::isGradientSupported( case QskGradient::Linear: { const auto dir = gradient.linearDirection(); - if ( dir.x1() > dir.x2() || dir.y1() > dir.y2() ) - return false; if ( shape.isRectangle() ) {