From b97507bf846fd0e1775ab3d209899c94b6a3bd0f Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 2 Sep 2024 12:00:41 +0200 Subject: [PATCH] wip --- src/nodes/QskArcNode.cpp | 4 ++-- src/nodes/QskArcRenderer.cpp | 41 ++++++++++++++++++++++++++++++++---- src/nodes/QskArcRenderer.h | 3 ++- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/nodes/QskArcNode.cpp b/src/nodes/QskArcNode.cpp index 43782d95..c2dc3f7a 100644 --- a/src/nodes/QskArcNode.cpp +++ b/src/nodes/QskArcNode.cpp @@ -120,8 +120,8 @@ void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics metricsArc.startAngle(), metricsArc.spanAngle(), shadowColor ); } - auto pathNode = qskInsertOrRemoveNode< QskShapeNode >( - this, PathRole, hasFilling && !QskArcRenderer::isGradientSupported( gradient ) ); + auto pathNode = qskInsertOrRemoveNode< QskShapeNode >( this, PathRole, + hasFilling && !QskArcRenderer::isGradientSupported( rect, metricsArc, gradient ) ); if ( pathNode ) { diff --git a/src/nodes/QskArcRenderer.cpp b/src/nodes/QskArcRenderer.cpp index 7d116c15..1a7963ce 100644 --- a/src/nodes/QskArcRenderer.cpp +++ b/src/nodes/QskArcRenderer.cpp @@ -442,12 +442,45 @@ namespace } } -bool QskArcRenderer::isGradientSupported( const QskGradient& gradient ) +bool QskArcRenderer::isGradientSupported( const QRectF& rect, + const QskArcMetrics& metrics, const QskGradient& gradient ) { - if ( gradient.isVisible() && !gradient.isMonochrome() ) - return gradient.type() == QskGradient::Stops; + if ( rect.isEmpty() || metrics.isNull() ) + return true; - return true; + if ( !gradient.isVisible() || gradient.isMonochrome() ) + return true; + + switch( gradient.type() ) + { + case QskGradient::Stops: + { + return true; + } + case QskGradient::Conic: + { + const auto direction = gradient.conicDirection(); + if ( direction.center() == rect.center() ) + { + const auto aspectRatio = rect.width() / rect.height(); + if ( qskFuzzyCompare( direction.aspectRatio(), aspectRatio ) ) + { + /* + we should be able to create a list of stops from + this gradient that works for the renderer. TODO ... + */ + } + } + + return false; + } + default: + { + return false; + } + } + + return false; } void QskArcRenderer::renderArc( const QRectF& rect, const QskArcMetrics& metrics, diff --git a/src/nodes/QskArcRenderer.h b/src/nodes/QskArcRenderer.h index ca38e38b..1b0ce528 100644 --- a/src/nodes/QskArcRenderer.h +++ b/src/nodes/QskArcRenderer.h @@ -35,7 +35,8 @@ namespace QskArcRenderer Filling the geometry with color information: see QSGGeometry::defaultAttributes_ColoredPoint2D() */ - QSK_EXPORT bool isGradientSupported( const QskGradient& ); + QSK_EXPORT bool isGradientSupported( + const QRectF&, const QskArcMetrics&, const QskGradient& ); QSK_EXPORT void renderArc( const QRectF&, const QskArcMetrics&, bool radial, qreal borderWidth, const QskGradient&, const QColor& borderColor, QSGGeometry& );