{"version":3,"file":"CanvasRenderTargetAdaptor.mjs","sources":["../../../../../src/rendering/renderers/canvas/renderTarget/CanvasRenderTargetAdaptor.ts"],"sourcesContent":["import { Color } from '../../../../color/Color';\nimport { DOMAdapter } from '../../../../environment/adapter';\nimport { CanvasSource } from '../../shared/texture/sources/CanvasSource';\n\nimport type { ICanvas } from '../../../../environment/canvas/ICanvas';\nimport type { ICanvasRenderingContext2D } from '../../../../environment/canvas/ICanvasRenderingContext2D';\nimport type { Rectangle } from '../../../../maths/shapes/Rectangle';\nimport type { CLEAR_OR_BOOL } from '../../gl/const';\nimport type { RenderTarget } from '../../shared/renderTarget/RenderTarget';\nimport type { RenderTargetAdaptor, RenderTargetSystem } from '../../shared/renderTarget/RenderTargetSystem';\nimport type { TextureSource } from '../../shared/texture/sources/TextureSource';\nimport type { Texture } from '../../shared/texture/Texture';\nimport type { CanvasRenderer } from '../CanvasRenderer';\n\n/**\n * Canvas render target backing store.\n * @internal\n */\nexport type CanvasRenderTarget = {\n    /** Backing canvas element. */\n    canvas: ICanvas;\n    /** 2D context associated with the canvas. */\n    context: ICanvasRenderingContext2D;\n    /** Pixel width. */\n    width: number;\n    /** Pixel height. */\n    height: number;\n};\n\n/**\n * Canvas adaptor for render targets.\n * @category rendering\n * @advanced\n */\nexport class CanvasRenderTargetAdaptor implements RenderTargetAdaptor<CanvasRenderTarget>\n{\n    private _renderer: CanvasRenderer;\n    private _renderTargetSystem: RenderTargetSystem<CanvasRenderTarget>;\n\n    /**\n     * Initializes the adaptor.\n     * @param renderer - Canvas renderer instance.\n     * @param renderTargetSystem - The render target system.\n     * @advanced\n     */\n    public init(renderer: CanvasRenderer, renderTargetSystem: RenderTargetSystem<CanvasRenderTarget>): void\n    {\n        this._renderer = renderer;\n        this._renderTargetSystem = renderTargetSystem;\n    }\n\n    /**\n     * Creates a GPU render target for canvas.\n     * @param renderTarget - Render target to initialize.\n     * @advanced\n     */\n    public initGpuRenderTarget(renderTarget: RenderTarget): CanvasRenderTarget\n    {\n        const colorTexture = renderTarget.colorTexture;\n        const { canvas, context } = this._ensureCanvas(colorTexture);\n\n        return {\n            canvas,\n            context,\n            width: canvas.width,\n            height: canvas.height,\n        };\n    }\n\n    /**\n     * Resizes the backing canvas for a render target.\n     * @param renderTarget - Render target to resize.\n     * @advanced\n     */\n    public resizeGpuRenderTarget(renderTarget: RenderTarget): void\n    {\n        const colorTexture = renderTarget.colorTexture;\n        const { canvas } = this._ensureCanvas(colorTexture);\n\n        canvas.width = renderTarget.pixelWidth;\n        canvas.height = renderTarget.pixelHeight;\n    }\n\n    /**\n     * Starts a render pass on the canvas target.\n     * @param renderTarget - Target to render to.\n     * @param clear - Clear mode.\n     * @param clearColor - Optional clear color.\n     * @param viewport - Optional viewport.\n     * @advanced\n     */\n    public startRenderPass(\n        renderTarget: RenderTarget,\n        clear: CLEAR_OR_BOOL,\n        clearColor?: number[],\n        viewport?: Rectangle\n    ): void\n    {\n        const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n        this._renderer.canvasContext.activeContext = gpuRenderTarget.context as any;\n        this._renderer.canvasContext.activeResolution = renderTarget.resolution;\n\n        if (clear)\n        {\n            this.clear(renderTarget, clear, clearColor, viewport);\n        }\n    }\n\n    /**\n     * Clears the render target.\n     * @param renderTarget - Target to clear.\n     * @param _clear - Clear mode (unused).\n     * @param clearColor - Optional clear color.\n     * @param viewport - Optional viewport rectangle.\n     * @advanced\n     */\n    public clear(\n        renderTarget: RenderTarget,\n        _clear: CLEAR_OR_BOOL,\n        clearColor?: number[],\n        viewport?: Rectangle\n    ): void\n    {\n        const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n        const context = gpuRenderTarget.context as ICanvasRenderingContext2D;\n        const bounds = viewport || { x: 0, y: 0, width: renderTarget.pixelWidth, height: renderTarget.pixelHeight };\n\n        context.setTransform(1, 0, 0, 1, 0, 0);\n        context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n        if (clearColor)\n        {\n            const color = Color.shared.setValue(clearColor);\n\n            if (color.alpha > 0)\n            {\n                context.globalAlpha = color.alpha;\n                context.fillStyle = color.toHex();\n                context.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);\n                context.globalAlpha = 1;\n            }\n        }\n    }\n\n    /**\n     * Finishes the render pass (no-op for canvas).\n     * @advanced\n     */\n    public finishRenderPass(): void\n    {\n        // no-op for canvas\n    }\n\n    /**\n     * Copies a render target into a texture source.\n     * @param {RenderTarget} sourceRenderSurfaceTexture - Source render target.\n     * @param {Texture} destinationTexture - Destination texture.\n     * @param {object} originSrc - Source origin.\n     * @param {number} originSrc.x - Source x origin.\n     * @param {number} originSrc.y - Source y origin.\n     * @param {object} size - Copy size.\n     * @param {number} size.width - Copy width.\n     * @param {number} size.height - Copy height.\n     * @param {object} [originDest] - Destination origin.\n     * @param {number} originDest.x - Destination x origin.\n     * @param {number} originDest.y - Destination y origin.\n     * @advanced\n     */\n    public copyToTexture(\n        sourceRenderSurfaceTexture: RenderTarget,\n        destinationTexture: Texture,\n        originSrc: { x: number; y: number },\n        size: { width: number; height: number },\n        originDest?: { x: number; y: number },\n    ): Texture\n    {\n        const sourceGpuTarget = this._renderTargetSystem.getGpuRenderTarget(sourceRenderSurfaceTexture);\n        const sourceCanvas = sourceGpuTarget.canvas as CanvasImageSource;\n\n        const destSource = destinationTexture.source as TextureSource;\n        const { context } = this._ensureCanvas(destSource);\n\n        const dx = originDest?.x ?? 0;\n        const dy = originDest?.y ?? 0;\n\n        context.drawImage(\n            sourceCanvas,\n            originSrc.x,\n            originSrc.y,\n            size.width,\n            size.height,\n            dx,\n            dy,\n            size.width,\n            size.height\n        );\n\n        destSource.update();\n\n        return destinationTexture;\n    }\n\n    /**\n     * Destroys a GPU render target (no-op for canvas).\n     * @param _gpuRenderTarget - Target to destroy.\n     * @advanced\n     */\n    public destroyGpuRenderTarget(_gpuRenderTarget: CanvasRenderTarget): void\n    {\n        // no-op for canvas\n    }\n\n    private _ensureCanvas(source: TextureSource)\n    {\n        let canvas = source.resource as ICanvas;\n\n        if (!canvas || !(CanvasSource.test(canvas)))\n        {\n            canvas = DOMAdapter.get().createCanvas(source.pixelWidth, source.pixelHeight);\n            source.resource = canvas as any;\n        }\n\n        if (canvas.width !== source.pixelWidth || canvas.height !== source.pixelHeight)\n        {\n            canvas.width = source.pixelWidth;\n            canvas.height = source.pixelHeight;\n        }\n\n        const context = canvas.getContext('2d') as ICanvasRenderingContext2D;\n\n        return { canvas, context };\n    }\n}\n"],"names":[],"mappings":"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"}