Added support for inverted intersect masks (#1137)
Also cleaned up some stuff from the original masks PR.
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index 3ef4f62..7c14f39 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -292,15 +292,6 @@
return PixelFormat.TRANSLUCENT;
}
- private void drawRect(Canvas canvas, float lp, float tp, float rp, float bp, @Nullable PorterDuff.Mode mode, int color) {
- Paint paint = new Paint();
- paint.setColor(color);
- if (mode != null) {
- paint.setXfermode(new PorterDuffXfermode(mode));
- }
- canvas.drawRect(canvas.getWidth() * lp, canvas.getHeight() * tp, canvas.getWidth() * rp, canvas.getHeight() * bp, paint);
- }
-
@Override
public void draw(@NonNull Canvas canvas) {
isDirty = false;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
index 988408a..f2a3ed0 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
@@ -66,11 +66,7 @@
private final Matrix matrix = new Matrix();
private final Paint contentPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
private final Paint dstInPaint = new LPaint(Paint.ANTI_ALIAS_FLAG, PorterDuff.Mode.DST_IN);
- private final Paint addMaskPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
- private final Paint addInvMaskLayerPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
- private final Paint addInvMaskPaintClear = new LPaint(Paint.ANTI_ALIAS_FLAG, PorterDuff.Mode.CLEAR);
- private final Paint subtractMaskStartingPaintNormal = new LPaint(Paint.ANTI_ALIAS_FLAG);
- private final Paint subtractMaskPaintDstOut = new LPaint(Paint.ANTI_ALIAS_FLAG, PorterDuff.Mode.DST_OUT);
+ private final Paint dstOutPaint = new LPaint(Paint.ANTI_ALIAS_FLAG, PorterDuff.Mode.DST_OUT);
private final Paint mattePaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
private final Paint clearPaint = new LPaint(PorterDuff.Mode.CLEAR);
private final RectF rect = new RectF();
@@ -101,8 +97,6 @@
this.lottieDrawable = lottieDrawable;
this.layerModel = layerModel;
drawTraceName = layerModel.getName() + "#draw";
- addMaskPaint.setColor(Color.BLUE);
- subtractMaskStartingPaintNormal.setColor(Color.BLACK);
if (layerModel.getMatteType() == Layer.MatteType.INVERT) {
mattePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
} else {
@@ -371,7 +365,6 @@
private void applyMasks(Canvas canvas, Matrix matrix) {
L.beginSection("Layer#saveLayer");
saveLayerCompat(canvas, rect, dstInPaint, false);
-// canvas.drawRect(rect.left, rect.top, rect.right, rect.bottom, subtractMaskStartingPaintNormal);
L.endSection("Layer#saveLayer");
for (int i = 0; i < mask.getMasks().size(); i++) {
Mask mask = this.mask.getMasks().get(i);
@@ -399,7 +392,11 @@
}
break;
case MASK_MODE_INTERSECT:
- applyIntersectMask(canvas, matrix, mask, maskAnimation, opacityAnimation);
+ if (mask.isInverted()) {
+ applyInvertedIntersectMask(canvas, matrix, mask, maskAnimation, opacityAnimation);
+ } else {
+ applyIntersectMask(canvas, matrix, mask, maskAnimation, opacityAnimation);
+ }
break;
}
}
@@ -413,19 +410,19 @@
Path maskPath = maskAnimation.getValue();
path.set(maskPath);
path.transform(matrix);
- addMaskPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
- canvas.drawPath(path, addMaskPaint);
+ contentPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
+ canvas.drawPath(path, contentPaint);
}
private void applyInvertedAddMask(Canvas canvas, Matrix matrix, Mask mask,
BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
- saveLayerCompat(canvas, rect, addInvMaskLayerPaint, true);
- canvas.drawRect(rect, addInvMaskLayerPaint);
+ saveLayerCompat(canvas, rect, contentPaint, true);
+ canvas.drawRect(rect, contentPaint);
Path maskPath = maskAnimation.getValue();
path.set(maskPath);
path.transform(matrix);
- addMaskPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
- canvas.drawPath(path, addInvMaskPaintClear);
+ contentPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
+ canvas.drawPath(path, dstOutPaint);
canvas.restore();
}
@@ -434,18 +431,18 @@
Path maskPath = maskAnimation.getValue();
path.set(maskPath);
path.transform(matrix);
- canvas.drawPath(path, subtractMaskPaintDstOut);
+ canvas.drawPath(path, dstOutPaint);
}
private void applyInvertedSubtractMask(Canvas canvas, Matrix matrix, Mask mask,
BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
- saveLayerCompat(canvas, rect, subtractMaskPaintDstOut, true);
- canvas.drawRect(rect, subtractMaskStartingPaintNormal);
- subtractMaskPaintDstOut.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
+ saveLayerCompat(canvas, rect, dstOutPaint, true);
+ canvas.drawRect(rect, contentPaint);
+ dstOutPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
Path maskPath = maskAnimation.getValue();
path.set(maskPath);
path.transform(matrix);
- canvas.drawPath(path, subtractMaskPaintDstOut);
+ canvas.drawPath(path, dstOutPaint);
canvas.restore();
}
@@ -460,6 +457,18 @@
canvas.restore();
}
+ private void applyInvertedIntersectMask(Canvas canvas, Matrix matrix, Mask mask,
+ BaseKeyframeAnimation<ShapeData, Path> maskAnimation, BaseKeyframeAnimation<Integer, Integer> opacityAnimation) {
+ saveLayerCompat(canvas, rect, dstInPaint, true);
+ canvas.drawRect(rect, contentPaint);
+ dstOutPaint.setAlpha((int) (opacityAnimation.getValue() * 2.55f));
+ Path maskPath = maskAnimation.getValue();
+ path.set(maskPath);
+ path.transform(matrix);
+ canvas.drawPath(path, dstOutPaint);
+ canvas.restore();
+ }
+
boolean hasMasksOnThisLayer() {
return mask != null && !mask.getMaskAnimations().isEmpty();
}