1 package com.airbnb.lottie.parser; 2 3 import androidx.annotation.Nullable; 4 5 import com.airbnb.lottie.LottieComposition; 6 import com.airbnb.lottie.model.content.ContentModel; 7 import com.airbnb.lottie.parser.moshi.JsonReader; 8 import com.airbnb.lottie.utils.Logger; 9 10 import java.io.IOException; 11 12 class ContentModelParser { 13 14 private static final JsonReader.Options NAMES = JsonReader.Options.of( 15 "ty", 16 "d" 17 ); 18 ContentModelParser()19 private ContentModelParser() { 20 } 21 22 @Nullable parse(JsonReader reader, LottieComposition composition)23 static ContentModel parse(JsonReader reader, LottieComposition composition) 24 throws IOException { 25 String type = null; 26 27 reader.beginObject(); 28 // Unfortunately, for an ellipse, d is before "ty" which means that it will get parsed 29 // before we are in the ellipse parser. 30 // "d" is 2 for normal and 3 for reversed. 31 int d = 2; 32 typeLoop: 33 while (reader.hasNext()) { 34 switch (reader.selectName(NAMES)) { 35 case 0: 36 type = reader.nextString(); 37 break typeLoop; 38 case 1: 39 d = reader.nextInt(); 40 break; 41 default: 42 reader.skipName(); 43 reader.skipValue(); 44 } 45 } 46 47 if (type == null) { 48 return null; 49 } 50 51 ContentModel model = null; 52 switch (type) { 53 case "gr": 54 model = ShapeGroupParser.parse(reader, composition); 55 break; 56 case "st": 57 model = ShapeStrokeParser.parse(reader, composition); 58 break; 59 case "gs": 60 model = GradientStrokeParser.parse(reader, composition); 61 break; 62 case "fl": 63 model = ShapeFillParser.parse(reader, composition); 64 break; 65 case "gf": 66 model = GradientFillParser.parse(reader, composition); 67 break; 68 case "tr": 69 model = AnimatableTransformParser.parse(reader, composition); 70 break; 71 case "sh": 72 model = ShapePathParser.parse(reader, composition); 73 break; 74 case "el": 75 model = CircleShapeParser.parse(reader, composition, d); 76 break; 77 case "rc": 78 model = RectangleShapeParser.parse(reader, composition); 79 break; 80 case "tm": 81 model = ShapeTrimPathParser.parse(reader, composition); 82 break; 83 case "sr": 84 model = PolystarShapeParser.parse(reader, composition, d); 85 break; 86 case "mm": 87 model = MergePathsParser.parse(reader); 88 composition.addWarning("Animation contains merge paths. Merge paths are only " + 89 "supported on KitKat+ and must be manually enabled by calling " + 90 "enableMergePathsForKitKatAndAbove()."); 91 break; 92 case "rp": 93 model = RepeaterParser.parse(reader, composition); 94 break; 95 case "rd": 96 model = RoundedCornersParser.parse(reader, composition); 97 break; 98 default: 99 Logger.warning("Unknown shape type " + type); 100 } 101 102 while (reader.hasNext()) { 103 reader.skipValue(); 104 } 105 reader.endObject(); 106 107 return model; 108 } 109 } 110