{"version":3,"file":"maxrects-packer.js","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":["PACKING_LOGIC"],"mappings":"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"}