{"version":3,"file":"maxrects-packer.mjs","sources":["../src/geom/Rectangle.ts","../src/abstract-bin.ts","../src/maxrects-bin.ts","../src/oversized-element-bin.ts","../src/maxrects-packer.ts"],"sourcesContent":["export interface IRectangle {\n width: number;\n height: number;\n x: number;\n y: number;\n [propName: string]: any;\n}\n\nexport class Rectangle implements IRectangle {\n /**\n * Oversized tag on rectangle which is bigger than packer itself.\n *\n * @type {boolean}\n * @memberof Rectangle\n */\n public oversized: boolean = false;\n\n /**\n * Creates an instance of Rectangle.\n *\n * @param {number} [width=0]\n * @param {number} [height=0]\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @param {boolean} [rot=false]\n * @param {boolean} [allowRotation=false]\n * @memberof Rectangle\n */\n constructor (\n width: number = 0,\n height: number = 0,\n x: number = 0,\n y: number = 0,\n rot: boolean = false,\n allowRotation: boolean | undefined = undefined\n ) {\n this._width = width;\n this._height = height;\n this._x = x;\n this._y = y;\n this._data = {};\n this._rot = rot;\n this._allowRotation = allowRotation;\n }\n\n /**\n * Test if two given rectangle collide each other\n *\n * @static\n * @param {IRectangle} first\n * @param {IRectangle} second\n * @returns\n * @memberof Rectangle\n */\n public static Collide (first: IRectangle, second: IRectangle) { return first.collide(second); }\n\n /**\n * Test if the first rectangle contains the second one\n *\n * @static\n * @param {IRectangle} first\n * @param {IRectangle} second\n * @returns\n * @memberof Rectangle\n */\n public static Contain (first: IRectangle, second: IRectangle) { return first.contain(second); }\n\n /**\n * Get the area (w * h) of the rectangle\n *\n * @returns {number}\n * @memberof Rectangle\n */\n public area (): number { return this.width * this.height; }\n\n /**\n * Test if the given rectangle collide with this rectangle.\n *\n * @param {IRectangle} rect\n * @returns {boolean}\n * @memberof Rectangle\n */\n public collide (rect: IRectangle): boolean {\n return (\n rect.x < this.x + this.width &&\n rect.x + rect.width > this.x &&\n rect.y < this.y + this.height &&\n rect.y + rect.height > this.y\n );\n }\n\n /**\n * Test if this rectangle contains the given rectangle.\n *\n * @param {IRectangle} rect\n * @returns {boolean}\n * @memberof Rectangle\n */\n public contain (rect: IRectangle): boolean {\n return (rect.x >= this.x && rect.y >= this.y &&\n rect.x + rect.width <= this.x + this.width && rect.y + rect.height <= this.y + this.height);\n }\n\n protected _width: number;\n get width (): number { return this._width; }\n set width (value: number) {\n if (value === this._width) return;\n this._width = value;\n this._dirty ++;\n }\n\n protected _height: number;\n get height (): number { return this._height; }\n set height (value: number) {\n if (value === this._height) return;\n this._height = value;\n this._dirty ++;\n }\n\n protected _x: number;\n get x (): number { return this._x; }\n set x (value: number) {\n if (value === this._x) return;\n this._x = value;\n this._dirty ++;\n }\n\n protected _y: number;\n get y (): number { return this._y; }\n set y (value: number) {\n if (value === this._y) return;\n this._y = value;\n this._dirty ++;\n }\n\n protected _rot: boolean = false;\n\n /**\n * If the rectangle is rotated\n *\n * @type {boolean}\n * @memberof Rectangle\n */\n get rot (): boolean { return this._rot; }\n\n /**\n * Set the rotate tag of the rectangle.\n *\n * note: after `rot` is set, `width/height` of this rectangle is swaped.\n *\n * @memberof Rectangle\n */\n set rot (value: boolean) {\n if (this._allowRotation === false) return;\n\n if (this._rot !== value) {\n const tmp = this.width;\n this.width = this.height;\n this.height = tmp;\n this._rot = value;\n this._dirty ++;\n }\n }\n\n protected _allowRotation: boolean | undefined = undefined;\n\n /**\n * If the rectangle allow rotation\n *\n * @type {boolean}\n * @memberof Rectangle\n */\n get allowRotation (): boolean | undefined { return this._allowRotation; }\n\n /**\n * Set the allowRotation tag of the rectangle.\n *\n * @memberof Rectangle\n */\n set allowRotation (value: boolean | undefined) {\n if (this._allowRotation !== value) {\n this._allowRotation = value;\n this._dirty ++;\n }\n }\n\n protected _data: any;\n get data (): any { return this._data; }\n set data (value: any) {\n if (value === null || value === this._data) return;\n this._data = value;\n // extract allowRotation settings\n if (typeof value === \"object\" && value.hasOwnProperty(\"allowRotation\")) {\n this._allowRotation = value.allowRotation;\n }\n this._dirty ++;\n }\n\n protected _dirty: number = 0;\n get dirty (): boolean { return this._dirty > 0; }\n public setDirty (value: boolean = true): void { this._dirty = value ? this._dirty + 1 : 0; }\n}\n","import { IRectangle, Rectangle } from \"./geom/Rectangle\";\nimport { IOption } from \"./maxrects-packer\";\n\nexport interface IBin {\n width: number;\n height: number;\n maxWidth: number;\n maxHeight: number;\n freeRects: IRectangle[];\n rects: IRectangle[];\n options: IOption;\n [propName: string]: any;\n}\n\nexport abstract class Bin implements IBin {\n public width!: number;\n public height!: number;\n public maxWidth!: number;\n public maxHeight!: number;\n public freeRects!: IRectangle[];\n public rects!: T[];\n public options!: IOption;\n public abstract add (rect: T): T | undefined;\n public abstract add (width: number, height: number, data: any): T | undefined;\n public abstract reset (deepRest: boolean): void;\n public abstract repack (): T[] | undefined;\n\n public data?: any;\n public tag?: string;\n\n protected _dirty: number = 0;\n get dirty (): boolean { return this._dirty > 0 || this.rects.some(rect => rect.dirty); }\n /**\n * Set bin dirty status\n *\n * @memberof Bin\n */\n public setDirty (value: boolean = true): void {\n this._dirty = value ? this._dirty + 1 : 0;\n if (!value) {\n for (let rect of this.rects) {\n if (rect.setDirty) rect.setDirty(false);\n }\n }\n }\n\n public abstract clone (): Bin;\n}\n","import { EDGE_MAX_VALUE, PACKING_LOGIC, IOption } from \"./maxrects-packer\";\nimport { Rectangle, IRectangle } from \"./geom/Rectangle\";\nimport { Bin } from \"./abstract-bin\";\n\nexport class MaxRectsBin extends Bin {\n public width: number;\n public height: number;\n public freeRects: Rectangle[] = [];\n public rects: T[] = [];\n private verticalExpand: boolean = false;\n private stage: Rectangle;\n private border: number;\n public options: IOption = {\n smart: true,\n pot: true,\n square: true,\n allowRotation: false,\n tag: false,\n exclusiveTag: true,\n border: 0,\n logic: PACKING_LOGIC.MAX_EDGE\n }\n\n constructor(\n public maxWidth: number = EDGE_MAX_VALUE,\n public maxHeight: number = EDGE_MAX_VALUE,\n public padding: number = 0,\n options: IOption = {}\n ) {\n super();\n this.options = { ...this.options, ...options };\n this.width = this.options.smart ? 0 : maxWidth;\n this.height = this.options.smart ? 0 : maxHeight;\n this.border = this.options.border ? this.options.border : 0;\n this.freeRects.push(new Rectangle(\n this.maxWidth + this.padding - this.border * 2,\n this.maxHeight + this.padding - this.border * 2,\n this.border,\n this.border));\n this.stage = new Rectangle(this.width, this.height);\n }\n\n public add (rect: T): T | undefined;\n public add (width: number, height: number, data: any): T | undefined;\n public add (...args: any[]): any {\n let data: any;\n let rect: IRectangle;\n if (args.length === 1) {\n if (typeof args[0] !== 'object') throw new Error(\"MacrectsBin.add(): Wrong parameters\");\n rect = args[0] as T;\n // Check if rect.tag match bin.tag, if bin.tag not defined, it will accept any rect\n let tag = (rect.data && rect.data.tag) ? rect.data.tag : rect.tag ? rect.tag : undefined;\n if (this.options.tag && this.options.exclusiveTag && this.tag !== tag) return undefined;\n } else {\n data = args.length > 2 ? args[2] : null;\n // Check if data.tag match bin.tag, if bin.tag not defined, it will accept any rect\n if (this.options.tag && this.options.exclusiveTag) {\n if (data && this.tag !== data.tag) return undefined;\n if (!data && this.tag) return undefined;\n }\n rect = new Rectangle(args[0], args[1]);\n rect.data = data;\n rect.setDirty(false);\n }\n\n const result = this.place(rect);\n if (result) this.rects.push(result);\n return result;\n }\n\n public repack (): T[] | undefined {\n let unpacked: T[] = [];\n this.reset();\n // re-sort rects from big to small\n this.rects.sort((a, b) => {\n const result = Math.max(b.width, b.height) - Math.max(a.width, a.height);\n if (result === 0 && a.hash && b.hash) {\n return a.hash > b.hash ? -1 : 1;\n } else return result;\n });\n for (let rect of this.rects) {\n if (!this.place(rect)) {\n unpacked.push(rect);\n }\n }\n for (let rect of unpacked) this.rects.splice(this.rects.indexOf(rect), 1);\n return unpacked.length > 0 ? unpacked : undefined;\n }\n\n public reset (deepReset: boolean = false, resetOption: boolean = false): void {\n if (deepReset) {\n if (this.data) delete this.data;\n if (this.tag) delete this.tag;\n this.rects = [];\n if (resetOption) {\n this.options = {\n smart: true,\n pot: true,\n square: true,\n allowRotation: false,\n tag: false,\n border: 0\n };\n }\n }\n this.width = this.options.smart ? 0 : this.maxWidth;\n this.height = this.options.smart ? 0 : this.maxHeight;\n this.border = this.options.border ? this.options.border : 0;\n this.freeRects = [new Rectangle(\n this.maxWidth + this.padding - this.border * 2,\n this.maxHeight + this.padding - this.border * 2,\n this.border,\n this.border)];\n this.stage = new Rectangle(this.width, this.height);\n this._dirty = 0;\n }\n\n public clone (): MaxRectsBin {\n let clonedBin: MaxRectsBin = new MaxRectsBin(this.maxWidth, this.maxHeight, this.padding, this.options);\n for (let rect of this.rects) {\n clonedBin.add(rect);\n }\n return clonedBin;\n }\n\n private place (rect: IRectangle): T | undefined {\n // recheck if tag matched\n let tag = (rect.data && rect.data.tag) ? rect.data.tag : rect.tag ? rect.tag : undefined;\n if (this.options.tag && this.options.exclusiveTag && this.tag !== tag) return undefined;\n\n let node: IRectangle | undefined;\n let allowRotation: boolean | undefined;\n // getter/setter do not support hasOwnProperty()\n if (rect.hasOwnProperty(\"_allowRotation\") && rect.allowRotation !== undefined) {\n allowRotation = rect.allowRotation; // Per Rectangle allowRotation override packer settings\n } else {\n allowRotation = this.options.allowRotation;\n }\n node = this.findNode(rect.width + this.padding, rect.height + this.padding, allowRotation);\n\n if (node) {\n this.updateBinSize(node);\n let numRectToProcess = this.freeRects.length;\n let i: number = 0;\n while (i < numRectToProcess) {\n if (this.splitNode(this.freeRects[i], node)) {\n this.freeRects.splice(i, 1);\n numRectToProcess--;\n i--;\n }\n i++;\n }\n this.pruneFreeList();\n this.verticalExpand = this.width > this.height ? true : false;\n rect.x = node.x;\n rect.y = node.y;\n if (rect.rot === undefined) rect.rot = false;\n rect.rot = node.rot ? !rect.rot : rect.rot;\n this._dirty ++;\n return rect as T;\n } else if (!this.verticalExpand) {\n if (this.updateBinSize(new Rectangle(\n rect.width + this.padding, rect.height + this.padding,\n this.width + this.padding - this.border, this.border\n )) || this.updateBinSize(new Rectangle(\n rect.width + this.padding, rect.height + this.padding,\n this.border, this.height + this.padding - this.border\n ))) {\n return this.place(rect);\n }\n } else {\n if (this.updateBinSize(new Rectangle(\n rect.width + this.padding, rect.height + this.padding,\n this.border, this.height + this.padding - this.border\n )) || this.updateBinSize(new Rectangle(\n rect.width + this.padding, rect.height + this.padding,\n this.width + this.padding - this.border, this.border\n ))) {\n return this.place(rect);\n }\n }\n return undefined;\n }\n\n private findNode (width: number, height: number, allowRotation?: boolean): Rectangle | undefined {\n let score: number = Number.MAX_VALUE;\n let areaFit: number;\n let r: Rectangle;\n let bestNode: Rectangle | undefined;\n for (let i in this.freeRects) {\n r = this.freeRects[i];\n if (r.width >= width && r.height >= height) {\n areaFit = (this.options.logic === PACKING_LOGIC.MAX_AREA) ?\n r.width * r.height - width * height :\n Math.min(r.width - width, r.height - height);\n if (areaFit < score) {\n bestNode = new Rectangle(width, height, r.x, r.y);\n score = areaFit;\n }\n }\n\n if (!allowRotation) continue;\n\n // Continue to test 90-degree rotated rectangle\n if (r.width >= height && r.height >= width) {\n areaFit = (this.options.logic === PACKING_LOGIC.MAX_AREA) ?\n r.width * r.height - height * width :\n Math.min(r.height - width, r.width - height);\n if (areaFit < score) {\n bestNode = new Rectangle(height, width, r.x, r.y, true); // Rotated node\n score = areaFit;\n }\n }\n }\n return bestNode;\n }\n\n private splitNode (freeRect: IRectangle, usedNode: IRectangle): boolean {\n // Test if usedNode intersect with freeRect\n if (!freeRect.collide(usedNode)) return false;\n\n // Do vertical split\n if (usedNode.x < freeRect.x + freeRect.width && usedNode.x + usedNode.width > freeRect.x) {\n // New node at the top side of the used node\n if (usedNode.y > freeRect.y && usedNode.y < freeRect.y + freeRect.height) {\n let newNode: Rectangle = new Rectangle(freeRect.width, usedNode.y - freeRect.y, freeRect.x, freeRect.y);\n this.freeRects.push(newNode);\n }\n // New node at the bottom side of the used node\n if (usedNode.y + usedNode.height < freeRect.y + freeRect.height) {\n let newNode = new Rectangle(\n freeRect.width,\n freeRect.y + freeRect.height - (usedNode.y + usedNode.height),\n freeRect.x,\n usedNode.y + usedNode.height\n );\n this.freeRects.push(newNode);\n }\n }\n\n // Do Horizontal split\n if (usedNode.y < freeRect.y + freeRect.height &&\n usedNode.y + usedNode.height > freeRect.y) {\n // New node at the left side of the used node.\n if (usedNode.x > freeRect.x && usedNode.x < freeRect.x + freeRect.width) {\n let newNode = new Rectangle(usedNode.x - freeRect.x, freeRect.height, freeRect.x, freeRect.y);\n this.freeRects.push(newNode);\n }\n // New node at the right side of the used node.\n if (usedNode.x + usedNode.width < freeRect.x + freeRect.width) {\n let newNode = new Rectangle(\n freeRect.x + freeRect.width - (usedNode.x + usedNode.width),\n freeRect.height,\n usedNode.x + usedNode.width,\n freeRect.y\n );\n this.freeRects.push(newNode);\n }\n }\n return true;\n }\n\n private pruneFreeList () {\n // Go through each pair of freeRects and remove any rects that is redundant\n let i: number = 0;\n let j: number = 0;\n let len: number = this.freeRects.length;\n while (i < len) {\n j = i + 1;\n let tmpRect1 = this.freeRects[i];\n while (j < len) {\n let tmpRect2 = this.freeRects[j];\n if (tmpRect2.contain(tmpRect1)) {\n this.freeRects.splice(i, 1);\n i--;\n len--;\n break;\n }\n if (tmpRect1.contain(tmpRect2)) {\n this.freeRects.splice(j, 1);\n j--;\n len--;\n }\n j++;\n }\n i++;\n }\n }\n\n private updateBinSize (node: IRectangle): boolean {\n if (!this.options.smart) return false;\n if (this.stage.contain(node)) return false;\n let tmpWidth: number = Math.max(this.width, node.x + node.width - this.padding + this.border);\n let tmpHeight: number = Math.max(this.height, node.y + node.height - this.padding + this.border);\n if (this.options.allowRotation) {\n // do extra test on rotated node whether it's a better choice\n const rotWidth: number = Math.max(this.width, node.x + node.height - this.padding + this.border);\n const rotHeight: number = Math.max(this.height, node.y + node.width - this.padding + this.border);\n if (rotWidth * rotHeight < tmpWidth * tmpHeight) {\n tmpWidth = rotWidth;\n tmpHeight = rotHeight;\n }\n }\n if (this.options.pot) {\n tmpWidth = Math.pow(2, Math.ceil(Math.log(tmpWidth) * Math.LOG2E));\n tmpHeight = Math.pow(2, Math.ceil(Math.log(tmpHeight) * Math.LOG2E));\n }\n if (this.options.square) {\n tmpWidth = tmpHeight = Math.max(tmpWidth, tmpHeight);\n }\n if (tmpWidth > this.maxWidth + this.padding || tmpHeight > this.maxHeight + this.padding) {\n return false;\n }\n this.expandFreeRects(tmpWidth + this.padding, tmpHeight + this.padding);\n this.width = this.stage.width = tmpWidth;\n this.height = this.stage.height = tmpHeight;\n return true;\n }\n\n private expandFreeRects (width: number, height: number) {\n this.freeRects.forEach((freeRect, index) => {\n if (freeRect.x + freeRect.width >= Math.min(this.width + this.padding - this.border, width)) {\n freeRect.width = width - freeRect.x - this.border;\n }\n if (freeRect.y + freeRect.height >= Math.min(this.height + this.padding - this.border, height)) {\n freeRect.height = height - freeRect.y - this.border;\n }\n }, this);\n this.freeRects.push(new Rectangle(\n width - this.width - this.padding,\n height - this.border * 2,\n this.width + this.padding - this.border,\n this.border));\n this.freeRects.push(new Rectangle(\n width - this.border * 2,\n height - this.height - this.padding,\n this.border,\n this.height + this.padding - this.border));\n this.freeRects = this.freeRects.filter(freeRect => {\n return !(freeRect.width <= 0 || freeRect.height <= 0 || freeRect.x < this.border || freeRect.y < this.border);\n });\n this.pruneFreeList();\n }\n}\n","import { IRectangle, Rectangle } from \"./geom/Rectangle\";\nimport { IOption } from \"./maxrects-packer\";\nimport { Bin } from \"./abstract-bin\";\n\nexport class OversizedElementBin extends Bin {\n public width: number;\n public height: number;\n public data: any;\n public maxWidth: number;\n public maxHeight: number;\n public options: IOption;\n public rects: T[] = [];\n public freeRects: IRectangle[];\n\n constructor (rect: T);\n constructor (width: number, height: number, data: any);\n constructor (...args: any[]) {\n super();\n if (args.length === 1) {\n if (typeof args[0] !== 'object') throw new Error(\"OversizedElementBin: Wrong parameters\");\n const rect = args[0];\n this.rects = [rect];\n this.width = rect.width;\n this.height = rect.height;\n this.data = rect.data;\n rect.oversized = true;\n } else {\n this.width = args[0];\n this.height = args[1];\n this.data = args.length > 2 ? args[2] : null;\n const rect: IRectangle = new Rectangle(this.width, this.height);\n rect.oversized = true;\n rect.data = this.data;\n this.rects.push(rect as T);\n }\n this.freeRects = [];\n this.maxWidth = this.width;\n this.maxHeight = this.height;\n this.options = { smart: false, pot: false, square: false };\n }\n\n add () { return undefined; }\n reset (deepReset: boolean = false): void {\n // nothing to do here\n }\n repack (): T[] | undefined { return undefined; }\n clone(): Bin {\n let clonedBin: OversizedElementBin = new OversizedElementBin(this.rects[0]);\n return clonedBin;\n }\n}\n","import { Rectangle, IRectangle } from \"./geom/Rectangle\";\nimport { MaxRectsBin } from \"./maxrects-bin\";\nimport { OversizedElementBin } from \"./oversized-element-bin\";\nimport { Bin, IBin } from \"./abstract-bin\";\n\nexport const EDGE_MAX_VALUE: number = 4096;\nexport const EDGE_MIN_VALUE: number = 128;\nexport enum PACKING_LOGIC {\n MAX_AREA = 0,\n MAX_EDGE = 1\n}\n\n/**\n * Options for MaxRect Packer\n * @property {boolean} options.smart Smart sizing packer (default is true)\n * @property {boolean} options.pot use power of 2 sizing (default is true)\n * @property {boolean} options.square use square size (default is false)\n * @property {boolean} options.allowRotation allow rotation packing (default is false)\n * @property {boolean} options.tag allow auto grouping based on `rect.tag` (default is false)\n * @property {boolean} options.exclusiveTag tagged rects will have dependent bin, if set to `false`, packer will try to put tag rects into the same bin (default is true)\n * @property {boolean} options.border atlas edge spacing (default is 0)\n * @property {PACKING_LOGIC} options.logic MAX_AREA or MAX_EDGE based sorting logic (default is MAX_EDGE)\n * @export\n * @interface Option\n */\nexport interface IOption {\n smart?: boolean;\n pot?: boolean;\n square?: boolean;\n allowRotation?: boolean;\n tag?: boolean;\n exclusiveTag?: boolean;\n border?: number;\n logic?: PACKING_LOGIC;\n}\n\nexport class MaxRectsPacker {\n\n /**\n * The Bin array added to the packer\n *\n * @type {Bin[]}\n * @memberof MaxRectsPacker\n */\n public bins: Bin[];\n\n /**\n * Options for MaxRect Packer\n * @property {boolean} options.smart Smart sizing packer (default is true)\n * @property {boolean} options.pot use power of 2 sizing (default is true)\n * @property {boolean} options.square use square size (default is false)\n * @property {boolean} options.allowRotation allow rotation packing (default is false)\n * @property {boolean} options.tag allow auto grouping based on `rect.tag` (default is false)\n * @property {boolean} options.exclusiveTag tagged rects will have dependent bin, if set to `false`, packer will try to put tag rects into the same bin (default is true)\n * @property {boolean} options.border atlas edge spacing (default is 0)\n * @property {PACKING_LOGIC} options.logic MAX_AREA or MAX_EDGE based sorting logic (default is MAX_EDGE)\n * @export\n * @interface Option\n */\n public options: IOption = {\n smart: true,\n pot: true,\n square: false,\n allowRotation: false,\n tag: false,\n exclusiveTag: true,\n border: 0,\n logic: PACKING_LOGIC.MAX_EDGE\n }\n\n /**\n * Creates an instance of MaxRectsPacker.\n * @param {number} width of the output atlas (default is 4096)\n * @param {number} height of the output atlas (default is 4096)\n * @param {number} padding between glyphs/images (default is 0)\n * @param {IOption} [options={}] (Optional) packing options\n * @memberof MaxRectsPacker\n */\n constructor (\n public width: number = EDGE_MAX_VALUE,\n public height: number = EDGE_MAX_VALUE,\n public padding: number = 0,\n options: IOption = {}\n ) {\n this.bins = [];\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Add a bin/rectangle object with data to packer\n * @param {number} width of the input bin/rectangle\n * @param {number} height of the input bin/rectangle\n * @param {*} data custom data object\n * @memberof MaxRectsPacker\n */\n public add (width: number, height: number, data: any): T;\n /**\n * Add a bin/rectangle object extends IRectangle to packer\n * @template T Generic type extends IRectangle interface\n * @param {T} rect the rect object add to the packer bin\n * @memberof MaxRectsPacker\n */\n public add (rect: T): T;\n public add (...args: any[]): any {\n if (args.length === 1) {\n if (typeof args[0] !== 'object') throw new Error(\"MacrectsPacker.add(): Wrong parameters\");\n const rect = args[0] as T;\n if (rect.width > this.width || rect.height > this.height) {\n this.bins.push(new OversizedElementBin(rect));\n } else {\n let added = this.bins.slice(this._currentBinIndex).find(bin => bin.add(rect) !== undefined);\n if (!added) {\n let bin = new MaxRectsBin(this.width, this.height, this.padding, this.options);\n let tag = (rect.data && rect.data.tag) ? rect.data.tag : rect.tag ? rect.tag : undefined;\n if (this.options.tag && tag) bin.tag = tag;\n bin.add(rect);\n this.bins.push(bin);\n }\n }\n return rect;\n } else {\n const rect: IRectangle = new Rectangle(args[0], args[1]);\n if (args.length > 2) rect.data = args[2];\n\n if (rect.width > this.width || rect.height > this.height) {\n this.bins.push(new OversizedElementBin(rect as T));\n } else {\n let added = this.bins.slice(this._currentBinIndex).find(bin => bin.add(rect as T) !== undefined);\n if (!added) {\n let bin = new MaxRectsBin(this.width, this.height, this.padding, this.options);\n if (this.options.tag && rect.data.tag) bin.tag = rect.data.tag;\n bin.add(rect as T);\n this.bins.push(bin);\n }\n }\n return rect as T;\n }\n }\n\n /**\n * Add an Array of bins/rectangles to the packer.\n *\n * `Javascript`: Any object has property: { width, height, ... } is accepted.\n *\n * `Typescript`: object shall extends `MaxrectsPacker.IRectangle`.\n *\n * note: object has `hash` property will have more stable packing result\n *\n * @param {IRectangle[]} rects Array of bin/rectangles\n * @memberof MaxRectsPacker\n */\n public addArray(rects: T[]) {\n if (!this.options.tag || this.options.exclusiveTag) {\n // if not using tag or using exclusiveTag, old approach\n this.sort(rects, this.options.logic).forEach(rect => this.add(rect));\n } else {\n // sort rects by tags first\n if (rects.length === 0) return;\n rects.sort((a,b) => {\n const aTag = (a.data && a.data.tag) ? a.data.tag : a.tag ? a.tag : undefined;\n const bTag = (b.data && b.data.tag) ? b.data.tag : b.tag ? b.tag : undefined;\n return bTag === undefined ? -1 : aTag === undefined ? 1 : bTag > aTag ? -1 : 1;\n });\n \n // iterate all bins to find the first bin which can place rects with same tag\n //\n let currentTag: any;\n let currentIdx: number = 0;\n let targetBin = this.bins.slice(this._currentBinIndex).find((bin, binIndex) => {\n let testBin = bin.clone();\n for (let i = currentIdx; i < rects.length; i++) {\n const rect = rects[i];\n const tag = (rect.data && rect.data.tag) ? rect.data.tag : rect.tag ? rect.tag : undefined;\n\n // initialize currentTag\n if (i === 0) currentTag = tag;\n\n if (tag !== currentTag) {\n // all current tag memeber tested successfully\n currentTag = tag;\n // do addArray()\n this.sort(rects.slice(currentIdx, i), this.options.logic).forEach(r => bin.add(r));\n currentIdx = i;\n\n // recrusively addArray() with remaining rects\n this.addArray(rects.slice(i));\n return true;\n }\n\n // remaining untagged rect will use normal addArray()\n if (tag === undefined) {\n // do addArray()\n this.sort(rects.slice(i), this.options.logic).forEach(r => this.add(r));\n currentIdx = rects.length;\n // end test\n return true;\n }\n\n // still in the same tag group\n if (testBin.add(rect) === undefined) {\n // add the rects that could fit into the bins already\n // do addArray()\n this.sort(rects.slice(currentIdx, i), this.options.logic).forEach(r => bin.add(r));\n currentIdx = i;\n\n // current bin cannot contain all tag members\n // procceed to test next bin\n return false;\n }\n }\n\n // all rects tested\n // do addArray() to the remaining tag group\n this.sort(rects.slice(currentIdx), this.options.logic).forEach(r => bin.add(r));\n return true;\n });\n\n // create a new bin if no current bin fit\n if (!targetBin) {\n const rect = rects[currentIdx];\n const bin = new MaxRectsBin(this.width, this.height, this.padding, this.options);\n const tag = (rect.data && rect.data.tag) ? rect.data.tag : rect.tag ? rect.tag : undefined;\n if (this.options.tag && this.options.exclusiveTag && tag) bin.tag = tag;\n this.bins.push(bin);\n // Add the rect to the newly created bin\n bin.add(rect)\n currentIdx++\n this.addArray(rects.slice(currentIdx));\n }\n }\n }\n\n /**\n * Reset entire packer to initial states, keep settings\n *\n * @memberof MaxRectsPacker\n */\n public reset (): void {\n this.bins = [];\n this._currentBinIndex = 0;\n }\n\n /**\n * Repack all elements inside bins\n *\n * @param {boolean} [quick=true] quick repack only dirty bins\n * @returns {void}\n * @memberof MaxRectsPacker\n */\n public repack (quick: boolean = true): void {\n if (quick) {\n let unpack: T[] = [];\n for (let bin of this.bins) {\n if (bin.dirty) {\n let up = bin.repack();\n if (up) unpack.push(...up);\n }\n }\n this.addArray(unpack);\n return;\n }\n if (!this.dirty) return;\n const allRects = this.rects;\n this.reset();\n this.addArray(allRects);\n }\n\n /**\n * Stop adding new element to the current bin and return a new bin.\n *\n * note: After calling `next()` all elements will no longer added to previous bins.\n *\n * @returns {Bin}\n * @memberof MaxRectsPacker\n */\n public next (): number {\n this._currentBinIndex = this.bins.length;\n return this._currentBinIndex;\n }\n\n /**\n * Load bins to the packer, overwrite exist bins\n * @param {MaxRectsBin[]} bins MaxRectsBin objects\n * @memberof MaxRectsPacker\n */\n public load (bins: IBin[]) {\n bins.forEach((bin, index) => {\n if (bin.maxWidth > this.width || bin.maxHeight > this.height) {\n this.bins.push(new OversizedElementBin(bin.width, bin.height, {}));\n } else {\n let newBin = new MaxRectsBin(this.width, this.height, this.padding, bin.options);\n newBin.freeRects.splice(0);\n bin.freeRects.forEach((r, i) => {\n newBin.freeRects.push(new Rectangle(r.width, r.height, r.x, r.y));\n });\n newBin.width = bin.width;\n newBin.height = bin.height;\n if (bin.tag) newBin.tag = bin.tag;\n this.bins[index] = newBin;\n }\n }, this);\n }\n\n /**\n * Output current bins to save\n * @memberof MaxRectsPacker\n */\n public save (): IBin[] {\n let saveBins: IBin[] = [];\n this.bins.forEach((bin => {\n let saveBin: IBin = {\n width: bin.width,\n height: bin.height,\n maxWidth: bin.maxWidth,\n maxHeight: bin.maxHeight,\n freeRects: [],\n rects: [],\n options: bin.options\n };\n if (bin.tag) saveBin = { ...saveBin, tag: bin.tag };\n bin.freeRects.forEach(r => {\n saveBin.freeRects.push({\n x: r.x,\n y: r.y,\n width: r.width,\n height: r.height\n });\n });\n saveBins.push(saveBin);\n }));\n return saveBins;\n }\n\n /**\n * Sort the given rects based on longest edge or surface area.\n *\n * If rects have the same sort value, will sort by second key `hash` if presented.\n *\n * @private\n * @param {T[]} rects\n * @param {PACKING_LOGIC} [logic=PACKING_LOGIC.MAX_EDGE] sorting logic, \"area\" or \"edge\"\n * @returns\n * @memberof MaxRectsPacker\n */\n private sort (rects: T[], logic: IOption['logic'] = PACKING_LOGIC.MAX_EDGE) {\n return rects.slice().sort((a, b) => {\n const result = (logic === PACKING_LOGIC.MAX_EDGE) ?\n Math.max(b.width, b.height) - Math.max(a.width, a.height) :\n b.width * b.height - a.width * a.height;\n if (result === 0 && a.hash && b.hash) {\n return a.hash > b.hash ? -1 : 1;\n } else return result;\n });\n }\n\n private _currentBinIndex: number = 0;\n /**\n * Return current functioning bin index, perior to this wont accept any new elements\n *\n * @readonly\n * @type {number}\n * @memberof MaxRectsPacker\n */\n get currentBinIndex (): number { return this._currentBinIndex; }\n\n /**\n * Returns dirty status of all child bins\n *\n * @readonly\n * @type {boolean}\n * @memberof MaxRectsPacker\n */\n get dirty (): boolean { return this.bins.some(bin => bin.dirty); }\n\n /**\n * Return all rectangles in this packer\n *\n * @readonly\n * @type {T[]}\n * @memberof MaxRectsPacker\n */\n get rects (): T[] {\n let allRects: T[] = [];\n for (let bin of this.bins) {\n allRects.push(...bin.rects);\n }\n return allRects;\n }\n}\n"],"names":[],"mappings":"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"}