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