diff options
author | Samuel Gaist <samuel.gaist@idiap.ch> | 2018-11-20 21:55:13 +0100 |
---|---|---|
committer | Samuel Gaist <samuel.gaist@idiap.ch> | 2019-04-06 21:12:40 +0000 |
commit | 946d868619fe19c494fd2b7bb6694b29e17203d1 (patch) | |
tree | c2901317b7ed48ca4543abd7519469b0d5c2ca76 | |
parent | 5c90a9699871006d51fdd83bd38c8c8ea5dfa26e (diff) |
QEasyingCurve: fix data stream operators
Until now, QEasingCurve was not streaming all it's internal state.
Therefore, doing store/reload operation through QDataStream would not
yield the same curve as the original. This patch fixes it.
[ChangeLog][QtCore][QEasingCurve] QEasingCurve now properly streams all
the data needed to QDataStream.
Change-Id: I1619501f5b4237983c8c68e148745a5e58863f55
Fixes: QTBUG-68181
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r-- | src/corelib/tools/qeasingcurve.cpp | 53 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp | 33 |
2 files changed, 80 insertions, 6 deletions
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp index f82048db0f..9169b5c7f1 100644 --- a/src/corelib/tools/qeasingcurve.cpp +++ b/src/corelib/tools/qeasingcurve.cpp @@ -339,6 +339,23 @@ struct TCBPoint { }; Q_DECLARE_TYPEINFO(TCBPoint, Q_PRIMITIVE_TYPE); +QDataStream &operator<<(QDataStream &stream, const TCBPoint &point) +{ + stream << point._point + << point._t + << point._c + << point._b; + return stream; +} + +QDataStream &operator>>(QDataStream &stream, TCBPoint &point) +{ + stream >> point._point + >> point._t + >> point._c + >> point._b; + return stream; +} typedef QVector<TCBPoint> TCBPoints; @@ -363,6 +380,34 @@ public: }; +QDataStream &operator<<(QDataStream &stream, QEasingCurveFunction *func) +{ + if (func) { + stream << func->_p; + stream << func->_a; + stream << func->_o; + if (stream.version() > QDataStream::Qt_5_12) { + stream << func->_bezierCurves; + stream << func->_tcbPoints; + } + } + return stream; +} + +QDataStream &operator>>(QDataStream &stream, QEasingCurveFunction *func) +{ + if (func) { + stream >> func->_p; + stream >> func->_a; + stream >> func->_o; + if (stream.version() > QDataStream::Qt_5_12) { + stream >> func->_bezierCurves; + stream >> func->_tcbPoints; + } + } + return stream; +} + static QEasingCurve::EasingFunction curveToFunc(QEasingCurve::Type curve); qreal QEasingCurveFunction::value(qreal t) @@ -1480,9 +1525,7 @@ QDataStream &operator<<(QDataStream &stream, const QEasingCurve &easing) bool hasConfig = easing.d_ptr->config; stream << hasConfig; if (hasConfig) { - stream << easing.d_ptr->config->_p; - stream << easing.d_ptr->config->_a; - stream << easing.d_ptr->config->_o; + stream << easing.d_ptr->config; } return stream; } @@ -1515,9 +1558,7 @@ QDataStream &operator>>(QDataStream &stream, QEasingCurve &easing) easing.d_ptr->config = nullptr; if (hasConfig) { QEasingCurveFunction *config = curveToFunctionObject(type); - stream >> config->_p; - stream >> config->_a; - stream >> config->_o; + stream >> config; easing.d_ptr->config = config; } return stream; diff --git a/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp b/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp index 0196dd2d23..c21d0afacb 100644 --- a/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp +++ b/tests/auto/corelib/tools/qeasingcurve/tst_qeasingcurve.cpp @@ -55,6 +55,8 @@ private slots: void testCbrtFloat(); void cpp11(); void quadraticEquation(); + void streamInOut_data(); + void streamInOut(); }; void tst_QEasingCurve::type() @@ -879,5 +881,36 @@ void tst_QEasingCurve::quadraticEquation() { } } +void tst_QEasingCurve::streamInOut_data() +{ + QTest::addColumn<int>("version"); + QTest::addColumn<bool>("equality"); + + QTest::newRow("5.11") << int(QDataStream::Qt_5_11) << false; + QTest::newRow("5.13") << int(QDataStream::Qt_5_13) << true; +} + +void tst_QEasingCurve::streamInOut() +{ + QFETCH(int, version); + QFETCH(bool, equality); + + QEasingCurve orig; + orig.addCubicBezierSegment(QPointF(0.43, 0.0025), QPointF(0.38, 0.51), QPointF(0.57, 0.99)); + + QEasingCurve copy; + + QByteArray data; + QDataStream dsw(&data,QIODevice::WriteOnly); + QDataStream dsr(&data,QIODevice::ReadOnly); + + dsw.setVersion(version); + dsr.setVersion(version); + dsw << orig; + dsr >> copy; + + QCOMPARE(copy == orig, equality); +} + QTEST_MAIN(tst_QEasingCurve) #include "tst_qeasingcurve.moc" |