mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
254 lines
10 KiB
Java
254 lines
10 KiB
Java
package com.google.android.material.shape;
|
|
|
|
import android.graphics.Matrix;
|
|
import android.graphics.Path;
|
|
import android.graphics.PointF;
|
|
import android.graphics.RectF;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public class ShapeAppearancePathProvider {
|
|
private final ShapePath[] cornerPaths = new ShapePath[4];
|
|
private final Matrix[] cornerTransforms = new Matrix[4];
|
|
private final Matrix[] edgeTransforms = new Matrix[4];
|
|
private final PointF pointF = new PointF();
|
|
private final Path overlappedEdgePath = new Path();
|
|
private final Path boundsPath = new Path();
|
|
private final ShapePath shapePath = new ShapePath();
|
|
private final float[] scratch = new float[2];
|
|
private final float[] scratch2 = new float[2];
|
|
private final Path edgePath = new Path();
|
|
private final Path cornerPath = new Path();
|
|
private boolean edgeIntersectionCheckEnabled = true;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public interface PathListener {
|
|
void onCornerPathCreated(ShapePath shapePath, Matrix matrix, int i);
|
|
|
|
void onEdgePathCreated(ShapePath shapePath, Matrix matrix, int i);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public void setEdgeIntersectionCheckEnable(boolean z) {
|
|
this.edgeIntersectionCheckEnabled = z;
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
private static class Lazy {
|
|
static final ShapeAppearancePathProvider INSTANCE = new ShapeAppearancePathProvider();
|
|
|
|
private Lazy() {
|
|
}
|
|
}
|
|
|
|
public ShapeAppearancePathProvider() {
|
|
for (int i = 0; i < 4; i++) {
|
|
this.cornerPaths[i] = new ShapePath();
|
|
this.cornerTransforms[i] = new Matrix();
|
|
this.edgeTransforms[i] = new Matrix();
|
|
}
|
|
}
|
|
|
|
public static ShapeAppearancePathProvider getInstance() {
|
|
return Lazy.INSTANCE;
|
|
}
|
|
|
|
public void calculatePath(ShapeAppearanceModel shapeAppearanceModel, float f, RectF rectF, Path path) {
|
|
calculatePath(shapeAppearanceModel, f, rectF, null, path);
|
|
}
|
|
|
|
public void calculatePath(ShapeAppearanceModel shapeAppearanceModel, float f, RectF rectF, PathListener pathListener, Path path) {
|
|
path.rewind();
|
|
this.overlappedEdgePath.rewind();
|
|
this.boundsPath.rewind();
|
|
this.boundsPath.addRect(rectF, Path.Direction.CW);
|
|
ShapeAppearancePathSpec shapeAppearancePathSpec = new ShapeAppearancePathSpec(shapeAppearanceModel, f, rectF, pathListener, path);
|
|
for (int i = 0; i < 4; i++) {
|
|
setCornerPathAndTransform(shapeAppearancePathSpec, i);
|
|
setEdgePathAndTransform(i);
|
|
}
|
|
for (int i2 = 0; i2 < 4; i2++) {
|
|
appendCornerPath(shapeAppearancePathSpec, i2);
|
|
appendEdgePath(shapeAppearancePathSpec, i2);
|
|
}
|
|
path.close();
|
|
this.overlappedEdgePath.close();
|
|
if (this.overlappedEdgePath.isEmpty()) {
|
|
return;
|
|
}
|
|
path.op(this.overlappedEdgePath, Path.Op.UNION);
|
|
}
|
|
|
|
private void setCornerPathAndTransform(ShapeAppearancePathSpec shapeAppearancePathSpec, int i) {
|
|
getCornerTreatmentForIndex(i, shapeAppearancePathSpec.shapeAppearanceModel).getCornerPath(this.cornerPaths[i], 90.0f, shapeAppearancePathSpec.interpolation, shapeAppearancePathSpec.bounds, getCornerSizeForIndex(i, shapeAppearancePathSpec.shapeAppearanceModel));
|
|
float angleOfEdge = angleOfEdge(i);
|
|
this.cornerTransforms[i].reset();
|
|
getCoordinatesOfCorner(i, shapeAppearancePathSpec.bounds, this.pointF);
|
|
this.cornerTransforms[i].setTranslate(this.pointF.x, this.pointF.y);
|
|
this.cornerTransforms[i].preRotate(angleOfEdge);
|
|
}
|
|
|
|
private void setEdgePathAndTransform(int i) {
|
|
this.scratch[0] = this.cornerPaths[i].getEndX();
|
|
this.scratch[1] = this.cornerPaths[i].getEndY();
|
|
this.cornerTransforms[i].mapPoints(this.scratch);
|
|
float angleOfEdge = angleOfEdge(i);
|
|
this.edgeTransforms[i].reset();
|
|
Matrix matrix = this.edgeTransforms[i];
|
|
float[] fArr = this.scratch;
|
|
matrix.setTranslate(fArr[0], fArr[1]);
|
|
this.edgeTransforms[i].preRotate(angleOfEdge);
|
|
}
|
|
|
|
private void appendCornerPath(ShapeAppearancePathSpec shapeAppearancePathSpec, int i) {
|
|
this.scratch[0] = this.cornerPaths[i].getStartX();
|
|
this.scratch[1] = this.cornerPaths[i].getStartY();
|
|
this.cornerTransforms[i].mapPoints(this.scratch);
|
|
if (i == 0) {
|
|
Path path = shapeAppearancePathSpec.path;
|
|
float[] fArr = this.scratch;
|
|
path.moveTo(fArr[0], fArr[1]);
|
|
} else {
|
|
Path path2 = shapeAppearancePathSpec.path;
|
|
float[] fArr2 = this.scratch;
|
|
path2.lineTo(fArr2[0], fArr2[1]);
|
|
}
|
|
this.cornerPaths[i].applyToPath(this.cornerTransforms[i], shapeAppearancePathSpec.path);
|
|
if (shapeAppearancePathSpec.pathListener != null) {
|
|
shapeAppearancePathSpec.pathListener.onCornerPathCreated(this.cornerPaths[i], this.cornerTransforms[i], i);
|
|
}
|
|
}
|
|
|
|
private void appendEdgePath(ShapeAppearancePathSpec shapeAppearancePathSpec, int i) {
|
|
int i2 = (i + 1) % 4;
|
|
this.scratch[0] = this.cornerPaths[i].getEndX();
|
|
this.scratch[1] = this.cornerPaths[i].getEndY();
|
|
this.cornerTransforms[i].mapPoints(this.scratch);
|
|
this.scratch2[0] = this.cornerPaths[i2].getStartX();
|
|
this.scratch2[1] = this.cornerPaths[i2].getStartY();
|
|
this.cornerTransforms[i2].mapPoints(this.scratch2);
|
|
float f = this.scratch[0];
|
|
float[] fArr = this.scratch2;
|
|
float max = Math.max(((float) Math.hypot(f - fArr[0], r1[1] - fArr[1])) - 0.001f, 0.0f);
|
|
float edgeCenterForIndex = getEdgeCenterForIndex(shapeAppearancePathSpec.bounds, i);
|
|
this.shapePath.reset(0.0f, 0.0f);
|
|
EdgeTreatment edgeTreatmentForIndex = getEdgeTreatmentForIndex(i, shapeAppearancePathSpec.shapeAppearanceModel);
|
|
edgeTreatmentForIndex.getEdgePath(max, edgeCenterForIndex, shapeAppearancePathSpec.interpolation, this.shapePath);
|
|
this.edgePath.reset();
|
|
this.shapePath.applyToPath(this.edgeTransforms[i], this.edgePath);
|
|
if (this.edgeIntersectionCheckEnabled && (edgeTreatmentForIndex.forceIntersection() || pathOverlapsCorner(this.edgePath, i) || pathOverlapsCorner(this.edgePath, i2))) {
|
|
Path path = this.edgePath;
|
|
path.op(path, this.boundsPath, Path.Op.DIFFERENCE);
|
|
this.scratch[0] = this.shapePath.getStartX();
|
|
this.scratch[1] = this.shapePath.getStartY();
|
|
this.edgeTransforms[i].mapPoints(this.scratch);
|
|
Path path2 = this.overlappedEdgePath;
|
|
float[] fArr2 = this.scratch;
|
|
path2.moveTo(fArr2[0], fArr2[1]);
|
|
this.shapePath.applyToPath(this.edgeTransforms[i], this.overlappedEdgePath);
|
|
} else {
|
|
this.shapePath.applyToPath(this.edgeTransforms[i], shapeAppearancePathSpec.path);
|
|
}
|
|
if (shapeAppearancePathSpec.pathListener != null) {
|
|
shapeAppearancePathSpec.pathListener.onEdgePathCreated(this.shapePath, this.edgeTransforms[i], i);
|
|
}
|
|
}
|
|
|
|
private boolean pathOverlapsCorner(Path path, int i) {
|
|
this.cornerPath.reset();
|
|
this.cornerPaths[i].applyToPath(this.cornerTransforms[i], this.cornerPath);
|
|
RectF rectF = new RectF();
|
|
path.computeBounds(rectF, true);
|
|
this.cornerPath.computeBounds(rectF, true);
|
|
path.op(this.cornerPath, Path.Op.INTERSECT);
|
|
path.computeBounds(rectF, true);
|
|
if (rectF.isEmpty()) {
|
|
return rectF.width() > 1.0f && rectF.height() > 1.0f;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private float getEdgeCenterForIndex(RectF rectF, int i) {
|
|
this.scratch[0] = this.cornerPaths[i].endX;
|
|
this.scratch[1] = this.cornerPaths[i].endY;
|
|
this.cornerTransforms[i].mapPoints(this.scratch);
|
|
if (i == 1 || i == 3) {
|
|
return Math.abs(rectF.centerX() - this.scratch[0]);
|
|
}
|
|
return Math.abs(rectF.centerY() - this.scratch[1]);
|
|
}
|
|
|
|
private CornerTreatment getCornerTreatmentForIndex(int i, ShapeAppearanceModel shapeAppearanceModel) {
|
|
if (i == 1) {
|
|
return shapeAppearanceModel.getBottomRightCorner();
|
|
}
|
|
if (i == 2) {
|
|
return shapeAppearanceModel.getBottomLeftCorner();
|
|
}
|
|
if (i == 3) {
|
|
return shapeAppearanceModel.getTopLeftCorner();
|
|
}
|
|
return shapeAppearanceModel.getTopRightCorner();
|
|
}
|
|
|
|
private CornerSize getCornerSizeForIndex(int i, ShapeAppearanceModel shapeAppearanceModel) {
|
|
if (i == 1) {
|
|
return shapeAppearanceModel.getBottomRightCornerSize();
|
|
}
|
|
if (i == 2) {
|
|
return shapeAppearanceModel.getBottomLeftCornerSize();
|
|
}
|
|
if (i == 3) {
|
|
return shapeAppearanceModel.getTopLeftCornerSize();
|
|
}
|
|
return shapeAppearanceModel.getTopRightCornerSize();
|
|
}
|
|
|
|
private EdgeTreatment getEdgeTreatmentForIndex(int i, ShapeAppearanceModel shapeAppearanceModel) {
|
|
if (i == 1) {
|
|
return shapeAppearanceModel.getBottomEdge();
|
|
}
|
|
if (i == 2) {
|
|
return shapeAppearanceModel.getLeftEdge();
|
|
}
|
|
if (i == 3) {
|
|
return shapeAppearanceModel.getTopEdge();
|
|
}
|
|
return shapeAppearanceModel.getRightEdge();
|
|
}
|
|
|
|
private void getCoordinatesOfCorner(int i, RectF rectF, PointF pointF) {
|
|
if (i == 1) {
|
|
pointF.set(rectF.right, rectF.bottom);
|
|
return;
|
|
}
|
|
if (i == 2) {
|
|
pointF.set(rectF.left, rectF.bottom);
|
|
} else if (i == 3) {
|
|
pointF.set(rectF.left, rectF.top);
|
|
} else {
|
|
pointF.set(rectF.right, rectF.top);
|
|
}
|
|
}
|
|
|
|
private float angleOfEdge(int i) {
|
|
return ((i + 1) % 4) * 90;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes2.dex */
|
|
public static final class ShapeAppearancePathSpec {
|
|
public final RectF bounds;
|
|
public final float interpolation;
|
|
public final Path path;
|
|
public final PathListener pathListener;
|
|
public final ShapeAppearanceModel shapeAppearanceModel;
|
|
|
|
ShapeAppearancePathSpec(ShapeAppearanceModel shapeAppearanceModel, float f, RectF rectF, PathListener pathListener, Path path) {
|
|
this.pathListener = pathListener;
|
|
this.shapeAppearanceModel = shapeAppearanceModel;
|
|
this.interpolation = f;
|
|
this.bounds = rectF;
|
|
this.path = path;
|
|
}
|
|
}
|
|
}
|