package com.airbnb.lottie;
import android.graphics.Path;
import android.support.annotation.Nullable;
import org.json.JSONException;
import org.json.JSONObject;
class GradientFill {
private final GradientType gradientType;
private final Path.FillType fillType;
private final AnimatableGradientColorValue gradientColor;
private final AnimatableIntegerValue opacity;
private final AnimatablePointValue startPoint;
private final AnimatablePointValue endPoint;
private final String name;
@Nullable private final AnimatableFloatValue highlightLength;
@Nullable private final AnimatableFloatValue highlightAngle;
private GradientFill(String name, GradientType gradientType, Path.FillType fillType,
AnimatableGradientColorValue gradientColor,
AnimatableIntegerValue opacity, AnimatablePointValue startPoint,
AnimatablePointValue endPoint, AnimatableFloatValue highlightLength,
AnimatableFloatValue highlightAngle) {
this.gradientType = gradientType;
this.fillType = fillType;
this.gradientColor = gradientColor;
this.opacity = opacity;
this.startPoint = startPoint;
this.endPoint = endPoint;
this.name = name;
this.highlightLength = highlightLength;
this.highlightAngle = highlightAngle;
}
String getName() {
return name;
}
GradientType getGradientType() {
return gradientType;
}
Path.FillType getFillType() {
return fillType;
}
AnimatableGradientColorValue getGradientColor() {
return gradientColor;
}
AnimatableIntegerValue getOpacity() {
return opacity;
}
AnimatablePointValue getStartPoint() {
return startPoint;
}
AnimatablePointValue getEndPoint() {
return endPoint;
}
@Nullable AnimatableFloatValue getHighlightLength() {
return highlightLength;
}
@Nullable AnimatableFloatValue getHighlightAngle() {
return highlightAngle;
}
static class Factory {
private Factory() {
}
static GradientFill newInstance(JSONObject json, LottieComposition composition) {
final String name = json.optString("nm");
JSONObject jsonColor = json.optJSONObject("g");
if (jsonColor != null && jsonColor.has("k")) {
// This is a hack because the "p" value which contains the number of color points is outside
// of "k" which contains the useful data.
int points = jsonColor.optInt("p");
jsonColor = jsonColor.optJSONObject("k");
try {
jsonColor.put("p", points);
} catch (JSONException e) {
// Do nothing. This shouldn't fail.
}
}
AnimatableGradientColorValue color = null;
if (jsonColor != null) {
color = AnimatableGradientColorValue.Factory.newInstance(jsonColor, composition);
}
JSONObject jsonOpacity = json.optJSONObject("o");
AnimatableIntegerValue opacity = null;
if (jsonOpacity != null) {
opacity = AnimatableIntegerValue.Factory.newInstance(jsonOpacity, composition);
}
int fillTypeInt = json.optInt("r", 1);
Path.FillType fillType = fillTypeInt == 1 ? Path.FillType.WINDING : Path.FillType.EVEN_ODD;
int gradientTypeInt = json.optInt("t", 1);
GradientType gradientType = gradientTypeInt == 1 ? GradientType.Linear : GradientType.Radial;
JSONObject jsonStartPoint = json.optJSONObject("s");
AnimatablePointValue startPoint = null;
if (jsonStartPoint != null) {
startPoint = AnimatablePointValue.Factory.newInstance(jsonStartPoint, composition);
}
JSONObject jsonEndPoint = json.optJSONObject("e");
AnimatablePointValue endPoint = null;
if (jsonEndPoint != null) {
endPoint = AnimatablePointValue.Factory.newInstance(jsonEndPoint, composition);
}
return new GradientFill(name, gradientType, fillType, color, opacity, startPoint, endPoint,
null, null);
}
}
}