Created LPaint (#1045)

diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/LPaint.java b/lottie/src/main/java/com/airbnb/lottie/animation/LPaint.java
new file mode 100644
index 0000000..0462a1d
--- /dev/null
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/LPaint.java
@@ -0,0 +1,25 @@
+package com.airbnb.lottie.animation;
+
+import android.graphics.Paint;
+import android.os.LocaleList;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Custom paint that doesn't set text locale.
+ * It takes ~1ms on initialization and isn't needed so removing it speeds up
+ * setComposition.
+ */
+public class LPaint extends Paint {
+    public LPaint() {
+    }
+
+    public LPaint(int flags) {
+        super(flags);
+    }
+
+    @Override
+    public void setTextLocales(@NonNull LocaleList locales) {
+        // Do nothing.
+    }
+}
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
index af64225..06080dd 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
@@ -14,6 +14,7 @@
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.FloatKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.IntegerKeyframeAnimation;
@@ -43,7 +44,7 @@
   private final BaseLayer layer;
   private final List<PathGroup> pathGroups = new ArrayList<>();
   private final float[] dashPatternValues;
-  final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+  final Paint paint = new LPaint(Paint.ANTI_ALIAS_FLAG);
 
   private final BaseKeyframeAnimation<?, Float> widthAnimation;
   private final BaseKeyframeAnimation<?, Integer> opacityAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
index 1adc88b..4e3b838 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
@@ -11,6 +11,7 @@
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ColorKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ValueCallbackKeyframeAnimation;
@@ -28,7 +29,7 @@
 public class FillContent
     implements DrawingContent, BaseKeyframeAnimation.AnimationListener, KeyPathElementContent {
   private final Path path = new Path();
-  private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint paint = new LPaint(Paint.ANTI_ALIAS_FLAG);
   private final BaseLayer layer;
   private final String name;
   private final boolean hidden;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
index d6f64da..effa0fe 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
@@ -17,6 +17,7 @@
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ValueCallbackKeyframeAnimation;
 import com.airbnb.lottie.model.KeyPath;
@@ -45,7 +46,7 @@
   private final LongSparseArray<RadialGradient> radialGradientCache = new LongSparseArray<>();
   private final Matrix shaderMatrix = new Matrix();
   private final Path path = new Path();
-  private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint paint = new LPaint(Paint.ANTI_ALIAS_FLAG);
   private final RectF boundsRect = new RectF();
   private final List<PathContent> paths = new ArrayList<>();
   private final GradientType type;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
index 3dd38df..f3ccf25 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
@@ -1,5 +1,7 @@
 package com.airbnb.lottie.animation.keyframe;
 
+import android.util.Log;
+
 import com.airbnb.lottie.value.Keyframe;
 import com.airbnb.lottie.value.LottieValueCallback;
 
@@ -19,7 +21,7 @@
   }
 
   // This is not a Set because we don't want to create an iterator object on every setProgress.
-  final List<AnimationListener> listeners = new ArrayList<>();
+  final List<AnimationListener> listeners = new ArrayList<>(1);
   private boolean isDiscrete = false;
 
   private final List<? extends Keyframe<K>> keyframes;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
index e1413a2..7fdfda9 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
@@ -11,17 +11,18 @@
 import java.util.List;
 
 public class ShapeData {
-  private final List<CubicCurveData> curves = new ArrayList<>();
+  private final List<CubicCurveData> curves;
   private PointF initialPoint;
   private boolean closed;
 
   public ShapeData(PointF initialPoint, boolean closed, List<CubicCurveData> curves) {
     this.initialPoint = initialPoint;
     this.closed = closed;
-    this.curves.addAll(curves);
+    this.curves = new ArrayList<>(curves);
   }
 
   public ShapeData() {
+    curves = new ArrayList<>();
   }
 
   private void setInitialPoint(float x, float y) {
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 bc93848..f18f269 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
@@ -9,6 +9,7 @@
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieComposition;
 import com.airbnb.lottie.LottieDrawable;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.content.Content;
 import com.airbnb.lottie.animation.content.DrawingContent;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
@@ -62,11 +63,11 @@
 
   private final Path path = new Path();
   private final Matrix matrix = new Matrix();
-  private final Paint contentPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint addMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint subtractMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint mattePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-  private final Paint clearPaint = new Paint();
+  private final Paint contentPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint addMaskPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint subtractMaskPaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint mattePaint = new LPaint(Paint.ANTI_ALIAS_FLAG);
+  private final Paint clearPaint = new LPaint();
   private final RectF rect = new RectF();
   private final RectF maskBoundsRect = new RectF();
   private final RectF matteBoundsRect = new RectF();
@@ -224,7 +225,7 @@
     getBounds(rect, matrix, false);
 
     // Uncomment this to draw matte outlines.
-    /* Paint paint = new Paint();
+    /* Paint paint = new LPaint();
     paint.setColor(Color.RED);
     paint.setStyle(Paint.Style.STROKE);
     paint.setStrokeWidth(3);
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
index af5bc86..f7e9186 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
@@ -12,6 +12,7 @@
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ValueCallbackKeyframeAnimation;
 import com.airbnb.lottie.utils.Utils;
@@ -19,7 +20,7 @@
 
 public class ImageLayer extends BaseLayer {
 
-  private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+  private final Paint paint = new LPaint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
   private final Rect src = new Rect();
   private final Rect dst = new Rect();
   @Nullable private BaseKeyframeAnimation<ColorFilter, ColorFilter> colorFilterAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
index b2aec41..23e7cb3 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
@@ -11,14 +11,14 @@
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ValueCallbackKeyframeAnimation;
 import com.airbnb.lottie.value.LottieValueCallback;
 
 public class SolidLayer extends BaseLayer {
-
   private final RectF rect = new RectF();
-  private final Paint paint = new Paint();
+  private final Paint paint = new LPaint();
   private final float[] points = new float[8];
   private final Path path = new Path();
   private final Layer layerModel;
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
index 9956ae9..5bf7e00 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
@@ -15,6 +15,7 @@
 import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.L;
+import com.airbnb.lottie.animation.LPaint;
 import com.airbnb.lottie.animation.content.TrimPathContent;
 import com.airbnb.lottie.animation.keyframe.FloatKeyframeAnimation;
 
@@ -207,7 +208,7 @@
     path.computeBounds(bounds, false);
     Bitmap bitmap = Bitmap.createBitmap((int) bounds.right, (int) bounds.bottom, Bitmap.Config.ARGB_8888);
     Canvas canvas = new Canvas(bitmap);
-    Paint paint = new Paint();
+    Paint paint = new LPaint();
     paint.setAntiAlias(true);
     paint.setColor(Color.BLUE);
     canvas.drawPath(path, paint);