From a797516c70e1fa9456422d47f3591a97db88099e Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Wed, 18 Jun 2025 18:16:23 +0200 Subject: [PATCH] lottie: add lineTo support in round corner alg So far, there hasn't been a case where this support was necessary, but it will be once chaining is added- when the LottieRoundnessModifier::modifyPath() is called by a previous modifier. --- src/loaders/lottie/tvgLottieModifier.cpp | 33 +++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/loaders/lottie/tvgLottieModifier.cpp b/src/loaders/lottie/tvgLottieModifier.cpp index ed14d062..c7761898 100644 --- a/src/loaders/lottie/tvgLottieModifier.cpp +++ b/src/loaders/lottie/tvgLottieModifier.cpp @@ -208,7 +208,13 @@ bool LottieRoundnessModifier::modifyPath(PathCommand* inCmds, uint32_t inCmdsCnt _roundCorner(path.cmds, path.pts, prev, curr, inPts[iPts + 5], r); iPts += 3; break; - } else if (inCmds[iCmds + 1] == PathCommand::Close) { + } + if (inCmds[iCmds + 1] == PathCommand::LineTo) { + _roundCorner(path.cmds, path.pts, prev, curr, inPts[iPts + 3], r); + iPts += 3; + break; + } + if (inCmds[iCmds + 1] == PathCommand::Close) { _roundCorner(path.cmds, path.pts, prev, curr, inPts[2], r); path.pts[startIndex] = path.pts.last(); iPts += 3; @@ -221,6 +227,31 @@ bool LottieRoundnessModifier::modifyPath(PathCommand* inCmds, uint32_t inCmdsCnt path.pts.push(inPts[iPts++]); break; } + case PathCommand::LineTo: { + if (iCmds < inCmdsCnt - 1) { + auto& prev = inPts[iPts - 1]; + auto& curr = inPts[iPts]; + if (inCmds[iCmds + 1] == PathCommand::CubicTo && _colinear(inPts + iPts)) { + _roundCorner(path.cmds, path.pts, prev, curr, inPts[iPts + 3], r); + ++iPts; + break; + } + if (inCmds[iCmds + 1] == PathCommand::LineTo) { + _roundCorner(path.cmds, path.pts, prev, curr, inPts[iPts + 1], r); + ++iPts; + break; + } + if (inCmds[iCmds + 1] == PathCommand::Close) { + _roundCorner(path.cmds, path.pts, prev, curr, inPts[1], r); + path.pts[startIndex] = path.pts.last(); + ++iPts; + break; + } + } + path.cmds.push(PathCommand::LineTo); + path.pts.push(inPts[iPts++]); + break; + } case PathCommand::Close: { path.cmds.push(PathCommand::Close); break;