private boolean calculateBounds(RectF rect){
  float left=BitmapUtils.getRectLeft(mBoundsPoints);
  float top=BitmapUtils.getRectTop(mBoundsPoints);
  float right=BitmapUtils.getRectRight(mBoundsPoints);
  float bottom=BitmapUtils.getRectBottom(mBoundsPoints);
  if (isNonStraightAngleRotated()) {
    mCalcBounds.set(left,top,right,bottom);
    return false;
  }
 else {
    float x0=mBoundsPoints[0];
    float y0=mBoundsPoints[1];
    float x2=mBoundsPoints[4];
    float y2=mBoundsPoints[5];
    float x3=mBoundsPoints[6];
    float y3=mBoundsPoints[7];
    if (mBoundsPoints[7] < mBoundsPoints[1]) {
      if (mBoundsPoints[1] < mBoundsPoints[3]) {
        x0=mBoundsPoints[6];
        y0=mBoundsPoints[7];
        x2=mBoundsPoints[2];
        y2=mBoundsPoints[3];
        x3=mBoundsPoints[4];
        y3=mBoundsPoints[5];
      }
 else {
        x0=mBoundsPoints[4];
        y0=mBoundsPoints[5];
        x2=mBoundsPoints[0];
        y2=mBoundsPoints[1];
        x3=mBoundsPoints[2];
        y3=mBoundsPoints[3];
      }
    }
 else     if (mBoundsPoints[1] > mBoundsPoints[3]) {
      x0=mBoundsPoints[2];
      y0=mBoundsPoints[3];
      x2=mBoundsPoints[6];
      y2=mBoundsPoints[7];
      x3=mBoundsPoints[0];
      y3=mBoundsPoints[1];
    }
    float a0=(y3 - y0) / (x3 - x0);
    float a1=-1f / a0;
    float b0=y0 - a0 * x0;
    float b1=y0 - a1 * x0;
    float b2=y2 - a0 * x2;
    float b3=y2 - a1 * x2;
    float c0=(rect.centerY() - rect.top) / (rect.centerX() - rect.left);
    float c1=-c0;
    float d0=rect.top - c0 * rect.left;
    float d1=rect.top - c1 * rect.right;
    left=Math.max(left,(d0 - b0) / (a0 - c0) < rect.right ? (d0 - b0) / (a0 - c0) : left);
    left=Math.max(left,(d0 - b1) / (a1 - c0) < rect.right ? (d0 - b1) / (a1 - c0) : left);
    left=Math.max(left,(d1 - b3) / (a1 - c1) < rect.right ? (d1 - b3) / (a1 - c1) : left);
    right=Math.min(right,(d1 - b1) / (a1 - c1) > rect.left ? (d1 - b1) / (a1 - c1) : right);
    right=Math.min(right,(d1 - b2) / (a0 - c1) > rect.left ? (d1 - b2) / (a0 - c1) : right);
    right=Math.min(right,(d0 - b2) / (a0 - c0) > rect.left ? (d0 - b2) / (a0 - c0) : right);
    top=Math.max(top,Math.max(a0 * left + b0,a1 * right + b1));
    bottom=Math.min(bottom,Math.min(a1 * left + b3,a0 * right + b2));
    mCalcBounds.left=left;
    mCalcBounds.top=top;
    mCalcBounds.right=right;
    mCalcBounds.bottom=bottom;
    return true;
  }
}

private boolean calculateBounds ( RectF rect ) { float left = BitmapUtils . getRectLeft ( mBoundsPoints ) ; float top = BitmapUtils . getRectTop ( mBoundsPoints ) ; float right = BitmapUtils . getRectRight ( mBoundsPoints ) ; float bottom = BitmapUtils . getRectBottom ( mBoundsPoints ) ; if ( isNonStraightAngleRotated ( ) ) { mCalcBounds . set ( left , top , right , bottom ) ; return false ; } else { float x0 = mBoundsPoints [ 0 ] ; float y0 = mBoundsPoints [ 1 ] ; float x2 = mBoundsPoints [ 4 ] ; float y2 = mBoundsPoints [ 5 ] ; float x3 = mBoundsPoints [ 6 ] ; float y3 = mBoundsPoints [ 7 ] ; if ( mBoundsPoints [ 7 ] < mBoundsPoints [ 1 ] ) { if ( mBoundsPoints [ 1 ] < mBoundsPoints [ 3 ] ) { x0 = mBoundsPoints [ 6 ] ; y0 = mBoundsPoints [ 7 ] ; x2 = mBoundsPoints [ 2 ] ; y2 = mBoundsPoints [ 3 ] ; x3 = mBoundsPoints [ 4 ] ; y3 = mBoundsPoints [ 5 ] ; } else { x0 = mBoundsPoints [ 4 ] ; y0 = mBoundsPoints [ 5 ] ; x2 = mBoundsPoints [ 0 ] ; y2 = mBoundsPoints [ 1 ] ; x3 = mBoundsPoints [ 2 ] ; y3 = mBoundsPoints [ 3 ] ; } } else if ( mBoundsPoints [ 1 ] > mBoundsPoints [ 3 ] ) { x0 = mBoundsPoints [ 2 ] ; y0 = mBoundsPoints [ 3 ] ; x2 = mBoundsPoints [ 6 ] ; y2 = mBoundsPoints [ 7 ] ; x3 = mBoundsPoints [ 0 ] ; y3 = mBoundsPoints [ 1 ] ; } float a0 = ( y3 - y0 ) / ( x3 - x0 ) ; float a1 = - 1f / a0 ; float b0 = y0 - a0 * x0 ; float b1 = y0 - a1 * x0 ; float b2 = y2 - a0 * x2 ; float b3 = y2 - a1 * x2 ; float c0 = ( rect . centerY ( ) - rect . top ) / ( rect . centerX ( ) - rect . left ) ; float c1 = - c0 ; float d0 = rect . top - c0 * rect . left ; float d1 = rect . top - c1 * rect . right ; left = Math . max ( left , ( d0 - b0 ) / ( a0 - c0 ) < rect . right ? ( d0 - b0 ) / ( a0 - c0 ) : left ) ; left = Math . max ( left , ( d0 - b1 ) / ( a1 - c0 ) < rect . right ? ( d0 - b1 ) / ( a1 - c0 ) : left ) ; left = Math . max ( left , ( d1 - b3 ) / ( a1 - c1 ) < rect . right ? ( d1 - b3 ) / ( a1 - c1 ) : left ) ; right = Math . min ( right , ( d1 - b1 ) / ( a1 - c1 ) > rect . left ? ( d1 - b1 ) / ( a1 - c1 ) : right ) ; right = Math . min ( right , ( d1 - b2 ) / ( a0 - c1 ) > rect . left ? ( d1 - b2 ) / ( a0 - c1 ) : right ) ; right = Math . min ( right , ( d0 - b2 ) / ( a0 - c0 ) > rect . left ? ( d0 - b2 ) / ( a0 - c0 ) : right ) ; top = Math . max ( top , Math . max ( a0 * left + b0 , a1 * right + b1 ) ) ; bottom = Math . min ( bottom , Math . min ( a1 * left + b3 , a0 * right + b2 ) ) ; mCalcBounds . left = left ; mCalcBounds . top = top ; mCalcBounds . right = right ; mCalcBounds . bottom = bottom ; return true ; } }
calculate the bounding rectangle for current crop window , handle non - straight rotation angles . < br > if the rotation angle is straight then the bounds rectangle is the bitmap rectangle , otherwsie we find the max rectangle that is within the image bounds starting from the crop window rectangle .
