mirroring added

This commit is contained in:
Uwe Rathmann 2022-06-01 18:27:05 +02:00
parent 86e438a0ed
commit a35cc9936a
2 changed files with 45 additions and 4 deletions

View File

@ -64,6 +64,20 @@ static GLuint qskTakeTexture( QOpenGLFramebufferObject& fbo )
return textureId; return textureId;
} }
static inline QSGImageNode::TextureCoordinatesTransformMode
qskEffectiveTransformMode( const Qt::Orientations mirrored )
{
QSGImageNode::TextureCoordinatesTransformMode mode;
if ( mirrored & Qt::Vertical )
mode |= QSGImageNode::MirrorVertically;
if ( mirrored & Qt::Horizontal )
mode |= QSGImageNode::MirrorHorizontally;
return mode;
}
namespace namespace
{ {
const quint8 imageRole = 250; // reserved for internal use const quint8 imageRole = 250; // reserved for internal use
@ -104,6 +118,25 @@ QskPaintedNode::RenderHint QskPaintedNode::renderHint() const
return m_renderHint; return m_renderHint;
} }
void QskPaintedNode::setMirrored( Qt::Orientations orientations )
{
if ( orientations != m_mirrored )
{
m_mirrored == orientations;
if ( auto imageNode = findImageNode( this ) )
{
imageNode->setTextureCoordinatesTransform(
qskEffectiveTransformMode( orientations ) );
}
}
}
Qt::Orientations QskPaintedNode::mirrored() const
{
return m_mirrored;
}
QRectF QskPaintedNode::rect() const QRectF QskPaintedNode::rect() const
{ {
const auto imageNode = findImageNode( this ); const auto imageNode = findImageNode( this );
@ -145,6 +178,14 @@ void QskPaintedNode::update( QQuickWindow* window,
else else
updateImageNode( window, rect, nodeData ); updateImageNode( window, rect, nodeData );
} }
imageNode = findImageNode( this );
if ( imageNode )
{
imageNode->setRect( rect );
imageNode->setTextureCoordinatesTransform(
qskEffectiveTransformMode( m_mirrored ) );
}
} }
void QskPaintedNode::updateImageNode( void QskPaintedNode::updateImageNode(
@ -183,8 +224,6 @@ void QskPaintedNode::updateImageNode(
texture->setImage( image ); texture->setImage( image );
else else
imageNode->setTexture( window->createTextureFromImage( image ) ); imageNode->setTexture( window->createTextureFromImage( image ) );
imageNode->setRect( rect );
} }
void QskPaintedNode::updateImageNodeGL( void QskPaintedNode::updateImageNodeGL(
@ -240,8 +279,6 @@ void QskPaintedNode::updateImageNodeGL(
texture->setTextureSize( size ); texture->setTextureSize( size );
} }
#endif #endif
imageNode->setRect( rect );
} }
uint32_t QskPaintedNode::createTexture( uint32_t QskPaintedNode::createTexture(

View File

@ -38,6 +38,9 @@ class QSK_EXPORT QskPaintedNode : public QSGNode
void setRenderHint( RenderHint ); void setRenderHint( RenderHint );
RenderHint renderHint() const; RenderHint renderHint() const;
void setMirrored( Qt::Orientations );
Qt::Orientations mirrored() const;
QRectF rect() const; QRectF rect() const;
protected: protected:
@ -55,6 +58,7 @@ class QSK_EXPORT QskPaintedNode : public QSGNode
uint32_t createTexture( QQuickWindow*, const QSize&, const void* nodeData ); uint32_t createTexture( QQuickWindow*, const QSize&, const void* nodeData );
RenderHint m_renderHint = OpenGL; RenderHint m_renderHint = OpenGL;
Qt::Orientations m_mirrored;
QskHashValue m_hash = 0; QskHashValue m_hash = 0;
}; };