aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2017-01-10 17:17:11 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2017-01-23 13:56:20 +0000
commit77614c6c48ce8caf5697afb53a26caf1b165fed3 (patch)
treec7dd0aec08dd16c1d9821fda8b9242f80ea29ee7
parent20c2c8b627b119b9ed72dd40f5b1f77786fad1de (diff)
Correct software PathItem bounding rect
Reporting the QQuickItem geometry is incorrect. Report the area touched by the path instead. This fixes the tiger in the pathitem example. Change-Id: Ib443f442411befabe7864eff6473604926527f4e Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r--src/quick/items/qquickpathitemsoftwarerenderer.cpp9
-rw-r--r--src/quick/items/qquickpathitemsoftwarerenderer_p.h1
-rw-r--r--src/quick/scenegraph/coreapi/qsgrendernode.cpp4
3 files changed, 13 insertions, 1 deletions
diff --git a/src/quick/items/qquickpathitemsoftwarerenderer.cpp b/src/quick/items/qquickpathitemsoftwarerenderer.cpp
index 63d4f8f6d4..46ebcbfe6d 100644
--- a/src/quick/items/qquickpathitemsoftwarerenderer.cpp
+++ b/src/quick/items/qquickpathitemsoftwarerenderer.cpp
@@ -180,6 +180,8 @@ void QQuickPathItemSoftwareRenderer::updateNode()
if (listChanged)
m_node->m_vp.resize(count);
+ m_node->m_boundingRect = QRectF();
+
for (int i = 0; i < count; ++i) {
VisualPathGuiData &src(m_vp[i]);
QQuickPathItemSoftwareRenderNode::VisualPathRenderData &dst(m_node->m_vp[i]);
@@ -201,6 +203,11 @@ void QQuickPathItemSoftwareRenderer::updateNode()
dst.brush = src.brush;
src.dirty = 0;
+
+ QRectF br = dst.path.boundingRect();
+ const float sw = qMax(1.0f, dst.strokeWidth);
+ br.adjust(-sw, -sw, sw, sw);
+ m_node->m_boundingRect |= br;
}
m_node->markDirty(QSGNode::DirtyMaterial);
@@ -256,7 +263,7 @@ QSGRenderNode::RenderingFlags QQuickPathItemSoftwareRenderNode::flags() const
QRectF QQuickPathItemSoftwareRenderNode::rect() const
{
- return QRect(0, 0, m_item->width(), m_item->height());
+ return m_boundingRect;
}
QT_END_NAMESPACE
diff --git a/src/quick/items/qquickpathitemsoftwarerenderer_p.h b/src/quick/items/qquickpathitemsoftwarerenderer_p.h
index 38130d7301..64280b436e 100644
--- a/src/quick/items/qquickpathitemsoftwarerenderer_p.h
+++ b/src/quick/items/qquickpathitemsoftwarerenderer_p.h
@@ -125,6 +125,7 @@ private:
QBrush brush;
};
QVector<VisualPathRenderData> m_vp;
+ QRectF m_boundingRect;
friend class QQuickPathItemSoftwareRenderer;
};
diff --git a/src/quick/scenegraph/coreapi/qsgrendernode.cpp b/src/quick/scenegraph/coreapi/qsgrendernode.cpp
index 3007e0000c..a8954848d6 100644
--- a/src/quick/scenegraph/coreapi/qsgrendernode.cpp
+++ b/src/quick/scenegraph/coreapi/qsgrendernode.cpp
@@ -267,6 +267,10 @@ QSGRenderNode::RenderingFlags QSGRenderNode::flags() const
For rendernodes covering the entire area of a corresponding QQuickItem the
return value will be (0, 0, item->width(), item->height()).
+ \note Nodes are also free to render outside the boundaries specified by the
+ item's width and height, since the scenegraph nodes are not bounded by the
+ QQuickItem geometry, as long as this is reported correctly from this function.
+
\sa flags()
*/
QRectF QSGRenderNode::rect() const