294 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			294 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package com.google.android.material.shadow;
 | |
| 
 | |
| import android.content.Context;
 | |
| import android.graphics.Canvas;
 | |
| import android.graphics.LinearGradient;
 | |
| import android.graphics.Paint;
 | |
| import android.graphics.Path;
 | |
| import android.graphics.RadialGradient;
 | |
| import android.graphics.Rect;
 | |
| import android.graphics.RectF;
 | |
| import android.graphics.Shader;
 | |
| import android.graphics.drawable.Drawable;
 | |
| import androidx.appcompat.graphics.drawable.DrawableWrapperCompat;
 | |
| import androidx.core.content.ContextCompat;
 | |
| import com.google.android.material.R;
 | |
| 
 | |
| @Deprecated
 | |
| /* loaded from: classes.dex */
 | |
| public class ShadowDrawableWrapper extends DrawableWrapperCompat {
 | |
|     static final double COS_45 = Math.cos(Math.toRadians(45.0d));
 | |
|     static final float SHADOW_BOTTOM_SCALE = 1.0f;
 | |
|     static final float SHADOW_HORIZ_SCALE = 0.5f;
 | |
|     static final float SHADOW_MULTIPLIER = 1.5f;
 | |
|     static final float SHADOW_TOP_SCALE = 0.25f;
 | |
|     private boolean addPaddingForCorners;
 | |
|     final RectF contentBounds;
 | |
|     float cornerRadius;
 | |
|     final Paint cornerShadowPaint;
 | |
|     Path cornerShadowPath;
 | |
|     private boolean dirty;
 | |
|     final Paint edgeShadowPaint;
 | |
|     float maxShadowSize;
 | |
|     private boolean printedShadowClipWarning;
 | |
|     float rawMaxShadowSize;
 | |
|     float rawShadowSize;
 | |
|     private float rotation;
 | |
|     private final int shadowEndColor;
 | |
|     private final int shadowMiddleColor;
 | |
|     float shadowSize;
 | |
|     private final int shadowStartColor;
 | |
| 
 | |
|     public static float calculateHorizontalPadding(float f, float f2, boolean z) {
 | |
|         return z ? (float) (f + ((1.0d - COS_45) * f2)) : f;
 | |
|     }
 | |
| 
 | |
|     public static float calculateVerticalPadding(float f, float f2, boolean z) {
 | |
|         return z ? (float) ((f * SHADOW_MULTIPLIER) + ((1.0d - COS_45) * f2)) : f * SHADOW_MULTIPLIER;
 | |
|     }
 | |
| 
 | |
|     public float getCornerRadius() {
 | |
|         return this.cornerRadius;
 | |
|     }
 | |
| 
 | |
|     public float getMaxShadowSize() {
 | |
|         return this.rawMaxShadowSize;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.graphics.drawable.DrawableWrapperCompat, android.graphics.drawable.Drawable
 | |
|     public int getOpacity() {
 | |
|         return -3;
 | |
|     }
 | |
| 
 | |
|     public float getShadowSize() {
 | |
|         return this.rawShadowSize;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.graphics.drawable.DrawableWrapperCompat, android.graphics.drawable.Drawable
 | |
|     protected void onBoundsChange(Rect rect) {
 | |
|         this.dirty = true;
 | |
|     }
 | |
| 
 | |
|     public ShadowDrawableWrapper(Context context, Drawable drawable, float f, float f2, float f3) {
 | |
|         super(drawable);
 | |
|         this.dirty = true;
 | |
|         this.addPaddingForCorners = true;
 | |
|         this.printedShadowClipWarning = false;
 | |
|         this.shadowStartColor = ContextCompat.getColor(context, R.color.design_fab_shadow_start_color);
 | |
|         this.shadowMiddleColor = ContextCompat.getColor(context, R.color.design_fab_shadow_mid_color);
 | |
|         this.shadowEndColor = ContextCompat.getColor(context, R.color.design_fab_shadow_end_color);
 | |
|         Paint paint = new Paint(5);
 | |
|         this.cornerShadowPaint = paint;
 | |
|         paint.setStyle(Paint.Style.FILL);
 | |
|         this.cornerRadius = Math.round(f);
 | |
|         this.contentBounds = new RectF();
 | |
|         Paint paint2 = new Paint(paint);
 | |
|         this.edgeShadowPaint = paint2;
 | |
|         paint2.setAntiAlias(false);
 | |
|         setShadowSize(f2, f3);
 | |
|     }
 | |
| 
 | |
|     private static int toEven(float f) {
 | |
|         int round = Math.round(f);
 | |
|         return round % 2 == 1 ? round - 1 : round;
 | |
|     }
 | |
| 
 | |
|     public void setAddPaddingForCorners(boolean z) {
 | |
|         this.addPaddingForCorners = z;
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.graphics.drawable.DrawableWrapperCompat, android.graphics.drawable.Drawable
 | |
|     public void setAlpha(int i) {
 | |
|         super.setAlpha(i);
 | |
|         this.cornerShadowPaint.setAlpha(i);
 | |
|         this.edgeShadowPaint.setAlpha(i);
 | |
|     }
 | |
| 
 | |
|     public void setShadowSize(float f, float f2) {
 | |
|         if (f < 0.0f || f2 < 0.0f) {
 | |
|             throw new IllegalArgumentException("invalid shadow size");
 | |
|         }
 | |
|         float even = toEven(f);
 | |
|         float even2 = toEven(f2);
 | |
|         if (even > even2) {
 | |
|             if (!this.printedShadowClipWarning) {
 | |
|                 this.printedShadowClipWarning = true;
 | |
|             }
 | |
|             even = even2;
 | |
|         }
 | |
|         if (this.rawShadowSize == even && this.rawMaxShadowSize == even2) {
 | |
|             return;
 | |
|         }
 | |
|         this.rawShadowSize = even;
 | |
|         this.rawMaxShadowSize = even2;
 | |
|         this.shadowSize = Math.round(even * SHADOW_MULTIPLIER);
 | |
|         this.maxShadowSize = even2;
 | |
|         this.dirty = true;
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     public void setShadowSize(float f) {
 | |
|         setShadowSize(f, this.rawMaxShadowSize);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.graphics.drawable.DrawableWrapperCompat, android.graphics.drawable.Drawable
 | |
|     public boolean getPadding(Rect rect) {
 | |
|         int ceil = (int) Math.ceil(calculateVerticalPadding(this.rawMaxShadowSize, this.cornerRadius, this.addPaddingForCorners));
 | |
|         int ceil2 = (int) Math.ceil(calculateHorizontalPadding(this.rawMaxShadowSize, this.cornerRadius, this.addPaddingForCorners));
 | |
|         rect.set(ceil2, ceil, ceil2, ceil);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public void setCornerRadius(float f) {
 | |
|         float round = Math.round(f);
 | |
|         if (this.cornerRadius == round) {
 | |
|             return;
 | |
|         }
 | |
|         this.cornerRadius = round;
 | |
|         this.dirty = true;
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.graphics.drawable.DrawableWrapperCompat, android.graphics.drawable.Drawable
 | |
|     public void draw(Canvas canvas) {
 | |
|         if (this.dirty) {
 | |
|             buildComponents(getBounds());
 | |
|             this.dirty = false;
 | |
|         }
 | |
|         drawShadow(canvas);
 | |
|         super.draw(canvas);
 | |
|     }
 | |
| 
 | |
|     public final void setRotation(float f) {
 | |
|         if (this.rotation != f) {
 | |
|             this.rotation = f;
 | |
|             invalidateSelf();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void drawShadow(Canvas canvas) {
 | |
|         int i;
 | |
|         float f;
 | |
|         int i2;
 | |
|         float f2;
 | |
|         float f3;
 | |
|         float f4;
 | |
|         int save = canvas.save();
 | |
|         canvas.rotate(this.rotation, this.contentBounds.centerX(), this.contentBounds.centerY());
 | |
|         float f5 = this.cornerRadius;
 | |
|         float f6 = (-f5) - this.shadowSize;
 | |
|         float f7 = f5 * 2.0f;
 | |
|         boolean z = this.contentBounds.width() - f7 > 0.0f;
 | |
|         boolean z2 = this.contentBounds.height() - f7 > 0.0f;
 | |
|         float f8 = this.rawShadowSize;
 | |
|         float f9 = f5 / ((f8 - (0.5f * f8)) + f5);
 | |
|         float f10 = f5 / ((f8 - (SHADOW_TOP_SCALE * f8)) + f5);
 | |
|         float f11 = f5 / ((f8 - (f8 * 1.0f)) + f5);
 | |
|         int save2 = canvas.save();
 | |
|         canvas.translate(this.contentBounds.left + f5, this.contentBounds.top + f5);
 | |
|         canvas.scale(f9, f10);
 | |
|         canvas.drawPath(this.cornerShadowPath, this.cornerShadowPaint);
 | |
|         if (z) {
 | |
|             canvas.scale(1.0f / f9, 1.0f);
 | |
|             i = save2;
 | |
|             f = f11;
 | |
|             i2 = save;
 | |
|             f2 = f10;
 | |
|             canvas.drawRect(0.0f, f6, this.contentBounds.width() - f7, -this.cornerRadius, this.edgeShadowPaint);
 | |
|         } else {
 | |
|             i = save2;
 | |
|             f = f11;
 | |
|             i2 = save;
 | |
|             f2 = f10;
 | |
|         }
 | |
|         canvas.restoreToCount(i);
 | |
|         int save3 = canvas.save();
 | |
|         canvas.translate(this.contentBounds.right - f5, this.contentBounds.bottom - f5);
 | |
|         float f12 = f;
 | |
|         canvas.scale(f9, f12);
 | |
|         canvas.rotate(180.0f);
 | |
|         canvas.drawPath(this.cornerShadowPath, this.cornerShadowPaint);
 | |
|         if (z) {
 | |
|             canvas.scale(1.0f / f9, 1.0f);
 | |
|             f3 = f2;
 | |
|             f4 = f12;
 | |
|             canvas.drawRect(0.0f, f6, this.contentBounds.width() - f7, (-this.cornerRadius) + this.shadowSize, this.edgeShadowPaint);
 | |
|         } else {
 | |
|             f3 = f2;
 | |
|             f4 = f12;
 | |
|         }
 | |
|         canvas.restoreToCount(save3);
 | |
|         int save4 = canvas.save();
 | |
|         canvas.translate(this.contentBounds.left + f5, this.contentBounds.bottom - f5);
 | |
|         canvas.scale(f9, f4);
 | |
|         canvas.rotate(270.0f);
 | |
|         canvas.drawPath(this.cornerShadowPath, this.cornerShadowPaint);
 | |
|         if (z2) {
 | |
|             canvas.scale(1.0f / f4, 1.0f);
 | |
|             canvas.drawRect(0.0f, f6, this.contentBounds.height() - f7, -this.cornerRadius, this.edgeShadowPaint);
 | |
|         }
 | |
|         canvas.restoreToCount(save4);
 | |
|         int save5 = canvas.save();
 | |
|         canvas.translate(this.contentBounds.right - f5, this.contentBounds.top + f5);
 | |
|         float f13 = f3;
 | |
|         canvas.scale(f9, f13);
 | |
|         canvas.rotate(90.0f);
 | |
|         canvas.drawPath(this.cornerShadowPath, this.cornerShadowPaint);
 | |
|         if (z2) {
 | |
|             canvas.scale(1.0f / f13, 1.0f);
 | |
|             canvas.drawRect(0.0f, f6, this.contentBounds.height() - f7, -this.cornerRadius, this.edgeShadowPaint);
 | |
|         }
 | |
|         canvas.restoreToCount(save5);
 | |
|         canvas.restoreToCount(i2);
 | |
|     }
 | |
| 
 | |
|     private void buildShadowCorners() {
 | |
|         float f = this.cornerRadius;
 | |
|         RectF rectF = new RectF(-f, -f, f, f);
 | |
|         RectF rectF2 = new RectF(rectF);
 | |
|         float f2 = this.shadowSize;
 | |
|         rectF2.inset(-f2, -f2);
 | |
|         Path path = this.cornerShadowPath;
 | |
|         if (path == null) {
 | |
|             this.cornerShadowPath = new Path();
 | |
|         } else {
 | |
|             path.reset();
 | |
|         }
 | |
|         this.cornerShadowPath.setFillType(Path.FillType.EVEN_ODD);
 | |
|         this.cornerShadowPath.moveTo(-this.cornerRadius, 0.0f);
 | |
|         this.cornerShadowPath.rLineTo(-this.shadowSize, 0.0f);
 | |
|         this.cornerShadowPath.arcTo(rectF2, 180.0f, 90.0f, false);
 | |
|         this.cornerShadowPath.arcTo(rectF, 270.0f, -90.0f, false);
 | |
|         this.cornerShadowPath.close();
 | |
|         float f3 = -rectF2.top;
 | |
|         if (f3 > 0.0f) {
 | |
|             float f4 = this.cornerRadius / f3;
 | |
|             this.cornerShadowPaint.setShader(new RadialGradient(0.0f, 0.0f, f3, new int[]{0, this.shadowStartColor, this.shadowMiddleColor, this.shadowEndColor}, new float[]{0.0f, f4, ((1.0f - f4) / 2.0f) + f4, 1.0f}, Shader.TileMode.CLAMP));
 | |
|         }
 | |
|         this.edgeShadowPaint.setShader(new LinearGradient(0.0f, rectF.top, 0.0f, rectF2.top, new int[]{this.shadowStartColor, this.shadowMiddleColor, this.shadowEndColor}, new float[]{0.0f, 0.5f, 1.0f}, Shader.TileMode.CLAMP));
 | |
|         this.edgeShadowPaint.setAntiAlias(false);
 | |
|     }
 | |
| 
 | |
|     private void buildComponents(Rect rect) {
 | |
|         float f = this.rawMaxShadowSize * SHADOW_MULTIPLIER;
 | |
|         this.contentBounds.set(rect.left + this.rawMaxShadowSize, rect.top + f, rect.right - this.rawMaxShadowSize, rect.bottom - f);
 | |
|         getDrawable().setBounds((int) this.contentBounds.left, (int) this.contentBounds.top, (int) this.contentBounds.right, (int) this.contentBounds.bottom);
 | |
|         buildShadowCorners();
 | |
|     }
 | |
| 
 | |
|     public void setMaxShadowSize(float f) {
 | |
|         setShadowSize(this.rawShadowSize, f);
 | |
|     }
 | |
| 
 | |
|     public float getMinWidth() {
 | |
|         float f = this.rawMaxShadowSize;
 | |
|         return (Math.max(f, this.cornerRadius + (f / 2.0f)) * 2.0f) + (this.rawMaxShadowSize * 2.0f);
 | |
|     }
 | |
| 
 | |
|     public float getMinHeight() {
 | |
|         float f = this.rawMaxShadowSize;
 | |
|         return (Math.max(f, this.cornerRadius + ((f * SHADOW_MULTIPLIER) / 2.0f)) * 2.0f) + (this.rawMaxShadowSize * SHADOW_MULTIPLIER * 2.0f);
 | |
|     }
 | |
| }
 |