content: package com.github.siyamed.shapeimageview.mask;
  
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.graphics.Canvas;
  import android.graphics.Matrix;
  import android.graphics.Paint;
  import android.graphics.drawable.BitmapDrawable;
  import android.graphics.drawable.Drawable;
  import android.util.AttributeSet;
  
  import com.github.siyamed.shapeimageview.R;
  
  public class PorterShapeImageView extends PorterImageView {
      private Drawable shape;
      private Matrix matrix;
      private Matrix drawMatrix;
  
      public PorterShapeImageView(Context context) {
          super(context);
          setup(context, null, 0);
      }
  
      public PorterShapeImageView(Context context, AttributeSet attrs) {
          super(context, attrs);
          setup(context, attrs, 0);
      }
  
      public PorterShapeImageView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
          setup(context, attrs, defStyle);
      }
  
      private void setup(Context context, AttributeSet attrs, int defStyle) {
          if(attrs != null){
              TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShaderImageView, defStyle, 0);
              shape = typedArray.getDrawable(R.styleable.ShaderImageView_siShape);
              typedArray.recycle();
          }
          matrix = new Matrix();
      }
  
      @Override
      protected void paintMaskCanvas(Canvas maskCanvas, Paint maskPaint, int width, int height) {
          if(shape != null) {
              if (shape instanceof BitmapDrawable) {
                  configureBitmapBounds(width, height);
                  if(drawMatrix != null) {
                      int drawableSaveCount = maskCanvas.getSaveCount();
                      maskCanvas.save();
                      maskCanvas.concat(matrix);
                      shape.draw(maskCanvas);
                      maskCanvas.restoreToCount(drawableSaveCount);
                      return;
                  }
              }
  
              shape.setBounds(0, 0, width, height);
              shape.draw(maskCanvas);
          }
      }
  
      private void configureBitmapBounds(int viewWidth, int viewHeight) {
          drawMatrix = null;
          int drawableWidth = shape.getIntrinsicWidth();
          int drawableHeight = shape.getIntrinsicHeight();
          boolean fits = viewWidth == drawableWidth && viewHeight == drawableHeight;
  
          if (drawableWidth > 0 && drawableHeight > 0 && !fits) {
              shape.setBounds(0, 0, drawableWidth, drawableHeight);
              float widthRatio = (float) viewWidth / (float) drawableWidth;
              float heightRatio = (float) viewHeight / (float) drawableHeight;
              float scale = Math.min(widthRatio, heightRatio);
              float dx = (int) ((viewWidth - drawableWidth * scale) * 0.5f + 0.5f);
              float dy = (int) ((viewHeight - drawableHeight * scale) * 0.5f + 0.5f);
  
              matrix.setScale(scale, scale);
              matrix.postTranslate(dx, dy);
          }
      }
  }