function sprite_pack_shelf(rectangles, width) { array_sort(rectangles, function(rect1, rect2) { return rect2.h - rect1.h; }); var shelfY = 0; var shelfWidth = 0; var shelfHeight = 0; var shelfItems = []; var packedRectangles = []; var maxWidth = 0; var maxHeight = 0; for (var i = 0; i < array_length(rectangles); i++) //make sure the width is larger than largest rectangle width = max(width, rectangles[i].w); for (var i = 0; i < array_length(rectangles); i++) { var rect = rectangles[i]; if (shelfWidth + rect.w <= width) { // Add the rectangle to the current shelf rect.x = shelfWidth; rect.y = shelfY; shelfWidth += rect.w; shelfHeight = max(shelfHeight, rect.h); } else { // Start a new shelf shelfY += shelfHeight; shelfWidth = rect.w; shelfHeight = rect.h; rect.x = 0; rect.y = shelfY; } maxWidth = max(maxWidth, rect.x + rect.w); maxHeight = max(maxHeight, rect.y + rect.h); } return [ new Rectangle(0, 0, maxWidth, maxHeight), rectangles ]; }