diff options
Diffstat (limited to 'src/corelib/tools/qeasingcurve.cpp')
-rw-r--r-- | src/corelib/tools/qeasingcurve.cpp | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp index f82048db0f..52c8d13fe3 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) @@ -538,6 +583,13 @@ struct BezierEase : public QEasingCurveFunction qWarning("QEasingCurve: Invalid bezier curve"); return x; } + + // The bezier computation is not always precise on the endpoints, so handle explicitly + if (!(x > 0)) + return 0; + if (!(x < 1)) + return 1; + SingleCubicBezier *singleCubicBezier = 0; getBezierSegment(singleCubicBezier, x); @@ -862,6 +914,10 @@ struct TCBEase : public BezierEase return BezierEase::value(x); } + QEasingCurveFunction *copy() const override + { + return new TCBEase{*this}; + } }; struct ElasticEase : public QEasingCurveFunction @@ -949,6 +1005,11 @@ struct BackEase : public QEasingCurveFunction qreal value(qreal t) override { + // The *Back() functions are not always precise on the endpoints, so handle explicitly + if (!(t > 0)) + return 0; + if (!(t < 1)) + return 1; qreal o = (_o < 0) ? qreal(1.70158) : _o; switch(_t) { case QEasingCurve::InBack: @@ -1480,9 +1541,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 +1574,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; |