docs: public MovementBounds set(State state) {
          RectF area = tmpRectF;
          GravityUtils.getMovementAreaPosition(settings, tmpRect);
          area.set(tmpRect);
  
          final Rect pos = tmpRect;
  
          if (settings.getFitMethod() == Settings.Fit.OUTSIDE) {
              // For OUTSIDE fit method we will rotate area rect instead of image rect,
              // that will help us correctly fit movement area inside image rect
              boundsRotation = state.getRotation();
              boundsPivotX = area.centerX();
              boundsPivotY = area.centerY();
  
              if (!State.equals(boundsRotation, 0f)) {
                  tmpMatrix.setRotate(-boundsRotation, boundsPivotX, boundsPivotY);
                  tmpMatrix.mapRect(area);
              }
          } else {
              boundsRotation = 0f;
              boundsPivotX = boundsPivotY = 0f;
          }
  
          state.get(tmpMatrix);
          if (!State.equals(boundsRotation, 0f)) {
              // Removing image rotation
              tmpMatrix.postRotate(-boundsRotation, boundsPivotX, boundsPivotY);
          }
          GravityUtils.getImagePosition(tmpMatrix, settings, pos);
  
          // Calculating movement bounds for top-left corner of the scaled image
          switch (settings.getBoundsType()) {
              case NORMAL:
                  calculateNormalBounds(area, pos);
                  break;
              case INSIDE:
                  calculateInsideBounds(area, pos);
                  break;
              case OUTSIDE:
                  calculateOutsideBounds(area, pos);
                  break;
              case PIVOT:
                  calculatePivotBounds(pos);
                  break;
              case NONE:
              default:
                  // Infinite bounds with overflow prevention
                  bounds.set(Integer.MIN_VALUE >> 2, Integer.MIN_VALUE >> 2,
                          Integer.MAX_VALUE >> 2, Integer.MAX_VALUE >> 2);
                  break;
          }
  
          // We should also adjust bounds position, since top-left corner of rotated image rectangle
          // will be somewhere on the edge of non-rotated bounding rectangle.
          // Note: for OUTSIDE fit method image rotation was skipped above, so we will not need
          // to adjust bounds here.
          if (settings.getFitMethod() != Settings.Fit.OUTSIDE) {
              state.get(tmpMatrix);
  
              RectF imageRect = tmpRectF;
              imageRect.set(0, 0, settings.getImageW(), settings.getImageH());
              tmpMatrix.mapRect(imageRect);
  
              tmpPointArr[0] = tmpPointArr[1] = 0f;
              tmpMatrix.mapPoints(tmpPointArr);
  
              bounds.offset(tmpPointArr[0] - imageRect.left, tmpPointArr[1] - imageRect.top);
          }
  
          return this;
      }