{"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<T extends IRectangle> 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<T>;\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<T extends IRectangle = Rectangle> extends Bin<T> {\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<T> {\n        let clonedBin: MaxRectsBin<T> = new MaxRectsBin<T>(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<T extends IRectangle = Rectangle> extends Bin<T> {\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<T> {\n        let clonedBin: OversizedElementBin<T> = new OversizedElementBin<T>(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<T extends IRectangle = Rectangle> {\n\n    /**\n     * The Bin array added to the packer\n     *\n     * @type {Bin[]}\n     * @memberof MaxRectsPacker\n     */\n    public bins: Bin<T>[];\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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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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"}