From ca1951d9a6836d479bc7a6df59f0652f614d5e3e Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 23 Oct 2024 15:20:42 +0200 Subject: [PATCH] using QskBoxRectangleNode for shadows without blur --- src/nodes/QskBoxNode.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 1e7363fd..e0b82300 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -20,6 +20,7 @@ namespace enum Role { ShadowRole, + ShadowFillRole, BoxRole, FillRole }; @@ -27,14 +28,15 @@ namespace static void qskUpdateChildren( QSGNode* parentNode, quint8 role, QSGNode* node ) { - static const QVector< quint8 > roles = { ShadowRole, BoxRole, FillRole }; + static const QVector< quint8 > roles = + { ShadowRole, ShadowFillRole, BoxRole, FillRole }; auto oldNode = QskSGNode::findChildNode( parentNode, role ); QskSGNode::replaceChildNode( roles, role, parentNode, oldNode, node ); } template< typename Node > -inline Node* qskNode( QSGNode* parentNode, quint8 role ) +static inline Node* qskNode( QSGNode* parentNode, quint8 role ) { using namespace QskSGNode; @@ -65,6 +67,7 @@ void QskBoxNode::updateNode( const QRectF& rect, using namespace QskSGNode; QskBoxShadowNode* shadowNode = nullptr; + QskBoxRectangleNode* shadowFillNode = nullptr; QskBoxRectangleNode* rectNode = nullptr; QskBoxRectangleNode* fillNode = nullptr; @@ -78,9 +81,20 @@ void QskBoxNode::updateNode( const QRectF& rect, if ( hasShadow ) { - shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole ); - shadowNode->setShadowData( shadowMetrics.shadowRect( rect ), - shape, shadowMetrics.blurRadius(), shadowColor ); + const auto shadowRect = shadowMetrics.shadowRect( rect ); + const auto blurRadius = shadowMetrics.blurRadius(); + + if ( blurRadius <= 0.0 ) + { + // QskBoxRectangleNode allows scene graph batching + shadowFillNode = qskNode< QskBoxRectangleNode >( this, ShadowFillRole ); + shadowFillNode->updateFilling( shadowRect, shape, shadowColor ); + } + else + { + shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole ); + shadowNode->setShadowData( shadowRect, shape, blurRadius, shadowColor ); + } } if ( hasBorder || hasFilling ) @@ -95,7 +109,7 @@ void QskBoxNode::updateNode( const QRectF& rect, if ( !doCombine ) fillNode = qskNode< QskBoxRectangleNode >( this, FillRole ); } - + if ( fillNode ) { rectNode->updateBorder( rect, shape, borderMetrics, borderColors ); @@ -109,6 +123,7 @@ void QskBoxNode::updateNode( const QRectF& rect, } qskUpdateChildren( this, ShadowRole, shadowNode ); + qskUpdateChildren( this, ShadowFillRole, shadowFillNode ); qskUpdateChildren( this, BoxRole, rectNode ); qskUpdateChildren( this, FillRole, fillNode ); }