{"version":3,"file":"CanvasExtract.mjs","sources":["../src/CanvasExtract.ts"],"sourcesContent":["import { extensions, ExtensionType, Rectangle, RenderTexture, utils } from 'pixijs/core';\n\nimport type { CanvasRenderer } from 'pixijs/renderer/canvas';\nimport type { BaseRenderTexture, ExtensionMetadata, ICanvas, ISystem } from 'pixijs/core';\nimport type { DisplayObject } from 'pixijs/display';\nimport type { IExtract } from 'pixijs/extract';\n\nconst TEMP_RECT = new Rectangle();\n\n/**\n * The extract manager provides functionality to export content from the renderers.\n *\n * An instance of this class is automatically created by default, and can be found at `renderer.extract`\n * @class\n * @memberof PIXI\n */\nexport class CanvasExtract implements ISystem, IExtract\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        name: 'extract',\n        type: ExtensionType.CanvasRendererSystem,\n    };\n\n    /** A reference to the current renderer */\n    public renderer: CanvasRenderer;\n\n    /**\n     * @param renderer - A reference to the current renderer\n     */\n    constructor(renderer: CanvasRenderer)\n    {\n        this.renderer = renderer;\n    }\n\n    /**\n     * Will return a HTML Image of the target\n     * @param target - A displayObject or renderTexture\n     *  to convert. If left empty will use the main renderer\n     * @param format - Image format, e.g. \"image/jpeg\" or \"image/webp\".\n     * @param quality - JPEG or Webp compression from 0 to 1. Default is 0.92.\n     * @returns HTML Image of the target\n     */\n    public async image(target?: DisplayObject | RenderTexture, format?: string, quality?: number): Promise<HTMLImageElement>\n    {\n        const image = new Image();\n\n        image.src = await this.base64(target, format, quality);\n\n        return image;\n    }\n\n    /**\n     * Will return a base64 encoded string of this target. It works by calling\n     *  `CanvasExtract.getCanvas` and then running toDataURL on that.\n     * @param target - A displayObject or renderTexture\n     *  to convert. If left empty will use the main renderer\n     * @param format - Image format, e.g. \"image/jpeg\" or \"image/webp\".\n     * @param quality - JPEG or Webp compression from 0 to 1. Default is 0.92.\n     * @returns A base64 encoded string of the texture.\n     */\n    public async base64(target?: DisplayObject | RenderTexture, format?: string, quality?: number): Promise<string>\n    {\n        const canvas = this.canvas(target);\n\n        if (canvas.toDataURL !== undefined)\n        {\n            return canvas.toDataURL(format, quality);\n        }\n        if (canvas.convertToBlob !== undefined)\n        {\n            const blob = await canvas.convertToBlob({ type: format, quality });\n\n            return await new Promise<string>((resolve) =>\n            {\n                const reader = new FileReader();\n\n                reader.onload = () => resolve(reader.result as string);\n                reader.readAsDataURL(blob);\n            });\n        }\n\n        throw new Error('CanvasExtract.base64() requires ICanvas.toDataURL or ICanvas.convertToBlob to be implemented');\n    }\n\n    /**\n     * Creates a Canvas element, renders this target to it and then returns it.\n     * @param target - A displayObject or renderTexture\n     *  to convert. If left empty will use the main renderer\n     * @param frame - The frame the extraction is restricted to.\n     * @returns A Canvas element with the texture rendered on.\n     */\n    public canvas(target?: DisplayObject | RenderTexture, frame?: Rectangle): ICanvas\n    {\n        const renderer = this.renderer;\n        let context;\n        let resolution;\n        let renderTexture;\n\n        if (target)\n        {\n            if (target instanceof RenderTexture)\n            {\n                renderTexture = target;\n            }\n            else\n            {\n                renderTexture = renderer.generateTexture(target);\n            }\n        }\n\n        if (renderTexture)\n        {\n            context = (renderTexture.baseTexture as BaseRenderTexture)._canvasRenderTarget.context;\n            resolution = (renderTexture.baseTexture as BaseRenderTexture)._canvasRenderTarget.resolution;\n            frame = frame ?? renderTexture.frame;\n        }\n        else\n        {\n            context = renderer.canvasContext.rootContext;\n            resolution = renderer._view.resolution;\n\n            if (!frame)\n            {\n                frame = TEMP_RECT;\n                frame.width = renderer.width;\n                frame.height = renderer.height;\n            }\n        }\n\n        const x = Math.round(frame.x * resolution);\n        const y = Math.round(frame.y * resolution);\n        const width = Math.round(frame.width * resolution);\n        const height = Math.round(frame.height * resolution);\n\n        const canvasBuffer = new utils.CanvasRenderTarget(width, height, 1);\n        const canvasData = context.getImageData(x, y, width, height);\n\n        canvasBuffer.context.putImageData(canvasData, 0, 0);\n\n        // send the canvas back..\n        return canvasBuffer.canvas;\n    }\n\n    /**\n     * Will return a one-dimensional array containing the pixel data of the entire texture in RGBA\n     * order, with integer values between 0 and 255 (included).\n     * @param target - A displayObject or renderTexture\n     *  to convert. If left empty will use the main renderer\n     * @param frame - The frame the extraction is restricted to.\n     * @returns One-dimensional array containing the pixel data of the entire texture\n     */\n    public pixels(target?: DisplayObject | RenderTexture, frame?: Rectangle): Uint8ClampedArray\n    {\n        const renderer = this.renderer;\n        let context;\n        let resolution;\n        let renderTexture;\n\n        if (target)\n        {\n            if (target instanceof RenderTexture)\n            {\n                renderTexture = target;\n            }\n            else\n            {\n                renderTexture = renderer.generateTexture(target);\n            }\n        }\n\n        if (renderTexture)\n        {\n            context = (renderTexture.baseTexture as BaseRenderTexture)._canvasRenderTarget.context;\n            resolution = (renderTexture.baseTexture as BaseRenderTexture)._canvasRenderTarget.resolution;\n            frame = frame ?? renderTexture.frame;\n        }\n        else\n        {\n            context = renderer.canvasContext.rootContext;\n            resolution = renderer.resolution;\n\n            if (!frame)\n            {\n                frame = TEMP_RECT;\n                frame.width = renderer.width;\n                frame.height = renderer.height;\n            }\n        }\n\n        const x = Math.round(frame.x * resolution);\n        const y = Math.round(frame.y * resolution);\n        const width = Math.round(frame.width * resolution);\n        const height = Math.round(frame.height * resolution);\n\n        return context.getImageData(x, y, width, height).data;\n    }\n\n    /** Destroys the extract */\n    public destroy(): void\n    {\n        this.renderer = null;\n    }\n}\n\nextensions.add(CanvasExtract);\n"],"names":[],"mappings":"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"}