loader/lottie: optimize the matrix computation.

Do not multiply the matrices if either one is identity.
This commit is contained in:
Hermet Park 2023-08-21 21:35:36 +09:00
parent b240e781d9
commit 345b867c38
2 changed files with 13 additions and 10 deletions

View file

@ -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) static bool _updateTransform(LottieTransform* transform, int32_t frameNo, bool autoOrient, Matrix& matrix, uint8_t& opacity)
{ {
if (!transform) return false;
mathIdentity(&matrix); mathIdentity(&matrix);
if (!transform) {
opacity = 255;
return false;
}
if (transform->coords) { if (transform->coords) {
mathTranslate(&matrix, transform->coords->x(frameNo), transform->coords->y(frameNo)); mathTranslate(&matrix, transform->coords->x(frameNo), transform->coords->y(frameNo));
} else { } else {
@ -76,15 +79,15 @@ static void _updateTransform(LottieLayer* layer, int32_t frameNo)
if (parent) _updateTransform(parent, parent->remap(frameNo)); if (parent) _updateTransform(parent, parent->remap(frameNo));
auto& matrix = layer->cache.matrix; 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) { if (parent) {
layer->cache.matrix = mathMultiply(&parent->cache.matrix, &matrix); if (!mathIdentity((const Matrix*) &parent->cache.matrix)) {
layer->cache.opacity = MULTIPLY(opacity, parent->cache.opacity); 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; layer->cache.frameNo = frameNo;
} }

View file

@ -84,9 +84,9 @@ void mathRotate(Matrix* m, float degree)
bool mathIdentity(const Matrix* m) bool mathIdentity(const Matrix* m)
{ {
if (!mathEqual(m->e11, 1.0f) || !mathZero(m->e12) || !mathZero(m->e13) || if (m->e11 != 1.0f || m->e12 != 0.0f || m->e13 != 0.0f ||
!mathZero(m->e21) || !mathEqual(m->e22, 1.0f) || !mathZero(m->e23) || m->e21 != 0.0f || m->e22 != 1.0f || m->e23 != 0.0f ||
!mathZero(m->e31) || !mathZero(m->e32) || !mathEqual(m->e33, 1.0f)) { m->e31 != 0.0f || m->e32 != 0.0f || m->e33 != 1.0f) {
return false; return false;
} }
return true; return true;