diff options
author | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-09-07 13:19:35 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-09-08 12:44:40 +0300 |
commit | fa8b3f078318c5a2aa0dd48348f518083f08d2f7 (patch) | |
tree | 3d3bcc338ec6787224a2051ca64b3a14b4c66daa | |
parent | 3bedcbbddb45a1e312e6b029f108586460dc8a07 (diff) |
Handle new pure virtual methods in QSGLayer
Added support for horizontal and vertical mirroring of a QSGLayer.
Change-Id: Ic3c94f219ea97ef97287c8e4cebf853cfa961a80
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@theqtcompany.com>
4 files changed, 34 insertions, 0 deletions
diff --git a/src/plugins/scenegraph/softwarecontext/context.cpp b/src/plugins/scenegraph/softwarecontext/context.cpp index b3b97a7..6f5c997 100644 --- a/src/plugins/scenegraph/softwarecontext/context.cpp +++ b/src/plugins/scenegraph/softwarecontext/context.cpp @@ -121,6 +121,8 @@ void Renderer::nodeChanged(QSGNode *node, QSGNode::DirtyState state) PixmapRenderer::PixmapRenderer(QSGRenderContext *context) : QSGRenderer(context) + , m_mirrorHorizontal(false) + , m_mirrorVertical(false) { } @@ -147,6 +149,12 @@ void PixmapRenderer::render(QPixmap *target) painter.setRenderHint(QPainter::Antialiasing); painter.setWindow(m_projectionRect); + if (m_mirrorHorizontal || m_mirrorVertical) { + QMatrix mirroringMatrix; + mirroringMatrix.scale(m_mirrorHorizontal ? -1 : 1, m_mirrorVertical ? -1 : 1); + painter.setMatrix(mirroringMatrix); + } + RenderingVisitor(&painter).visitChildren(rootNode()); } diff --git a/src/plugins/scenegraph/softwarecontext/context.h b/src/plugins/scenegraph/softwarecontext/context.h index 0d734df..b8cd5bb 100644 --- a/src/plugins/scenegraph/softwarecontext/context.h +++ b/src/plugins/scenegraph/softwarecontext/context.h @@ -68,6 +68,8 @@ public: void render(QPixmap *target); QRect m_projectionRect; + bool m_mirrorHorizontal; + bool m_mirrorVertical; }; class RenderContext : public QSGRenderContext diff --git a/src/plugins/scenegraph/softwarecontext/softwarelayer.cpp b/src/plugins/scenegraph/softwarecontext/softwarelayer.cpp index 2ee1461..13531c5 100644 --- a/src/plugins/scenegraph/softwarecontext/softwarelayer.cpp +++ b/src/plugins/scenegraph/softwarecontext/softwarelayer.cpp @@ -26,6 +26,8 @@ SoftwareLayer::SoftwareLayer(QSGRenderContext *renderContext) , m_context(renderContext) , m_renderer(0) , m_device_pixel_ratio(1) + , m_mirrorHorizontal(false) + , m_mirrorVertical(false) , m_live(true) , m_grab(true) , m_recursive(false) @@ -151,6 +153,22 @@ void SoftwareLayer::setDevicePixelRatio(qreal ratio) m_device_pixel_ratio = ratio; } +void SoftwareLayer::setMirrorHorizontal(bool mirror) +{ + if (m_mirrorHorizontal == mirror) + return; + m_mirrorHorizontal = mirror; + markDirtyTexture(); +} + +void SoftwareLayer::setMirrorVertical(bool mirror) +{ + if (m_mirrorVertical == mirror) + return; + m_mirrorVertical = mirror; + markDirtyTexture(); +} + void SoftwareLayer::markDirtyTexture() { m_dirtyTexture = true; @@ -198,6 +216,8 @@ void SoftwareLayer::grab() m_renderer->setDeviceRect(m_size); m_renderer->setViewportRect(m_size); + m_renderer->m_mirrorHorizontal = m_mirrorHorizontal; + m_renderer->m_mirrorVertical = m_mirrorVertical; m_renderer->m_projectionRect = QRect(m_rect.x() * m_device_pixel_ratio, m_rect.y() * m_device_pixel_ratio, m_rect.width() * m_device_pixel_ratio, diff --git a/src/plugins/scenegraph/softwarecontext/softwarelayer.h b/src/plugins/scenegraph/softwarecontext/softwarelayer.h index 67d7953..c4375b1 100644 --- a/src/plugins/scenegraph/softwarecontext/softwarelayer.h +++ b/src/plugins/scenegraph/softwarecontext/softwarelayer.h @@ -60,6 +60,8 @@ public: virtual void setFormat(GLenum); virtual void setHasMipmaps(bool); virtual void setDevicePixelRatio(qreal ratio); + virtual void setMirrorHorizontal(bool mirror); + virtual void setMirrorVertical(bool mirror); public slots: virtual void markDirtyTexture(); @@ -75,6 +77,8 @@ private: QSize m_size; QPixmap m_pixmap; qreal m_device_pixel_ratio; + bool m_mirrorHorizontal; + bool m_mirrorVertical; bool m_live; bool m_grab; bool m_recursive; |