// 1. check if the layer is part of the current frame
if (!visible()) return;
+ float alpha = parentAlpha * opacity(frameNo());
+ if (vIsZero(alpha)) {
+ mCombinedAlpha = 0;
+ return;
+ }
+
// 2. calculate the parent matrix and alpha
VMatrix m = matrix(frameNo());
m *= parentMatrix;
- float alpha = parentAlpha * opacity(frameNo());
+
// 3. update the dirty flag based on the change
if (!mCombinedMatrix.fuzzyCompare(m)) {
if (layer->hasMatte()) {
matte = layer.get();
} else {
- if (matte && matte->visible() && layer->visible()) {
- renderMatteLayer(painter, mask, matteRle, matte, layer.get());
- } else {
- layer->render(painter, mask, matteRle);
+ if (layer->visible()) {
+ if (matte) {
+ if (matte->visible())
+ renderMatteLayer(painter, mask, matteRle, matte, layer.get());
+ } else {
+ layer->render(painter, mask, matteRle);
+ }
}
matte = nullptr;
}
void LOTCompLayerItem::renderList(std::vector<VDrawable *> &list)
{
- if (!visible()) return;
+ if (!visible() || vIsZero(combinedAlpha())) return;
LOTLayerItem *matte = nullptr;
for (const auto &layer : mLayers) {
if (layer->hasMatte()) {
matte = layer.get();
} else {
- if (matte && matte->visible() && layer->visible()) {
- layer->renderList(list);
- matte->renderList(list);
- } else {
- layer->renderList(list);
+ if (layer->visible()) {
+ if (matte) {
+ if (matte->visible()) {
+ layer->renderList(list);
+ matte->renderList(list);
+ }
+ } else {
+ layer->renderList(list);
+ }
}
matte = nullptr;
}
void LOTSolidLayerItem::renderList(std::vector<VDrawable *> &list)
{
- if (!visible()) return;
+ if (!visible() || vIsZero(combinedAlpha())) return;
list.push_back(mRenderNode.get());
}
void LOTImageLayerItem::renderList(std::vector<VDrawable *> &list)
{
- if (!visible()) return;
+ if (!visible() || vIsZero(combinedAlpha())) return;
list.push_back(mRenderNode.get());
}
void LOTShapeLayerItem::renderList(std::vector<VDrawable *> &list)
{
- if (!visible()) return;
+ if (!visible() || vIsZero(combinedAlpha())) return;
mRoot->renderList(list);
}