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