diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index a9d74074..ed4aa458 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -369,12 +369,11 @@ QSGNode* QskSkinlet::updateBackgroundNode( return nullptr; const auto gradient = control->background(); - if ( !gradient.isValid() ) + if ( !gradient.isVisible() ) return nullptr; auto rectNode = QskSGNode::ensureNode< QskBoxRectangleNode >( node ); - rectNode->updateFilling( rect, QskBoxShapeMetrics(), - QskBoxBorderMetrics(), gradient ); + rectNode->updateFilling( rect, gradient ); return rectNode; } diff --git a/src/nodes/QskBoxClipNode.cpp b/src/nodes/QskBoxClipNode.cpp index d90891b6..c04d79e2 100644 --- a/src/nodes/QskBoxClipNode.cpp +++ b/src/nodes/QskBoxClipNode.cpp @@ -67,7 +67,7 @@ void QskBoxClipNode::setBox( const QRectF& rect, else { setIsRectangular( false ); - QskBoxRenderer::renderFillGeometry( rect, shape, border, m_geometry ); + QskBoxRenderer::setFillLines( rect, shape, border, m_geometry ); } /* diff --git a/src/nodes/QskBoxRectangleNode.cpp b/src/nodes/QskBoxRectangleNode.cpp index dd5c7fb0..ec8b2a7e 100644 --- a/src/nodes/QskBoxRectangleNode.cpp +++ b/src/nodes/QskBoxRectangleNode.cpp @@ -112,8 +112,8 @@ void QskBoxRectangleNode::updateFilling( const QRectF& rect, { setColoring( QskFillNode::Polychrome ); - QskBoxRenderer::renderBox( rect, shape, - borderMetrics, QskBoxBorderColors(), fillGradient, *geometry() ); + QskBoxRenderer::setColoredFillLines( rect, shape, + borderMetrics, fillGradient, *geometry() ); markDirty( QSGNode::DirtyGeometry ); } @@ -132,7 +132,7 @@ void QskBoxRectangleNode::updateFilling( const QRectF& rect, if ( dirtyMetrics ) { - QskBoxRenderer::renderFillGeometry( + QskBoxRenderer::setFillLines( rect, shape, borderMetrics, *geometry() ); markDirty( QSGNode::DirtyGeometry ); @@ -165,8 +165,8 @@ void QskBoxRectangleNode::updateBorder( const QRectF& rect, else setColoring( borderColors.left().rgbStart() ); - QskBoxRenderer::renderBox( rect, shape, borderMetrics, - borderColors, QskGradient(), *this->geometry() ); + QskBoxRenderer::setColoredBorderLines( rect, shape, borderMetrics, + borderColors, *this->geometry() ); markDirty( QSGNode::DirtyGeometry ); } @@ -208,7 +208,7 @@ void QskBoxRectangleNode::updateBox( const QRectF& rect, fillGradient.setDirection( QskGradient::Linear ); } - QskBoxRenderer::renderBox( rect, shape, borderMetrics, + QskBoxRenderer::setColoredBorderAndFillLines( rect, shape, borderMetrics, borderColors, fillGradient, *geometry() ); markDirty( QSGNode::DirtyGeometry ); diff --git a/src/nodes/QskBoxRenderer.cpp b/src/nodes/QskBoxRenderer.cpp index a1e95e9f..cb432d3c 100644 --- a/src/nodes/QskBoxRenderer.cpp +++ b/src/nodes/QskBoxRenderer.cpp @@ -109,7 +109,7 @@ bool QskBoxRenderer::isGradientSupported( const QskGradient& gradient ) return false; } -void QskBoxRenderer::renderBorderGeometry( +void QskBoxRenderer::setBorderLines( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { @@ -124,13 +124,13 @@ void QskBoxRenderer::renderBorderGeometry( stroker.setBorderLines( lines ); } -void QskBoxRenderer::renderFillGeometry( +void QskBoxRenderer::setFillLines( const QRectF& rect, const QskBoxShapeMetrics& shape, QSGGeometry& geometry ) { - renderFillGeometry( rect, shape, QskBoxBorderMetrics(), geometry ); + setFillLines( rect, shape, QskBoxBorderMetrics(), geometry ); } -void QskBoxRenderer::renderFillGeometry( +void QskBoxRenderer::setFillLines( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { @@ -144,15 +144,28 @@ void QskBoxRenderer::renderFillGeometry( stroker.setFillLines( lines ); } -void QskBoxRenderer::renderBox( const QRectF& rect, - const QskBoxShapeMetrics& shape, const QskGradient& gradient, - QSGGeometry& geometry ) +void QskBoxRenderer::setColoredFillLines( const QRectF& rect, + const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, + const QskGradient& gradient, QSGGeometry& geometry ) { - renderBox( rect, shape, QskBoxBorderMetrics(), + setColoredBorderAndFillLines( rect, shape, border, QskBoxBorderColors(), gradient, geometry ); } -void QskBoxRenderer::renderBox( const QRectF& rect, +void QskBoxRenderer::setColoredBorderLines( const QRectF& rect, + const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, + const QskBoxBorderColors& borderColors, QSGGeometry& geometry ) +{ + geometry.setDrawingMode( QSGGeometry::DrawTriangleStrip ); + geometry.markVertexDataDirty(); + + const QskBoxBasicStroker stroker( QskBoxMetrics( rect, shape, border ), borderColors ); + + if ( auto lines = qskAllocateColoredLines( geometry, stroker.borderCount() ) ) + stroker.setBoxLines( lines, nullptr ); +} + +void QskBoxRenderer::setColoredBorderAndFillLines( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, const QskBoxBorderColors& borderColors, const QskGradient& gradient, QSGGeometry& geometry ) diff --git a/src/nodes/QskBoxRenderer.h b/src/nodes/QskBoxRenderer.h index 06a4bb30..2f8c89fc 100644 --- a/src/nodes/QskBoxRenderer.h +++ b/src/nodes/QskBoxRenderer.h @@ -26,27 +26,34 @@ namespace QskBoxRenderer - using shaders setting the color information */ - QSK_EXPORT void renderBorderGeometry( const QRectF&, + QSK_EXPORT void setBorderLines( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - QSK_EXPORT void renderFillGeometry( const QRectF&, + QSK_EXPORT void setFillLines( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - QSK_EXPORT void renderFillGeometry( const QRectF&, + QSK_EXPORT void setFillLines( const QRectF&, const QskBoxShapeMetrics&, QSGGeometry& ); /* - Filling the geometry usually with color information: + Filling the geometry with color information: see QSGGeometry::defaultAttributes_ColoredPoint2D() + + Usually used in combination with QSGVertexColorMaterial */ QSK_EXPORT bool isGradientSupported( const QskGradient& ); - QSK_EXPORT void renderBox( const QRectF&, + QSK_EXPORT void setColoredBorderLines( const QRectF&, + const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, + const QskBoxBorderColors&, QSGGeometry& ); + + QSK_EXPORT void setColoredFillLines( const QRectF&, + const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, + const QskGradient&, QSGGeometry& ); + + QSK_EXPORT void setColoredBorderAndFillLines( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, const QskBoxBorderColors&, const QskGradient&, QSGGeometry& ); - - QSK_EXPORT void renderBox( const QRectF&, - const QskBoxShapeMetrics&, const QskGradient&, QSGGeometry& ); } #endif