several fixes concerning box shadows
This commit is contained in:
parent
325c621485
commit
1258c17534
@ -196,26 +196,14 @@ static inline QSGNode* qskUpdateBoxNode(
|
||||
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
|
||||
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
|
||||
{
|
||||
if ( rect.isEmpty() )
|
||||
if ( rect.isEmpty() || !qskIsBoxVisible( borderMetrics, borderColors, gradient ) )
|
||||
return nullptr;
|
||||
|
||||
const auto size = rect.size();
|
||||
auto boxNode = QskSGNode::ensureNode< QskBoxNode >( node );
|
||||
boxNode->updateNode( rect, shape, borderMetrics,
|
||||
borderColors, gradient, shadowMetrics, shadowColor );
|
||||
|
||||
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 );
|
||||
boxNode->updateNode( rect, absoluteShape, absoluteMetrics,
|
||||
borderColors, gradient, absoluteShadowMetrics, shadowColor );
|
||||
|
||||
return boxNode;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return boxNode;
|
||||
}
|
||||
|
||||
static inline QSGNode* qskUpdateArcNode(
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "QskShadowMetrics.h"
|
||||
#include "QskBoxBorderMetrics.h"
|
||||
#include "QskBoxBorderColors.h"
|
||||
#include "QskBoxShapeMetrics.h"
|
||||
#include "QskRgbValue.h"
|
||||
|
||||
namespace
|
||||
@ -60,7 +61,7 @@ QskBoxNode::~QskBoxNode()
|
||||
}
|
||||
|
||||
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 QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
|
||||
{
|
||||
@ -75,25 +76,24 @@ void QskBoxNode::updateNode( const QRectF& rect,
|
||||
{
|
||||
const auto hasFilling = gradient.isVisible();
|
||||
const auto hasBorder = !borderMetrics.isNull() && borderColors.isVisible();
|
||||
|
||||
const auto hasShadow = hasFilling && !shadowMetrics.isNull()
|
||||
&& QskRgb::isVisible( shadowColor );
|
||||
const auto hasShadow = !shadowMetrics.isNull() && QskRgb::isVisible( shadowColor );
|
||||
|
||||
if ( hasShadow )
|
||||
{
|
||||
const auto shadowRect = shadowMetrics.shadowRect( rect );
|
||||
const auto blurRadius = shadowMetrics.blurRadius();
|
||||
const auto shadow = shadowMetrics.toAbsolute( rect.size() );
|
||||
const auto shadowRect = shadow.shadowRect( rect );
|
||||
|
||||
if ( blurRadius <= 0.0 )
|
||||
if ( shadow.blurRadius() <= 0.0 )
|
||||
{
|
||||
// QskBoxRectangleNode allows scene graph batching
|
||||
shadowFillNode = qskNode< QskBoxRectangleNode >( this, ShadowFillRole );
|
||||
shadowFillNode->updateFilling( shadowRect, shape, shadowColor );
|
||||
shadowFillNode->updateFilling( shadowRect, shapeMetrics, shadowColor );
|
||||
}
|
||||
else
|
||||
{
|
||||
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 )
|
||||
{
|
||||
rectNode->updateBorder( rect, shape, borderMetrics, borderColors );
|
||||
fillNode->updateFilling( rect, shape, borderMetrics, gradient );
|
||||
rectNode->updateBorder( rect, shapeMetrics, borderMetrics, borderColors );
|
||||
fillNode->updateFilling( rect, shapeMetrics, borderMetrics, gradient );
|
||||
}
|
||||
else
|
||||
{
|
||||
rectNode->updateBox( rect, shape, borderMetrics, borderColors, gradient );
|
||||
rectNode->updateBox( rect, shapeMetrics,
|
||||
borderMetrics, borderColors, gradient );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "QskGradientDirection.h"
|
||||
#include "QskFillNodePrivate.h"
|
||||
|
||||
static inline bool qskHasBorder(
|
||||
static inline bool qskHasBorder(
|
||||
const QskBoxBorderMetrics& metrics, const QskBoxBorderColors& colors )
|
||||
{
|
||||
return !metrics.isNull() && colors.isVisible();
|
||||
@ -142,7 +142,7 @@ void QskBoxRectangleNode::updateFilling( const QRectF& rect,
|
||||
}
|
||||
|
||||
void QskBoxRectangleNode::updateBorder( const QRectF& rect,
|
||||
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics,
|
||||
const QskBoxShapeMetrics& shapeMetrics, const QskBoxBorderMetrics& borderMetrics,
|
||||
const QskBoxBorderColors& borderColors )
|
||||
{
|
||||
Q_D( QskBoxRectangleNode );
|
||||
@ -153,6 +153,8 @@ void QskBoxRectangleNode::updateBorder( const QRectF& rect,
|
||||
return;
|
||||
}
|
||||
|
||||
const auto shape = shapeMetrics.toAbsolute( rect.size() );
|
||||
|
||||
const bool coloredGeometry = hasHint( PreferColoredGeometry )
|
||||
|| !borderColors.isMonochrome();
|
||||
|
||||
@ -189,7 +191,7 @@ void QskBoxRectangleNode::updateBorder( 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 )
|
||||
{
|
||||
Q_D( QskBoxRectangleNode );
|
||||
@ -205,6 +207,8 @@ void QskBoxRectangleNode::updateBox( const QRectF& rect,
|
||||
|
||||
if ( hasFill && hasBorder )
|
||||
{
|
||||
const auto shape = shapeMetrics.toAbsolute( rect.size() );
|
||||
|
||||
const bool isDirty = d->updateMetrics( rect, shape, borderMetrics )
|
||||
|| d->updateColors( borderColors, gradient ) || !isGeometryColored();
|
||||
|
||||
@ -232,11 +236,11 @@ void QskBoxRectangleNode::updateBox( const QRectF& rect,
|
||||
}
|
||||
else if ( hasFill )
|
||||
{
|
||||
updateFilling( rect, shape, borderMetrics, gradient );
|
||||
updateFilling( rect, shapeMetrics, borderMetrics, gradient );
|
||||
}
|
||||
else if ( hasBorder )
|
||||
{
|
||||
updateBorder( rect, shape, borderMetrics, borderColors );
|
||||
updateBorder( rect, shapeMetrics, borderMetrics, borderColors );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -269,7 +269,7 @@ QskBoxShadowNode::~QskBoxShadowNode()
|
||||
}
|
||||
|
||||
void QskBoxShadowNode::setShadowData(
|
||||
const QRectF& rect, const QskBoxShapeMetrics& shape,
|
||||
const QRectF& rect, const QskBoxShapeMetrics& shapeMetrics,
|
||||
qreal blurRadius, const QColor& color )
|
||||
{
|
||||
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 r1 = shape.radius( Qt::BottomRightCorner ).width();
|
||||
|
Loading…
x
Reference in New Issue
Block a user