several fixes concerning box shadows

This commit is contained in:
Uwe Rathmann 2024-10-24 10:16:51 +02:00
parent 325c621485
commit 1258c17534
4 changed files with 30 additions and 35 deletions

View File

@ -196,28 +196,16 @@ static inline QSGNode* qskUpdateBoxNode(
const QskBoxBorderColors& borderColors, const QskGradient& gradient, const QskBoxBorderColors& borderColors, const QskGradient& gradient,
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor ) const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
{ {
if ( rect.isEmpty() ) if ( rect.isEmpty() || !qskIsBoxVisible( borderMetrics, borderColors, gradient ) )
return nullptr; return nullptr;
const auto size = rect.size();
const auto absoluteMetrics = borderMetrics.toAbsolute( size );
if ( qskIsBoxVisible( absoluteMetrics, borderColors, gradient ) )
{
const auto absoluteShape = shape.toAbsolute( size );
const auto absoluteShadowMetrics = shadowMetrics.toAbsolute( size );
auto boxNode = QskSGNode::ensureNode< QskBoxNode >( node ); auto boxNode = QskSGNode::ensureNode< QskBoxNode >( node );
boxNode->updateNode( rect, absoluteShape, absoluteMetrics, boxNode->updateNode( rect, shape, borderMetrics,
borderColors, gradient, absoluteShadowMetrics, shadowColor ); borderColors, gradient, shadowMetrics, shadowColor );
return boxNode; return boxNode;
} }
return nullptr;
}
static inline QSGNode* qskUpdateArcNode( static inline QSGNode* qskUpdateArcNode(
const QskSkinnable*, QSGNode* node, const QRectF& rect, const QskSkinnable*, QSGNode* node, const QRectF& rect,
qreal borderWidth, const QColor borderColor, qreal borderWidth, const QColor borderColor,

View File

@ -13,6 +13,7 @@
#include "QskShadowMetrics.h" #include "QskShadowMetrics.h"
#include "QskBoxBorderMetrics.h" #include "QskBoxBorderMetrics.h"
#include "QskBoxBorderColors.h" #include "QskBoxBorderColors.h"
#include "QskBoxShapeMetrics.h"
#include "QskRgbValue.h" #include "QskRgbValue.h"
namespace namespace
@ -60,7 +61,7 @@ QskBoxNode::~QskBoxNode()
} }
void QskBoxNode::updateNode( const QRectF& rect, void QskBoxNode::updateNode( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, const QskBoxShapeMetrics& shapeMetrics, const QskBoxBorderMetrics& borderMetrics,
const QskBoxBorderColors& borderColors, const QskGradient& gradient, const QskBoxBorderColors& borderColors, const QskGradient& gradient,
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor ) const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
{ {
@ -75,25 +76,24 @@ void QskBoxNode::updateNode( const QRectF& rect,
{ {
const auto hasFilling = gradient.isVisible(); const auto hasFilling = gradient.isVisible();
const auto hasBorder = !borderMetrics.isNull() && borderColors.isVisible(); const auto hasBorder = !borderMetrics.isNull() && borderColors.isVisible();
const auto hasShadow = !shadowMetrics.isNull() && QskRgb::isVisible( shadowColor );
const auto hasShadow = hasFilling && !shadowMetrics.isNull()
&& QskRgb::isVisible( shadowColor );
if ( hasShadow ) if ( hasShadow )
{ {
const auto shadowRect = shadowMetrics.shadowRect( rect ); const auto shadow = shadowMetrics.toAbsolute( rect.size() );
const auto blurRadius = shadowMetrics.blurRadius(); const auto shadowRect = shadow.shadowRect( rect );
if ( blurRadius <= 0.0 ) if ( shadow.blurRadius() <= 0.0 )
{ {
// QskBoxRectangleNode allows scene graph batching // QskBoxRectangleNode allows scene graph batching
shadowFillNode = qskNode< QskBoxRectangleNode >( this, ShadowFillRole ); shadowFillNode = qskNode< QskBoxRectangleNode >( this, ShadowFillRole );
shadowFillNode->updateFilling( shadowRect, shape, shadowColor ); shadowFillNode->updateFilling( shadowRect, shapeMetrics, shadowColor );
} }
else else
{ {
shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole ); shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole );
shadowNode->setShadowData( shadowRect, shape, blurRadius, shadowColor ); shadowNode->setShadowData( shadowRect,
shapeMetrics, shadow.blurRadius(), shadowColor );
} }
} }
@ -112,12 +112,13 @@ void QskBoxNode::updateNode( const QRectF& rect,
if ( fillNode ) if ( fillNode )
{ {
rectNode->updateBorder( rect, shape, borderMetrics, borderColors ); rectNode->updateBorder( rect, shapeMetrics, borderMetrics, borderColors );
fillNode->updateFilling( rect, shape, borderMetrics, gradient ); fillNode->updateFilling( rect, shapeMetrics, borderMetrics, gradient );
} }
else else
{ {
rectNode->updateBox( rect, shape, borderMetrics, borderColors, gradient ); rectNode->updateBox( rect, shapeMetrics,
borderMetrics, borderColors, gradient );
} }
} }
} }

View File

@ -142,7 +142,7 @@ void QskBoxRectangleNode::updateFilling( const QRectF& rect,
} }
void QskBoxRectangleNode::updateBorder( const QRectF& rect, void QskBoxRectangleNode::updateBorder( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, const QskBoxShapeMetrics& shapeMetrics, const QskBoxBorderMetrics& borderMetrics,
const QskBoxBorderColors& borderColors ) const QskBoxBorderColors& borderColors )
{ {
Q_D( QskBoxRectangleNode ); Q_D( QskBoxRectangleNode );
@ -153,6 +153,8 @@ void QskBoxRectangleNode::updateBorder( const QRectF& rect,
return; return;
} }
const auto shape = shapeMetrics.toAbsolute( rect.size() );
const bool coloredGeometry = hasHint( PreferColoredGeometry ) const bool coloredGeometry = hasHint( PreferColoredGeometry )
|| !borderColors.isMonochrome(); || !borderColors.isMonochrome();
@ -189,7 +191,7 @@ void QskBoxRectangleNode::updateBorder( const QRectF& rect,
} }
void QskBoxRectangleNode::updateBox( const QRectF& rect, void QskBoxRectangleNode::updateBox( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, const QskBoxShapeMetrics& shapeMetrics, const QskBoxBorderMetrics& borderMetrics,
const QskBoxBorderColors& borderColors, const QskGradient& gradient ) const QskBoxBorderColors& borderColors, const QskGradient& gradient )
{ {
Q_D( QskBoxRectangleNode ); Q_D( QskBoxRectangleNode );
@ -205,6 +207,8 @@ void QskBoxRectangleNode::updateBox( const QRectF& rect,
if ( hasFill && hasBorder ) if ( hasFill && hasBorder )
{ {
const auto shape = shapeMetrics.toAbsolute( rect.size() );
const bool isDirty = d->updateMetrics( rect, shape, borderMetrics ) const bool isDirty = d->updateMetrics( rect, shape, borderMetrics )
|| d->updateColors( borderColors, gradient ) || !isGeometryColored(); || d->updateColors( borderColors, gradient ) || !isGeometryColored();
@ -232,11 +236,11 @@ void QskBoxRectangleNode::updateBox( const QRectF& rect,
} }
else if ( hasFill ) else if ( hasFill )
{ {
updateFilling( rect, shape, borderMetrics, gradient ); updateFilling( rect, shapeMetrics, borderMetrics, gradient );
} }
else if ( hasBorder ) else if ( hasBorder )
{ {
updateBorder( rect, shape, borderMetrics, borderColors ); updateBorder( rect, shapeMetrics, borderMetrics, borderColors );
} }
else else
{ {

View File

@ -269,7 +269,7 @@ QskBoxShadowNode::~QskBoxShadowNode()
} }
void QskBoxShadowNode::setShadowData( void QskBoxShadowNode::setShadowData(
const QRectF& rect, const QskBoxShapeMetrics& shape, const QRectF& rect, const QskBoxShapeMetrics& shapeMetrics,
qreal blurRadius, const QColor& color ) qreal blurRadius, const QColor& color )
{ {
Q_D( QskBoxShadowNode ); Q_D( QskBoxShadowNode );
@ -299,6 +299,8 @@ void QskBoxShadowNode::setShadowData(
} }
{ {
const auto shape = shapeMetrics.toAbsolute( rect.size() );
const float t = std::min( d->rect.width(), d->rect.height() ); const float t = std::min( d->rect.width(), d->rect.height() );
const float r1 = shape.radius( Qt::BottomRightCorner ).width(); const float r1 = shape.radius( Qt::BottomRightCorner ).width();