diff --git a/src/nodes/QskBoxRectangleNode.cpp b/src/nodes/QskBoxRectangleNode.cpp index 90bc11c3..2efb67f2 100644 --- a/src/nodes/QskBoxRectangleNode.cpp +++ b/src/nodes/QskBoxRectangleNode.cpp @@ -40,7 +40,6 @@ static inline QskHashValue qskColorsHash( #if 1 - static inline QskGradient qskEffectiveGradient( const QskGradient& gradient ) { QskGradient g; @@ -139,16 +138,10 @@ void QskBoxRectangleNode::updateNode( const QRectF& rect, Q_D( QskBoxRectangleNode ); /* - QskBoxRenderer supports certain linear gradients only. - For everything else we would have to use a QskGradientMaterial instead. - - As a temporary solution we simply "convert" gradient into a - simple QskLinearGradient so that at least something is happening. - TODO ... + We supports certain linear gradients only. + Everything else has to be done using QskRectangleNode */ -#if 1 const auto fillGradient = qskEffectiveGradient( gradient ); -#endif const auto metricsHash = qskMetricsHash( shape, borderMetrics ); const auto colorsHash = qskColorsHash( borderColors, fillGradient ); diff --git a/src/nodes/QskBoxRenderer.h b/src/nodes/QskBoxRenderer.h index e2b1347a..f5d77617 100644 --- a/src/nodes/QskBoxRenderer.h +++ b/src/nodes/QskBoxRenderer.h @@ -33,9 +33,6 @@ class QSK_EXPORT QskBoxRenderer const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, const QskBoxBorderColors&, const QskGradient&, QSGGeometry& ); - static void renderRect( const QRectF&, const QskGradient&, QSGGeometry& ); - static void renderRect( const QRectF&, QSGGeometry& ); - static bool isGradientSupported( const QskGradient& ); class Quad diff --git a/src/nodes/QskBoxRendererRect.cpp b/src/nodes/QskBoxRendererRect.cpp index 5e05767f..949a51c9 100644 --- a/src/nodes/QskBoxRendererRect.cpp +++ b/src/nodes/QskBoxRendererRect.cpp @@ -552,18 +552,6 @@ void QskBoxRenderer::renderRectFill( const QRectF& rect, p[3].set( quad.right, quad.bottom ); } -void QskBoxRenderer::renderRect( const QRectF& rect, - const QskGradient& gradient, QSGGeometry& geometry ) -{ - renderRect( rect, QskBoxBorderMetrics(), - QskBoxBorderColors(), gradient, geometry ); -} - -void QskBoxRenderer::renderRect( const QRectF& rect, QSGGeometry& geometry ) -{ - renderRectFill( rect, QskBoxBorderMetrics(), geometry ); -} - void QskBoxRenderer::renderRect( const QRectF& rect, const QskBoxBorderMetrics& border, const QskBoxBorderColors& borderColors, const QskGradient& gradient, QSGGeometry& geometry ) diff --git a/src/nodes/QskRectangleNode.cpp b/src/nodes/QskRectangleNode.cpp index e18fed41..1df2b555 100644 --- a/src/nodes/QskRectangleNode.cpp +++ b/src/nodes/QskRectangleNode.cpp @@ -9,6 +9,10 @@ #include "QskBoxRenderer.h" #include "QskGradientMaterial.h" +#include "QskBoxBorderMetrics.h" +#include "QskBoxBorderColors.h" +#include "QskBoxShapeMetrics.h" + #include #include @@ -33,6 +37,21 @@ static inline QskGradient qskEffectiveGradient( const QskGradient& gradient ) return gradient; } +static inline void qskUpdateColoredPoint2D( const QRectF& rect, + const QskBoxShapeMetrics& shape, const QskGradient& gradient, + QSGGeometry& geometry ) +{ + QskBoxRenderer::renderBox( rect, shape, + QskBoxBorderMetrics(), QskBoxBorderColors(), gradient, geometry ); +} + +static inline void qskUpdatePoint2D( const QRectF& rect, + const QskBoxShapeMetrics& shape, QSGGeometry& geometry ) +{ + QskBoxRenderer::renderFill( rect, shape, + QskBoxBorderMetrics(), geometry ); +} + class QskRectangleNodePrivate final : public QSGGeometryNodePrivate { public: @@ -41,10 +60,21 @@ class QskRectangleNodePrivate final : public QSGGeometryNodePrivate { } + inline void resetValues() + { + rect = QRectF(); + shape = QskBoxShapeMetrics(); + gradientHash = 0; + metricsHash = 0; + } + QSGGeometry geometry; QRectF rect; + QskBoxShapeMetrics shape; + QskHashValue gradientHash = 0; + QskHashValue metricsHash = 0; int gradientType = -1; }; @@ -64,30 +94,39 @@ QskRectangleNode::~QskRectangleNode() void QskRectangleNode::updateNode( const QRectF& rect, const QskGradient& gradient ) +{ + updateNode( rect, QskBoxShapeMetrics(), gradient ); +} + +void QskRectangleNode::updateNode( + const QRectF& rect, const QskBoxShapeMetrics& shape, const QskGradient& gradient ) { Q_D( QskRectangleNode ); if ( rect.isEmpty() || !gradient.isVisible() ) { - d->rect = QRectF(); - d->gradientHash = 0; + d->resetValues(); QskSGNode::resetGeometry( this ); return; } const auto effectiveGradient = qskEffectiveGradient( gradient ); + const auto effectiveShape = shape.toAbsolute( rect.size() ); const auto gradientHash = effectiveGradient.hash( 54228 ); + const auto metricsHash = effectiveShape.hash( 44564 ); - const bool dirtyGradient = gradientHash != d->gradientHash; - const bool dirtyRect = rect != d->rect; + const bool dirtyColors = gradientHash != d->gradientHash; + const bool dirtyMetrics = ( rect != d->rect ) || ( metricsHash != d->metricsHash ); - if ( !( dirtyGradient || dirtyRect ) ) + if ( !( dirtyColors || dirtyMetrics ) ) return; d->gradientHash = gradientHash; + d->metricsHash = metricsHash; d->rect = rect; + d->shape = effectiveShape; if ( QskBoxRenderer::isGradientSupported( effectiveGradient ) ) { @@ -128,9 +167,10 @@ void QskRectangleNode::updateNode( Colors are added to the vertices, while the material does not depend on the gradient at all */ - if ( dirtyRect || dirtyGradient ) + if ( dirtyMetrics || dirtyColors ) { - QskBoxRenderer::renderRect( rect, effectiveGradient, d->geometry ); + qskUpdateColoredPoint2D( rect, effectiveShape, + effectiveGradient, d->geometry ); markDirty( QSGNode::DirtyGeometry ); } } @@ -142,13 +182,13 @@ void QskRectangleNode::updateNode( Monochrome gradients or QskGradient::Stops are supported by the QskBoxRenderer. So we don't need to handle them here. */ - if ( dirtyRect ) + if ( dirtyMetrics ) { - QskBoxRenderer::renderRect( rect, d->geometry ); + qskUpdatePoint2D( rect, effectiveShape, d->geometry ); markDirty( QSGNode::DirtyGeometry ); } - if ( dirtyGradient ) + if ( dirtyColors ) { const auto gradientType = effectiveGradient.type(); diff --git a/src/nodes/QskRectangleNode.h b/src/nodes/QskRectangleNode.h index 4ec73638..176f2010 100644 --- a/src/nodes/QskRectangleNode.h +++ b/src/nodes/QskRectangleNode.h @@ -10,8 +10,14 @@ #include class QskGradient; +class QskBoxShapeMetrics; class QskRectangleNodePrivate; +/* + QskRectangleNode is for rounded rectangles without a border. + Depending on the type of gradient it uses a different + material/geometry combination. + */ class QSK_EXPORT QskRectangleNode : public QSGGeometryNode { public: @@ -19,6 +25,7 @@ class QSK_EXPORT QskRectangleNode : public QSGGeometryNode ~QskRectangleNode() override; void updateNode( const QRectF&, const QskGradient& ); + void updateNode( const QRectF&, const QskBoxShapeMetrics&, const QskGradient& ); private: Q_DECLARE_PRIVATE( QskRectangleNode )