diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 58146eec..36a08ed2 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -38,10 +38,13 @@ static bool _buildPrecomp(LottieComposition* comp, LottieGroup* parent); static bool _updateTransform(LottieTransform* transform, int32_t frameNo, bool autoOrient, Matrix& matrix, uint8_t& opacity) { - if (!transform) return false; - mathIdentity(&matrix); + if (!transform) { + opacity = 255; + return false; + } + if (transform->coords) { mathTranslate(&matrix, transform->coords->x(frameNo), transform->coords->y(frameNo)); } else { @@ -76,15 +79,15 @@ static void _updateTransform(LottieLayer* layer, int32_t frameNo) if (parent) _updateTransform(parent, parent->remap(frameNo)); auto& matrix = layer->cache.matrix; - uint8_t opacity; - _updateTransform(transform, frameNo, layer->autoOrient, matrix, opacity); + _updateTransform(transform, frameNo, layer->autoOrient, matrix, layer->cache.opacity); if (parent) { - layer->cache.matrix = mathMultiply(&parent->cache.matrix, &matrix); - layer->cache.opacity = MULTIPLY(opacity, parent->cache.opacity); + if (!mathIdentity((const Matrix*) &parent->cache.matrix)) { + if (mathIdentity((const Matrix*) &matrix)) layer->cache.matrix = parent->cache.matrix; + else layer->cache.matrix = mathMultiply(&parent->cache.matrix, &matrix); + } } - layer->cache.opacity = opacity; layer->cache.frameNo = frameNo; } diff --git a/src/utils/tvgMath.cpp b/src/utils/tvgMath.cpp index 2f8ab8fb..a9463c80 100644 --- a/src/utils/tvgMath.cpp +++ b/src/utils/tvgMath.cpp @@ -84,9 +84,9 @@ void mathRotate(Matrix* m, float degree) bool mathIdentity(const Matrix* m) { - if (!mathEqual(m->e11, 1.0f) || !mathZero(m->e12) || !mathZero(m->e13) || - !mathZero(m->e21) || !mathEqual(m->e22, 1.0f) || !mathZero(m->e23) || - !mathZero(m->e31) || !mathZero(m->e32) || !mathEqual(m->e33, 1.0f)) { + if (m->e11 != 1.0f || m->e12 != 0.0f || m->e13 != 0.0f || + m->e21 != 0.0f || m->e22 != 1.0f || m->e23 != 0.0f || + m->e31 != 0.0f || m->e32 != 0.0f || m->e33 != 1.0f) { return false; } return true;