var core = require('../../core'); /** * The ConvolutionFilter class applies a matrix convolution filter effect. * A convolution combines pixels in the input image with neighboring pixels to produce a new image. * A wide variety of image effects can be achieved through convolutions, including blurring, edge * detection, sharpening, embossing, and beveling. The matrix should be specified as a 9 point Array. * See http://docs.gimp.org/en/plug-in-convmatrix.html for more info. * * @class * @extends AbstractFilter * @namespace PIXI.filters * @param matrix {number[]} An array of values used for matrix transformation. Specified as a 9 point Array. * @param width {number} Width of the object you are transforming * @param height {number} Height of the object you are transforming */ function ConvolutionFilter(matrix, width, height) { core.AbstractFilter.call(this, // vertex shader null, // fragment shader require('fs').readFileSync(__dirname + '/convolution.frag', 'utf8'), // custom uniforms { matrix: { type: '1fv', value: new Float32Array(matrix) }, texelSize: { type: '2v', value: { x: 1 / width, y: 1 / height } } } ); } ConvolutionFilter.prototype = Object.create(core.AbstractFilter.prototype); ConvolutionFilter.prototype.constructor = ConvolutionFilter; module.exports = ConvolutionFilter; Object.defineProperties(ConvolutionFilter.prototype, { /** * An array of values used for matrix transformation. Specified as a 9 point Array. * * @member {number[]} * @memberof ConvolutionFilter# */ matrix: { get: function () { return this.uniforms.matrix.value; }, set: function (value) { this.uniforms.matrix.value = new Float32Array(value); } }, /** * Width of the object you are transforming * * @member {number} * @memberof ConvolutionFilter# */ width: { get: function () { return 1/this.uniforms.texelSize.value.x; }, set: function (value) { this.uniforms.texelSize.value.x = 1/value; } }, /** * Height of the object you are transforming * * @member {number} * @memberof ConvolutionFilter# */ height: { get: function () { return 1/this.uniforms.texelSize.value.y; }, set: function (value) { this.uniforms.texelSize.value.y = 1/value; } } });