{"version":3,"file":"measureMixin.mjs","sources":["../../../../src/scene/container/container-mixins/measureMixin.ts"],"sourcesContent":["import { Matrix } from '../../../maths/matrix/Matrix';\nimport { Bounds } from '../bounds/Bounds';\nimport { getGlobalBounds } from '../bounds/getGlobalBounds';\nimport { getLocalBounds } from '../bounds/getLocalBounds';\nimport { checkChildrenDidChange } from '../utils/checkChildrenDidChange';\n\nimport type { Size } from '../../../maths/misc/Size';\nimport type { Container } from '../Container';\n\nexport type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\nexport interface MeasureMixinConstructor\n{\n    width?: number;\n    height?: number;\n}\nexport interface MeasureMixin extends Required<MeasureMixinConstructor>\n{\n    getSize(out?: Size): Size;\n    setSize(width: number, height?: number): void;\n    setSize(value: Optional<Size, 'height'>): void;\n    getLocalBounds(bounds?: Bounds): Bounds;\n    getBounds(skipUpdate?: boolean, bounds?: Bounds): Bounds;\n    _localBoundsCacheData: LocalBoundsCacheData;\n    _localBoundsCacheId: number;\n    _setWidth(width: number, localWidth: number): void;\n    _setHeight(height: number, localHeight: number): void;\n}\n\ninterface LocalBoundsCacheData\n{\n    data: number[];\n    index: number;\n    didChange: boolean;\n    localBounds: Bounds;\n}\n\nconst tempMatrix = new Matrix();\n\nexport const measureMixin: Partial<Container> = {\n\n    _localBoundsCacheId: -1,\n    _localBoundsCacheData: null,\n\n    _setWidth(value: number, localWidth: number)\n    {\n        const sign = Math.sign(this.scale.x) || 1;\n\n        if (localWidth !== 0)\n        {\n            this.scale.x = (value / localWidth) * sign;\n        }\n        else\n        {\n            this.scale.x = sign;\n        }\n    },\n\n    _setHeight(value: number, localHeight: number)\n    {\n        const sign = Math.sign(this.scale.y) || 1;\n\n        if (localHeight !== 0)\n        {\n            this.scale.y = (value / localHeight) * sign;\n        }\n        else\n        {\n            this.scale.y = sign;\n        }\n    },\n\n    /**\n     * Retrieves the local bounds of the container as a Bounds object.\n     * @returns - The bounding area.\n     * @memberof scene.Container#\n     */\n    getLocalBounds(): Bounds\n    {\n        if (!this._localBoundsCacheData)\n        {\n            this._localBoundsCacheData = {\n                data: [],\n                index: 1,\n                didChange: false,\n                localBounds: new Bounds()\n            };\n        }\n\n        const localBoundsCacheData = this._localBoundsCacheData;\n\n        localBoundsCacheData.index = 1;\n        localBoundsCacheData.didChange = false;\n\n        if (localBoundsCacheData.data[0] !== this._didViewChangeTick)\n        {\n            localBoundsCacheData.didChange = true;\n            localBoundsCacheData.data[0] = this._didViewChangeTick;\n        }\n\n        checkChildrenDidChange(this, localBoundsCacheData);\n\n        if (localBoundsCacheData.didChange)\n        {\n            getLocalBounds(this, localBoundsCacheData.localBounds, tempMatrix);\n        }\n\n        return localBoundsCacheData.localBounds;\n    },\n\n    /**\n     * Calculates and returns the (world) bounds of the display object as a [Rectangle]{@link Rectangle}.\n     * @param skipUpdate - Setting to `true` will stop the transforms of the scene graph from\n     *  being updated. This means the calculation returned MAY be out of date BUT will give you a\n     *  nice performance boost.\n     * @param bounds - Optional bounds to store the result of the bounds calculation.\n     * @returns - The minimum axis-aligned rectangle in world space that fits around this object.\n     * @memberof scene.Container#\n     */\n    getBounds(skipUpdate?: boolean, bounds?: Bounds): Bounds\n    {\n        return getGlobalBounds(this, skipUpdate, bounds || new Bounds());\n    },\n} as Container;\n"],"names":[],"mappings":";;;;;;;AAqCA,MAAM,UAAA,GAAa,IAAI,MAAO,EAAA,CAAA;AAEvB,MAAM,YAAmC,GAAA;AAAA,EAE5C,mBAAqB,EAAA,CAAA,CAAA;AAAA,EACrB,qBAAuB,EAAA,IAAA;AAAA,EAEvB,SAAA,CAAU,OAAe,UACzB,EAAA;AACI,IAAA,MAAM,OAAO,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,CAAC,CAAK,IAAA,CAAA,CAAA;AAExC,IAAA,IAAI,eAAe,CACnB,EAAA;AACI,MAAK,IAAA,CAAA,KAAA,CAAM,CAAK,GAAA,KAAA,GAAQ,UAAc,GAAA,IAAA,CAAA;AAAA,KAG1C,MAAA;AACI,MAAA,IAAA,CAAK,MAAM,CAAI,GAAA,IAAA,CAAA;AAAA,KACnB;AAAA,GACJ;AAAA,EAEA,UAAA,CAAW,OAAe,WAC1B,EAAA;AACI,IAAA,MAAM,OAAO,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,CAAC,CAAK,IAAA,CAAA,CAAA;AAExC,IAAA,IAAI,gBAAgB,CACpB,EAAA;AACI,MAAK,IAAA,CAAA,KAAA,CAAM,CAAK,GAAA,KAAA,GAAQ,WAAe,GAAA,IAAA,CAAA;AAAA,KAG3C,MAAA;AACI,MAAA,IAAA,CAAK,MAAM,CAAI,GAAA,IAAA,CAAA;AAAA,KACnB;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cACA,GAAA;AACI,IAAI,IAAA,CAAC,KAAK,qBACV,EAAA;AACI,MAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,QACzB,MAAM,EAAC;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,QACP,SAAW,EAAA,KAAA;AAAA,QACX,WAAA,EAAa,IAAI,MAAO,EAAA;AAAA,OAC5B,CAAA;AAAA,KACJ;AAEA,IAAA,MAAM,uBAAuB,IAAK,CAAA,qBAAA,CAAA;AAElC,IAAA,oBAAA,CAAqB,KAAQ,GAAA,CAAA,CAAA;AAC7B,IAAA,oBAAA,CAAqB,SAAY,GAAA,KAAA,CAAA;AAEjC,IAAA,IAAI,oBAAqB,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,KAAK,kBAC1C,EAAA;AACI,MAAA,oBAAA,CAAqB,SAAY,GAAA,IAAA,CAAA;AACjC,MAAqB,oBAAA,CAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAK,CAAA,kBAAA,CAAA;AAAA,KACxC;AAEA,IAAA,sBAAA,CAAuB,MAAM,oBAAoB,CAAA,CAAA;AAEjD,IAAA,IAAI,qBAAqB,SACzB,EAAA;AACI,MAAe,cAAA,CAAA,IAAA,EAAM,oBAAqB,CAAA,WAAA,EAAa,UAAU,CAAA,CAAA;AAAA,KACrE;AAEA,IAAA,OAAO,oBAAqB,CAAA,WAAA,CAAA;AAAA,GAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAA,CAAU,YAAsB,MAChC,EAAA;AACI,IAAA,OAAO,gBAAgB,IAAM,EAAA,UAAA,EAAY,MAAU,IAAA,IAAI,QAAQ,CAAA,CAAA;AAAA,GACnE;AACJ;;;;"}