diff options
author | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-09-22 12:40:55 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-09-23 12:48:25 +0300 |
commit | cae291161f323df54aabf5333f485352a8d84e6e (patch) | |
tree | 6aa6b58e98ab606d0bf1d979698563115502c50e /src/plugins/scenegraph/softwarecontext/painternode.cpp | |
parent | 7895c6ffb026697ea167ead1cb92b79fb559a15f (diff) |
Add setTextureSize method to PainterNode
PainterNodes now support having a textureSize property to handle the
highDPI scenario. We still have to support both the old and the new
case though, so we have logic for both. This fixes the build with the
latest Qt 5.6.
Change-Id: Ia9c9d65b187956271c98fb19f6e5bb5745273e0d
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@theqtcompany.com>
Diffstat (limited to 'src/plugins/scenegraph/softwarecontext/painternode.cpp')
-rw-r--r-- | src/plugins/scenegraph/softwarecontext/painternode.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/plugins/scenegraph/softwarecontext/painternode.cpp b/src/plugins/scenegraph/softwarecontext/painternode.cpp index 8ff7bee310..7e61cfa889 100644 --- a/src/plugins/scenegraph/softwarecontext/painternode.cpp +++ b/src/plugins/scenegraph/softwarecontext/painternode.cpp @@ -136,7 +136,7 @@ QImage PainterNode::toImage() const void PainterNode::update() { if (m_dirtyGeometry) { - m_pixmap = QPixmap(m_size); + m_pixmap = QPixmap(m_textureSize); if (!m_opaquePainting) m_pixmap.fill(Qt::transparent); @@ -168,18 +168,29 @@ void PainterNode::paint() painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); } - painter.scale(m_contentsScale, m_contentsScale); + QRect clipRect; - QRect sclip(qFloor(dirtyRect.x()/m_contentsScale), - qFloor(dirtyRect.y()/m_contentsScale), - qCeil(dirtyRect.width()/m_contentsScale+dirtyRect.x()/m_contentsScale-qFloor(dirtyRect.x()/m_contentsScale)), - qCeil(dirtyRect.height()/m_contentsScale+dirtyRect.y()/m_contentsScale-qFloor(dirtyRect.y()/m_contentsScale))); + if (m_contentsScale == 1) { + qreal scaleX = m_textureSize.width() / (qreal) m_size.width(); + qreal scaleY = m_textureSize.height() / (qreal) m_size.height(); + painter.scale(scaleX, scaleY); + clipRect = dirtyRect; + } else { + painter.scale(m_contentsScale, m_contentsScale); + + QRect sclip(qFloor(dirtyRect.x()/m_contentsScale), + qFloor(dirtyRect.y()/m_contentsScale), + qCeil(dirtyRect.width()/m_contentsScale+dirtyRect.x()/m_contentsScale-qFloor(dirtyRect.x()/m_contentsScale)), + qCeil(dirtyRect.height()/m_contentsScale+dirtyRect.y()/m_contentsScale-qFloor(dirtyRect.y()/m_contentsScale))); + + clipRect = sclip; + } if (!m_dirtyRect.isNull()) - painter.setClipRect(sclip); + painter.setClipRect(clipRect); painter.setCompositionMode(QPainter::CompositionMode_Source); - painter.fillRect(sclip, m_fillColor); + painter.fillRect(clipRect, m_fillColor); painter.setCompositionMode(QPainter::CompositionMode_SourceOver); m_item->paint(&painter); @@ -187,3 +198,13 @@ void PainterNode::paint() m_dirtyRect = QRect(); } + + +void PainterNode::setTextureSize(const QSize &size) +{ + if (size == m_textureSize) + return; + + m_textureSize = size; + m_dirtyGeometry = true; +} |