From 3fd095e947e693eab3a962dda12a9b655bd265b9 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Wed, 9 Oct 2024 14:16:52 +0700 Subject: [PATCH] lottie: add support for mask expansion Implemented the mask attribute 'x' - expand mask. Enforced rounded lines join according to tests in AE. @Issue: https://github.com/thorvg/thorvg/issues/2832 --- src/loaders/lottie/tvgLottieBuilder.cpp | 11 ++++++++++- src/loaders/lottie/tvgLottieModel.h | 1 + src/loaders/lottie/tvgLottieModifier.h | 2 +- src/loaders/lottie/tvgLottieParser.cpp | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index a9653347..8b0de583 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1129,12 +1129,21 @@ void LottieBuilder::updateMaskings(LottieLayer* layer, float frameNo) auto pMask = static_cast(layer->masks[0]); auto pMethod = pMask->method; auto opacity = pMask->opacity(frameNo); + auto expand = pMask->expand(frameNo); auto pShape = layer->pooling(); pShape->reset(); pShape->fill(255, 255, 255, opacity); pShape->transform(layer->cache.matrix); - pMask->pathset(frameNo, P(pShape)->rs.path.cmds, P(pShape)->rs.path.pts, nullptr, nullptr, nullptr, exps); + + //Apply Masking Expansion (Offset) + if (expand == 0.0f) { + pMask->pathset(frameNo, P(pShape)->rs.path.cmds, P(pShape)->rs.path.pts, nullptr, nullptr, nullptr, exps); + } else { + //TODO: Once path direction support is implemented, ensure that the direction is ignored here + auto offset = LottieOffsetModifier(pMask->expand(frameNo)); + pMask->pathset(frameNo, P(pShape)->rs.path.cmds, P(pShape)->rs.path.pts, nullptr, nullptr, &offset, exps); + } auto compMethod = (pMethod == CompositeMethod::SubtractMask || pMethod == CompositeMethod::InvAlphaMask) ? CompositeMethod::InvAlphaMask : CompositeMethod::AlphaMask; diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 0f60a02e..91106012 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -107,6 +107,7 @@ struct LottieGaussianBlur : LottieEffect struct LottieMask { LottiePathSet pathset; + LottieFloat expand = 0.0f; LottieOpacity opacity = 255; CompositeMethod method; bool inverse = false; diff --git a/src/loaders/lottie/tvgLottieModifier.h b/src/loaders/lottie/tvgLottieModifier.h index 69aa8e96..e3cab1c0 100644 --- a/src/loaders/lottie/tvgLottieModifier.h +++ b/src/loaders/lottie/tvgLottieModifier.h @@ -47,7 +47,7 @@ struct LottieOffsetModifier float miterLimit; StrokeJoin join; - LottieOffsetModifier(float offset, float miter, StrokeJoin join) : offset(offset), miterLimit(miter), join(join) {}; + LottieOffsetModifier(float offset, float miter = 4.0f, StrokeJoin join = StrokeJoin::Round) : offset(offset), miterLimit(miter), join(join) {}; bool modifyPath(const PathCommand* inCmds, uint32_t inCmdsCnt, const Point* inPts, uint32_t inPtsCnt, Array& outCmds, Array& outPts, bool clockwise) const; bool modifyPolystar(const Array& inCmds, const Array& inPts, Array& outCmds, Array& outPts, bool clockwise) const; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index c964213c..7593ab55 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1233,6 +1233,7 @@ LottieMask* LottieParser::parseMask() } else if (valid && KEY_AS("pt")) getPathSet(mask->pathset); else if (valid && KEY_AS("o")) parseProperty(mask->opacity); + else if (valid && KEY_AS("x")) parseProperty(mask->expand); else skip(key); }