From c58e247000d3c091d22d1361570d80b7a6915925 Mon Sep 17 00:00:00 2001 From: Bram Leeda Date: Thu, 23 Jul 2026 10:22:11 +0200 Subject: [PATCH 1/2] Optimization in the LayerPacker class Added early return when there is no possible space in the layer --- src/LayerPacker.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/LayerPacker.php b/src/LayerPacker.php index 5990411e..3d32d6db 100644 --- a/src/LayerPacker.php +++ b/src/LayerPacker.php @@ -74,6 +74,12 @@ public function beStrictAboutItemOrdering(bool $beStrict): void public function packLayer(ItemList &$items, PackedItemList $packedItemList, int $startX, int $startY, int $startZ, int $widthForLayer, int $lengthForLayer, int $depthForLayer, int $guidelineLayerDepth, bool $considerStability, ?OrientatedItem $firstItem): PackedLayer { $layer = new PackedLayer(); + + // No usable space at all in this region + if ($widthForLayer - $startX <= 0 || $lengthForLayer - $startY <= 0 || $depthForLayer <= 0) { + return $layer; + } + $x = $startX; $y = $startY; $z = $startZ; From 3f7ffdf9b03dc0acdf42d9ebe003e2335b209818 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Tue, 4 Aug 2026 14:46:06 +0100 Subject: [PATCH 2/2] Guard lengthwise packLayer recursion at the call site Skip the recursive lengthwise fill when the just-packed item already defines the row length, instead of entering packLayer with zero free length. Matches the existing stackableDepth call-site guard. --- src/LayerPacker.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/LayerPacker.php b/src/LayerPacker.php index 3d32d6db..d4c98336 100644 --- a/src/LayerPacker.php +++ b/src/LayerPacker.php @@ -74,12 +74,6 @@ public function beStrictAboutItemOrdering(bool $beStrict): void public function packLayer(ItemList &$items, PackedItemList $packedItemList, int $startX, int $startY, int $startZ, int $widthForLayer, int $lengthForLayer, int $depthForLayer, int $guidelineLayerDepth, bool $considerStability, ?OrientatedItem $firstItem): PackedLayer { $layer = new PackedLayer(); - - // No usable space at all in this region - if ($widthForLayer - $startX <= 0 || $lengthForLayer - $startY <= 0 || $depthForLayer <= 0) { - return $layer; - } - $x = $startX; $y = $startY; $z = $startZ; @@ -121,7 +115,9 @@ public function packLayer(ItemList &$items, PackedItemList $packedItemList, int $x += $packedItem->width; // might be space available lengthwise across the width of this item, up to the current layer length - $layer->merge($this->packLayer($items, $packedItemList, $x - $packedItem->width, $y + $packedItem->length, $z, $x, $y + $rowLength, $depthForLayer, $layer->getDepth(), $considerStability, null)); + if ($rowLength > $packedItem->length) { + $layer->merge($this->packLayer($items, $packedItemList, $x - $packedItem->width, $y + $packedItem->length, $z, $x, $y + $rowLength, $depthForLayer, $layer->getDepth(), $considerStability, null)); + } if ($items->count() === 0 && $skippedItems) { $items = ItemList::fromArray(array_merge($skippedItems, iterator_to_array($items)), true);