{"version":3,"file":"CanvasPool.mjs","sources":["../../../../../src/rendering/renderers/shared/texture/CanvasPool.ts"],"sourcesContent":["import { DOMAdapter } from '../../../../environment/adapter';\nimport { nextPow2 } from '../../../../maths/misc/pow2';\nimport { GlobalResourceRegistry } from '../../../../utils/pool/GlobalResourceRegistry';\n\nimport type { ICanvas, ICanvasRenderingContext2DSettings } from '../../../../environment/canvas/ICanvas';\nimport type { ICanvasRenderingContext2D } from '../../../../environment/canvas/ICanvasRenderingContext2D';\n\n/**\n * A utility type that represents a canvas and its rendering context.\n * @category rendering\n * @internal\n */\nexport interface CanvasAndContext\n{\n    /** The canvas element. */\n    canvas: ICanvas;\n    /** The rendering context of the canvas. */\n    context: ICanvasRenderingContext2D;\n}\n\n/**\n * CanvasPool is a utility class that manages a pool of reusable canvas elements\n * @category rendering\n * @internal\n */\nexport class CanvasPoolClass\n{\n    public canvasOptions: ICanvasRenderingContext2DSettings;\n\n    /**\n     * Allow renderTextures of the same size as screen, not just pow2\n     *\n     * Automatically sets to true after `setScreenSize`\n     * @default false\n     */\n    public enableFullScreen: boolean;\n    private _canvasPool: {[x in string | number]: CanvasAndContext[]};\n\n    constructor(canvasOptions?: ICanvasRenderingContext2DSettings)\n    {\n        this._canvasPool = Object.create(null);\n        this.canvasOptions = canvasOptions || {};\n        this.enableFullScreen = false;\n    }\n\n    /**\n     * Creates texture with params that were specified in pool constructor.\n     * @param pixelWidth - Width of texture in pixels.\n     * @param pixelHeight - Height of texture in pixels.\n     */\n    private _createCanvasAndContext(pixelWidth: number, pixelHeight: number): CanvasAndContext\n    {\n        const canvas = DOMAdapter.get().createCanvas();\n\n        canvas.width = pixelWidth;\n        canvas.height = pixelHeight;\n\n        const context = canvas.getContext('2d');\n\n        return { canvas, context };\n    }\n\n    /**\n     * Gets a Power-of-Two render texture or fullScreen texture\n     * @param minWidth - The minimum width of the render texture.\n     * @param minHeight - The minimum height of the render texture.\n     * @param resolution - The resolution of the render texture.\n     * @returns The new render texture.\n     */\n    public getOptimalCanvasAndContext(minWidth: number, minHeight: number, resolution = 1): CanvasAndContext\n    {\n        minWidth = Math.ceil((minWidth * resolution) - 1e-6);\n        minHeight = Math.ceil((minHeight * resolution) - 1e-6);\n        minWidth = nextPow2(minWidth);\n        minHeight = nextPow2(minHeight);\n\n        const key = (minWidth << 17) + (minHeight << 1);\n\n        if (!this._canvasPool[key])\n        {\n            this._canvasPool[key] = [];\n        }\n\n        let canvasAndContext = this._canvasPool[key].pop();\n\n        if (!canvasAndContext)\n        {\n            canvasAndContext = this._createCanvasAndContext(minWidth, minHeight);\n        }\n\n        return canvasAndContext;\n    }\n\n    /**\n     * Place a render texture back into the pool.\n     * @param canvasAndContext\n     */\n    public returnCanvasAndContext(canvasAndContext: CanvasAndContext): void\n    {\n        const canvas = canvasAndContext.canvas;\n        const { width, height } = canvas;\n\n        const key = (width << 17) + (height << 1);\n\n        canvasAndContext.context.resetTransform();\n        canvasAndContext.context.clearRect(0, 0, width, height);\n\n        this._canvasPool[key].push(canvasAndContext);\n    }\n\n    public clear(): void\n    {\n        this._canvasPool = {};\n    }\n}\n\n/**\n * CanvasPool is a utility class that manages a pool of reusable canvas elements\n * @category rendering\n * @internal\n */\nexport const CanvasPool = new CanvasPoolClass();\nGlobalResourceRegistry.register(CanvasPool);\n"],"names":[],"mappings":";;;;;AAyBO,MAAM,eAAA,CACb;AAAA,EAYI,YAAY,aAAA,EACZ;AACI,IAAA,IAAA,CAAK,WAAA,mBAAc,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,iBAAiB,EAAC;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,uBAAA,CAAwB,YAAoB,WAAA,EACpD;AACI,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAI,CAAE,YAAA,EAAa;AAE7C,IAAA,MAAA,CAAO,KAAA,GAAQ,UAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAEhB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAEtC,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,0BAAA,CAA2B,QAAA,EAAkB,SAAA,EAAmB,UAAA,GAAa,CAAA,EACpF;AACI,IAAA,QAAA,GAAW,IAAA,CAAK,IAAA,CAAM,QAAA,GAAW,UAAA,GAAc,IAAI,CAAA;AACnD,IAAA,SAAA,GAAY,IAAA,CAAK,IAAA,CAAM,SAAA,GAAY,UAAA,GAAc,IAAI,CAAA;AACrD,IAAA,QAAA,GAAW,SAAS,QAAQ,CAAA;AAC5B,IAAA,SAAA,GAAY,SAAS,SAAS,CAAA;AAE9B,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,IAAY,EAAA,KAAO,SAAA,IAAa,CAAA,CAAA;AAE7C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,EACzB;AACI,MAAA,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,EAAC;AAAA,IAC7B;AAEA,IAAA,IAAI,gBAAA,GAAmB,IAAA,CAAK,WAAA,CAAY,GAAG,EAAE,GAAA,EAAI;AAEjD,IAAA,IAAI,CAAC,gBAAA,EACL;AACI,MAAA,gBAAA,GAAmB,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,SAAS,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,gBAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,uBAAuB,gBAAA,EAC9B;AACI,IAAA,MAAM,SAAS,gBAAA,CAAiB,MAAA;AAChC,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAE1B,IAAA,MAAM,GAAA,GAAA,CAAO,KAAA,IAAS,EAAA,KAAO,MAAA,IAAU,CAAA,CAAA;AAEvC,IAAA,gBAAA,CAAiB,QAAQ,cAAA,EAAe;AACxC,IAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AAEtD,IAAA,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAC/C;AAAA,EAEO,KAAA,GACP;AACI,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACxB;AACJ;AAOO,MAAM,UAAA,GAAa,IAAI,eAAA;AAC9B,sBAAA,CAAuB,SAAS,UAAU,CAAA;;;;"}