mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2026-02-03 18:13:41 +00:00
lottie: Add Mask information to the layer node.
Change-Id: I312e178d10747f29b6a6cbde9862edf5541a6c53
This commit is contained in:
committed by
Hermet Park
parent
6aaa82628f
commit
20910257ba
@@ -151,10 +151,13 @@ void LOTMaskItem::update(int frameNo, const VMatrix &parentMatrix,
|
||||
opacity = opacity * parentAlpha;
|
||||
mCombinedAlpha = opacity;
|
||||
|
||||
VPath path = mLocalPath;
|
||||
path.transform(parentMatrix);
|
||||
mFinalPath.reset();
|
||||
mFinalPath.addPath(mLocalPath);
|
||||
mFinalPath.transform(parentMatrix);
|
||||
|
||||
mRleTask = VRaster::generateFillInfo(std::move(path), std::move(mRle));
|
||||
VPath tmp = mFinalPath;
|
||||
|
||||
mRleTask = VRaster::generateFillInfo(std::move(tmp), std::move(mRle));
|
||||
mRle = VRle();
|
||||
}
|
||||
|
||||
@@ -204,7 +207,38 @@ void LOTLayerItem::buildLayerNode()
|
||||
}
|
||||
}
|
||||
if (hasMask()) {
|
||||
//TODO populate mask property
|
||||
mMasksCNode.clear();
|
||||
for (const auto &mask : mMasks) {
|
||||
LOTMask cNode;
|
||||
const std::vector<VPath::Element> &elm = mask->mFinalPath.elements();
|
||||
const std::vector<VPointF> & pts = mask->mFinalPath.points();
|
||||
const float *ptPtr = reinterpret_cast<const float *>(pts.data());
|
||||
const char * elmPtr = reinterpret_cast<const char *>(elm.data());
|
||||
cNode.mPath.ptPtr = ptPtr;
|
||||
cNode.mPath.ptCount = pts.size();
|
||||
cNode.mPath.elmPtr = elmPtr;
|
||||
cNode.mPath.elmCount = elm.size();
|
||||
switch (mask->maskMode()) {
|
||||
case LOTMaskData::Mode::Add:
|
||||
cNode.mMode = MaskModeAdd;
|
||||
break;
|
||||
case LOTMaskData::Mode::Substarct:
|
||||
cNode.mMode = MaskModeSubstract;
|
||||
break;
|
||||
case LOTMaskData::Mode::Intersect:
|
||||
cNode.mMode = MaskModeIntersect;
|
||||
break;
|
||||
case LOTMaskData::Mode::Difference:
|
||||
cNode.mMode = MaskModeDifference;
|
||||
break;
|
||||
default:
|
||||
cNode.mMode = MaskModeAdd;
|
||||
break;
|
||||
}
|
||||
mMasksCNode.push_back(std::move(cNode));
|
||||
}
|
||||
mLayerCNode->mMaskList.ptr = mMasksCNode.data();
|
||||
mLayerCNode->mMaskList.size = mMasksCNode.size();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ protected:
|
||||
VRle maskRle(const VRect &clipRect);
|
||||
bool hasMask() const {return !mMasks.empty();}
|
||||
protected:
|
||||
std::vector<LOTMask> mMasksCNode;
|
||||
std::unique_ptr<LOTLayerNode> mLayerCNode;
|
||||
std::vector<VDrawable *> mDrawableList;
|
||||
std::vector<std::unique_ptr<LOTMaskItem>> mMasks;
|
||||
@@ -161,6 +162,7 @@ public:
|
||||
float mCombinedAlpha;
|
||||
VMatrix mCombinedMatrix;
|
||||
VPath mLocalPath;
|
||||
VPath mFinalPath;
|
||||
std::future<VRle> mRleTask;
|
||||
VRle mRle;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user