{"version":3,"file":"ConvolutionFilter.mjs","sources":["../../src/convolution/ConvolutionFilter.ts"],"sourcesContent":["import { deprecation, Filter, GlProgram, GpuProgram, PointData } from 'pixi.js';\nimport { vertex, wgslVertex } from '../defaults';\nimport fragment from './convolution.frag';\nimport source from './convolution.wgsl';\n\ntype FixedArray<T, L extends number> = [ T, ...Array<T> ] & { length: L };\n\nexport type ConvolutionMatrix = Float32Array | FixedArray<number, 9>;\n\n/** Options for the ConvolutionFilter constructor. */\nexport interface ConvolutionFilterOptions\n{\n    /**\n     * An array of values used for matrix transformation, specified as a 9 point Array\n     * @example\n     * const matrix = new Float32Array(9); // 9 elements of value 0\n     * const matrix = [0,0.5,0,0.5,1,0.5,0,0.5,0];\n     * @default [0,0,0,0,0,0,0,0,0]\n     */\n    matrix?: ConvolutionMatrix;\n    /**\n     * Width of the object you are transforming\n     * @default 200\n     */\n    width?: number;\n    /**\n     * Height of the object you are transforming\n     * @default 200\n     */\n    height?: number;\n}\n\n/**\n * The ConvolutionFilter class applies a matrix convolution filter effect.\n * A convolution combines pixels in the input image with neighboring pixels to produce a new image.\n * A wide variety of image effects can be achieved through convolutions, including blurring, edge\n * detection, sharpening, embossing, and beveling. The matrix should be specified as a 9 point Array.\n * See https://docs.gimp.org/2.10/en/gimp-filter-convolution-matrix.html for more info.<br>\n * ![original](../screenshots/original.png)![filter](../screenshots/convolution.png)\n *\n * @class\n * @extends Filter\n */\nexport class ConvolutionFilter extends Filter\n{\n    /** Default values for options. */\n    public static readonly DEFAULT_OPTIONS: ConvolutionFilterOptions = {\n        matrix: new Float32Array(9),\n        width: 200,\n        height: 200,\n    };\n\n    public uniforms: {\n        uMatrix: ConvolutionMatrix;\n        uTexelSize: PointData;\n    };\n\n    /**\n     * @param options - Options for the ConvolutionFilter constructor.\n     */\n    constructor(options?: ConvolutionFilterOptions);\n    /**\n     * @deprecated since 6.0.0\n     *\n     * @param {number[]} [matrix=[0,0,0,0,0,0,0,0,0]] - An array of values used for matrix transformation.\n     *        Specified as a 9 point Array.\n     * @param {number} [width=200] - Width of the object you are transforming\n     * @param {number} [height=200] - Height of the object you are transforming\n     */\n    constructor(matrix: number[], width?: number, height?: number);\n    /** @ignore */\n    constructor(...args: [ConvolutionFilterOptions?] | [number[], number?, number?])\n    {\n        let options = args[0] ?? {};\n\n        if (Array.isArray(options))\n        {\n            // eslint-disable-next-line max-len\n            deprecation('6.0.0', 'ConvolutionFilter constructor params are now options object. See params: { matrix, width, height }');\n\n            options = { matrix: options as ConvolutionMatrix };\n\n            if (args[1] !== undefined) options.width = args[1];\n            if (args[2] !== undefined) options.height = args[2];\n        }\n\n        options = { ...ConvolutionFilter.DEFAULT_OPTIONS, ...options };\n\n        const width = options.width ?? 200;\n        const height = options.height ?? 200;\n\n        const gpuProgram = GpuProgram.from({\n            vertex: {\n                source: wgslVertex,\n                entryPoint: 'mainVertex',\n            },\n            fragment: {\n                source,\n                entryPoint: 'mainFragment',\n            },\n        });\n\n        const glProgram = GlProgram.from({\n            vertex,\n            fragment,\n            name: 'convolution-filter',\n        });\n\n        super({\n            gpuProgram,\n            glProgram,\n            resources: {\n                convolutionUniforms: {\n                    uMatrix: { value: options.matrix, type: 'mat3x3<f32>' },\n                    uTexelSize: { value: { x: 1 / width, y: 1 / height }, type: 'vec2<f32>' },\n                },\n            },\n        });\n\n        this.uniforms = this.resources.convolutionUniforms.uniforms;\n\n        this.width = width;\n        this.height = height;\n    }\n\n    /**\n     * An array of values used for matrix transformation, specified as a 9 point Array\n     * @example\n     * const matrix = new Float32Array(9); // 9 elements of value 0\n     * const matrix = [0,0.5,0,0.5,1,0.5,0,0.5,0];\n     * @default [0,0,0,0,0,0,0,0,0]\n     */\n    get matrix(): ConvolutionMatrix { return this.uniforms.uMatrix; }\n    set matrix(matrix: ConvolutionMatrix)\n    {\n        matrix.forEach((v, i) =>\n        {\n            this.uniforms.uMatrix[i] = v;\n        });\n    }\n\n    /**\n     * Width of the object you are transforming\n     * @default 200\n     */\n    get width(): number { return 1 / this.uniforms.uTexelSize.x; }\n    set width(value: number) { this.uniforms.uTexelSize.x = 1 / value; }\n\n    /**\n     * Height of the object you are transforming\n     * @default 200\n     */\n    get height(): number { return 1 / this.uniforms.uTexelSize.y; }\n    set height(value: number) { this.uniforms.uTexelSize.y = 1 / value; }\n}\n"],"names":[],"mappings":"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"}