/** Attempts to find space for specified tile */
  private boolean allocateSlot(Stitcher.Holder par1StitchHolder) {
    for (int i = 0; i < this.stitchSlots.size(); ++i) {
      if (((Stitcher.Slot) this.stitchSlots.get(i)).addSlot(par1StitchHolder)) {
        return true;
      }

      par1StitchHolder.rotate();

      if (((Stitcher.Slot) this.stitchSlots.get(i)).addSlot(par1StitchHolder)) {
        return true;
      }

      par1StitchHolder.rotate();
    }

    return this.expandAndAllocateSlot(par1StitchHolder);
  }
  /** Expand stitched texture in order to make space for specified tile */
  private boolean expandAndAllocateSlot(Stitcher.Holder par1StitchHolder) {
    int i = Math.min(par1StitchHolder.getWidth(), par1StitchHolder.getHeight());
    boolean flag = this.currentWidth == 0 && this.currentHeight == 0;
    boolean flag1;
    int j;

    if (this.forcePowerOf2) {
      j = MathHelper.roundUpToPowerOfTwo(this.currentWidth);
      int k = MathHelper.roundUpToPowerOfTwo(this.currentHeight);
      int l = MathHelper.roundUpToPowerOfTwo(this.currentWidth + i);
      int i1 = MathHelper.roundUpToPowerOfTwo(this.currentHeight + i);
      boolean flag2 = l <= this.maxWidth;
      boolean flag3 = i1 <= this.maxHeight;

      if (!flag2 && !flag3) {
        return false;
      }

      boolean flag4 = j != l;
      boolean flag5 = k != i1;

      if (flag4 ^ flag5) {
        flag1 =
            flag5
                && flag3; // Forge: Bug fix: Attempt to fill all downward space before expanding
                          // width
      } else {
        flag1 = flag2 && j <= k;
      }
    } else {
      boolean flag6 = this.currentWidth + i <= this.maxWidth;
      boolean flag7 = this.currentHeight + i <= this.maxHeight;

      if (!flag6 && !flag7) {
        return false;
      }

      flag1 = flag6 && (flag || this.currentWidth <= this.currentHeight);
    }

    j = Math.max(par1StitchHolder.getWidth(), par1StitchHolder.getHeight());

    if (MathHelper.roundUpToPowerOfTwo((flag1 ? this.currentHeight : this.currentWidth) + j)
        > (flag1 ? this.maxHeight : this.maxWidth)) {
      return false;
    } else {
      Stitcher.Slot slot;

      if (flag1) {
        if (par1StitchHolder.getWidth() > par1StitchHolder.getHeight()) {
          par1StitchHolder.rotate();
        }

        if (this.currentHeight == 0) {
          this.currentHeight = par1StitchHolder.getHeight();
        }

        slot =
            new Stitcher.Slot(
                this.currentWidth, 0, par1StitchHolder.getWidth(), this.currentHeight);
        this.currentWidth += par1StitchHolder.getWidth();
      } else {
        slot =
            new Stitcher.Slot(
                0, this.currentHeight, this.currentWidth, par1StitchHolder.getHeight());
        this.currentHeight += par1StitchHolder.getHeight();
      }

      slot.addSlot(par1StitchHolder);
      this.stitchSlots.add(slot);
      return true;
    }
  }