From 9b7e3dc3ecfc3c1a4f16788d565120e987f614c2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 2 May 2019 16:42:53 +0400 Subject: [PATCH] QtLottie: Fix SpatialProperty interpolation. --- Telegram/ThirdParty/qtlottie | 2 +- .../QtBodymovin/private/bmproperty_p.h | 9 +++++---- .../QtBodymovin/private/bmspatialproperty_p.h | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Telegram/ThirdParty/qtlottie b/Telegram/ThirdParty/qtlottie index 57e54b3d58..1d23bd35d1 160000 --- a/Telegram/ThirdParty/qtlottie +++ b/Telegram/ThirdParty/qtlottie @@ -1 +1 @@ -Subproject commit 57e54b3d5839431d935899c111f63daec3f53c30 +Subproject commit 1d23bd35d1e540d7c1aaf7ff88db22d914f4947c diff --git a/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmproperty_p.h b/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmproperty_p.h index 67fb88cc5e..b2b41a62b4 100644 --- a/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmproperty_p.h +++ b/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmproperty_p.h @@ -70,6 +70,7 @@ struct EasingSegment { T startValue; T endValue; BezierEasing easing; + QPainterPath bezier; }; template @@ -98,7 +99,7 @@ public: if (m_easingCurves.length() > 1) { postprocessEasingCurve( - m_easingCurves.at(m_easingCurves.length() - 2), + m_easingCurves[m_easingCurves.length() - 2], (*previous).toObject(), fromExpression); } @@ -107,7 +108,7 @@ public: } finalizeEasingCurves(); if (m_easingCurves.length() > 0) { - const EasingSegment &last = m_easingCurves.last(); + EasingSegment &last = m_easingCurves.last(); if (last.state == EasingSegmentState::Complete) { postprocessEasingCurve( last, @@ -159,7 +160,7 @@ protected: // The end value has to be hand picked to the // previous easing segment, as the json data does // not contain end values for segments - prevEase.endFrame = easing.startFrame - 1; + prevEase.endFrame = easing.startFrame; if (prevEase.state == EasingSegmentState::Incomplete) { prevEase.endValue = easing.startValue; prevEase.state = EasingSegmentState::Complete; @@ -262,7 +263,7 @@ protected: } virtual void postprocessEasingCurve( - const EasingSegment &easing, + EasingSegment &easing, const QJsonObject keyframe, bool fromExpression) { } diff --git a/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmspatialproperty_p.h b/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmspatialproperty_p.h index 346851de25..1fe0c849b5 100644 --- a/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmspatialproperty_p.h +++ b/Telegram/ThirdParty/qtlottie_helper/QtBodymovin/private/bmspatialproperty_p.h @@ -58,7 +58,7 @@ public: } virtual void postprocessEasingCurve( - const EasingSegment &easing, + EasingSegment &easing, const QJsonObject keyframe, bool fromExpression) override { // No need to parse further incomplete keyframes (i.e. last keyframes) @@ -99,8 +99,8 @@ public: c1 += s; c2 += e; - m_bezierPath.moveTo(s); - m_bezierPath.cubicTo(c1, c2, e); + easing.bezier.moveTo(s); + easing.bezier.cubicTo(c1, c2, e); } virtual bool update(int frame) override @@ -111,20 +111,22 @@ public: int adjustedFrame = qBound(m_startFrame, frame, m_endFrame); if (const EasingSegment *easing = getEasingSegment(adjustedFrame)) { if (easing->state == EasingSegmentState::Complete) { - qreal progress = ((adjustedFrame - m_startFrame) * 1.0) / (m_endFrame - m_startFrame); + int length = (easing->endFrame - easing->startFrame); + qreal progress = (length > 0) + ? ((adjustedFrame - easing->startFrame) * 1.0) / length + : 1.; qreal easedValue = easing->easing.valueForProgress(progress); - m_value = m_bezierPath.pointAtPercent(easedValue); + m_value = easing->bezier.pointAtPercent(easedValue); } else { // In case of incomplete easing we should just take the final point. - m_value = m_bezierPath.pointAtPercent(1.); + //m_value = m_bezierPath.pointAtPercent(1.); + m_value = easing->endValue; } } return true; } -private: - QPainterPath m_bezierPath; }; QT_END_NAMESPACE