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 
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
index 9153f4c..009b3c1 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.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 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 @@
 
   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 @@
         continue;
       }
       remainingTasks += 1;
+      Log.d(L.TAG, "Enqueueing " + animation);
       executor.execute(new Runnable() {
         @Override
         public void run() {
@@ -103,19 +106,24 @@
   }
 
   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 @@
     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 0000000..b2afbf3
--- /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 f03f528..79ecf25 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.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 @@
   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 4c9b0b2..e851c21 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 @@
 
 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 @@
     }
     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());
       }
     }