From a989ff92c9ad0f0e16fdedb31ccf7e19f9b59e3e Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 24 Sep 2024 12:20:03 +0200 Subject: [PATCH] resolving QskGradient::Stops depends on the shape and can't be resolved in QskFillNode. --- src/nodes/QskArcRenderNode.cpp | 13 +++++++++++-- src/nodes/QskArcRenderer.cpp | 4 +++- src/nodes/QskFillNode.cpp | 27 +++++++++++++++++++-------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/nodes/QskArcRenderNode.cpp b/src/nodes/QskArcRenderNode.cpp index 2abacb58..ff2f8fa4 100644 --- a/src/nodes/QskArcRenderNode.cpp +++ b/src/nodes/QskArcRenderNode.cpp @@ -104,8 +104,17 @@ void QskArcRenderNode::updateFilling( const QRectF& rect, return; } - const bool coloredGeometry = hasHint( PreferColoredGeometry ) - && QskArcRenderer::isGradientSupported( rect, metrics, gradient ); + bool coloredGeometry = hasHint( PreferColoredGeometry ); + if ( coloredGeometry ) + { + // not all gradients are supported by the renderer + coloredGeometry = QskArcRenderer::isGradientSupported( rect, metrics, gradient ); + } + else + { + // QskGradient::Stops is specific for QskArcRenderer + coloredGeometry = ( gradient.type() == QskGradient::Stops ); + } bool dirtyGeometry = d->updateMetrics( rect, metrics, radial, borderWidth ); bool dirtyMaterial = d->updateColors( QColor(), gradient ); diff --git a/src/nodes/QskArcRenderer.cpp b/src/nodes/QskArcRenderer.cpp index 48cd0f0e..02e843f9 100644 --- a/src/nodes/QskArcRenderer.cpp +++ b/src/nodes/QskArcRenderer.cpp @@ -458,6 +458,7 @@ bool QskArcRenderer::isGradientSupported( const QRectF& rect, } case QskGradient::Conic: { +#if 0 const auto direction = gradient.conicDirection(); if ( direction.center() == rect.center() ) { @@ -470,6 +471,7 @@ bool QskArcRenderer::isGradientSupported( const QRectF& rect, */ } } +#endif return false; } @@ -572,7 +574,7 @@ void QskArcRenderer::setBorderLines( const QRectF& rect, return; } - const Renderer renderer( rect, metrics, radial, QskGradient(), 0 ); + const Renderer renderer( rect, metrics, radial, QskGradient(), QskRgb::Black ); const auto lines = qskAllocateLines( geometry, renderer.borderCount() ); if ( lines ) diff --git a/src/nodes/QskFillNode.cpp b/src/nodes/QskFillNode.cpp index 99f20332..938dd7b0 100644 --- a/src/nodes/QskFillNode.cpp +++ b/src/nodes/QskFillNode.cpp @@ -136,10 +136,12 @@ void QskFillNode::setColoring( const QColor& color ) { setColoring( Monochrome ); + const auto colorRgb = color.toRgb(); + auto mat = static_cast< QSGFlatColorMaterial* >( material() ); - if ( mat->color() != color ) + if ( mat->color() != colorRgb ) { - mat->setColor( color ); + mat->setColor( colorRgb ); markDirty( QSGNode::DirtyMaterial ); } } @@ -148,16 +150,25 @@ void QskFillNode::setColoring( const QRectF& rect, const QskGradient& gradient ) { if ( gradient.isMonochrome() ) { - setColoring( gradient.startColor().toRgb() ); + setColoring( gradient.startColor() ); } else { - const auto effectiveGradient = gradient.effectiveGradient(); - setColoring( qskColoring( effectiveGradient.type() ) ); + if ( gradient.type() == QskGradient::Stops ) + { + qWarning() << "QskFillNode::setColoring:" + << "QskGradient::Stops is not supported, using the first color instead."; - auto mat = static_cast< QskGradientMaterial* >( material() ); - if ( mat->updateGradient( rect, effectiveGradient ) ) - markDirty( QSGNode::DirtyMaterial ); + setColoring( gradient.startColor() ); + } + else + { + setColoring( qskColoring( gradient.type() ) ); + + auto mat = static_cast< QskGradientMaterial* >( material() ); + if ( mat->updateGradient( rect, gradient ) ) + markDirty( QSGNode::DirtyMaterial ); + } } }