From a6898ccf421f25fc73089707f406ea3766754230 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 6 May 2025 22:15:35 +0200 Subject: [PATCH] lottie: enhance parsing of position's SeparateCoords MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "s" key does not have to appear at the beginning of the position block. Previously, such cases would result in a parsing error — now they are handled correctly. --- src/loaders/lottie/tvgLottieModel.h | 6 ++++++ src/loaders/lottie/tvgLottieParser.cpp | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 4545048f..441160e2 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -553,6 +553,12 @@ struct LottieTransform : LottieObject LottieFloat y = 0.0f; }; + SeparateCoord* separateCoord() + { + if (!coords) coords = new SeparateCoord; + return coords; + } + struct RotationEx { LottieFloat x = 0.0f; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index f8d39b14..c117002e 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -603,11 +603,14 @@ LottieTransform* LottieParser::parseTransform(bool ddd) enterObject(); while (auto key = nextObjectKey()) { if (KEY_AS("k")) parsePropertyInternal(transform->position); - else if (KEY_AS("s") && getBool()) transform->coords = new LottieTransform::SeparateCoord; - //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")) + { + //check separateCoord to figure out whether "x(expression)" / "x(coord)" + if (peekType() == kStringType) transform->position.exp = _expression(getStringCopy(), comp, context.layer, context.parent, &transform->position); + else parseProperty(transform->separateCoord()->x); + } + else if (KEY_AS("y")) parseProperty(transform->separateCoord()->y); + else if (KEY_AS("sid")) registerSlot(transform, getString()); else skip(key); }