package androidx.vectordrawable.graphics.drawable; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Path; import android.graphics.PathMeasure; import android.util.AttributeSet; import android.view.InflateException; import android.view.animation.Interpolator; import androidx.annotation.RestrictTo; import androidx.core.content.res.TypedArrayUtils; import androidx.core.graphics.PathParser; import c.d.b.a.a; import org.xmlpull.v1.XmlPullParser; @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public class PathInterpolatorCompat implements Interpolator { public static final double EPSILON = 1.0E-5d; public static final int MAX_NUM_POINTS = 3000; private static final float PRECISION = 0.002f; private float[] mX; private float[] mY; public PathInterpolatorCompat(Context context, AttributeSet attributeSet, XmlPullParser xmlPullParser) { this(context.getResources(), context.getTheme(), attributeSet, xmlPullParser); } public PathInterpolatorCompat(Resources resources, Resources.Theme theme, AttributeSet attributeSet, XmlPullParser xmlPullParser) { TypedArray obtainAttributes = TypedArrayUtils.obtainAttributes(resources, theme, attributeSet, AndroidResources.STYLEABLE_PATH_INTERPOLATOR); parseInterpolatorFromTypeArray(obtainAttributes, xmlPullParser); obtainAttributes.recycle(); } private void initCubic(float f, float f2, float f3, float f4) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.cubicTo(f, f2, f3, f4, 1.0f, 1.0f); initPath(path); } private void initPath(Path path) { int i = 0; PathMeasure pathMeasure = new PathMeasure(path, false); float length = pathMeasure.getLength(); int min = Math.min(3000, ((int) (length / 0.002f)) + 1); if (min > 0) { this.mX = new float[min]; this.mY = new float[min]; float[] fArr = new float[2]; for (int i2 = 0; i2 < min; i2++) { pathMeasure.getPosTan((((float) i2) * length) / ((float) (min - 1)), fArr, null); this.mX[i2] = fArr[0]; this.mY[i2] = fArr[1]; } if (((double) Math.abs(this.mX[0])) <= 1.0E-5d && ((double) Math.abs(this.mY[0])) <= 1.0E-5d) { int i3 = min - 1; if (((double) Math.abs(this.mX[i3] - 1.0f)) <= 1.0E-5d && ((double) Math.abs(this.mY[i3] - 1.0f)) <= 1.0E-5d) { float f = 0.0f; int i4 = 0; while (i < min) { float[] fArr2 = this.mX; int i5 = i4 + 1; float f2 = fArr2[i4]; if (f2 >= f) { fArr2[i] = f2; i++; f = f2; i4 = i5; } else { throw new IllegalArgumentException("The Path cannot loop back on itself, x :" + f2); } } if (pathMeasure.nextContour()) { throw new IllegalArgumentException("The Path should be continuous, can't have 2+ contours"); } return; } } StringBuilder L = a.L("The Path must start at (0,0) and end at (1,1) start: "); L.append(this.mX[0]); L.append(","); L.append(this.mY[0]); L.append(" end:"); int i6 = min - 1; L.append(this.mX[i6]); L.append(","); L.append(this.mY[i6]); throw new IllegalArgumentException(L.toString()); } throw new IllegalArgumentException("The Path has a invalid length " + length); } private void initQuad(float f, float f2) { Path path = new Path(); path.moveTo(0.0f, 0.0f); path.quadTo(f, f2, 1.0f, 1.0f); initPath(path); } private void parseInterpolatorFromTypeArray(TypedArray typedArray, XmlPullParser xmlPullParser) { if (TypedArrayUtils.hasAttribute(xmlPullParser, "pathData")) { String namedString = TypedArrayUtils.getNamedString(typedArray, xmlPullParser, "pathData", 4); Path createPathFromPathData = PathParser.createPathFromPathData(namedString); if (createPathFromPathData != null) { initPath(createPathFromPathData); return; } throw new InflateException(a.t("The path is null, which is created from ", namedString)); } else if (!TypedArrayUtils.hasAttribute(xmlPullParser, "controlX1")) { throw new InflateException("pathInterpolator requires the controlX1 attribute"); } else if (TypedArrayUtils.hasAttribute(xmlPullParser, "controlY1")) { float namedFloat = TypedArrayUtils.getNamedFloat(typedArray, xmlPullParser, "controlX1", 0, 0.0f); float namedFloat2 = TypedArrayUtils.getNamedFloat(typedArray, xmlPullParser, "controlY1", 1, 0.0f); boolean hasAttribute = TypedArrayUtils.hasAttribute(xmlPullParser, "controlX2"); if (hasAttribute != TypedArrayUtils.hasAttribute(xmlPullParser, "controlY2")) { throw new InflateException("pathInterpolator requires both controlX2 and controlY2 for cubic Beziers."); } else if (!hasAttribute) { initQuad(namedFloat, namedFloat2); } else { initCubic(namedFloat, namedFloat2, TypedArrayUtils.getNamedFloat(typedArray, xmlPullParser, "controlX2", 2, 0.0f), TypedArrayUtils.getNamedFloat(typedArray, xmlPullParser, "controlY2", 3, 0.0f)); } } else { throw new InflateException("pathInterpolator requires the controlY1 attribute"); } } @Override // android.animation.TimeInterpolator public float getInterpolation(float f) { if (f <= 0.0f) { return 0.0f; } if (f >= 1.0f) { return 1.0f; } int i = 0; int length = this.mX.length - 1; while (length - i > 1) { int i2 = (i + length) / 2; if (f < this.mX[i2]) { length = i2; } else { i = i2; } } float[] fArr = this.mX; float f2 = fArr[length] - fArr[i]; if (f2 == 0.0f) { return this.mY[i]; } float[] fArr2 = this.mY; float f3 = fArr2[i]; return a.a(fArr2[length], f3, (f - fArr[i]) / f2, f3); } }