From eb77e468f44429e68c5887d52796b48ade54317c Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Sat, 1 Jun 2024 19:22:33 +0400 Subject: [PATCH] [WIP] Lottie: simplify trim --- .../CompLayers/ShapeCompositionLayer.cpp | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/submodules/TelegramUI/Components/LottieCpp/Sources/Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.cpp b/submodules/TelegramUI/Components/LottieCpp/Sources/Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.cpp index e7ad955e0f..9e4eef16f9 100644 --- a/submodules/TelegramUI/Components/LottieCpp/Sources/Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.cpp +++ b/submodules/TelegramUI/Components/LottieCpp/Sources/Lottie/Private/MainThread/LayerContainers/CompLayers/ShapeCompositionLayer.cpp @@ -903,7 +903,7 @@ public: std::unique_ptr transform; std::vector shadings; - std::vector> trims; + std::shared_ptr trim; public: std::vector> subItems; @@ -929,8 +929,8 @@ public: auto &subItem = subItems[i]; std::optional currentTrim; - if (!trims.empty()) { - currentTrim = trims[0]->trimParams(); + if (trim) { + currentTrim = trim->trimParams(); } auto subItemPaths = subItem->collectPaths(INT32_MAX, effectiveTransform, false); @@ -973,8 +973,8 @@ public: shadings.insert(shadings.begin(), shading); } - void addTrim(Trim const &trim) { - trims.push_back(std::make_shared(trim)); + void setTrim(Trim const &trim_) { + trim = std::make_shared(trim_); } public: @@ -1028,7 +1028,7 @@ public: if (path) { path->update(frameTime); } - for (const auto &trim : trims) { + if (trim) { trim->update(frameTime); } @@ -1047,7 +1047,7 @@ public: } bool hasTrims() { - if (!trims.empty()) { + if (trim) { return true; } @@ -1060,6 +1060,16 @@ public: return false; } + bool hasNestedTrims() { + for (const auto &subItem : subItems) { + if (subItem->hasTrims()) { + return true; + } + } + + return false; + } + void updateContents(std::optional parentTrim) { Transform2D containerTransform = Transform2D::identity(); float containerOpacity = 1.0; @@ -1070,8 +1080,8 @@ public: _contentItem->transform = containerTransform; _contentItem->alpha = containerOpacity; - if (!trims.empty()) { - _contentItem->trimParams = trims[0]->trimParams(); + if (trim) { + _contentItem->trimParams = trim->trimParams(); } for (int i = 0; i < shadings.size(); i++) { @@ -1123,9 +1133,7 @@ public: if (isGroup && !subItems.empty()) { for (int i = (int)subItems.size() - 1; i >= 0; i--) { std::optional childTrim = parentTrim; - for (const auto &trim : trims) { - //TODO:allow combination - //assert(!parentTrim); + if (trim) { childTrim = trim->trimParams(); } @@ -1228,10 +1236,11 @@ private: auto groupItem = std::make_shared(); groupItem->isGroup = true; + groupItem->setTrim(trim); + for (const auto &subItem : itemTree->subItems) { groupItem->addSubItem(subItem); } - groupItem->addTrim(trim); itemTree->subItems.clear(); itemTree->addSubItem(groupItem);