{"version":3,"file":"CanvasFilterSystem.mjs","sources":["../../../../src/rendering/renderers/canvas/CanvasFilterSystem.ts"],"sourcesContent":["import { extensions, ExtensionType } from '../../../extensions/Extensions';\nimport { Bounds } from '../../../scene/container/bounds/Bounds';\nimport { getGlobalRenderableBounds } from '../../../scene/container/bounds/getRenderableBounds';\nimport { getPo2TextureFromSource } from '../../../scene/text/utils/getPo2TextureFromSource';\nimport { CanvasPool } from '../shared/texture/CanvasPool';\nimport { canvasUtils } from './utils/canvasUtils';\n\nimport type { ICanvasRenderingContext2D } from '../../../environment/canvas/ICanvasRenderingContext2D';\nimport type { Filter } from '../../../filters/Filter';\nimport type { FilterInstruction } from '../../../filters/FilterSystem';\nimport type { Container } from '../../../scene/container/Container';\nimport type { System } from '../shared/system/System';\nimport type { Texture } from '../shared/texture/Texture';\n\n/**\n * Interface for filters that can supply a CSS filter string for Canvas2D.\n * @category filters\n * @advanced\n */\nexport interface CanvasFilterCapable\n{\n    /** Returns CSS filter string (e.g., 'blur(5px)') or null if not supported */\n    getCanvasFilterString(): string | null;\n}\n\n/**\n * Check if a filter supports Canvas2D rendering.\n * @param filter - The filter to check\n * @returns True if the filter implements getCanvasFilterString()\n * @internal\n */\nexport function isCanvasFilterCapable(filter: Filter): filter is Filter & CanvasFilterCapable\n{\n    return typeof (filter as unknown as CanvasFilterCapable).getCanvasFilterString === 'function';\n}\n\n/**\n * Internal data stored per filter stack entry.\n * @internal\n */\nclass CanvasFilterFrame\n{\n    public skip = false;\n    public useClip = false;\n    public filters: Filter[] = null;\n    public container: Container = null;\n    public bounds = new Bounds();\n    public cssFilterString = '';\n}\n\n/**\n * Canvas2D filter system that applies compatible filters using CSS filter strings.\n * Unsupported filters are skipped with a warn-once message.\n * @category rendering\n * @advanced\n */\nexport class CanvasFilterSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [ExtensionType.CanvasSystem],\n        name: 'filter',\n    } as const;\n\n    /** The renderer this system is attached to */\n    public readonly renderer: {\n        canvasContext: {\n            activeContext: ICanvasRenderingContext2D;\n            activeResolution: number;\n        };\n    };\n\n    private _filterStack: CanvasFilterFrame[] = [];\n    private _filterStackIndex = 0;\n    private _savedStates: { filter: string; alphaMultiplier: number }[] = [];\n    private _alphaMultiplier = 1;\n    private _warnedFilterTypes = new Set<string>();\n\n    /**\n     * @param renderer - The Canvas renderer\n     * @param renderer.canvasContext\n     * @param renderer.canvasContext.activeContext\n     * @param renderer.canvasContext.activeResolution\n     */\n    constructor(renderer: {\n        canvasContext: {\n            activeContext: ICanvasRenderingContext2D;\n            activeResolution: number;\n        };\n    })\n    {\n        this.renderer = renderer;\n    }\n\n    /**\n     * Push a filter instruction onto the stack.\n     * Called when entering a filtered container.\n     * @param instruction - The filter instruction from FilterPipe\n     */\n    public push(instruction: FilterInstruction): void\n    {\n        const filterFrame = this._pushFilterFrame();\n        const filters = instruction.filterEffect.filters as Filter[];\n\n        filterFrame.skip = false;\n        filterFrame.useClip = false;\n        filterFrame.filters = filters;\n        filterFrame.container = instruction.container;\n        filterFrame.cssFilterString = '';\n\n        if (filters.every((filter) => !filter.enabled))\n        {\n            filterFrame.skip = true;\n\n            return;\n        }\n\n        const cssFilters: string[] = [];\n        const alphaMultiplier = 1;\n\n        for (const filter of filters)\n        {\n            if (!filter.enabled) continue;\n\n            if (!isCanvasFilterCapable(filter))\n            {\n                this._warnUnsupportedFilter(filter);\n\n                continue;\n            }\n\n            const cssString = filter.getCanvasFilterString();\n\n            if (cssString === null)\n            {\n                this._warnUnsupportedFilter(filter);\n\n                continue;\n            }\n\n            if (cssString)\n            {\n                cssFilters.push(cssString);\n            }\n        }\n\n        if (cssFilters.length === 0 && alphaMultiplier === 1)\n        {\n            filterFrame.skip = true;\n\n            return;\n        }\n\n        filterFrame.cssFilterString = cssFilters.join(' ');\n\n        this._calculateFilterArea(instruction, filterFrame.bounds);\n        filterFrame.useClip = !!instruction.filterEffect.filterArea;\n\n        const context = this.renderer.canvasContext.activeContext;\n        const previousFilter = context.filter || 'none';\n\n        this._savedStates.push({ filter: previousFilter, alphaMultiplier: this._alphaMultiplier });\n\n        if (filterFrame.useClip\n            && Number.isFinite(filterFrame.bounds.width)\n            && Number.isFinite(filterFrame.bounds.height)\n            && filterFrame.bounds.width > 0\n            && filterFrame.bounds.height > 0)\n        {\n            const resolution = this.renderer.canvasContext.activeResolution || 1;\n\n            context.save();\n            context.setTransform(1, 0, 0, 1, 0, 0);\n            context.beginPath();\n            context.rect(\n                filterFrame.bounds.x * resolution,\n                filterFrame.bounds.y * resolution,\n                filterFrame.bounds.width * resolution,\n                filterFrame.bounds.height * resolution\n            );\n            context.clip();\n        }\n        else\n        {\n            filterFrame.useClip = false;\n        }\n\n        if (alphaMultiplier !== 1)\n        {\n            this._alphaMultiplier *= alphaMultiplier;\n        }\n\n        if (filterFrame.cssFilterString)\n        {\n            context.filter = previousFilter !== 'none'\n                ? `${previousFilter} ${filterFrame.cssFilterString}`\n                : filterFrame.cssFilterString;\n        }\n    }\n\n    /** Pop a filter from the stack. Called when exiting a filtered container. */\n    public pop(): void\n    {\n        const filterFrame = this._popFilterFrame();\n\n        if (filterFrame.skip)\n        {\n            return;\n        }\n\n        const savedState = this._savedStates.pop();\n\n        if (!savedState)\n        {\n            return;\n        }\n\n        const context = this.renderer.canvasContext.activeContext;\n\n        if (filterFrame.useClip)\n        {\n            context.restore();\n        }\n        else\n        {\n            context.filter = savedState.filter;\n        }\n\n        this._alphaMultiplier = savedState.alphaMultiplier;\n    }\n\n    /**\n     * Applies supported filters to a texture and returns a new texture.\n     * Unsupported filters are skipped with a warn-once message.\n     * @param params - The parameters for applying filters.\n     * @param params.texture\n     * @param params.filters\n     * @returns The resulting texture after filters are applied.\n     */\n    public generateFilteredTexture({ texture, filters }: { texture: Texture; filters: Filter[] }): Texture\n    {\n        if (!filters?.length || filters.every((filter) => !filter.enabled))\n        {\n            return texture;\n        }\n\n        const cssFilters: string[] = [];\n        const alphaMultiplier = 1;\n\n        for (const filter of filters)\n        {\n            if (!filter.enabled) continue;\n\n            if (!isCanvasFilterCapable(filter))\n            {\n                this._warnUnsupportedFilter(filter);\n\n                continue;\n            }\n\n            const cssString = filter.getCanvasFilterString();\n\n            if (cssString === null)\n            {\n                this._warnUnsupportedFilter(filter);\n\n                continue;\n            }\n\n            if (cssString)\n            {\n                cssFilters.push(cssString);\n            }\n        }\n\n        if (cssFilters.length === 0 && alphaMultiplier === 1)\n        {\n            return texture;\n        }\n\n        const source = canvasUtils.getCanvasSource(texture);\n\n        if (!source)\n        {\n            return texture;\n        }\n\n        const frame = texture.frame;\n        const resolution = texture.source._resolution ?? texture.source.resolution ?? 1;\n        const width = frame.width;\n        const height = frame.height;\n\n        const canvasAndContext = CanvasPool.getOptimalCanvasAndContext(width, height, resolution);\n        const { canvas, context } = canvasAndContext;\n\n        context.setTransform(1, 0, 0, 1, 0, 0);\n        context.clearRect(0, 0, canvas.width, canvas.height);\n\n        if (cssFilters.length)\n        {\n            context.filter = cssFilters.join(' ');\n        }\n\n        if (alphaMultiplier !== 1)\n        {\n            context.globalAlpha = alphaMultiplier;\n        }\n\n        const sx = frame.x * resolution;\n        const sy = frame.y * resolution;\n        const sw = width * resolution;\n        const sh = height * resolution;\n\n        context.drawImage(\n            source,\n            sx,\n            sy,\n            sw,\n            sh,\n            0,\n            0,\n            sw,\n            sh\n        );\n\n        context.filter = 'none';\n        context.globalAlpha = 1;\n\n        return getPo2TextureFromSource(canvas, width, height, resolution);\n    }\n\n    /**\n     * Calculate the filter area bounds.\n     * @param instruction - Filter instruction\n     * @param bounds - Bounds object to populate\n     */\n    private _calculateFilterArea(instruction: FilterInstruction, bounds: Bounds): void\n    {\n        if (instruction.renderables)\n        {\n            getGlobalRenderableBounds(instruction.renderables, bounds);\n        }\n        else if (instruction.filterEffect.filterArea)\n        {\n            bounds.clear();\n            bounds.addRect(instruction.filterEffect.filterArea);\n            bounds.applyMatrix(instruction.container.worldTransform);\n        }\n        else\n        {\n            instruction.container.getFastGlobalBounds(true, bounds);\n        }\n\n        if (instruction.container)\n        {\n            const renderGroup = instruction.container.renderGroup || instruction.container.parentRenderGroup;\n            const filterFrameTransform = renderGroup?.cacheToLocalTransform;\n\n            if (filterFrameTransform)\n            {\n                bounds.applyMatrix(filterFrameTransform);\n            }\n        }\n    }\n\n    private _warnUnsupportedFilter(filter: Filter): void\n    {\n        const filterName = filter?.constructor?.name || 'Filter';\n\n        if (this._warnedFilterTypes.has(filterName))\n        {\n            return;\n        }\n\n        this._warnedFilterTypes.add(filterName);\n        console.warn(\n            `CanvasRenderer: filter \"${filterName}\" is not supported in Canvas2D and will be skipped.`\n        );\n    }\n\n    public get alphaMultiplier(): number\n    {\n        return this._alphaMultiplier;\n    }\n\n    private _pushFilterFrame(): CanvasFilterFrame\n    {\n        let filterFrame = this._filterStack[this._filterStackIndex];\n\n        if (!filterFrame)\n        {\n            filterFrame = this._filterStack[this._filterStackIndex] = new CanvasFilterFrame();\n        }\n\n        this._filterStackIndex++;\n\n        return filterFrame;\n    }\n\n    private _popFilterFrame(): CanvasFilterFrame\n    {\n        if (this._filterStackIndex <= 0)\n        {\n            return this._filterStack[0];\n        }\n\n        this._filterStackIndex--;\n\n        return this._filterStack[this._filterStackIndex];\n    }\n\n    /** Destroys the system */\n    public destroy(): void\n    {\n        this._filterStack = null;\n        this._savedStates = null;\n        this._warnedFilterTypes = null;\n        this._alphaMultiplier = 1;\n    }\n}\n\nextensions.add(CanvasFilterSystem);\n"],"names":[],"mappings":"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"}