QskBoxRenderer with static methods

This commit is contained in:
Uwe Rathmann 2022-12-05 17:06:55 +01:00
parent 6ed417873e
commit 9d409ab89b
6 changed files with 38 additions and 27 deletions

View File

@ -49,7 +49,7 @@ void QskBoxClipNode::setBox( const QRectF& rect,
else
{
setIsRectangular( false );
QskBoxRenderer().renderFill( rect, shape, border, m_geometry );
QskBoxRenderer::renderFill( rect, shape, border, m_geometry );
}
/*

View File

@ -90,7 +90,7 @@ void QskBoxFillNode::updateNode(
if ( dirtyGeometry )
{
QskBoxRenderer().renderFill( rect, shapeMetrics, borderMetrics, d->geometry );
QskBoxRenderer::renderFill( rect, shapeMetrics, borderMetrics, d->geometry );
markDirty( QSGNode::DirtyGeometry );
}

View File

@ -19,7 +19,7 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qsgnode_p.h>
QSK_QT_PRIVATE_END
Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialVertex )
Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialColorVertex )
static inline QskHashValue qskMetricsHash(
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics )
@ -73,7 +73,7 @@ static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
}
case QskGradient::Radial:
case QskGradient::Conic:
{
{
qWarning() << "QskBoxRectangleNode does not support radial/conic gradients";
g.setLinearDirection( Qt::Vertical );
@ -115,13 +115,13 @@ QskBoxRectangleNode::QskBoxRectangleNode()
{
Q_D( QskBoxRectangleNode );
setMaterial( qskMaterialVertex );
setMaterial( qskMaterialColorVertex );
setGeometry( &d->geometry );
}
QskBoxRectangleNode::~QskBoxRectangleNode()
{
if ( material() != qskMaterialVertex )
if ( material() != qskMaterialColorVertex )
delete material();
}
@ -139,7 +139,7 @@ void QskBoxRectangleNode::updateNode( const QRectF& rect,
Q_D( QskBoxRectangleNode );
/*
QskBoxRenderer supports certain linear gradients only.
QskBoxRenderer supports certain linear gradients only.
For everything else we would have to use a QskGradientMaterial instead.
As a temporary solution we simply "convert" gradient into a
@ -229,13 +229,11 @@ void QskBoxRectangleNode::updateNode( const QRectF& rect,
bool maybeFlat = false;
#endif
QskBoxRenderer renderer;
if ( !maybeFlat )
{
setMonochrome( false );
renderer.renderBox( d->rect, shape, borderMetrics,
QskBoxRenderer::renderBox( d->rect, shape, borderMetrics,
borderColors, fillGradient, *geometry() );
}
else
@ -248,12 +246,12 @@ void QskBoxRectangleNode::updateNode( const QRectF& rect,
if ( hasFill )
{
flatMaterial->setColor( fillGradient.rgbStart() );
renderer.renderFill( d->rect, shape, QskBoxBorderMetrics(), *geometry() );
QskBoxRenderer::renderFill( d->rect, shape, QskBoxBorderMetrics(), *geometry() );
}
else
{
flatMaterial->setColor( borderColors.left().rgbStart() );
renderer.renderBorder( d->rect, shape, borderMetrics, *geometry() );
QskBoxRenderer::renderBorder( d->rect, shape, borderMetrics, *geometry() );
}
}
}
@ -262,7 +260,7 @@ void QskBoxRectangleNode::setMonochrome( bool on )
{
const auto material = this->material();
if ( on == ( material != qskMaterialVertex ) )
if ( on == ( material != qskMaterialColorVertex ) )
return;
Q_D( QskBoxRectangleNode );
@ -278,7 +276,7 @@ void QskBoxRectangleNode::setMonochrome( bool on )
}
else
{
setMaterial( qskMaterialVertex );
setMaterial( qskMaterialColorVertex );
delete material;
const QSGGeometry g( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 );

View File

@ -32,7 +32,6 @@ class QSK_EXPORT QskBoxRectangleNode : public QSGGeometryNode
void setMonochrome( bool on );
Q_DECLARE_PRIVATE( QskBoxRectangleNode )
};
#endif

View File

@ -23,16 +23,19 @@ namespace QskVertex
class QSK_EXPORT QskBoxRenderer
{
public:
void renderBorder( const QRectF&,
static void renderBorder( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
void renderFill( const QRectF&,
static void renderFill( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
void renderBox( const QRectF&,
static void renderBox( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
static void renderRect( const QRectF&, const QskGradient&, QSGGeometry& );
static void renderRect( const QRectF&, QSGGeometry& );
class Quad
{
public:
@ -106,29 +109,29 @@ class QSK_EXPORT QskBoxRenderer
};
private:
void renderRectFill( const QRectF&,
static void renderRectFill( const QRectF&,
const QskBoxBorderMetrics&, QSGGeometry& );
void renderRectBorder( const QRectF&,
static void renderRectBorder( const QRectF&,
const QskBoxBorderMetrics&, QSGGeometry& );
void renderRect( const QRectF&, const QskBoxBorderMetrics&,
static void renderRect( const QRectF&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
void renderRectellipseFill( const QRectF&,
static void renderRectellipseFill( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
void renderRectellipseBorder( const QRectF&,
static void renderRectellipseBorder( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
void renderRectellipse( const QRectF&,
static void renderRectellipse( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
void renderDiagonalFill( const Metrics&, const QskGradient&,
static void renderDiagonalFill( const Metrics&, const QskGradient&,
int lineCount, QskVertex::ColoredLine* );
void renderRectFill( const Quad&, const QskGradient&, QskVertex::ColoredLine* );
static void renderRectFill( const Quad&, const QskGradient&, QskVertex::ColoredLine* );
};
inline void QskBoxRenderer::renderBorder(

View File

@ -543,7 +543,6 @@ void QskBoxRenderer::renderRectFill( const QRectF& rect,
return;
}
geometry.setDrawingMode( QSGGeometry::DrawTriangleStrip );
geometry.allocate( 4 );
auto p = geometry.vertexDataAsPoint2D();
@ -553,6 +552,18 @@ void QskBoxRenderer::renderRectFill( const QRectF& rect,
p[3].set( quad.right, quad.bottom );
}
void QskBoxRenderer::renderRect( const QRectF& rect,
const QskGradient& gradient, QSGGeometry& geometry )
{
renderRect( rect, QskBoxBorderMetrics(),
QskBoxBorderColors(), gradient, geometry );
}
void QskBoxRenderer::renderRect( const QRectF& rect, QSGGeometry& geometry )
{
renderRectFill( rect, QskBoxBorderMetrics(), geometry );
}
void QskBoxRenderer::renderRect( const QRectF& rect,
const QskBoxBorderMetrics& border, const QskBoxBorderColors& borderColors,
const QskGradient& gradient, QSGGeometry& geometry )