UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 9.55 kB
{"version":3,"file":"Convolute.mjs","sources":["../../../src/filters/Convolute.ts"],"sourcesContent":["import { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/convolute';\n\nexport type ConvoluteOwnProps = {\n opaque: boolean;\n matrix: number[];\n};\n\nexport const convoluteDefaultValues: ConvoluteOwnProps = {\n opaque: false,\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n};\n\n/**\n * Adapted from <a href=\"http://www.html5rocks.com/en/tutorials/canvas/imagefilters/\">html5rocks article</a>\n * @example <caption>Sharpen filter</caption>\n * const filter = new Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Blur filter</caption>\n * const filter = new Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Emboss filter</caption>\n * const filter = new Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Emboss filter with opaqueness</caption>\n * const filter = new Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class Convolute extends BaseFilter<'Convolute', ConvoluteOwnProps> {\n /*\n * Opaque value (true/false)\n */\n declare opaque: ConvoluteOwnProps['opaque'];\n\n /*\n * matrix for the filter, max 9x9\n */\n declare matrix: ConvoluteOwnProps['matrix'];\n\n static type = 'Convolute';\n\n static defaults = convoluteDefaultValues;\n\n static uniformLocations = ['uMatrix', 'uOpaque', 'uHalfSize', 'uSize'];\n\n getCacheKey() {\n return `${this.type}_${Math.sqrt(this.matrix.length)}_${\n this.opaque ? 1 : 0\n }` as keyof typeof fragmentSource;\n }\n\n getFragmentSource() {\n return fragmentSource[this.getCacheKey()];\n }\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d(options: T2DPipelineState) {\n const imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0;\n let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0;\n g = 0;\n b = 0;\n a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n } else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap,\n ) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n ...super.toObject(),\n opaque: this.opaque,\n matrix: [...this.matrix],\n };\n }\n}\n\nclassRegistry.setClass(Convolute);\n"],"names":["convoluteDefaultValues","opaque","matrix","Convolute","BaseFilter","getCacheKey","concat","type","Math","sqrt","length","getFragmentSource","fragmentSource","applyTo2d","options","imageData","data","weights","side","round","halfSide","floor","sw","width","sh","height","output","ctx","createImageData","dst","alphaFac","r","g","b","a","dstOff","scx","scy","srcOff","wt","x","y","cx","cy","sendUniformData","gl","uniformLocations","uniform1fv","uMatrix","toObject","_objectSpread","_defineProperty","classRegistry","setClass"],"mappings":"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"}