/**
   * @return a Rectangle which determines the Size of the BufferedImage to create If it fits the
   *     size of the BufferedImage is viewBounds * bufferScaleFactor
   */
  protected Rectangle getBufferRectangle() {
    // TODO: should be checked if width + height < 0
    double bufferScaleFactor = BufferManager.sharedInstance().getBufferScaleFactor();
    int bufferWidth = (int) (viewBounds.width * bufferScaleFactor);
    int bufferHeight = (int) (viewBounds.height * bufferScaleFactor);

    Rectangle newBufferBounds =
        new Rectangle(
            viewBounds.x - ((bufferWidth - viewBounds.width) / 2),
            viewBounds.y - ((bufferHeight - viewBounds.height) / 2),
            bufferWidth,
            bufferHeight);

    if (!isRectangleInReal(newBufferBounds)) {
      newBufferBounds = GeomUtil.checkBounds(newBufferBounds, realBounds);
    }
    newBufferBounds = checkOrigin(newBufferBounds);

    return newBufferBounds;
  }