{"version":3,"file":"convolutionFilter.cjs","sources":["../../../src/filters/convolutionFilter.ts"],"sourcesContent":["import {ConvolutionFilter, type ConvolutionMatrix} from 'pixi-filters';\nimport { type ConvolutionFilterConfig, type FilterResult } from './types';\nimport { ShaderResourceManager } from '../managers/ShaderResourceManager';\n\n/**\n * Helper function to create ConvolutionMatrix from number array\n * @param values - Array of 9 numbers for the 3x3 matrix\n * @returns A Float32Array that conforms to the ConvolutionMatrix type\n */\nfunction createMatrix(values: number[]): ConvolutionMatrix {\n    return new Float32Array(values);\n}\n\n/**\n * Creates a Convolution filter that applies a matrix convolution effect\n *\n * A convolution combines pixels in the input image with neighboring pixels to produce\n * a new image. Using different matrices, a wide variety of effects can be achieved,\n * including blurring, edge detection, sharpening, embossing, and beveling.\n * Uses shader pooling for better performance.\n *\n * @param config - Configuration for the Convolution filter\n * @returns FilterResult with the filter instance and control functions\n */\nexport function createConvolutionFilter(config: ConvolutionFilterConfig): FilterResult {\n    // Get shader manager instance\n    const shaderManager = ShaderResourceManager.getInstance();\n\n    // Create options object for the filter\n    const options: any = {\n        width: config.width ?? 200,      // Default width\n        height: config.height ?? 200,     // Default height\n    };\n\n    // Use provided matrix or default to an identity matrix (no effect)\n    const defaultMatrix = createMatrix([0, 0, 0, 0, 1, 0, 0, 0, 0]);\n    if (config.matrix) {\n        options.matrix = config.matrix;\n    } else {\n        options.matrix = defaultMatrix;\n    }\n\n    // Create a unique key for this filter configuration\n    const presetKey = config.preset || 'custom';\n    const shaderKey = `convolution-filter-${presetKey}-${config.width || 200}-${config.height || 200}`;\n\n    // Create the filter with options\n    const filter = new ConvolutionFilter(options);\n\n    // Register filter with shader manager\n    try {\n        shaderManager.registerFilter(filter, shaderKey);\n    } catch (error) {\n        console.warn('Error registering convolution filter with shader manager:', error);\n    }\n\n    // Common convolution matrices for different effects\n    type PresetMatrices = {\n        [key: string]: ConvolutionMatrix;\n    };\n\n    const presetMatrices: PresetMatrices = {\n        normal: createMatrix([0, 0, 0, 0, 1, 0, 0, 0, 0]),            // Identity (no effect)\n        gaussianBlur: createMatrix([1/16, 2/16, 1/16,\n            2/16, 4/16, 2/16,\n            1/16, 2/16, 1/16]),                // Gaussian blur\n        boxBlur: createMatrix([1/9, 1/9, 1/9,\n            1/9, 1/9, 1/9,\n            1/9, 1/9, 1/9]),                       // Box blur\n        sharpen: createMatrix([0, -1, 0,\n            -1, 5, -1,\n            0, -1, 0]),                            // Sharpen\n        edgeDetection: createMatrix([-1, -1, -1,\n            -1, 8, -1,\n            -1, -1, -1]),                    // Edge detection\n        emboss: createMatrix([-2, -1, 0,\n            -1, 1, 1,\n            0, 1, 2]),                             // Emboss\n        topSobel: createMatrix([1, 2, 1,\n            0, 0, 0,\n            -1, -2, -1]),                          // Top Sobel edge detection\n        rightSobel: createMatrix([-1, 0, 1,\n            -2, 0, 2,\n            -1, 0, 1])                          // Right Sobel edge detection\n    };\n\n    /**\n     * Apply a preset matrix effect\n     *\n     * @param presetName - Name of the preset effect to apply\n     * @param intensity - Optional intensity factor to scale the effect (1.0 = normal)\n     */\n    const applyPreset = (presetName: string, intensity: number = 1.0): void => {\n        if (presetMatrices[presetName]) {\n            // If intensity is not 1.0, scale the matrix values\n            if (intensity !== 1.0) {\n                // Start with identity matrix (center pixel only)\n                const baseMatrix = new Float32Array(presetMatrices.normal);\n                const effectMatrix = presetMatrices[presetName];\n                const scaledMatrix = new Float32Array(9);\n\n                // For each position in the matrix\n                for (let i = 0; i < 9; i++) {\n                    // Calculate the difference between effect and base (identity)\n                    const diff = effectMatrix[i] - baseMatrix[i];\n                    // Scale the difference by intensity and add to base\n                    scaledMatrix[i] = baseMatrix[i] + (diff * intensity);\n                }\n\n                // Apply the scaled matrix\n                filter.matrix = scaledMatrix;\n            } else {\n                // Apply preset directly at full intensity\n                filter.matrix = new Float32Array(presetMatrices[presetName]);\n            }\n        } else {\n            console.warn(`Preset \"${presetName}\" not found, using default matrix`);\n            filter.matrix = new Float32Array(defaultMatrix);\n        }\n    };\n\n    /**\n     * Update the filter's intensity based on the configuration\n     *\n     * @param intensity - New intensity value (0-10 scale)\n     */\n    const updateIntensity = (intensity: number): void => {\n        // Normalize intensity to a 0-10 scale\n        const normalizedIntensity = Math.max(0, Math.min(10, intensity));\n\n        // Convert to 0-1 range for easier matrix manipulation\n        const scaledIntensity = normalizedIntensity / 10;\n\n        // Check if we have a preset to apply\n        if (config.preset && presetMatrices[config.preset]) {\n            applyPreset(config.preset, scaledIntensity);\n        }\n        // If we have a primary matrix property defined\n        else if (config.primaryProperty === 'matrix' && config.matrix) {\n            // Scale between identity (no effect) and the provided matrix\n            const baseMatrix = new Float32Array(presetMatrices.normal);\n            const scaledMatrix = new Float32Array(9);\n\n            // For each position in the matrix\n            for (let i = 0; i < 9; i++) {\n                if (config.matrix) {\n                    // Calculate the difference between configured and base (identity)\n                    const diff = config.matrix[i] - baseMatrix[i];\n                    // Scale the difference by intensity and add to base\n                    scaledMatrix[i] = baseMatrix[i] + (diff * scaledIntensity);\n                } else {\n                    scaledMatrix[i] = baseMatrix[i];\n                }\n            }\n\n            // Apply the scaled matrix\n            filter.matrix = scaledMatrix;\n        }\n        // If nothing else applies, use a default effect (sharpen)\n        else {\n            applyPreset('sharpen', scaledIntensity);\n        }\n    };\n\n    // Set initial intensity\n    updateIntensity(config.intensity);\n\n    /**\n     * Reset the filter to default state (identity matrix - no effect)\n     */\n    const reset = (): void => {\n        filter.matrix = new Float32Array(presetMatrices.normal);\n    };\n\n    /**\n     * Release any WebGL resources used by this filter\n     */\n    const dispose = (): void => {\n        try {\n            shaderManager.releaseFilter(filter, shaderKey);\n        } catch (error) {\n            console.warn('Error releasing convolution filter shader:', error);\n        }\n        filter.destroy();\n    };\n\n    return { filter, updateIntensity, reset, dispose };\n}"],"names":["ShaderResourceManager","ConvolutionFilter"],"mappings":";;;;;AASA,SAAS,aAAa,MAAqC,EAAA;AACvD,EAAO,OAAA,IAAI,aAAa,MAAM,CAAA;AAClC;AAaO,SAAS,wBAAwB,MAA+C,EAAA;AAEnF,EAAM,MAAA,aAAA,GAAgBA,4CAAsB,WAAY,EAAA;AAGxD,EAAA,MAAM,OAAe,GAAA;AAAA,IACjB,KAAA,EAAO,OAAO,KAAS,IAAA,GAAA;AAAA;AAAA,IACvB,MAAA,EAAQ,OAAO,MAAU,IAAA;AAAA;AAAA,GAC7B;AAGA,EAAA,MAAM,aAAgB,GAAA,YAAA,CAAa,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAC,CAAC,CAAA;AAC9D,EAAA,IAAI,OAAO,MAAQ,EAAA;AACf,IAAA,OAAA,CAAQ,SAAS,MAAO,CAAA,MAAA;AAAA,GACrB,MAAA;AACH,IAAA,OAAA,CAAQ,MAAS,GAAA,aAAA;AAAA;AAIrB,EAAM,MAAA,SAAA,GAAY,OAAO,MAAU,IAAA,QAAA;AACnC,EAAM,MAAA,SAAA,GAAY,CAAsB,mBAAA,EAAA,SAAS,CAAI,CAAA,EAAA,MAAA,CAAO,SAAS,GAAG,CAAA,CAAA,EAAI,MAAO,CAAA,MAAA,IAAU,GAAG,CAAA,CAAA;AAGhG,EAAM,MAAA,MAAA,GAAS,IAAIC,6BAAA,CAAkB,OAAO,CAAA;AAG5C,EAAI,IAAA;AACA,IAAc,aAAA,CAAA,cAAA,CAAe,QAAQ,SAAS,CAAA;AAAA,WACzC,KAAO,EAAA;AACZ,IAAQ,OAAA,CAAA,IAAA,CAAK,6DAA6D,KAAK,CAAA;AAAA;AAQnF,EAAA,MAAM,cAAiC,GAAA;AAAA,IACnC,MAAQ,EAAA,YAAA,CAAa,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA;AAAA,IAChD,cAAc,YAAa,CAAA;AAAA,MAAC,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA,EAAA;AAAA,MACtC,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA,EAAA;AAAA,MACd,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA,EAAA;AAAA,MAAI,CAAE,GAAA;AAAA,KAAG,CAAA;AAAA;AAAA,IACrB,SAAS,YAAa,CAAA;AAAA,MAAC,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA,CAAA;AAAA,MAC/B,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA,CAAA;AAAA,MACZ,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA,CAAA;AAAA,MAAG,CAAE,GAAA;AAAA,KAAE,CAAA;AAAA;AAAA,IAClB,SAAS,YAAa,CAAA;AAAA,MAAC,CAAA;AAAA,MAAG,EAAA;AAAA,MAAI,CAAA;AAAA,MAC1B,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,EAAA;AAAA,MACP,CAAA;AAAA,MAAG,EAAA;AAAA,MAAI;AAAA,KAAE,CAAA;AAAA;AAAA,IACb,eAAe,YAAa,CAAA;AAAA,MAAC,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,EAAA;AAAA,MACjC,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,EAAA;AAAA,MACP,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI;AAAA,KAAG,CAAA;AAAA;AAAA,IACf,QAAQ,YAAa,CAAA;AAAA,MAAC,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,CAAA;AAAA,MAC1B,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MACP,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG;AAAA,KAAE,CAAA;AAAA;AAAA,IACZ,UAAU,YAAa,CAAA;AAAA,MAAC,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAC1B,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MACN,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI;AAAA,KAAG,CAAA;AAAA;AAAA,IACf,YAAY,YAAa,CAAA;AAAA,MAAC,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MAC7B,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MACP,EAAA;AAAA,MAAI,CAAA;AAAA,MAAG;AAAA,KAAE;AAAA;AAAA,GACjB;AAQA,EAAA,MAAM,WAAc,GAAA,CAAC,UAAoB,EAAA,SAAA,GAAoB,CAAc,KAAA;AACvE,IAAI,IAAA,cAAA,CAAe,UAAU,CAAG,EAAA;AAE5B,MAAA,IAAI,cAAc,CAAK,EAAA;AAEnB,QAAA,MAAM,UAAa,GAAA,IAAI,YAAa,CAAA,cAAA,CAAe,MAAM,CAAA;AACzD,QAAM,MAAA,YAAA,GAAe,eAAe,UAAU,CAAA;AAC9C,QAAM,MAAA,YAAA,GAAe,IAAI,YAAA,CAAa,CAAC,CAAA;AAGvC,QAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAExB,UAAA,MAAM,IAAO,GAAA,YAAA,CAAa,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AAE3C,UAAA,YAAA,CAAa,CAAC,CAAA,GAAI,UAAW,CAAA,CAAC,IAAK,IAAO,GAAA,SAAA;AAAA;AAI9C,QAAA,MAAA,CAAO,MAAS,GAAA,YAAA;AAAA,OACb,MAAA;AAEH,QAAA,MAAA,CAAO,MAAS,GAAA,IAAI,YAAa,CAAA,cAAA,CAAe,UAAU,CAAC,CAAA;AAAA;AAC/D,KACG,MAAA;AACH,MAAQ,OAAA,CAAA,IAAA,CAAK,CAAW,QAAA,EAAA,UAAU,CAAmC,iCAAA,CAAA,CAAA;AACrE,MAAO,MAAA,CAAA,MAAA,GAAS,IAAI,YAAA,CAAa,aAAa,CAAA;AAAA;AAClD,GACJ;AAOA,EAAM,MAAA,eAAA,GAAkB,CAAC,SAA4B,KAAA;AAEjD,IAAM,MAAA,mBAAA,GAAsB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,EAAA,EAAI,SAAS,CAAC,CAAA;AAG/D,IAAA,MAAM,kBAAkB,mBAAsB,GAAA,EAAA;AAG9C,IAAA,IAAI,MAAO,CAAA,MAAA,IAAU,cAAe,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA;AAChD,MAAY,WAAA,CAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AAAA,KAGrC,MAAA,IAAA,MAAA,CAAO,eAAoB,KAAA,QAAA,IAAY,OAAO,MAAQ,EAAA;AAE3D,MAAA,MAAM,UAAa,GAAA,IAAI,YAAa,CAAA,cAAA,CAAe,MAAM,CAAA;AACzD,MAAM,MAAA,YAAA,GAAe,IAAI,YAAA,CAAa,CAAC,CAAA;AAGvC,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AACxB,QAAA,IAAI,OAAO,MAAQ,EAAA;AAEf,UAAA,MAAM,OAAO,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AAE5C,UAAA,YAAA,CAAa,CAAC,CAAA,GAAI,UAAW,CAAA,CAAC,IAAK,IAAO,GAAA,eAAA;AAAA,SACvC,MAAA;AACH,UAAa,YAAA,CAAA,CAAC,CAAI,GAAA,UAAA,CAAW,CAAC,CAAA;AAAA;AAClC;AAIJ,MAAA,MAAA,CAAO,MAAS,GAAA,YAAA;AAAA,KAGf,MAAA;AACD,MAAA,WAAA,CAAY,WAAW,eAAe,CAAA;AAAA;AAC1C,GACJ;AAGA,EAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAKhC,EAAA,MAAM,QAAQ,MAAY;AACtB,IAAA,MAAA,CAAO,MAAS,GAAA,IAAI,YAAa,CAAA,cAAA,CAAe,MAAM,CAAA;AAAA,GAC1D;AAKA,EAAA,MAAM,UAAU,MAAY;AACxB,IAAI,IAAA;AACA,MAAc,aAAA,CAAA,aAAA,CAAc,QAAQ,SAAS,CAAA;AAAA,aACxC,KAAO,EAAA;AACZ,MAAQ,OAAA,CAAA,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAAA;AAEpE,IAAA,MAAA,CAAO,OAAQ,EAAA;AAAA,GACnB;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,eAAiB,EAAA,KAAA,EAAO,OAAQ,EAAA;AACrD;;;;"}