diff options
author | Gabriel Peal <gpeal@users.noreply.github.com> | 2018-08-04 13:23:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-04 13:23:31 -0700 |
commit | 4750fbd71bddb2b7f7303bf7ec2ed877cf0a542e (patch) | |
tree | 886d3715e74573e300b17ac09a1318ebf159d3ac | |
parent | 3f9ee24b530d21414fbc5eddc7c52f2d23fc89cb (diff) | |
download | lottie-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
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()); } } |