storing path and transformation to know when geometry updates are

necessary
This commit is contained in:
Uwe Rathmann 2022-09-30 15:23:55 +02:00
parent ee7dbb300a
commit f031e78a7b

View File

@ -108,6 +108,13 @@ class QskShapeNodePrivate final : public QSGGeometryNodePrivate
QSGGeometry geometry; QSGGeometry geometry;
QGradient::Type gradientType = QGradient::NoGradient; QGradient::Type gradientType = QGradient::NoGradient;
/*
Is there a better way to find out if the path has changed
beside storing a copy ( even, when internally with Copy On Write ) ?
*/
QPainterPath path;
QTransform transform;
}; };
QskShapeNode::QskShapeNode() QskShapeNode::QskShapeNode()
@ -127,12 +134,17 @@ void QskShapeNode::updateNode( const QPainterPath& path,
if ( path.isEmpty() || !color.isValid() || color.alpha() == 0 ) if ( path.isEmpty() || !color.isValid() || color.alpha() == 0 )
{ {
d->path = QPainterPath();
qskResetGeometry( this ); qskResetGeometry( this );
return; return;
} }
if ( true ) // For the moment we always update the geometry. TODO ... if ( ( transform != d->transform ) || ( path != d->path ) )
{ {
d->path = path;
d->transform = transform;
qskUpdateGeometry( path, transform, d->geometry ); qskUpdateGeometry( path, transform, d->geometry );
markDirty( QSGNode::DirtyGeometry ); markDirty( QSGNode::DirtyGeometry );
} }
@ -156,9 +168,13 @@ void QskShapeNode::updateNode( const QPainterPath& path,
void QskShapeNode::updateNode( const QPainterPath& path, void QskShapeNode::updateNode( const QPainterPath& path,
const QTransform& transform, const QGradient* gradient ) const QTransform& transform, const QGradient* gradient )
{ {
Q_D( QskShapeNode );
if ( path.isEmpty() || !qskIsGradientVisible( gradient ) ) if ( path.isEmpty() || !qskIsGradientVisible( gradient ) )
{ {
d->path = QPainterPath();
qskResetGeometry( this ); qskResetGeometry( this );
return; return;
} }
@ -168,15 +184,16 @@ void QskShapeNode::updateNode( const QPainterPath& path,
return; return;
} }
Q_D( QskShapeNode ); if ( ( transform != d->transform ) || ( path != d->path ) )
if ( true ) // For the moment we always update the geometry. TODO ...
{ {
d->path = path;
d->transform = transform;
qskUpdateGeometry( path, transform, d->geometry ); qskUpdateGeometry( path, transform, d->geometry );
markDirty( QSGNode::DirtyGeometry ); markDirty( QSGNode::DirtyGeometry );
} }
if ( ( material() == nullptr ) || gradient->type() != d->gradientType ) if ( ( material() == nullptr ) || ( gradient->type() != d->gradientType ) )
{ {
setMaterial( QskGradientMaterial::createMaterial( gradient->type() ) ); setMaterial( QskGradientMaterial::createMaterial( gradient->type() ) );
d->gradientType = gradient->type(); d->gradientType = gradient->type();