diff options
author | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2020-05-26 14:17:46 +0200 |
---|---|---|
committer | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2024-03-22 19:12:28 +0000 |
commit | e3a0f019478d3048c096ff6cb02fc0b45a66d8d7 (patch) | |
tree | 36c1a25f30df72b5e5fa43e1368177c4ff20ba22 /src | |
parent | 4177a7c8c5dd206224e2c359f9fcb2bcc051cacb (diff) |
Fix wrong calculations in animated transforms
In the implementation of the AnimateTransform node, the
percentOfAnimation variable is clearly intended to hold the current
instant's local fraction between animation step n and n+1. Instead it
held the global fraction between step 0 and final step.
Fix the calculation, and also rename the variables to make it easier
to follow.
Change-Id: Iefcb5cdf76d838de34e5a33ee4fd78721fa698fd
Done-with: Jean-Milost Reymond
Task-number: QTBUG-82779
Reviewed-by: Matthias Rauter <matthias.rauter@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/svg/qsvgstyle.cpp | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/src/svg/qsvgstyle.cpp b/src/svg/qsvgstyle.cpp index 88cfcc6..953d59f 100644 --- a/src/svg/qsvgstyle.cpp +++ b/src/svg/qsvgstyle.cpp @@ -673,25 +673,24 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) if (totalTimeElapsed < m_from || m_finished) return; - qreal animationFrame = 0; + qreal fractionOfTotalTime = 0; if (m_totalRunningTime != 0) { - animationFrame = (totalTimeElapsed - m_from) / m_totalRunningTime; + fractionOfTotalTime = (totalTimeElapsed - m_from) / m_totalRunningTime; - if (m_repeatCount >= 0 && m_repeatCount < animationFrame) { + if (m_repeatCount >= 0 && m_repeatCount < fractionOfTotalTime) { m_finished = true; - animationFrame = m_repeatCount; + fractionOfTotalTime = m_repeatCount; } } - qreal percentOfAnimation = animationFrame; - if (percentOfAnimation > 1) { - percentOfAnimation -= ((int)percentOfAnimation); - } + qreal fractionOfCurrentIterationTime = fractionOfTotalTime - std::trunc(fractionOfTotalTime); - qreal currentPosition = percentOfAnimation * (m_count - 1); - int endElem = qCeil(currentPosition); + qreal currentIndexPosition = fractionOfCurrentIterationTime * (m_count - 1); + int endElem = qCeil(currentIndexPosition); int startElem = qMax(endElem - 1, 0); + qreal fractionOfCurrentElement = currentIndexPosition - std::trunc(currentIndexPosition); + switch(m_type) { case Translate: { @@ -704,9 +703,9 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) to1 = m_args[endElem++]; to2 = m_args[endElem++]; - qreal transXDiff = (to1-from1) * percentOfAnimation; + qreal transXDiff = (to1 - from1) * fractionOfCurrentElement; qreal transX = from1 + transXDiff; - qreal transYDiff = (to2-from2) * percentOfAnimation; + qreal transYDiff = (to2 - from2) * fractionOfCurrentElement; qreal transY = from2 + transYDiff; m_transform = QTransform(); m_transform.translate(transX, transY); @@ -722,9 +721,9 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) to1 = m_args[endElem++]; to2 = m_args[endElem++]; - qreal transXDiff = (to1-from1) * percentOfAnimation; + qreal transXDiff = (to1 - from1) * fractionOfCurrentElement; qreal transX = from1 + transXDiff; - qreal transYDiff = (to2-from2) * percentOfAnimation; + qreal transYDiff = (to2 - from2) * fractionOfCurrentElement; qreal transY = from2 + transYDiff; if (transY == 0) transY = transX; @@ -744,12 +743,12 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) to2 = m_args[endElem++]; to3 = m_args[endElem++]; - qreal rotationDiff = (to1 - from1) * percentOfAnimation; + qreal rotationDiff = (to1 - from1) * fractionOfCurrentElement; //qreal rotation = from1 + rotationDiff; - qreal transXDiff = (to2-from2) * percentOfAnimation; + qreal transXDiff = (to2 - from2) * fractionOfCurrentElement; qreal transX = from2 + transXDiff; - qreal transYDiff = (to3-from3) * percentOfAnimation; + qreal transYDiff = (to3 - from3) * fractionOfCurrentElement; qreal transY = from3 + transYDiff; m_transform = QTransform(); m_transform.translate(transX, transY); @@ -765,7 +764,7 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) from1 = m_args[startElem++]; to1 = m_args[endElem++]; - qreal transXDiff = (to1-from1) * percentOfAnimation; + qreal transXDiff = (to1 - from1) * fractionOfCurrentElement; qreal transX = from1 + transXDiff; m_transform = QTransform(); m_transform.shear(qTan(qDegreesToRadians(transX)), 0); @@ -779,8 +778,7 @@ void QSvgAnimateTransform::resolveMatrix(const QSvgNode *node) from1 = m_args[startElem++]; to1 = m_args[endElem++]; - - qreal transYDiff = (to1 - from1) * percentOfAnimation; + qreal transYDiff = (to1 - from1) * fractionOfCurrentElement; qreal transY = from1 + transYDiff; m_transform = QTransform(); m_transform.shear(0, qTan(qDegreesToRadians(transY))); |