From 5c80504c571fb9da5d20c1ca86cfc013aa0c8733 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 2 Sep 2024 10:47:41 +0200 Subject: [PATCH] QskArcRenderNode is a QskFillNode now --- src/nodes/QskArcRenderNode.cpp | 96 ++++++++++++++++++---------------- src/nodes/QskArcRenderNode.h | 12 +++-- 2 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/nodes/QskArcRenderNode.cpp b/src/nodes/QskArcRenderNode.cpp index 9a7119f7..0d7ffddd 100644 --- a/src/nodes/QskArcRenderNode.cpp +++ b/src/nodes/QskArcRenderNode.cpp @@ -9,44 +9,23 @@ #include "QskArcMetrics.h" #include "QskGradient.h" #include "QskSGNode.h" +#include "QskFillNodePrivate.h" -QSK_QT_PRIVATE_BEGIN -#include -QSK_QT_PRIVATE_END - -#if 1 -#include -#include -// deriving from QskFillNode:TODO ... -Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialColorVertex ) -#endif - -class QskArcRenderNodePrivate final : public QSGGeometryNodePrivate +class QskArcRenderNodePrivate final : public QskFillNodePrivate { public: - QskArcRenderNodePrivate() - : geometry( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ) - { - } + inline void resetValues() { hash = 0; } - inline void resetValues() - { - hash = 0; - } - - QSGGeometry geometry; QskHashValue hash = 0; }; QskArcRenderNode::QskArcRenderNode() - : QSGGeometryNode( *new QskArcRenderNodePrivate ) + : QskFillNode( *new QskArcRenderNodePrivate ) { - Q_D( QskArcRenderNode ); +} - setGeometry( &d->geometry ); - - setMaterial( qskMaterialColorVertex ); - setFlag( QSGNode::OwnsMaterial, false ); +QskArcRenderNode::~QskArcRenderNode() +{ } void QskArcRenderNode::updateNode( const QRectF& rect, @@ -70,18 +49,11 @@ void QskArcRenderNode::updateNode( const auto metrics = arcMetrics.toAbsolute( rect.size() ); const auto borderMax = 0.5 * metrics.thickness(); - bool visible = !( rect.isEmpty() || metrics.isNull() ); - if ( visible ) - { - visible = gradient.isVisible() && ( borderWidth < borderMax ); - if ( !visible ) - { - visible = ( borderWidth > 0.0 ) + const bool hasFill = gradient.isVisible() && ( borderWidth < borderMax ); + const bool hasBorder = ( borderWidth > 0.0 ) && borderColor.isValid() && ( borderColor.alpha() > 0 ); - } - } - if ( !visible ) + if ( rect.isEmpty() || metrics.isNull() || !( hasFill || hasBorder ) ) { d->resetValues(); QskSGNode::resetGeometry( this ); @@ -100,14 +72,50 @@ void QskArcRenderNode::updateNode( hash = gradient.hash( hash ); hash = qHash( radial, hash ); - if ( hash != d->hash ) + if ( hash == d->hash ) + return; + + d->hash = hash; + + auto coloring = QskFillNode::Polychrome; + +#if 0 + if ( !( hasFill && hasBorder ) ) { - d->hash = hash; + if ( hasBorder || ( hasFill && gradient.isMonochrome() ) ) + coloring = QskFillNode::Monochrome; + } +#endif + + auto& geometry = *this->geometry(); + + if ( coloring == QskFillNode::Polychrome ) + { + setColoring( coloring ); QskArcRenderer::renderArc( rect, metrics, radial, - borderWidth, gradient, borderColor, *geometry() ); - - markDirty( QSGNode::DirtyGeometry ); - markDirty( QSGNode::DirtyMaterial ); + borderWidth, gradient, borderColor, geometry ); } + else + { + if ( hasFill ) + { + setColoring( gradient.rgbStart() ); + + QskArcRenderer::renderArc( rect, metrics, radial, + borderWidth, gradient, borderColor, geometry ); + } + else + { + setColoring( borderColor ); + + QskArcRenderer::renderArc( rect, metrics, radial, + borderWidth, gradient, borderColor, geometry ); + } + } + + markDirty( QSGNode::DirtyGeometry ); + markDirty( QSGNode::DirtyMaterial ); + + geometry.markVertexDataDirty(); } diff --git a/src/nodes/QskArcRenderNode.h b/src/nodes/QskArcRenderNode.h index 82e6f3f6..f0d248ab 100644 --- a/src/nodes/QskArcRenderNode.h +++ b/src/nodes/QskArcRenderNode.h @@ -7,23 +7,25 @@ #define QSK_ARC_RENDER_NODE_H #include "QskGlobal.h" -#include +#include "QskFillNode.h" class QskGradient; class QskArcMetrics; class QskArcRenderNodePrivate; -class QSK_EXPORT QskArcRenderNode : public QSGGeometryNode +class QSK_EXPORT QskArcRenderNode : public QskFillNode { - using Inherited = QSGGeometryNode; + using Inherited = QskFillNode; public: QskArcRenderNode(); + ~QskArcRenderNode() override; void updateNode( const QRectF&, const QskArcMetrics&, const QskGradient& ); - void updateNode( const QRectF&, const QskArcMetrics&, qreal borderWidth, - const QColor& borderColor ); + + void updateNode( const QRectF&, const QskArcMetrics&, + qreal borderWidth, const QColor& borderColor ); void updateNode( const QRectF&, const QskArcMetrics&, bool radial, qreal borderWidth, const QColor& borderColor, const QskGradient& );