From 1f0ff00651ad1a29050324c18835265c23405d67 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Wed, 2 Jul 2025 14:17:35 +0200 Subject: [PATCH] lottie: prevent mem leak Masks of pooled shapes were not unrefed, filling up the memory pool. --- src/loaders/lottie/tvgLottieBuilder.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 5ceecff5..0b8843bf 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1278,9 +1278,7 @@ void LottieBuilder::updateMasks(LottieLayer* layer, float frameNo) //the first mask if (!pShape) { pShape = layer->pooling(); - pShape->reset(); - pShape->fill(255, 255, 255, opacity); - pShape->transform(layer->cache.matrix); + P(pShape)->reset(); auto compMethod = (method == CompositeMethod::SubtractMask || method == CompositeMethod::InvAlphaMask) ? CompositeMethod::InvAlphaMask : CompositeMethod::AlphaMask; //Cheaper. Replace the masking with a clipper if (layer->masks.count == 1 && compMethod == CompositeMethod::AlphaMask) { @@ -1292,13 +1290,14 @@ void LottieBuilder::updateMasks(LottieLayer* layer, float frameNo) //Chain mask composition } else if (pMethod != method || pOpacity != opacity || (method != CompositeMethod::SubtractMask && method != CompositeMethod::DifferenceMask)) { auto shape = layer->pooling(); - shape->reset(); - shape->fill(255, 255, 255, opacity); - shape->transform(layer->cache.matrix); + P(shape)->reset(); pShape->composite(cast(shape), method); pShape = shape; } + pShape->fill(255, 255, 255, opacity); + pShape->transform(layer->cache.matrix); + //Default Masking if (expand == 0.0f) { mask->pathset(frameNo, P(pShape)->rs.path.cmds, P(pShape)-> rs.path.pts, nullptr, nullptr, nullptr, exps);