166 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package com.google.android.material.textfield;
 | |
| 
 | |
| import android.graphics.Canvas;
 | |
| import android.graphics.Paint;
 | |
| import android.graphics.PorterDuff;
 | |
| import android.graphics.PorterDuffXfermode;
 | |
| import android.graphics.RectF;
 | |
| import android.graphics.Region;
 | |
| import android.graphics.drawable.Drawable;
 | |
| import android.os.Build;
 | |
| import android.view.View;
 | |
| import com.google.android.material.shape.MaterialShapeDrawable;
 | |
| import com.google.android.material.shape.ShapeAppearanceModel;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class CutoutDrawable extends MaterialShapeDrawable {
 | |
|     CutoutDrawableState drawableState;
 | |
| 
 | |
|     static CutoutDrawable create(ShapeAppearanceModel shapeAppearanceModel) {
 | |
|         if (shapeAppearanceModel == null) {
 | |
|             shapeAppearanceModel = new ShapeAppearanceModel();
 | |
|         }
 | |
|         return create(new CutoutDrawableState(shapeAppearanceModel, new RectF()));
 | |
|     }
 | |
| 
 | |
|     /* JADX INFO: Access modifiers changed from: private */
 | |
|     public static CutoutDrawable create(CutoutDrawableState cutoutDrawableState) {
 | |
|         return new ImplApi18(cutoutDrawableState);
 | |
|     }
 | |
| 
 | |
|     private CutoutDrawable(CutoutDrawableState cutoutDrawableState) {
 | |
|         super(cutoutDrawableState);
 | |
|         this.drawableState = cutoutDrawableState;
 | |
|     }
 | |
| 
 | |
|     @Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
 | |
|     public Drawable mutate() {
 | |
|         this.drawableState = new CutoutDrawableState(this.drawableState);
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     boolean hasCutout() {
 | |
|         return !this.drawableState.cutoutBounds.isEmpty();
 | |
|     }
 | |
| 
 | |
|     void setCutout(float f, float f2, float f3, float f4) {
 | |
|         if (f == this.drawableState.cutoutBounds.left && f2 == this.drawableState.cutoutBounds.top && f3 == this.drawableState.cutoutBounds.right && f4 == this.drawableState.cutoutBounds.bottom) {
 | |
|             return;
 | |
|         }
 | |
|         this.drawableState.cutoutBounds.set(f, f2, f3, f4);
 | |
|         invalidateSelf();
 | |
|     }
 | |
| 
 | |
|     void setCutout(RectF rectF) {
 | |
|         setCutout(rectF.left, rectF.top, rectF.right, rectF.bottom);
 | |
|     }
 | |
| 
 | |
|     void removeCutout() {
 | |
|         setCutout(0.0f, 0.0f, 0.0f, 0.0f);
 | |
|     }
 | |
| 
 | |
|     private static class ImplApi18 extends CutoutDrawable {
 | |
|         ImplApi18(CutoutDrawableState cutoutDrawableState) {
 | |
|             super(cutoutDrawableState);
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.shape.MaterialShapeDrawable
 | |
|         protected void drawStrokeShape(Canvas canvas) {
 | |
|             if (this.drawableState.cutoutBounds.isEmpty()) {
 | |
|                 super.drawStrokeShape(canvas);
 | |
|                 return;
 | |
|             }
 | |
|             canvas.save();
 | |
|             if (Build.VERSION.SDK_INT >= 26) {
 | |
|                 canvas.clipOutRect(this.drawableState.cutoutBounds);
 | |
|             } else {
 | |
|                 canvas.clipRect(this.drawableState.cutoutBounds, Region.Op.DIFFERENCE);
 | |
|             }
 | |
|             super.drawStrokeShape(canvas);
 | |
|             canvas.restore();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static class ImplApi14 extends CutoutDrawable {
 | |
|         private Paint cutoutPaint;
 | |
|         private int savedLayer;
 | |
| 
 | |
|         ImplApi14(CutoutDrawableState cutoutDrawableState) {
 | |
|             super(cutoutDrawableState);
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.shape.MaterialShapeDrawable, android.graphics.drawable.Drawable
 | |
|         public void draw(Canvas canvas) {
 | |
|             preDraw(canvas);
 | |
|             super.draw(canvas);
 | |
|             postDraw(canvas);
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.shape.MaterialShapeDrawable
 | |
|         protected void drawStrokeShape(Canvas canvas) {
 | |
|             super.drawStrokeShape(canvas);
 | |
|             canvas.drawRect(this.drawableState.cutoutBounds, getCutoutPaint());
 | |
|         }
 | |
| 
 | |
|         private Paint getCutoutPaint() {
 | |
|             if (this.cutoutPaint == null) {
 | |
|                 Paint paint = new Paint(1);
 | |
|                 this.cutoutPaint = paint;
 | |
|                 paint.setStyle(Paint.Style.FILL_AND_STROKE);
 | |
|                 this.cutoutPaint.setColor(-1);
 | |
|                 this.cutoutPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
 | |
|             }
 | |
|             return this.cutoutPaint;
 | |
|         }
 | |
| 
 | |
|         private void preDraw(Canvas canvas) {
 | |
|             Drawable.Callback callback = getCallback();
 | |
|             if (useHardwareLayer(callback)) {
 | |
|                 View view = (View) callback;
 | |
|                 if (view.getLayerType() != 2) {
 | |
|                     view.setLayerType(2, null);
 | |
|                     return;
 | |
|                 }
 | |
|                 return;
 | |
|             }
 | |
|             saveCanvasLayer(canvas);
 | |
|         }
 | |
| 
 | |
|         private void saveCanvasLayer(Canvas canvas) {
 | |
|             this.savedLayer = canvas.saveLayer(0.0f, 0.0f, canvas.getWidth(), canvas.getHeight(), null);
 | |
|         }
 | |
| 
 | |
|         private void postDraw(Canvas canvas) {
 | |
|             if (useHardwareLayer(getCallback())) {
 | |
|                 return;
 | |
|             }
 | |
|             canvas.restoreToCount(this.savedLayer);
 | |
|         }
 | |
| 
 | |
|         private boolean useHardwareLayer(Drawable.Callback callback) {
 | |
|             return callback instanceof View;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private static final class CutoutDrawableState extends MaterialShapeDrawable.MaterialShapeDrawableState {
 | |
|         private final RectF cutoutBounds;
 | |
| 
 | |
|         private CutoutDrawableState(ShapeAppearanceModel shapeAppearanceModel, RectF rectF) {
 | |
|             super(shapeAppearanceModel, null);
 | |
|             this.cutoutBounds = rectF;
 | |
|         }
 | |
| 
 | |
|         private CutoutDrawableState(CutoutDrawableState cutoutDrawableState) {
 | |
|             super(cutoutDrawableState);
 | |
|             this.cutoutBounds = cutoutDrawableState.cutoutBounds;
 | |
|         }
 | |
| 
 | |
|         @Override // com.google.android.material.shape.MaterialShapeDrawable.MaterialShapeDrawableState, android.graphics.drawable.Drawable.ConstantState
 | |
|         public Drawable newDrawable() {
 | |
|             CutoutDrawable create = CutoutDrawable.create(this);
 | |
|             create.invalidateSelf();
 | |
|             return create;
 | |
|         }
 | |
|     }
 | |
| }
 |