blob: 4d50b7e85408d84e9a8df37c8ec52986040efa0a [file] [log] [blame]
package com.airbnb.lottie;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.support.annotation.FloatRange;
import android.support.v4.util.LongSparseArray;
import java.util.ArrayList;
import java.util.List;
class CompositionLayer extends BaseLayer {
private final List<BaseLayer> layers = new ArrayList<>();
CompositionLayer(LottieDrawable lottieDrawable, Layer layerModel, List<Layer> layerModels,
LottieComposition composition) {
super(lottieDrawable, layerModel);
LongSparseArray<BaseLayer> layerMap =
new LongSparseArray<>(composition.getLayers().size());
BaseLayer mattedLayer = null;
for (int i = layerModels.size() - 1; i >= 0; i--) {
Layer lm = layerModels.get(i);
BaseLayer layer = BaseLayer.forModel(lm, lottieDrawable, composition);
layerMap.put(layer.getLayerModel().getId(), layer);
if (mattedLayer != null) {
mattedLayer.setMatteLayer(layer);
mattedLayer = null;
} else {
layers.add(0, layer);
switch (lm.getMatteType()) {
case Add:
case Invert:
mattedLayer = layer;
break;
}
}
}
for (int i = 0; i < layerMap.size(); i++) {
long key = layerMap.keyAt(i);
BaseLayer layerView = layerMap.get(key);
BaseLayer parentLayer = layerMap.get(layerView.getLayerModel().getParentId());
if (parentLayer != null) {
layerView.setParentLayer(parentLayer);
}
}
}
@Override void drawLayer(Canvas canvas, Matrix parentMatrix, int parentAlpha) {
for (int i = layers.size() - 1; i >= 0 ; i--) {
layers.get(i).draw(canvas, parentMatrix, parentAlpha);
}
}
@Override public void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
super.setProgress(progress);
progress -= layerModel.getStartProgress();
for (int i = layers.size() - 1; i >= 0; i--) {
layers.get(i).setProgress(progress);
}
}
boolean hasMasks() {
for (int i = layers.size() - 1; i >= 0; i--) {
BaseLayer layer = layers.get(i);
if (layer instanceof ShapeLayer) {
if (layer.hasMasksOnThisLayer()) {
return true;
}
}
}
return false;
}
boolean hasMatte() {
if (hasMatteOnThisLayer()) {
return true;
}
for (int i = layers.size() - 1; i >= 0; i--) {
if (layers.get(i).hasMatteOnThisLayer()) {
return true;
}
}
return false;
}
}