Skip to content

Commit

Permalink
Fix crash issue for path animation and path interpulator
Browse files Browse the repository at this point in the history
When set progress value out of [0,1], path animation and
path interpulator should make sure the value be modified
in the valid value range, otherwise the QQuickPath::backwardsPointAt()
will crash.

Task-number: QTBUG-24308
Change-Id: Icd6e9165c9f844ddb8ec84c229eac4db5246a749
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
  • Loading branch information
yinyunqiao authored and Qt by Nokia committed Mar 23, 2012
1 parent c913351 commit b63ce68
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/quick/items/qquickitemanimation.cpp
Expand Up @@ -927,6 +927,8 @@ QAbstractAnimationJob* QQuickPathAnimation::transition(QQuickStateActions &actio

void QQuickPathAnimationUpdater::setValue(qreal v)
{
v = qMin(qMax(v, (qreal)0.0), (qreal)1.0);;

if (interruptStart.isValid()) {
if (reverse)
v = 1 - v;
Expand Down
2 changes: 2 additions & 0 deletions src/quick/util/qquickpath.cpp
Expand Up @@ -527,6 +527,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);
Expand Down
2 changes: 2 additions & 0 deletions src/quick/util/qquickpathinterpolator.cpp
Expand Up @@ -102,6 +102,8 @@ qreal QQuickPathInterpolator::progress() const

void QQuickPathInterpolator::setProgress(qreal progress)
{
progress = qMin(qMax(progress, (qreal)0.0), (qreal)1.0);

if (progress == _progress)
return;
_progress = progress;
Expand Down
@@ -0,0 +1,26 @@
import QtQuick 2.0
Item {
id: root
width: 450; height: 600

Rectangle {
objectName:"rect"
id: rect
x:200
y:500
width: 225; height: 40
color: "lightsteelblue"
}
PathAnimation {
id:anim
running:true
duration: 200

easing.type: Easing.InOutBack

target:rect
path: Path {
PathLine { x: 0; y: 0 }
}
}
}
24 changes: 24 additions & 0 deletions tests/auto/quick/qquickanimations/tst_qquickanimations.cpp
Expand Up @@ -107,6 +107,7 @@ private slots:
void pauseBug();
void loopingBug();
void anchorBug();
void pathAnimationInOutBackBug();
};

#define QTIMED_COMPARE(lhs, rhs) do { \
Expand Down Expand Up @@ -455,6 +456,13 @@ void tst_qquickanimations::pathInterpolator()
QCOMPARE(interpolator->x(), qreal(300));
QCOMPARE(interpolator->y(), qreal(300));
QCOMPARE(interpolator->angle(), qreal(0));

//for path interpulator the progress value must be [0,1] range.
interpolator->setProgress(1.1);
QCOMPARE(interpolator->progress(), qreal(1));

interpolator->setProgress(-0.000123);
QCOMPARE(interpolator->progress(), qreal(0));
}

void tst_qquickanimations::pathInterpolatorBackwardJump()
Expand Down Expand Up @@ -1171,6 +1179,22 @@ void tst_qquickanimations::runningTrueBug()
QVERIFY(cloud->x() > qreal(0));
}

//QTBUG-24308
void tst_qquickanimations::pathAnimationInOutBackBug()
{
//ensure we don't pass bad progress value (out of [0,1]) to QQuickPath::backwardsPointAt()
QQmlEngine engine;
QQmlComponent c(&engine, testFileUrl("pathAnimationInOutBackCrash.qml"));
QQuickItem *item = qobject_cast<QQuickItem*>(c.create());
QVERIFY(item);

QQuickRectangle *rect = item->findChild<QQuickRectangle *>("rect");
QVERIFY(rect);
QTest::qWait(1000);
QCOMPARE(rect->x(), qreal(0));
QCOMPARE(rect->y(), qreal(0));
}

//QTBUG-12805
void tst_qquickanimations::nonTransitionBug()
{
Expand Down

0 comments on commit b63ce68

Please sign in to comment.