aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Peal <gpeal@users.noreply.github.com>2018-08-04 13:23:31 -0700
committerGitHub <noreply@github.com>2018-08-04 13:23:31 -0700
commit4750fbd71bddb2b7f7303bf7ec2ed877cf0a542e (patch)
tree886d3715e74573e300b17ac09a1318ebf159d3ac
parent3f9ee24b530d21414fbc5eddc7c52f2d23fc89cb (diff)
downloadlottie-4750fbd71bddb2b7f7303bf7ec2ed877cf0a542e.tar.gz
Allow shapes with different point counts but warn (#865)
Previously, Lottie would crash and not even try to render animations with shapes that had a different number of vertices. Now Lottie logs a warnings but renders the first n points where n is the min number of points between the two shapes. Fixes #856
-rw-r--r--LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java21
-rw-r--r--LottieSample/src/main/assets/Tests/DifferentPointsCount.json1
-rw-r--r--lottie/src/main/java/com/airbnb/lottie/L.java15
-rw-r--r--lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java19
4 files changed, 42 insertions, 14 deletions
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
index 9153f4c5..009b3c1b 100644
--- a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
+++ b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
@@ -7,9 +7,11 @@ import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PointF;
+import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.os.Environment;
import android.support.annotation.Nullable;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.ViewGroup;
@@ -26,6 +28,7 @@ import com.airbnb.lottie.value.ScaleXY;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -48,8 +51,7 @@ public class LottieSnapshotProvider extends SnapshotProvider {
LottieSnapshotProvider(Context context) {
this.context = context;
- dummyBitmap = BitmapFactory.decodeResource(context.getResources(), com.airbnb.lottie.samples.R
- .drawable.airbnb);
+ dummyBitmap = BitmapFactory.decodeResource(context.getResources(), com.airbnb.lottie.samples.R.drawable.airbnb);
}
@Override
@@ -92,6 +94,7 @@ public class LottieSnapshotProvider extends SnapshotProvider {
continue;
}
remainingTasks += 1;
+ Log.d(L.TAG, "Enqueueing " + animation);
executor.execute(new Runnable() {
@Override
public void run() {
@@ -103,19 +106,24 @@ public class LottieSnapshotProvider extends SnapshotProvider {
}
private void runAnimation(final String name) {
+ Log.d(L.TAG, "Running " + name);
LottieResult<LottieComposition> result = LottieCompositionFactory.fromAssetSync(context, name);
if (result.getException() != null) throw new IllegalStateException(result.getException());
LottieComposition composition = result.getValue();
- if (composition.getBounds().width() > 4 * Resources.getSystem().getDisplayMetrics().widthPixels ||
- composition.getBounds().height() > 4 * Resources.getSystem().getDisplayMetrics().heightPixels) {
- Log.d("Happo", "" + name + " is too large. Skipping (" + composition.getBounds().width() +
- "x" + composition.getBounds().height() + ")");
+
+ Rect bounds = composition.getBounds();
+ int width = bounds.width();
+ int height = bounds.height();
+ DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
+ if (width > 4 * displayMetrics.widthPixels || height > 4 * displayMetrics.heightPixels) {
+ Log.d("Happo", name + " is too large. Skipping (" + width + "x" + height + ")");
return;
}
drawComposition(composition, name);
}
private void drawComposition(LottieComposition composition, String name) {
+ Log.d(L.TAG, "Drawing " + name);
LottieAnimationView view = new LottieAnimationView(context);
view.setImageAssetDelegate(new ImageAssetDelegate() {
@Override public Bitmap fetchBitmap(LottieImageAsset asset) {
@@ -125,6 +133,7 @@ public class LottieSnapshotProvider extends SnapshotProvider {
view.setComposition(composition);
for (float progress : PROGRESS) {
view.setProgress(progress);
+ Log.d(L.TAG, "Recording " + name + " @ " + progress);
recordSnapshot(view, 1080, "android", name, Integer.toString((int) (progress * 100)));
}
}
diff --git a/LottieSample/src/main/assets/Tests/DifferentPointsCount.json b/LottieSample/src/main/assets/Tests/DifferentPointsCount.json
new file mode 100644
index 00000000..b2afbf36
--- /dev/null
+++ b/LottieSample/src/main/assets/Tests/DifferentPointsCount.json
@@ -0,0 +1 @@
+{"v":"5.1.4","fr":30,"ip":0,"op":153,"w":1080,"h":1080,"nm":"Web screeen 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 17","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[500,500,100],"ix":6}},"ao":0,"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.324,1.324,0],"ix":2},"a":{"a":0,"k":[341.824,952.324,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.867,900.696],[378.494,915.654]],"c":true}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[399.527,895.156],[378.494,915.654]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[399.527,895.156],[378.494,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[395.119,899.547],[378.494,915.654]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[395.119,899.547],[378.494,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[389.502,905.13],[378.494,915.654]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[389.502,905.13],[378.494,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.836,900.728],[378.494,915.654]],"c":true}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[289.647,1004.619]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[294.256,1000.027]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[294.256,1000.027]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[283.596,1010.567]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[283.596,1010.567]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[291.527,1002.498]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[291.527,1002.498]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[305.154,988.994],[289.661,1004.603]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[297.799,908.277],[305.154,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[276.99,887.485],[305.154,915.654]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[276.99,887.485],[305.154,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[289.594,900.082],[305.154,915.654]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[289.594,900.082],[305.154,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[295.999,906.477],[305.154,915.654]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[295.999,906.477],[305.154,915.654]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[297.786,908.264],[305.154,915.654]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[389.061,999.558]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[393.86,1004.359]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[393.86,1004.359]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[388.661,999.158]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[388.661,999.158]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[396.463,1006.957]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[396.463,1006.957]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[378.494,988.994],[389.115,999.612]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.324,1.324,0],"ix":2},"a":{"a":0,"k":[341.824,952.324,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.071,883.769],[341.824,900.465]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.085,878.969],[341.824,900.465]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.085,878.969],[341.824,900.465]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.071,870.168],[341.824,900.465]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.071,870.168],[341.824,900.465]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.042,880.568],[341.824,900.465]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.042,880.568],[341.824,900.465]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[342.071,883.745],[341.824,900.465]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.071,1033.278]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.085,1027.279]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.085,1027.279]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.071,1020.078]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.071,1020.078]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.042,1029.279]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.042,1029.279]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[341.824,1004.183],[342.071,1033.25]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[272.869,952.523],[289.965,952.324]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[266.069,952.561],[289.965,952.324]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[266.069,952.561],[289.965,952.324]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[269.269,952.523],[289.965,952.324]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[269.269,952.523],[289.965,952.324]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[261.669,952.445],[289.965,952.324]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[261.669,952.445],[289.965,952.324]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[272.788,952.522],[289.965,952.324]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[413.58,952.523]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[407.58,952.561]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":39,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[407.58,952.561]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[418.78,952.523]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"n":"0p833_1_0p167_0","t":78,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[418.78,952.523]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[410.38,952.445]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"n":"0p833_0p833_0p167_0","t":118,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[410.38,952.445]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[393.683,952.324],[413.557,952.522]],"c":false}]},{"t":152}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.324,1.324,0],"ix":2},"a":{"a":0,"k":[341.824,952.324,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,20.122],[20.122,0],[0,-20.122],[-20.122,0]],"o":[[0,-20.122],[-20.122,0],[0,20.122],[20.122,0]],"v":[[378.258,952.324],[341.824,915.89],[305.391,952.324],[341.824,988.757]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.858823529412,0.243137254902,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12.5,"ix":5},"lc":1,"lj":1,"ml":10,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":181,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/L.java b/lottie/src/main/java/com/airbnb/lottie/L.java
index f03f5280..79ecf25b 100644
--- a/lottie/src/main/java/com/airbnb/lottie/L.java
+++ b/lottie/src/main/java/com/airbnb/lottie/L.java
@@ -4,11 +4,19 @@ import android.support.annotation.RestrictTo;
import android.support.v4.os.TraceCompat;
import android.util.Log;
+import java.util.HashSet;
+import java.util.Set;
+
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class L {
public static final String TAG = "LOTTIE";
public static final boolean DBG = false;
+ /**
+ * Set to ensure that we only log each message one time max.
+ */
+ private static final Set<String> loggedMessages = new HashSet<>();
+
private static final int MAX_DEPTH = 20;
private static boolean traceEnabled = false;
private static String[] sections;
@@ -16,8 +24,15 @@ public class L {
private static int traceDepth = 0;
private static int depthPastMaxDepth = 0;
+ /**
+ * Warn to logcat. Keeps track of messages so they are only logged once ever.
+ */
public static void warn(String msg) {
+ if (loggedMessages.contains(msg)) {
+ return;
+ }
Log.w(TAG, msg);
+ loggedMessages.add(msg);
}
public static void setTraceEnabled(boolean enabled) {
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 4c9b0b2a..e851c210 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
@@ -2,7 +2,9 @@ package com.airbnb.lottie.model.content;
import android.graphics.PointF;
import android.support.annotation.FloatRange;
+import android.util.Log;
+import com.airbnb.lottie.L;
import com.airbnb.lottie.model.CubicCurveData;
import com.airbnb.lottie.utils.MiscUtils;
@@ -49,14 +51,15 @@ public class ShapeData {
}
closed = shapeData1.isClosed() || shapeData2.isClosed();
- if (!curves.isEmpty() && curves.size() != shapeData1.getCurves().size()
- && curves.size() != shapeData2.getCurves().size()) {
- throw new IllegalStateException("Curves must have the same number of control points. This: "
- + getCurves().size()
- + "\tShape 1: " + shapeData1.getCurves().size() + "\tShape 2: "
- + shapeData2.getCurves().size());
- } else if (curves.isEmpty()) {
- for (int i = shapeData1.getCurves().size() - 1; i >= 0; i--) {
+
+ if (shapeData1.getCurves().size() != shapeData2.getCurves().size()) {
+ L.warn("Curves must have the same number of control points. Shape 1: " +
+ shapeData1.getCurves().size() + "\tShape 2: " + shapeData2.getCurves().size());
+ }
+
+ if (curves.isEmpty()) {
+ int points = Math.min(shapeData1.getCurves().size(), shapeData2.getCurves().size());
+ for (int i = 0; i < points; i++) {
curves.add(new CubicCurveData());
}
}