question: private float [ ] calculateImageIndents ( ) { mTempMatrix . reset ( ) ; mTempMatrix . setRotate ( - getCurrentAngle ( ) ) ; float [ ] unrotatedImageCorners = Arrays . copyOf ( mCurrentImageCorners , mCurrentImageCorners . length ) ; float [ ] unrotatedCropBoundsCorners = RectUtils . getCornersFromRect ( mCropRect ) ; mTempMatrix . mapPoints ( unrotatedImageCorners ) ; mTempMatrix . mapPoints ( unrotatedCropBoundsCorners ) ; RectF unrotatedImageRect = RectUtils . trapToRect ( unrotatedImageCorners ) ; RectF unrotatedCropRect = RectUtils . trapToRect ( unrotatedCropBoundsCorners ) ; float deltaLeft = unrotatedImageRect . left - unrotatedCropRect . left ; float deltaTop = unrotatedImageRect . top - unrotatedCropRect . top ; float deltaRight = unrotatedImageRect . right - unrotatedCropRect . right ; float deltaBottom = unrotatedImageRect . bottom - unrotatedCropRect . bottom ; float indents [ ] = new float [ 4 ] ; indents [ 0 ] = ( deltaLeft > 0 ) ? deltaLeft : 0 ; indents [ 1 ] = ( deltaTop > 0 ) ? deltaTop : 0 ; indents [ 2 ] = ( deltaRight < 0 ) ? deltaRight : 0 ; indents [ 3 ] = ( deltaBottom < 0 ) ? deltaBottom : 0 ; mTempMatrix . reset ( ) ; mTempMatrix . setRotate ( getCurrentAngle ( ) ) ; mTempMatrix . mapPoints ( indents ) ; return indents ; }
target:  First, un-rotate image and crop rectangles (make image rectangle axis-aligned). Second, calculate deltas between those rectangles sides. Third, depending on delta (its sign) put them or zero inside an array. Fourth, using Matrix, rotate back those points (indents).