mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-08 21:49:41 +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.
|
||||
// as lottie model keeps the data in front-toback-order.
|
||||
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()
|
||||
@ -518,6 +523,14 @@ void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const
|
||||
mask = inheritMask;
|
||||
}
|
||||
|
||||
if (mClipper) {
|
||||
if (mask.empty()) {
|
||||
mask = mClipper->rle();
|
||||
} else {
|
||||
mask = mClipper->rle() & mask;
|
||||
}
|
||||
}
|
||||
|
||||
LOTLayerItem *matteLayer = nullptr;
|
||||
for (const auto &layer : mLayers) {
|
||||
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()
|
||||
{
|
||||
if (mClipper && flag().testFlag(DirtyFlagBit::Matrix)) {
|
||||
mClipper->update(combinedMatrix());
|
||||
}
|
||||
|
||||
for (const auto &layer : mLayers) {
|
||||
layer->update( mLayerData->timeRemap(frameNo()) - mLayerData->startFrame(),
|
||||
combinedMatrix(), combinedAlpha());
|
||||
|
@ -71,6 +71,19 @@ private:
|
||||
|
||||
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;
|
||||
class LOTLayerItem
|
||||
{
|
||||
@ -127,6 +140,7 @@ protected:
|
||||
private:
|
||||
std::vector<LOTLayerNode *> mLayersCNode;
|
||||
std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
|
||||
std::unique_ptr<LOTClipperItem> mClipper;
|
||||
};
|
||||
|
||||
class LOTSolidLayerItem: public LOTLayerItem
|
||||
|
Loading…
x
Reference in New Issue
Block a user