From 7f2cd1090c956c4cacb5101d96dd693fc3450ef5 Mon Sep 17 00:00:00 2001 From: Jinny You Date: Tue, 12 Mar 2024 11:12:04 +0900 Subject: [PATCH] lottie/slot: Support overriding plural sids Previously, slot overriding only works in single sid, the others are ignored. This patch enables slot overriding for all sids within a single slot. --- src/loaders/lottie/tvgLottieLoader.cpp | 23 ++++++++++++----------- src/loaders/lottie/tvgLottieParser.cpp | 10 ++++++---- src/loaders/lottie/tvgLottieParser.h | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index 424b7982..5f484ab1 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -305,21 +305,22 @@ bool LottieLoader::override(const char* slot) //parsing slot json LottieParser parser(temp, dirName); - auto sid = parser.sid(); - if (!sid) { - free(temp); - return false; + + auto idx = 0; + auto success = true; + while (auto sid = parser.sid(idx == 0)) { + for (auto s = comp->slots.begin(); s < comp->slots.end(); ++s) { + if (strcmp((*s)->sid, sid)) continue; + if (!parser.parse(*s)) success = false; + break; + } + ++idx; } - bool ret = false; - for (auto s = comp->slots.begin(); s < comp->slots.end(); ++s) { - if (strcmp((*s)->sid, sid)) continue; - ret = parser.parse(*s); - break; - } + if (idx < 1) success = false; free(temp); - return ret; + return success; } diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 5582175e..68958d1a 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1238,11 +1238,13 @@ void LottieParser::postProcess(Array& glyphes) /* External Class Implementation */ /************************************************************************/ -const char* LottieParser::sid() +const char* LottieParser::sid(bool first) { - //verify json - if (!parseNext()) return nullptr; - enterObject(); + if (first) { + //verify json + if (!parseNext()) return nullptr; + enterObject(); + } return nextObjectKey(); } diff --git a/src/loaders/lottie/tvgLottieParser.h b/src/loaders/lottie/tvgLottieParser.h index f1a892c3..635a1c1d 100644 --- a/src/loaders/lottie/tvgLottieParser.h +++ b/src/loaders/lottie/tvgLottieParser.h @@ -37,7 +37,7 @@ public: bool parse(); bool parse(LottieSlot* slot); - const char* sid(); + const char* sid(bool first = false); LottieComposition* comp = nullptr; const char* dirName = nullptr; //base resource directory