diff options
author | Gunnar Sletta <gunnar@sletta.org> | 2015-09-09 10:20:23 +0200 |
---|---|---|
committer | Gunnar Sletta <gunnar@sletta.org> | 2015-09-15 07:45:51 +0000 |
commit | 0c7349fa9621f6460b754c2b3595d1c0f1d02ec4 (patch) | |
tree | 1f94b5dc0cdc1ae551bc784416f6d3473f1738f4 /src/quick/scenegraph | |
parent | f3efdebc34d37137f256995984d2050375be25de (diff) |
Introduce QQuickPaintedItem::textureSize and support HighDpi.
contentsSize/Scale/BoundingRect are confusing and will in
most cases not produce what the user wants, but since
they might be in use, we keep their behavior and simply
obsolete them. New code should use textureSize, though most
code can simply rely on implicit HighDpi support.
[ChangeLog][QtQuick][QQuickPaintedItem] Implement high-dpi
support and add function textureSize. This obsoletes the
existing contentsSize, contentsScale and contentsBoundingRect
functions.
Task-number: QTBUG-32510
Task-number: QTBUG-40489
Change-Id: I660bbf394594b6ea588d4de9cc83c8c5eb28cb28
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
Diffstat (limited to 'src/quick/scenegraph')
-rw-r--r-- | src/quick/scenegraph/qsgadaptationlayer_p.h | 1 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgdefaultpainternode.cpp | 58 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgdefaultpainternode_p.h | 7 |
3 files changed, 50 insertions, 16 deletions
diff --git a/src/quick/scenegraph/qsgadaptationlayer_p.h b/src/quick/scenegraph/qsgadaptationlayer_p.h index fde3fa06b2..ceb455fb28 100644 --- a/src/quick/scenegraph/qsgadaptationlayer_p.h +++ b/src/quick/scenegraph/qsgadaptationlayer_p.h @@ -160,6 +160,7 @@ public: virtual void setFillColor(const QColor &c) = 0; virtual void setContentsScale(qreal s) = 0; virtual void setFastFBOResizing(bool dynamic) = 0; + virtual void setTextureSize(const QSize &size) = 0; virtual QImage toImage() const = 0; virtual void update() = 0; diff --git a/src/quick/scenegraph/util/qsgdefaultpainternode.cpp b/src/quick/scenegraph/util/qsgdefaultpainternode.cpp index 0ba9781e68..38bcc7a3f3 100644 --- a/src/quick/scenegraph/util/qsgdefaultpainternode.cpp +++ b/src/quick/scenegraph/util/qsgdefaultpainternode.cpp @@ -136,18 +136,35 @@ void QSGDefaultPainterNode::paint() painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); } - 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))); + QRect clipRect; + QRect dirtyTextureRect; + + 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; + dirtyTextureRect = QRectF(dirtyRect.x() * scaleX, + dirtyRect.y() * scaleY, + dirtyRect.width() * scaleX, + dirtyRect.height() * scaleY).toAlignedRect(); + } 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; + dirtyTextureRect = dirtyRect; + } - if (!m_dirtyRect.isNull()) - painter.setClipRect(sclip); + // only clip if we were originally updating only a subrect + if (!m_dirtyRect.isNull()) { + 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); @@ -155,9 +172,9 @@ void QSGDefaultPainterNode::paint() if (m_actualRenderTarget == QQuickPaintedItem::Image) { m_texture->setImage(m_image); - m_texture->setDirtyRect(dirtyRect); + m_texture->setDirtyRect(dirtyTextureRect); } else if (m_multisampledFbo) { - QOpenGLFramebufferObject::blitFramebuffer(m_fbo, dirtyRect, m_multisampledFbo, dirtyRect); + QOpenGLFramebufferObject::blitFramebuffer(m_fbo, dirtyTextureRect, m_multisampledFbo, dirtyTextureRect); } if (m_multisampledFbo) @@ -276,7 +293,7 @@ void QSGDefaultPainterNode::updateRenderTarget() if (!m_image.isNull() && !m_dirtyGeometry) return; - m_image = QImage(m_size, QImage::Format_ARGB32_Premultiplied); + m_image = QImage(m_textureSize, QImage::Format_ARGB32_Premultiplied); m_image.fill(Qt::transparent); } @@ -302,12 +319,12 @@ void QSGDefaultPainterNode::updateFBOSize() int fboWidth; int fboHeight; if (m_fastFBOResizing) { - fboWidth = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qNextPowerOfTwo(m_size.width() - 1)); - fboHeight = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qNextPowerOfTwo(m_size.height() - 1)); + fboWidth = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qNextPowerOfTwo(m_textureSize.width() - 1)); + fboHeight = qMax(QT_MINIMUM_DYNAMIC_FBO_SIZE, qNextPowerOfTwo(m_textureSize.height() - 1)); } else { QSize minimumFBOSize = m_context->sceneGraphContext()->minimumFBOSize(); - fboWidth = qMax(minimumFBOSize.width(), m_size.width()); - fboHeight = qMax(minimumFBOSize.height(), m_size.height()); + fboWidth = qMax(minimumFBOSize.width(), m_textureSize.width()); + fboHeight = qMax(minimumFBOSize.height(), m_textureSize.height()); } m_fboSize = QSize(fboWidth, fboHeight); @@ -331,6 +348,15 @@ void QSGDefaultPainterNode::setSize(const QSize &size) return; m_size = size; + m_dirtyGeometry = true; +} + +void QSGDefaultPainterNode::setTextureSize(const QSize &size) +{ + if (size == m_textureSize) + return; + + m_textureSize = size; updateFBOSize(); if (m_fbo) diff --git a/src/quick/scenegraph/util/qsgdefaultpainternode_p.h b/src/quick/scenegraph/util/qsgdefaultpainternode_p.h index 99e415b2d1..115ddc66f2 100644 --- a/src/quick/scenegraph/util/qsgdefaultpainternode_p.h +++ b/src/quick/scenegraph/util/qsgdefaultpainternode_p.h @@ -94,6 +94,9 @@ public: void setFastFBOResizing(bool dynamic); bool fastFBOResizing() const { return m_fastFBOResizing; } + void setTextureSize(const QSize &textureSize); + QSize textureSize() const { return m_textureSize; } + QImage toImage() const; void update(); @@ -126,8 +129,12 @@ private: QSize m_size; QSize m_fboSize; + QSize m_textureSize; QRect m_dirtyRect; QColor m_fillColor; +#if QT_VERSION >= 0x060000 +#warning "Remove m_contentsScale and assume 1 everywhere" +#endif qreal m_contentsScale; bool m_dirtyContents : 1; |