Change copyrights from Nokia to Digia
[profile/ivi/qtdeclarative.git] / src / quick / util / qquickpath.cpp
index adf4242..d29cd60 100644 (file)
@@ -1,38 +1,38 @@
 /****************************************************************************
 **
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
 **
 ** This file is part of the QtQml module of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
 ** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 **
 ** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
 **
 **
 ** $QT_END_LICENSE$
 QT_BEGIN_NAMESPACE
 
 /*!
-    \qmlclass PathElement QQuickPathElement
+    \qmltype PathElement
+    \instantiates QQuickPathElement
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief PathElement is the base path type.
+    \ingroup qtquick-animation-paths
+    \brief PathElement is the base path type
 
     This type is the base for all path types.  It cannot
     be instantiated.
@@ -65,10 +66,11 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
-    \qmlclass Path QQuickPath
+    \qmltype Path
+    \instantiates QQuickPath
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief A Path object defines a path for use by \l PathView.
+    \ingroup qtquick-animation-paths
+    \brief Defines a path for use by \l PathView
 
     A Path is composed of one or more path segments - PathLine, PathQuad,
     PathCubic, PathArc, PathCurve, PathSvg.
@@ -181,7 +183,7 @@ bool QQuickPath::hasEnd() const
         \li \l PathPercent - a way to spread out items along various segments of the path.
     \endlist
 
-    \snippet doc/src/snippets/qml/pathview/pathattributes.qml 2
+    \snippet qml/pathview/pathattributes.qml 2
 */
 
 QQmlListProperty<QQuickPathElement> QQuickPath::pathElements()
@@ -455,6 +457,20 @@ static inline QBezier nextBezier(const QPainterPath &path, int *current, qreal *
     return QBezier();
 }
 
+static inline int segmentCount(const QPainterPath &path, qreal pathLength)
+{
+    // In the really simple case of a single straight line we can interpolate without jitter
+    // between just two points.
+    if (path.elementCount() == 2
+            && path.elementAt(0).type == QPainterPath::MoveToElement
+            && path.elementAt(1).type == QPainterPath::LineToElement) {
+        return 1;
+    }
+    // more points means less jitter between items as they move along the
+    // path, but takes longer to generate
+    return qCeil(pathLength*5);
+}
+
 //derivative of the equation
 static inline qreal slopeAt(qreal t, qreal a, qreal b, qreal c, qreal d)
 {
@@ -467,11 +483,10 @@ void QQuickPath::createPointCache() const
     qreal pathLength = d->pathLength;
     if (pathLength <= 0 || qIsNaN(pathLength))
         return;
-    // more points means less jitter between items as they move along the
-    // path, but takes longer to generate
-    const int points = qCeil(pathLength*5);
+
+    const int segments = segmentCount(d->_path, pathLength);
     const int lastElement = d->_path.elementCount() - 1;
-    d->_pointCache.resize(points+1);
+    d->_pointCache.resize(segments+1);
 
     int currElement = -1;
     qreal bezLength = 0;
@@ -484,7 +499,7 @@ void QQuickPath::createPointCache() const
         qreal prevPercent = 0;
         qreal prevOrigPercent = 0;
         for (int ii = 0; ii < d->_attributePoints.count(); ++ii) {
-            qreal percent = qreal(i)/points;
+            qreal percent = qreal(i)/segments;
             const AttributePoint &point = d->_attributePoints.at(ii);
             if (percent < point.percent || ii == d->_attributePoints.count() - 1) { //### || is special case for very last item
                 qreal elementPercent = (percent - prevPercent);
@@ -527,6 +542,8 @@ QPointF QQuickPath::sequentialPointAt(qreal p, qreal *angle) const
 
 QPointF QQuickPath::sequentialPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle)
 {
+    Q_ASSERT(p >= 0.0 && p <= 1.0);
+
     if (!prevBez.isValid)
         return p > .5 ? backwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle) :
                         forwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle);
@@ -655,12 +672,12 @@ QPointF QQuickPath::pointAt(qreal p) const
             return QPointF();
     }
 
-    const int pointCacheSize = d->_pointCache.size();
-    qreal idxf = p*pointCacheSize;
+    const int segmentCount = d->_pointCache.size() - 1;
+    qreal idxf = p*segmentCount;
     int idx1 = qFloor(idxf);
     qreal delta = idxf - idx1;
-    if (idx1 >= pointCacheSize)
-        idx1 = pointCacheSize - 1;
+    if (idx1 > segmentCount)
+        idx1 = segmentCount;
     else if (idx1 < 0)
         idx1 = 0;
 
@@ -669,8 +686,8 @@ QPointF QQuickPath::pointAt(qreal p) const
 
     // interpolate between the two points.
     int idx2 = qCeil(idxf);
-    if (idx2 >= pointCacheSize)
-        idx2 = pointCacheSize - 1;
+    if (idx2 > segmentCount)
+        idx2 = segmentCount;
     else if (idx2 < 0)
         idx2 = 0;
 
@@ -788,15 +805,16 @@ bool QQuickCurve::hasRelativeY()
 /****************************************************************************/
 
 /*!
-    \qmlclass PathAttribute QQuickPathAttribute
+    \qmltype PathAttribute
+    \instantiates QQuickPathAttribute
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathAttribute allows setting an attribute at a given position in a Path.
+    \ingroup qtquick-animation-paths
+    \brief Specifies how to set an attribute at a given position in a Path
 
     The PathAttribute object allows attributes consisting of a name and
     a value to be specified for various points along a path.  The
     attributes are exposed to the delegate as
-    \l{qdeclarativeintroduction.html#attached-properties} {Attached Properties}.
+    \l{Attached Properties and Attached Signal Handlers} {Attached Properties}.
     The value of an attribute at any particular point along the path is interpolated
     from the PathAttributes bounding that point.
 
@@ -810,7 +828,7 @@ bool QQuickCurve::hasRelativeY()
     \row
     \li \image declarative-pathattribute.png
     \li
-    \snippet doc/src/snippets/qml/pathview/pathattributes.qml 0
+    \snippet qml/pathview/pathattributes.qml 0
     (see the PathView documentation for the specification of ContactModel.qml
      used for ContactModel above.)
     \endtable
@@ -827,7 +845,7 @@ bool QQuickCurve::hasRelativeY()
 
     Note that using an existing Item property name such as "opacity" as an
     attribute is allowed.  This is because path attributes add a new
-    \l{qdeclarativeintroduction.html#attached-properties} {Attached Property}
+    \l{Attached Properties and Attached Signal Handlers} {Attached Property}
     which in no way clashes with existing properties.
 */
 
@@ -868,7 +886,7 @@ void QQuickPathAttribute::setName(const QString &name)
    \endqml
 
    In our delegate, we can then bind the \e rotation property to the
-   \l{qdeclarativeintroduction.html#attached-properties} {Attached Property}
+   \l{Attached Properties and Attached Signal Handlers} {Attached Property}
    \e PathView.itemRotation created for this attribute.
 
    \qml
@@ -904,10 +922,11 @@ void QQuickPathAttribute::setValue(qreal value)
 /****************************************************************************/
 
 /*!
-    \qmlclass PathLine QQuickPathLine
+    \qmltype PathLine
+    \instantiates QQuickPathLine
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathLine defines a straight line.
+    \ingroup qtquick-animation-paths
+    \brief Defines a straight line
 
     The example below creates a path consisting of a straight line from
     0,100 to 200,100:
@@ -962,10 +981,11 @@ void QQuickPathLine::addToPath(QPainterPath &path, const QQuickPathData &data)
 /****************************************************************************/
 
 /*!
-    \qmlclass PathQuad QQuickPathQuad
+    \qmltype PathQuad
+    \instantiates QQuickPathQuad
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathQuad defines a quadratic Bezier curve with a control point.
+    \ingroup qtquick-animation-paths
+    \brief Defines a quadratic Bezier curve with a control point
 
     The following QML produces the path shown below:
     \table
@@ -1050,8 +1070,8 @@ void QQuickPathQuad::setControlY(qreal y)
 }
 
 /*!
-   \qmlproperty real QtQuick2::PathCubic::relativeControlX
-   \qmlproperty real QtQuick2::PathCubic::relativeControlY
+   \qmlproperty real QtQuick2::PathQuad::relativeControlX
+   \qmlproperty real QtQuick2::PathQuad::relativeControlY
 
     Defines the position of the control point relative to the curve's start.
 
@@ -1113,10 +1133,11 @@ void QQuickPathQuad::addToPath(QPainterPath &path, const QQuickPathData &data)
 /****************************************************************************/
 
 /*!
-   \qmlclass PathCubic QQuickPathCubic
+    \qmltype PathCubic
+    \instantiates QQuickPathCubic
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-   \brief The PathCubic defines a cubic Bezier curve with two control points.
+    \ingroup qtquick-animation-paths
+    \brief Defines a cubic Bezier curve with two control points
 
     The following QML produces the path shown below:
     \table
@@ -1336,15 +1357,16 @@ void QQuickPathCubic::addToPath(QPainterPath &path, const QQuickPathData &data)
 /****************************************************************************/
 
 /*!
-    \qmlclass PathCurve QQuickPathCurve
+    \qmltype PathCurve
+    \instantiates QQuickPathCatmullRomCurve
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathCurve defines a point on a Catmull-Rom curve.
+    \ingroup qtquick-animation-paths
+    \brief Defines a point on a Catmull-Rom curve
 
     PathCurve provides an easy way to specify a curve passing directly through a set of points.
     Typically multiple PathCurves are used in a series, as the following example demonstrates:
 
-    \snippet doc/src/snippets/qml/path/basiccurve.qml 0
+    \snippet qml/path/basiccurve.qml 0
 
     This example produces the following path (with the starting point and PathCurve points
     highlighted in red):
@@ -1481,10 +1503,11 @@ void QQuickPathCatmullRomCurve::addToPath(QPainterPath &path, const QQuickPathDa
 /****************************************************************************/
 
 /*!
-    \qmlclass PathArc QQuickPathArc
+    \qmltype PathArc
+    \instantiates QQuickPathArc
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathArc defines an arc with the given radius.
+    \ingroup qtquick-animation-paths
+    \brief Defines an arc with the given radius
 
     PathArc provides a simple way of specifying an arc that ends at a given position
     and uses the specified radius. It is modeled after the SVG elliptical arc command.
@@ -1493,7 +1516,7 @@ void QQuickPathCatmullRomCurve::addToPath(QPainterPath &path, const QQuickPathDa
     \table
     \row
     \li \image declarative-patharc.png
-    \li \snippet doc/src/snippets/qml/path/basicarc.qml 0
+    \li \snippet qml/path/basicarc.qml 0
     \endtable
 
     Note that a single PathArc cannot be used to specify a circle. Instead, you can
@@ -1537,7 +1560,7 @@ void QQuickPathCatmullRomCurve::addToPath(QPainterPath &path, const QQuickPathDa
     \table
     \row
     \li \image declarative-arcradius.png
-    \li \snippet doc/src/snippets/qml/path/arcradius.qml 0
+    \li \snippet qml/path/arcradius.qml 0
     \endtable
 */
 
@@ -1582,7 +1605,7 @@ void QQuickPathArc::setRadiusY(qreal radius)
     \table
     \row
     \li \image declarative-largearc.png
-    \li \snippet doc/src/snippets/qml/path/largearc.qml 0
+    \li \snippet qml/path/largearc.qml 0
     \endtable
 
     The default value is false.
@@ -1603,7 +1626,7 @@ void QQuickPathArc::setUseLargeArc(bool largeArc)
 }
 
 /*!
-    \qmlproperty enum QtQuick2::PathArc::direction
+    \qmlproperty enumeration QtQuick2::PathArc::direction
 
     Defines the direction of the arc. Possible values are
     PathArc.Clockwise (default) and PathArc.Counterclockwise.
@@ -1613,7 +1636,7 @@ void QQuickPathArc::setUseLargeArc(bool largeArc)
     \table
     \row
     \li \image declarative-arcdirection.png
-    \li \snippet doc/src/snippets/qml/path/arcdirection.qml 0
+    \li \snippet qml/path/arcdirection.qml 0
     \endtable
 
     \sa useLargeArc
@@ -1651,10 +1674,11 @@ void QQuickPathArc::addToPath(QPainterPath &path, const QQuickPathData &data)
 /****************************************************************************/
 
 /*!
-    \qmlclass PathSvg QQuickPathSvg
+    \qmltype PathSvg
+    \instantiates QQuickPathSvg
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathSvg defines a path using an SVG path data string.
+    \ingroup qtquick-animation-paths
+    \brief Defines a path using an SVG path data string
 
     The following QML produces the path shown below:
     \table
@@ -1703,10 +1727,11 @@ void QQuickPathSvg::addToPath(QPainterPath &path, const QQuickPathData &)
 /****************************************************************************/
 
 /*!
-    \qmlclass PathPercent QQuickPathPercent
+    \qmltype PathPercent
+    \instantiates QQuickPathPercent
     \inqmlmodule QtQuick 2
-    \ingroup qml-view-elements
-    \brief The PathPercent manipulates the way a path is interpreted.
+    \ingroup qtquick-animation-paths
+    \brief Manipulates the way a path is interpreted
 
     PathPercent allows you to manipulate the spacing between items on a
     PathView's path. You can use it to bunch together items on part of