From 868a085262d231d6f375820ffe91266a38a3ff3a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 20 Jan 2025 19:07:49 +0900 Subject: [PATCH] lottie: expressions compactness++ expressions is an optional feature, do not prepare expressions if the engine doesn't support it. --- src/loaders/lottie/tvgLottieBuilder.h | 5 +++++ src/loaders/lottie/tvgLottieLoader.cpp | 4 ++-- src/loaders/lottie/tvgLottieParser.cpp | 26 ++++++++++++++------------ src/loaders/lottie/tvgLottieParser.h | 5 ++++- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.h b/src/loaders/lottie/tvgLottieBuilder.h index a57a747e..01f138b7 100644 --- a/src/loaders/lottie/tvgLottieBuilder.h +++ b/src/loaders/lottie/tvgLottieBuilder.h @@ -98,6 +98,11 @@ struct LottieBuilder LottieExpressions::retrieve(exps); } + bool expressions() + { + return exps ? true : false; + } + bool update(LottieComposition* comp, float progress); void build(LottieComposition* comp); diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index ef324f1d..144d92af 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -37,7 +37,7 @@ void LottieLoader::run(unsigned tid) builder->update(comp, frameNo); //initial loading } else { - LottieParser parser(content, dirName); + LottieParser parser(content, dirName, builder->expressions()); if (!parser.parse()) return; { ScopedLock lock(key); @@ -300,7 +300,7 @@ bool LottieLoader::override(const char* slots, bool byDefault) auto temp = byDefault ? slots : strdup(slots); //parsing slot json - LottieParser parser(temp, dirName); + LottieParser parser(temp, dirName, builder->expressions()); parser.comp = comp; auto idx = 0; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 0813add2..044b04af 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -34,8 +34,18 @@ #define KEY_AS(name) !strcmp(key, name) -static LottieExpression* _expression(char* code, LottieComposition* comp, LottieLayer* layer, LottieObject* object, LottieProperty* property) +static unsigned long _int2str(int num) { + char str[20]; + snprintf(str, 20, "%d", num); + return djb2Encode(str); +} + + +LottieExpression* LottieParser::getExpression(char* code, LottieComposition* comp, LottieLayer* layer, LottieObject* object, LottieProperty* property) +{ + if (!expressions) return nullptr; + if (!comp->expressions) comp->expressions = true; auto inst = new LottieExpression; @@ -49,14 +59,6 @@ static LottieExpression* _expression(char* code, LottieComposition* comp, Lottie } -static unsigned long _int2str(int num) -{ - char str[20]; - snprintf(str, 20, "%d", num); - return djb2Encode(str); -} - - LottieEffect* LottieParser::getEffect(int type) { switch (type) { @@ -477,7 +479,7 @@ void LottieParser::parseProperty(T& prop, LottieObject* obj) while (auto key = nextObjectKey()) { if (KEY_AS("k")) parsePropertyInternal(prop); else if (obj && KEY_AS("sid")) registerSlot(obj, getString()); - else if (KEY_AS("x")) prop.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &prop); + else if (KEY_AS("x")) prop.exp = getExpression(getStringCopy(), comp, context.layer, context.parent, &prop); else if (KEY_AS("ix")) prop.ix = getInt(); else skip(); } @@ -566,7 +568,7 @@ LottieTransform* LottieParser::parseTransform(bool ddd) //check separateCoord to figure out whether "x(expression)" / "x(coord)" else if (transform->coords && KEY_AS("x")) parseProperty(transform->coords->x); else if (transform->coords && KEY_AS("y")) parseProperty(transform->coords->y); - else if (KEY_AS("x")) transform->position.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &transform->position); + else if (KEY_AS("x")) transform->position.exp = getExpression(getStringCopy(), comp, context.layer, context.parent, &transform->position); else if (KEY_AS("sid")) registerSlot(transform, getString()); else skip(); } @@ -659,7 +661,7 @@ void LottieParser::getPathSet(LottiePathSet& path) getValue(path.value); } } else if (KEY_AS("x")) { - path.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &path); + path.exp = getExpression(getStringCopy(), comp, context.layer, context.parent, &path); } else skip(); } path.type = LottieProperty::Type::PathSet; diff --git a/src/loaders/lottie/tvgLottieParser.h b/src/loaders/lottie/tvgLottieParser.h index e340ca28..2372d3e6 100644 --- a/src/loaders/lottie/tvgLottieParser.h +++ b/src/loaders/lottie/tvgLottieParser.h @@ -30,9 +30,10 @@ struct LottieParser : LookaheadParserHandler { public: - LottieParser(const char *str, const char* dirName) : LookaheadParserHandler(str) + LottieParser(const char *str, const char* dirName, bool expressions) : LookaheadParserHandler(str) { this->dirName = dirName; + this->expressions = expressions; } bool parse(); @@ -44,6 +45,7 @@ public: LottieComposition* comp = nullptr; const char* dirName = nullptr; //base resource directory char* slots = nullptr; + bool expressions = false; //support expressions? private: RGB24 getColor(const char *str); @@ -51,6 +53,7 @@ private: MaskMethod getMaskMethod(bool inversed); LottieInterpolator* getInterpolator(const char* key, Point& in, Point& out); LottieEffect* getEffect(int type); + LottieExpression* getExpression(char* code, LottieComposition* comp, LottieLayer* layer, LottieObject* object, LottieProperty* property); void getInterpolatorPoint(Point& pt); void getPathSet(LottiePathSet& path);