diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 2617b52f..e5f38b75 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -177,10 +177,6 @@ static void _updateGroup(LottieGroup* parent, LottieGroup* group, int32_t frameN { //Prepare render data group->scene = parent->scene; - - auto opacity = group->opacity(frameNo); - if (opacity == 0) return; - auto ctx2 = ctx; _updateChildren(group, frameNo, ctx2); } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index db888beb..f5acccd7 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -123,7 +123,6 @@ Fill* LottieGradient::fill(int32_t frameNo) void LottieGroup::prepare(LottieObject::Type type) { LottieObject::type = type; - if (transform) statical &= transform->statical; for (auto child = children.data; child < children.end(); ++child) { statical &= (*child)->statical; if (!statical) break; @@ -133,13 +132,16 @@ void LottieGroup::prepare(LottieObject::Type type) void LottieLayer::prepare() { - LottieGroup::prepare(LottieObject::Layer); + if (transform) statical &= transform->statical; - /* if layer is hidden, only useulf data is its transform matrix. + /* if layer is hidden, only useful data is its transform matrix. so force it to be a Null Layer and release all resource. */ - if (!hidden) return; - type = LottieLayer::Null; - children.reset(); + if (hidden) { + type = LottieLayer::Null; + children.reset(); + return; + } + LottieGroup::prepare(LottieObject::Layer); } diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index f37c4ca2..35e5acc4 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -386,20 +386,13 @@ struct LottieGroup : LottieObject virtual ~LottieGroup() { for (auto p = children.data; p < children.end(); ++p) delete(*p); - delete(transform); } void prepare(LottieObject::Type type = LottieObject::Group); - virtual uint8_t opacity(int32_t frameNo) - { - return (transform ? transform->opacity(frameNo) : 255); - } - Scene* scene = nullptr; //tvg render data Array children; - LottieTransform* transform = nullptr; }; @@ -420,14 +413,14 @@ struct LottieLayer : LottieGroup } delete(matte.target); + delete(transform); } - uint8_t opacity(int32_t frameNo) override + uint8_t opacity(int32_t frameNo) { //return zero if the visibility is false. - if (frameNo < inFrame || frameNo > outFrame) return 0; if (type == Null) return 255; - return LottieGroup::opacity(frameNo); + return transform->opacity(frameNo); } void prepare(); @@ -445,6 +438,7 @@ struct LottieLayer : LottieGroup LottieLayer* parent = nullptr; LottieFloat timeRemap = 0.0f; LottieComposition* comp = nullptr; + LottieTransform* transform = nullptr; Array masks; float timeStretch = 1.0f;