summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEirik Aavitsland <eirik.aavitsland@qt.io>2020-05-26 14:17:46 +0200
committerEirik Aavitsland <eirik.aavitsland@qt.io>2024-03-22 19:12:28 +0000
commite3a0f019478d3048c096ff6cb02fc0b45a66d8d7 (patch)
tree36c1a25f30df72b5e5fa43e1368177c4ff20ba22 /src
parent4177a7c8c5dd206224e2c359f9fcb2bcc051cacb (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.cpp38
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)));