diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/shapes/qquickshape.cpp | 2 | ||||
-rw-r--r-- | src/quick/util/qquickpath.cpp | 43 | ||||
-rw-r--r-- | src/quick/util/qquickpath_p.h | 1 | ||||
-rw-r--r-- | src/quick/util/qquickpath_p_p.h | 3 |
4 files changed, 47 insertions, 2 deletions
diff --git a/src/imports/shapes/qquickshape.cpp b/src/imports/shapes/qquickshape.cpp index 54a0a3d402..da5a525ff0 100644 --- a/src/imports/shapes/qquickshape.cpp +++ b/src/imports/shapes/qquickshape.cpp @@ -142,6 +142,8 @@ QQuickShapeStrokeFillParams::QQuickShapeStrokeFillParams() QQuickShapePathPrivate::QQuickShapePathPrivate() : dirty(DirtyAll) { + // Set this QQuickPath to be a ShapePath + isShapePath = true; } QQuickShapePath::QQuickShapePath(QObject *parent) diff --git a/src/quick/util/qquickpath.cpp b/src/quick/util/qquickpath.cpp index 0323dc9286..1ae9b78669 100644 --- a/src/quick/util/qquickpath.cpp +++ b/src/quick/util/qquickpath.cpp @@ -397,7 +397,12 @@ void QQuickPath::processPath() d->_pointCache.clear(); d->prevBez.isValid = false; - d->_path = createPath(QPointF(), QPointF(), d->_attributes, d->pathLength, d->_attributePoints, &d->closed); + if (d->isShapePath) { + // This path is a ShapePath, so avoid extra overhead + d->_path = createShapePath(QPointF(), QPointF(), d->pathLength, &d->closed); + } else { + d->_path = createPath(QPointF(), QPointF(), d->_attributes, d->pathLength, d->_attributePoints, &d->closed); + } emit changed(); } @@ -493,6 +498,42 @@ QPainterPath QQuickPath::createPath(const QPointF &startPoint, const QPointF &en return path; } +QPainterPath QQuickPath::createShapePath(const QPointF &startPoint, const QPointF &endPoint, qreal &pathLength, bool *closed) +{ + Q_D(QQuickPath); + + if (!d->componentComplete) + return QPainterPath(); + + QPainterPath path; + + qreal startX = d->startX.isValid() ? d->startX.value : startPoint.x(); + qreal startY = d->startY.isValid() ? d->startY.value : startPoint.y(); + path.moveTo(startX, startY); + + int index = 0; + for (QQuickCurve *curve : qAsConst(d->_pathCurves)) { + QQuickPathData data; + data.index = index; + data.endPoint = endPoint; + data.curves = d->_pathCurves; + curve->addToPath(path, data); + ++index; + } + + if (closed) { + QPointF end = path.currentPosition(); + *closed = startX == end.x() && startY == end.y(); + } + + // Note: Length of paths inside ShapePath is not used, so currently + // length is always 0. This avoids potentially heavy path.length() + //pathLength = path.length(); + pathLength = 0; + + return path; +} + void QQuickPath::classBegin() { Q_D(QQuickPath); diff --git a/src/quick/util/qquickpath_p.h b/src/quick/util/qquickpath_p.h index d5474e2d30..a49403fd0e 100644 --- a/src/quick/util/qquickpath_p.h +++ b/src/quick/util/qquickpath_p.h @@ -522,6 +522,7 @@ private: public: QPainterPath createPath(const QPointF &startPoint, const QPointF &endPoint, const QStringList &attributes, qreal &pathLength, QList<AttributePoint> &attributePoints, bool *closed = 0); + QPainterPath createShapePath(const QPointF &startPoint, const QPointF &endPoint, qreal &pathLength, bool *closed = 0); static QPointF sequentialPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle = 0); }; diff --git a/src/quick/util/qquickpath_p_p.h b/src/quick/util/qquickpath_p_p.h index 8ce85dbf0f..f5c9664223 100644 --- a/src/quick/util/qquickpath_p_p.h +++ b/src/quick/util/qquickpath_p_p.h @@ -72,7 +72,7 @@ public: static QQuickPathPrivate* get(QQuickPath *path) { return path->d_func(); } static const QQuickPathPrivate* get(const QQuickPath *path) { return path->d_func(); } - QQuickPathPrivate() : pathLength(0), closed(false), componentComplete(true) { } + QQuickPathPrivate() : pathLength(0), closed(false), componentComplete(true), isShapePath(false) { } QPainterPath _path; QList<QQuickPathElement*> _pathElements; @@ -86,6 +86,7 @@ public: qreal pathLength; bool closed; bool componentComplete; + bool isShapePath; }; QT_END_NAMESPACE |