From f32a83bfcf5a667a81fdd2020f119cdeec79a9f1 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Fri, 30 Sep 2011 09:04:11 +1000 Subject: [PATCH] Fix issue with interpolating more than one path segment backwards. Change-Id: I463010ed63d41be80db96e8306aef8caa3863ccf Reviewed-on: http://codereview.qt-project.org/5821 Reviewed-by: Qt Sanity Bot Reviewed-by: Martin Jones --- src/declarative/util/qdeclarativepath.cpp | 3 +- .../data/pathInterpolatorBack.qml | 11 ++++++ .../tst_qdeclarativeanimations.cpp | 33 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/pathInterpolatorBack.qml diff --git a/src/declarative/util/qdeclarativepath.cpp b/src/declarative/util/qdeclarativepath.cpp index f923413..05d56e0 100644 --- a/src/declarative/util/qdeclarativepath.cpp +++ b/src/declarative/util/qdeclarativepath.cpp @@ -608,7 +608,8 @@ QPointF QDeclarativePath::backwardsPointAt(const QPainterPath &path, const qreal Q_ASSERT(!(currElement < firstElement)); currBez = nextBezier(path, &currElement, &bezLength, true /*reverse*/); currLength = prevLength; - epc = (currLength - bezLength) / pathLength; + prevLength = currLength - bezLength; + epc = prevLength / pathLength; } prevBez.element = currElement; prevBez.bezLength = bezLength; diff --git a/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolatorBack.qml b/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolatorBack.qml new file mode 100644 index 0000000..41366ef --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/pathInterpolatorBack.qml @@ -0,0 +1,11 @@ +import QtQuick 2.0 + +PathInterpolator { + path: Path { + startX: 50; startY: 50 + PathLine { x: 50; y: 100 } + PathLine { x: 100; y: 100 } + PathLine { x: 100; y: 50 } + PathLine { x: 200; y: 50 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp index 303268e..652e357 100644 --- a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp +++ b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp @@ -75,6 +75,7 @@ private slots: void simpleRotation(); void simplePath(); void pathInterpolator(); + void pathInterpolatorBackwardJump(); void pathWithNoStart(); void alwaysRunToEnd(); void complete(); @@ -316,6 +317,38 @@ void tst_qdeclarativeanimations::pathInterpolator() QCOMPARE(interpolator->angle(), qreal(0)); } +void tst_qdeclarativeanimations::pathInterpolatorBackwardJump() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathInterpolatorBack.qml")); + QDeclarativePathInterpolator *interpolator = qobject_cast(c.create()); + QVERIFY(interpolator); + + QCOMPARE(interpolator->progress(), qreal(0)); + QCOMPARE(interpolator->x(), qreal(50)); + QCOMPARE(interpolator->y(), qreal(50)); + QCOMPARE(interpolator->angle(), qreal(270)); + + interpolator->setProgress(.5); + QCOMPARE(interpolator->progress(), qreal(.5)); + QCOMPARE(interpolator->x(), qreal(100)); + QCOMPARE(interpolator->y(), qreal(75)); + QCOMPARE(interpolator->angle(), qreal(90)); + + interpolator->setProgress(1); + QCOMPARE(interpolator->progress(), qreal(1)); + QCOMPARE(interpolator->x(), qreal(200)); + QCOMPARE(interpolator->y(), qreal(50)); + QCOMPARE(interpolator->angle(), qreal(0)); + + //make sure we don't get caught in infinite loop here + interpolator->setProgress(0); + QCOMPARE(interpolator->progress(), qreal(0)); + QCOMPARE(interpolator->x(), qreal(50)); + QCOMPARE(interpolator->y(), qreal(50)); + QCOMPARE(interpolator->angle(), qreal(270)); +} + void tst_qdeclarativeanimations::pathWithNoStart() { QDeclarativeEngine engine; -- 1.7.2.5