mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-11 23:14:48 +00:00
lottie/render: Added Clipper for nested composition layer.
Change-Id: Ic9a9b390863dc05a0391a3f17acc80ab912d172a
This commit is contained in:
parent
b279733f82
commit
1787aaf4ab
@ -458,6 +458,11 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
|
|||||||
// 3. keep the layer in back-to-front order.
|
// 3. keep the layer in back-to-front order.
|
||||||
// as lottie model keeps the data in front-toback-order.
|
// as lottie model keeps the data in front-toback-order.
|
||||||
std::reverse(mLayers.begin(), mLayers.end());
|
std::reverse(mLayers.begin(), mLayers.end());
|
||||||
|
|
||||||
|
// 4. check if its a nested composition
|
||||||
|
if (!layerModel->layerSize().empty()) {
|
||||||
|
mClipper = std::make_unique<LOTClipperItem>(layerModel->layerSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LOTCompLayerItem::updateStaticProperty()
|
void LOTCompLayerItem::updateStaticProperty()
|
||||||
@ -518,6 +523,14 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
|
|||||||
mask = inheritMask;
|
mask = inheritMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mClipper) {
|
||||||
|
if (mask.empty()) {
|
||||||
|
mask = mClipper->rle();
|
||||||
|
} else {
|
||||||
|
mask = mClipper->rle() & mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LOTLayerItem *matteLayer = nullptr;
|
LOTLayerItem *matteLayer = nullptr;
|
||||||
for (const auto &layer : mLayers) {
|
for (const auto &layer : mLayers) {
|
||||||
if (!matteLayer && layer->hasMatte()) {
|
if (!matteLayer && layer->hasMatte()) {
|
||||||
@ -536,8 +549,35 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LOTClipperItem::update(const VMatrix &matrix)
|
||||||
|
{
|
||||||
|
mPath.reset();
|
||||||
|
mPath.addRect(VRectF(0,0, mSize.width(), mSize.height()));
|
||||||
|
mPath.transform(matrix);
|
||||||
|
|
||||||
|
VPath tmp = mPath;
|
||||||
|
|
||||||
|
if (!mRleFuture) mRleFuture = std::make_shared<VSharedState<VRle>>();
|
||||||
|
|
||||||
|
mRleFuture->reuse();
|
||||||
|
VRaster::generateFillInfo(mRleFuture, std::move(tmp), std::move(mRle));
|
||||||
|
mRle = VRle();
|
||||||
|
}
|
||||||
|
|
||||||
|
VRle LOTClipperItem::rle()
|
||||||
|
{
|
||||||
|
if (mRleFuture && mRleFuture->valid()) {
|
||||||
|
mRle = mRleFuture->get();
|
||||||
|
}
|
||||||
|
return mRle;
|
||||||
|
}
|
||||||
|
|
||||||
void LOTCompLayerItem::updateContent()
|
void LOTCompLayerItem::updateContent()
|
||||||
{
|
{
|
||||||
|
if (mClipper && flag().testFlag(DirtyFlagBit::Matrix)) {
|
||||||
|
mClipper->update(combinedMatrix());
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto &layer : mLayers) {
|
for (const auto &layer : mLayers) {
|
||||||
layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(),
|
layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(),
|
||||||
combinedMatrix(), combinedAlpha());
|
combinedMatrix(), combinedAlpha());
|
||||||
|
@ -71,6 +71,19 @@ private:
|
|||||||
|
|
||||||
class LOTLayerMaskItem;
|
class LOTLayerMaskItem;
|
||||||
|
|
||||||
|
class LOTClipperItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LOTClipperItem(VSize size): mSize(size){}
|
||||||
|
void update(const VMatrix &matrix);
|
||||||
|
VRle rle();
|
||||||
|
public:
|
||||||
|
VSize mSize;
|
||||||
|
VPath mPath;
|
||||||
|
RleShare mRleFuture;
|
||||||
|
VRle mRle;
|
||||||
|
};
|
||||||
|
|
||||||
typedef vFlag<DirtyFlagBit> DirtyFlag;
|
typedef vFlag<DirtyFlagBit> DirtyFlag;
|
||||||
class LOTLayerItem
|
class LOTLayerItem
|
||||||
{
|
{
|
||||||
@ -127,6 +140,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
std::vector<LOTLayerNode *> mLayersCNode;
|
std::vector<LOTLayerNode *> mLayersCNode;
|
||||||
std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
|
std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
|
||||||
|
std::unique_ptr<LOTClipperItem> mClipper;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LOTSolidLayerItem: public LOTLayerItem
|
class LOTSolidLayerItem: public LOTLayerItem
|
||||||
|
Loading…
x
Reference in New Issue
Block a user