{
mCompData = model->mRoot.get();
mRootLayer = createLayerItem(mCompData->mRootLayer.get());
+ mRootLayer->setComplexContent(false);
mViewSize = mCompData->size();
}
LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
: LOTLayerItem(layerModel)
-{
+{
// 1. create layer item
for (auto &i : mLayerData->mChildren) {
LOTLayerData *layerModel = static_cast<LOTLayerData *>(i.get());
if (!layerModel->layerSize().empty()) {
mClipper = std::make_unique<LOTClipperItem>(layerModel->layerSize());
}
+
+ if (mLayers.size() > 1) setComplexContent(true);
}
void LOTCompLayerItem::buildLayerNode()
void LOTCompLayerItem::render(VPainter *painter, const VRle &inheritMask, const VRle &matteRle)
{
+ if (vIsZero(combinedAlpha())) return;
+
+ if (vCompare(combinedAlpha(), 1.0)) {
+ renderHelper(painter, inheritMask, matteRle);
+ } else {
+ if (complexContent()) {
+ VSize size = painter->clipBoundingRect().size();
+ VPainter srcPainter;
+ VBitmap srcBitmap(size.width(), size.height(), VBitmap::Format::ARGB32_Premultiplied);
+ srcPainter.begin(&srcBitmap);
+ renderHelper(&srcPainter, inheritMask, matteRle);
+ srcPainter.end();
+ painter->drawBitmap(VPoint(), srcBitmap, combinedAlpha() * 255);
+ } else {
+ renderHelper(painter, inheritMask, matteRle);
+ }
+ }
+}
+
+void LOTCompLayerItem::renderHelper(VPainter *painter, const VRle &inheritMask, const VRle &matteRle)
+{
VRle mask;
if (mLayerMask) {
mask = mLayerMask->maskRle(painter->clipBoundingRect());
mClipper->update(combinedMatrix());
}
int mappedFrame = mLayerData->timeRemap(frameNo());
+ float alpha = combinedAlpha();
+ if (complexContent()) alpha = 1;
for (const auto &layer : mLayers) {
- layer->update( mappedFrame, combinedMatrix(), combinedAlpha());
+ layer->update( mappedFrame, combinedMatrix(), alpha);
}
}
int id() const {return mLayerData->id();}
int parentId() const {return mLayerData->parentId();}
void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;}
+ void setComplexContent(bool value) { mComplexContent = value;}
+ bool complexContent() const {return mComplexContent;}
virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha);
VMatrix matrix(int frameNo) const;
virtual void renderList(std::vector<VDrawable *> &){}
float mCombinedAlpha{0.0};
int mFrameNo{-1};
DirtyFlag mDirtyFlag{DirtyFlagBit::All};
+ bool mComplexContent{false};
};
class LOTCompLayerItem: public LOTLayerItem
protected:
void updateContent() final;
private:
+ void renderHelper(VPainter *painter, const VRle &mask, const VRle &matteRle);
void renderMatteLayer(VPainter *painter, const VRle &inheritMask, const VRle &matteRle,
LOTLayerItem *layer, LOTLayerItem *src);
private: