From 1afeb86238f9aa47aa72aff778f6a31817a0678f Mon Sep 17 00:00:00 2001 From: Gabriel Peal Date: Fri, 11 Nov 2022 23:33:09 -0600 Subject: [PATCH] Pass LottieComposition to all content when it is generated --- .../airbnb/lottie/animation/content/ContentGroup.java | 9 +++++---- .../lottie/animation/content/GradientFillContent.java | 5 +++-- .../lottie/model/animatable/AnimatableTransform.java | 3 ++- .../com/airbnb/lottie/model/content/CircleShape.java | 3 ++- .../com/airbnb/lottie/model/content/ContentModel.java | 3 ++- .../com/airbnb/lottie/model/content/GradientFill.java | 5 +++-- .../com/airbnb/lottie/model/content/GradientStroke.java | 3 ++- .../java/com/airbnb/lottie/model/content/MergePaths.java | 3 ++- .../com/airbnb/lottie/model/content/PolystarShape.java | 3 ++- .../com/airbnb/lottie/model/content/RectangleShape.java | 3 ++- .../java/com/airbnb/lottie/model/content/Repeater.java | 3 ++- .../com/airbnb/lottie/model/content/RoundedCorners.java | 3 ++- .../java/com/airbnb/lottie/model/content/ShapeFill.java | 3 ++- .../java/com/airbnb/lottie/model/content/ShapeGroup.java | 5 +++-- .../java/com/airbnb/lottie/model/content/ShapePath.java | 3 ++- .../com/airbnb/lottie/model/content/ShapeStroke.java | 3 ++- .../com/airbnb/lottie/model/content/ShapeTrimPath.java | 3 ++- .../java/com/airbnb/lottie/model/layer/BaseLayer.java | 2 +- .../java/com/airbnb/lottie/model/layer/ShapeLayer.java | 5 +++-- .../java/com/airbnb/lottie/model/layer/TextLayer.java | 2 +- 20 files changed, 45 insertions(+), 27 deletions(-) diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java index 1db7f55d0e..099e28b429 100644 --- a/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java +++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java @@ -8,6 +8,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.LPaint; import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation; @@ -30,11 +31,11 @@ public class ContentGroup implements DrawingContent, PathContent, private final Paint offScreenPaint = new LPaint(); private final RectF offScreenRectF = new RectF(); - private static List contentsFromModels(LottieDrawable drawable, BaseLayer layer, + private static List contentsFromModels(LottieDrawable drawable, LottieComposition composition, BaseLayer layer, List contentModels) { List contents = new ArrayList<>(contentModels.size()); for (int i = 0; i < contentModels.size(); i++) { - Content content = contentModels.get(i).toContent(drawable, layer); + Content content = contentModels.get(i).toContent(drawable, composition, layer); if (content != null) { contents.add(content); } @@ -63,9 +64,9 @@ private static List contentsFromModels(LottieDrawable drawable, BaseLay @Nullable private List pathContents; @Nullable private TransformKeyframeAnimation transformAnimation; - public ContentGroup(final LottieDrawable lottieDrawable, BaseLayer layer, ShapeGroup shapeGroup) { + public ContentGroup(final LottieDrawable lottieDrawable, BaseLayer layer, ShapeGroup shapeGroup, LottieComposition composition) { this(lottieDrawable, layer, shapeGroup.getName(), - shapeGroup.isHidden(), contentsFromModels(lottieDrawable, layer, shapeGroup.getItems()), + shapeGroup.isHidden(), contentsFromModels(lottieDrawable, composition, layer, shapeGroup.getItems()), findTransform(shapeGroup.getItems())); } 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 272a3a0210..16def6649e 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 @@ -19,6 +19,7 @@ import androidx.collection.LongSparseArray; import com.airbnb.lottie.L; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.LottieProperty; import com.airbnb.lottie.animation.LPaint; @@ -64,14 +65,14 @@ public class GradientFillContent float blurMaskFilterRadius = 0f; @Nullable private DropShadowKeyframeAnimation dropShadowAnimation; - public GradientFillContent(final LottieDrawable lottieDrawable, BaseLayer layer, GradientFill fill) { + public GradientFillContent(final LottieDrawable lottieDrawable, LottieComposition composition, BaseLayer layer, GradientFill fill) { this.layer = layer; name = fill.getName(); hidden = fill.isHidden(); this.lottieDrawable = lottieDrawable; type = fill.getGradientType(); path.setFillType(fill.getFillType()); - cacheSteps = (int) (lottieDrawable.getComposition().getDuration() / CACHE_STEPS_MS); + cacheSteps = (int) (composition.getDuration() / CACHE_STEPS_MS); colorAnimation = fill.getGradientColor().createAnimation(); colorAnimation.addUpdateListener(this); diff --git a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java index 2fb5ac93d3..14bd173eef 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.ModifierContent; @@ -104,7 +105,7 @@ public TransformKeyframeAnimation createAnimation() { @Nullable @Override - public Content toContent(LottieDrawable drawable, BaseLayer layer) { + public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return null; } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/CircleShape.java b/lottie/src/main/java/com/airbnb/lottie/model/content/CircleShape.java index 9d7add698d..fd7cd23ba6 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/CircleShape.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/CircleShape.java @@ -2,6 +2,7 @@ import android.graphics.PointF; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.EllipseContent; @@ -25,7 +26,7 @@ public CircleShape(String name, AnimatableValue position, this.hidden = hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new EllipseContent(drawable, layer, this); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java index 2e926857d1..a506047108 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java @@ -3,10 +3,11 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.model.layer.BaseLayer; public interface ContentModel { - @Nullable Content toContent(LottieDrawable drawable, BaseLayer layer); + @Nullable Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java index 87ecf3a0b3..9a082809c5 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.GradientFillContent; @@ -75,8 +76,8 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { - return new GradientFillContent(drawable, layer, this); + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { + return new GradientFillContent(drawable, composition, layer, this); } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java index 837277c33a..6e4b2029a7 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java @@ -2,6 +2,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.GradientStrokeContent; @@ -103,7 +104,7 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new GradientStrokeContent(drawable, layer, this); } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java b/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java index f8d4453ff1..315add2d08 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java @@ -2,6 +2,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.MergePathsContent; @@ -58,7 +59,7 @@ public boolean isHidden() { return hidden; } - @Override @Nullable public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override @Nullable public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { if (!drawable.enableMergePathsForKitKatAndAbove()) { Logger.warning("Animation contains merge paths but they are disabled."); return null; diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/PolystarShape.java b/lottie/src/main/java/com/airbnb/lottie/model/content/PolystarShape.java index e7d805ad53..45144221fe 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/PolystarShape.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/PolystarShape.java @@ -2,6 +2,7 @@ import android.graphics.PointF; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.PolystarContent; @@ -104,7 +105,7 @@ public boolean isReversed() { return isReversed; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new PolystarContent(drawable, layer, this); } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/RectangleShape.java b/lottie/src/main/java/com/airbnb/lottie/model/content/RectangleShape.java index 6edd0303ba..13b1f4d4a6 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/RectangleShape.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/RectangleShape.java @@ -2,6 +2,7 @@ import android.graphics.PointF; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.RectangleContent; @@ -45,7 +46,7 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new RectangleContent(drawable, layer, this); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java b/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java index f031aa73ea..f336391e82 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java @@ -2,6 +2,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.RepeaterContent; @@ -45,7 +46,7 @@ public boolean isHidden() { return hidden; } - @Nullable @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Nullable @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new RepeaterContent(drawable, layer, this); } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/RoundedCorners.java b/lottie/src/main/java/com/airbnb/lottie/model/content/RoundedCorners.java index 0541e4686e..8daa5378fd 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/RoundedCorners.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/RoundedCorners.java @@ -2,6 +2,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.RoundedCornersContent; @@ -25,7 +26,7 @@ public AnimatableValue getCornerRadius() { return cornerRadius; } - @Nullable @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Nullable @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new RoundedCornersContent(drawable, layer, this); } } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java index f992d107bb..a3364ac251 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.FillContent; @@ -49,7 +50,7 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new FillContent(drawable, layer, this); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeGroup.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeGroup.java index ed332bc16f..5865d6ed0e 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeGroup.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeGroup.java @@ -1,5 +1,6 @@ package com.airbnb.lottie.model.content; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.ContentGroup; @@ -31,8 +32,8 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { - return new ContentGroup(drawable, layer, this); + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { + return new ContentGroup(drawable, layer, this, composition); } @Override public String toString() { diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapePath.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapePath.java index af161998bc..9ae952b2f7 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapePath.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapePath.java @@ -1,5 +1,6 @@ package com.airbnb.lottie.model.content; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.ShapeContent; @@ -27,7 +28,7 @@ public AnimatableShapeValue getShapePath() { return shapePath; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new ShapeContent(drawable, layer, this); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java index dacb6bea0c..4c900585f0 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java @@ -4,6 +4,7 @@ import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.StrokeContent; @@ -78,7 +79,7 @@ public ShapeStroke(String name, @Nullable AnimatableFloatValue offset, this.hidden = hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new StrokeContent(drawable, layer, this); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeTrimPath.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeTrimPath.java index bf75948c76..b86e5ed2b3 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeTrimPath.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeTrimPath.java @@ -1,5 +1,6 @@ package com.airbnb.lottie.model.content; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.TrimPathContent; @@ -65,7 +66,7 @@ public boolean isHidden() { return hidden; } - @Override public Content toContent(LottieDrawable drawable, BaseLayer layer) { + @Override public Content toContent(LottieDrawable drawable, LottieComposition composition, BaseLayer layer) { return new TrimPathContent(layer, this); } 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 14b1c66731..e28a6f75d9 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 @@ -55,7 +55,7 @@ static BaseLayer forModel( CompositionLayer compositionLayer, Layer layerModel, LottieDrawable drawable, LottieComposition composition) { switch (layerModel.getLayerType()) { case SHAPE: - return new ShapeLayer(drawable, layerModel, compositionLayer); + return new ShapeLayer(drawable, layerModel, compositionLayer, composition); case PRE_COMP: return new CompositionLayer(drawable, layerModel, composition.getPrecomps(layerModel.getRefId()), composition); diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java index 4250d8eda2..3a82138f2c 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.airbnb.lottie.LottieComposition; import com.airbnb.lottie.LottieDrawable; import com.airbnb.lottie.animation.content.Content; import com.airbnb.lottie.animation.content.ContentGroup; @@ -22,13 +23,13 @@ public class ShapeLayer extends BaseLayer { private final ContentGroup contentGroup; private final CompositionLayer compositionLayer; - ShapeLayer(LottieDrawable lottieDrawable, Layer layerModel, CompositionLayer compositionLayer) { + ShapeLayer(LottieDrawable lottieDrawable, Layer layerModel, CompositionLayer compositionLayer, LottieComposition composition) { super(lottieDrawable, layerModel); this.compositionLayer = compositionLayer; // Naming this __container allows it to be ignored in KeyPath matching. ShapeGroup shapeGroup = new ShapeGroup("__container", layerModel.getShapes(), false); - contentGroup = new ContentGroup(lottieDrawable, this, shapeGroup); + contentGroup = new ContentGroup(lottieDrawable, this, shapeGroup, composition); contentGroup.setContents(Collections.emptyList(), Collections.emptyList()); } diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java index 42f23950a1..9f737ec3b4 100644 --- a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java +++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java @@ -426,7 +426,7 @@ private List getContentsForCharacter(FontCharacter character) { List contents = new ArrayList<>(size); for (int i = 0; i < size; i++) { ShapeGroup sg = shapes.get(i); - contents.add(new ContentGroup(lottieDrawable, this, sg)); + contents.add(new ContentGroup(lottieDrawable, this, sg, composition)); } contentsForCharacter.put(character, contents); return contents;