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