lottie/render: Added Clipper for nested composition layer.

Change-Id: Ic9a9b390863dc05a0391a3f17acc80ab912d172a
This commit is contained in:
subhransu mohanty 2019-01-03 16:41:15 +09:00
parent b279733f82
commit 1787aaf4ab
2 changed files with 54 additions and 0 deletions

View File

@ -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());

View File

@ -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