@postermywall/fabricjs-2 6.0.0-rc2.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/dist/index.js +229 -491
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +229 -491
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +229 -491
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +229 -491
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/canvas/Canvas.d.ts.map +1 -1
- package/dist/src/canvas/Canvas.min.mjs +1 -1
- package/dist/src/canvas/Canvas.min.mjs.map +1 -1
- package/dist/src/canvas/Canvas.mjs +8 -9
- package/dist/src/canvas/Canvas.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +4 -4
- package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.mjs +0 -13
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/color/Color.d.ts +1 -0
- package/dist/src/color/Color.d.ts.map +1 -1
- package/dist/src/color/Color.min.mjs +1 -1
- package/dist/src/color/Color.min.mjs.map +1 -1
- package/dist/src/color/Color.mjs +3 -1
- package/dist/src/color/Color.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.d.ts +16 -23
- package/dist/src/filters/BaseFilter.d.ts.map +1 -1
- package/dist/src/filters/BaseFilter.min.mjs +1 -1
- package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.mjs +24 -41
- package/dist/src/filters/BaseFilter.mjs.map +1 -1
- package/dist/src/filters/BlendColor.d.ts +13 -24
- package/dist/src/filters/BlendColor.d.ts.map +1 -1
- package/dist/src/filters/BlendColor.min.mjs +1 -1
- package/dist/src/filters/BlendColor.min.mjs.map +1 -1
- package/dist/src/filters/BlendColor.mjs +1 -25
- package/dist/src/filters/BlendColor.mjs.map +1 -1
- package/dist/src/filters/BlendImage.d.ts +18 -19
- package/dist/src/filters/BlendImage.d.ts.map +1 -1
- package/dist/src/filters/BlendImage.min.mjs +1 -1
- package/dist/src/filters/BlendImage.min.mjs.map +1 -1
- package/dist/src/filters/BlendImage.mjs +13 -24
- package/dist/src/filters/BlendImage.mjs.map +1 -1
- package/dist/src/filters/Blur.d.ts +10 -12
- package/dist/src/filters/Blur.d.ts.map +1 -1
- package/dist/src/filters/Blur.min.mjs +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs +5 -14
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Boilerplate.d.ts +11 -13
- package/dist/src/filters/Boilerplate.d.ts.map +1 -1
- package/dist/src/filters/Brightness.d.ts +10 -12
- package/dist/src/filters/Brightness.d.ts.map +1 -1
- package/dist/src/filters/Brightness.min.mjs +1 -1
- package/dist/src/filters/Brightness.min.mjs.map +1 -1
- package/dist/src/filters/Brightness.mjs +4 -16
- package/dist/src/filters/Brightness.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.d.ts +17 -15
- package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.mjs +7 -27
- package/dist/src/filters/ColorMatrix.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.d.ts +63 -497
- package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.mjs +13 -8
- package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
- package/dist/src/filters/Composed.d.ts +11 -10
- package/dist/src/filters/Composed.d.ts.map +1 -1
- package/dist/src/filters/Composed.min.mjs +1 -1
- package/dist/src/filters/Composed.min.mjs.map +1 -1
- package/dist/src/filters/Composed.mjs +7 -12
- package/dist/src/filters/Composed.mjs.map +1 -1
- package/dist/src/filters/Contrast.d.ts +10 -12
- package/dist/src/filters/Contrast.d.ts.map +1 -1
- package/dist/src/filters/Contrast.min.mjs +1 -1
- package/dist/src/filters/Contrast.min.mjs.map +1 -1
- package/dist/src/filters/Contrast.mjs +6 -17
- package/dist/src/filters/Contrast.mjs.map +1 -1
- package/dist/src/filters/Convolute.d.ts +11 -14
- package/dist/src/filters/Convolute.d.ts.map +1 -1
- package/dist/src/filters/Convolute.min.mjs +1 -1
- package/dist/src/filters/Convolute.min.mjs.map +1 -1
- package/dist/src/filters/Convolute.mjs +1 -15
- package/dist/src/filters/Convolute.mjs.map +1 -1
- package/dist/src/filters/Gamma.d.ts +17 -14
- package/dist/src/filters/Gamma.d.ts.map +1 -1
- package/dist/src/filters/Gamma.min.mjs +1 -1
- package/dist/src/filters/Gamma.min.mjs.map +1 -1
- package/dist/src/filters/Gamma.mjs +20 -24
- package/dist/src/filters/Gamma.mjs.map +1 -1
- package/dist/src/filters/Grayscale.d.ts +8 -11
- package/dist/src/filters/Grayscale.d.ts.map +1 -1
- package/dist/src/filters/Grayscale.min.mjs +1 -1
- package/dist/src/filters/Grayscale.min.mjs.map +1 -1
- package/dist/src/filters/Grayscale.mjs +2 -14
- package/dist/src/filters/Grayscale.mjs.map +1 -1
- package/dist/src/filters/HueRotation.d.ts +11 -5
- package/dist/src/filters/HueRotation.d.ts.map +1 -1
- package/dist/src/filters/HueRotation.min.mjs +1 -1
- package/dist/src/filters/HueRotation.min.mjs.map +1 -1
- package/dist/src/filters/HueRotation.mjs +10 -5
- package/dist/src/filters/HueRotation.mjs.map +1 -1
- package/dist/src/filters/Invert.d.ts +10 -13
- package/dist/src/filters/Invert.d.ts.map +1 -1
- package/dist/src/filters/Invert.min.mjs +1 -1
- package/dist/src/filters/Invert.min.mjs.map +1 -1
- package/dist/src/filters/Invert.mjs +2 -15
- package/dist/src/filters/Invert.mjs.map +1 -1
- package/dist/src/filters/Noise.d.ts +9 -20
- package/dist/src/filters/Noise.d.ts.map +1 -1
- package/dist/src/filters/Noise.min.mjs +1 -1
- package/dist/src/filters/Noise.min.mjs.map +1 -1
- package/dist/src/filters/Noise.mjs +4 -27
- package/dist/src/filters/Noise.mjs.map +1 -1
- package/dist/src/filters/Pixelate.d.ts +8 -12
- package/dist/src/filters/Pixelate.d.ts.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs +2 -16
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.d.ts +12 -23
- package/dist/src/filters/RemoveColor.d.ts.map +1 -1
- package/dist/src/filters/RemoveColor.min.mjs +1 -1
- package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.mjs +2 -25
- package/dist/src/filters/RemoveColor.mjs.map +1 -1
- package/dist/src/filters/Resize.d.ts +14 -30
- package/dist/src/filters/Resize.d.ts.map +1 -1
- package/dist/src/filters/Resize.min.mjs +1 -1
- package/dist/src/filters/Resize.min.mjs.map +1 -1
- package/dist/src/filters/Resize.mjs +3 -30
- package/dist/src/filters/Resize.mjs.map +1 -1
- package/dist/src/filters/Saturation.d.ts +9 -12
- package/dist/src/filters/Saturation.d.ts.map +1 -1
- package/dist/src/filters/Saturation.min.mjs +1 -1
- package/dist/src/filters/Saturation.min.mjs.map +1 -1
- package/dist/src/filters/Saturation.mjs +8 -20
- package/dist/src/filters/Saturation.mjs.map +1 -1
- package/dist/src/filters/Vibrance.d.ts +10 -13
- package/dist/src/filters/Vibrance.d.ts.map +1 -1
- package/dist/src/filters/Vibrance.min.mjs +1 -1
- package/dist/src/filters/Vibrance.min.mjs.map +1 -1
- package/dist/src/filters/Vibrance.mjs +6 -18
- package/dist/src/filters/Vibrance.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.d.ts +1 -0
- package/dist/src/filters/shaders/blendImage.d.ts.map +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.mjs +2 -1
- package/dist/src/filters/shaders/blendImage.mjs.map +1 -1
- package/dist/src/filters/typedefs.d.ts +22 -0
- package/dist/src/filters/typedefs.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.d.ts +1 -1
- package/dist/src/parser/elements_parser.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts.map +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.mjs +13 -10
- package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts +9 -0
- package/dist/src/shapes/Group.d.ts.map +1 -1
- package/dist/src/shapes/Group.min.mjs +1 -1
- package/dist/src/shapes/Group.min.mjs.map +1 -1
- package/dist/src/shapes/Group.mjs +10 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/Image.d.ts +4 -4
- package/dist/src/shapes/Image.d.ts.map +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts +3 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +3 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +1 -16
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +9 -10
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.d.ts +8 -15
- package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.mjs +11 -21
- package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
- package/dist/src/shapes/Path.d.ts +2 -2
- package/dist/src/shapes/Path.d.ts.map +1 -1
- package/dist/src/shapes/Path.min.mjs.map +1 -1
- package/dist/src/shapes/Path.mjs +2 -2
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.d.ts +2 -2
- package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/package.json +2 -2
- package/src/canvas/Canvas.ts +6 -9
- package/src/canvas/SelectableCanvas.ts +2 -2
- package/src/canvas/StaticCanvas.ts +4 -18
- package/src/color/Color.ts +2 -1
- package/src/color/color.test.ts +6 -0
- package/src/filters/BaseFilter.ts +45 -51
- package/src/filters/BlendColor.ts +13 -35
- package/src/filters/BlendImage.ts +26 -40
- package/src/filters/Blur.ts +13 -20
- package/src/filters/Boilerplate.ts +13 -22
- package/src/filters/Brightness.ts +12 -21
- package/src/filters/Canvas2dFilterBackend.ts +1 -1
- package/src/filters/ColorMatrix.ts +29 -34
- package/src/filters/ColorMatrixFilters.ts +15 -9
- package/src/filters/Composed.ts +26 -16
- package/src/filters/Contrast.ts +15 -23
- package/src/filters/Convolute.ts +11 -23
- package/src/filters/Gamma.ts +32 -24
- package/src/filters/Grayscale.ts +8 -19
- package/src/filters/HueRotation.ts +21 -11
- package/src/filters/Invert.ts +11 -22
- package/src/filters/Noise.ts +11 -30
- package/src/filters/Pixelate.ts +9 -22
- package/src/filters/RemoveColor.ts +21 -35
- package/src/filters/Resize.ts +20 -44
- package/src/filters/Saturation.ts +16 -27
- package/src/filters/Vibrance.ts +14 -24
- package/src/filters/WebGLFilterBackend.ts +1 -1
- package/src/filters/shaders/blendImage.ts +12 -0
- package/src/filters/typedefs.ts +23 -0
- package/src/parser/elements_parser.ts +1 -1
- package/src/shapes/ActiveSelection.ts +8 -4
- package/src/shapes/Group.ts +16 -1
- package/src/shapes/Image.ts +8 -6
- package/src/shapes/Object/InteractiveObject.ts +3 -1
- package/src/shapes/Object/Object.ts +10 -35
- package/src/shapes/Object/StackedObject.ts +28 -44
- package/src/shapes/Path.ts +4 -4
- package/src/shapes/Text/TextSVGExportMixin.ts +1 -1
- package/src/util/misc/objectEnlive.ts +12 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Color.mjs","sources":["../../../src/color/Color.ts"],"sourcesContent":["import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n private declare _source: TRGBAColorSource;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n ([0, 0, 0, 1] as TRGBAColorSource);\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha)\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf Color\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf Color\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf Color\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n * @memberOf Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf Color\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16)\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @static\n * @memberOf Color\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n"],"names":["Color","constructor","color","setSource","_source","Array","isArray","r","g","b","a","_tryParsingColor","ColorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","getSource","source","toRgb","concat","toRgba","join","toHsl","h","s","l","rgb2Hsl","toHsla","toHex","fullHex","toHexa","slice","hexify","Math","round","getAlpha","setAlpha","alpha","toGrayscale","greyAverage","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","map","value","index","fromRgb","fromRgba","match","reRGBa","parsedValue","parseFloat","endsWith","fromAlphaToFloat","fromHsl","fromHsla","reHSLa","match1degrees","parseAngletoDegrees","q","p","hue2rgb","fromHex","reHex","indexOf","isShortNotation","length","expandedValue","split","hex","hexCouple","parseInt","lowercase","toLowerCase","numeric","includes","radiansToDegrees"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Color.mjs","sources":["../../../src/color/Color.ts"],"sourcesContent":["import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';\nimport { ColorNameMap } from './color_map';\nimport { reHSLa, reHex, reRGBa } from './constants';\nimport type { TRGBAColorSource, TColorArg } from './typedefs';\nimport {\n hue2rgb,\n hexify,\n rgb2Hsl,\n fromAlphaToFloat,\n greyAverage,\n} from './util';\n\n/**\n * @class Color common color operations\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors colors}\n */\nexport class Color {\n private declare _source: TRGBAColorSource;\n isUnrecognised = false;\n\n /**\n *\n * @param {string} [color] optional in hex or rgb(a) or hsl format or from known color list\n */\n constructor(color?: TColorArg) {\n if (!color) {\n // we default to black as canvas does\n this.setSource([0, 0, 0, 1]);\n } else if (color instanceof Color) {\n this.setSource([...color._source]);\n } else if (Array.isArray(color)) {\n const [r, g, b, a = 1] = color;\n this.setSource([r, g, b, a]);\n } else {\n this.setSource(this._tryParsingColor(color));\n }\n }\n\n /**\n * @private\n * @param {string} [color] Color value to parse\n * @returns {TRGBAColorSource}\n */\n protected _tryParsingColor(color: string) {\n if (color in ColorNameMap) {\n color = ColorNameMap[color as keyof typeof ColorNameMap];\n }\n return color === 'transparent'\n ? ([255, 255, 255, 0] as TRGBAColorSource)\n : Color.sourceFromHex(color) ||\n Color.sourceFromRgb(color) ||\n Color.sourceFromHsl(color) ||\n // color is not recognized\n // we default to black as canvas does\n ((this.isUnrecognised = true) && ([0, 0, 0, 1] as TRGBAColorSource));\n }\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {TRGBAColorSource}\n */\n getSource() {\n return this._source;\n }\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {TRGBAColorSource} source\n */\n setSource(source: TRGBAColorSource) {\n this._source = source;\n }\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb() {\n const [r, g, b] = this.getSource();\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba() {\n return `rgba(${this.getSource().join(',')})`;\n }\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl() {\n const [h, s, l] = rgb2Hsl(...this.getSource());\n return `hsl(${h},${s}%,${l}%)`;\n }\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla() {\n const [h, s, l, a] = rgb2Hsl(...this.getSource());\n return `hsla(${h},${s}%,${l}%,${a})`;\n }\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex() {\n const fullHex = this.toHexa();\n return fullHex.slice(0, 6);\n }\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa() {\n const [r, g, b, a] = this.getSource();\n return `${hexify(r)}${hexify(g)}${hexify(b)}${hexify(Math.round(a * 255))}`;\n }\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha() {\n return this.getSource()[3];\n }\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {Color} thisArg\n */\n setAlpha(alpha: number) {\n this._source[3] = alpha;\n return this;\n }\n\n /**\n * Transforms color to its grayscale representation\n * @return {Color} thisArg\n */\n toGrayscale() {\n this.setSource(greyAverage(this.getSource()));\n return this;\n }\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {Color} thisArg\n */\n toBlackWhite(threshold: number) {\n const [average, , , a] = greyAverage(this.getSource()),\n bOrW = average < (threshold || 127) ? 0 : 255;\n this.setSource([bOrW, bOrW, bOrW, a]);\n return this;\n }\n\n /**\n * Overlays color with another color\n * @param {String|Color} otherColor\n * @return {Color} thisArg\n */\n overlayWith(otherColor: string | Color) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n const source = this.getSource(),\n otherAlpha = 0.5,\n otherSource = otherColor.getSource(),\n [R, G, B] = source.map((value, index) =>\n Math.round(value * (1 - otherAlpha) + otherSource[index] * otherAlpha)\n );\n\n this.setSource([R, G, B, source[3]]);\n return this;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {Color}\n */\n static fromRgb(color: string): Color {\n return Color.fromRgba(color);\n }\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf Color\n * @param {String} color\n * @return {Color}\n */\n static fromRgba(color: string): Color {\n return new Color(Color.sourceFromRgb(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromRgb(color: string): TRGBAColorSource | undefined {\n const match = color.match(reRGBa());\n if (match) {\n const [r, g, b] = match.slice(1, 4).map((value) => {\n const parsedValue = parseFloat(value);\n return value.endsWith('%')\n ? Math.round(parsedValue * 2.55)\n : parsedValue;\n });\n return [r, g, b, fromAlphaToFloat(match[4])];\n }\n }\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf Color\n * @return {Color}\n */\n static fromHsl(color: string): Color {\n return Color.fromHsla(color);\n }\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf Color\n * @param {String} color\n * @return {Color}\n */\n static fromHsla(color: string): Color {\n return new Color(Color.sourceFromHsl(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n * @memberOf Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {TRGBAColorSource | undefined} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n static sourceFromHsl(color: string): TRGBAColorSource | undefined {\n const match = color.match(reHSLa());\n if (!match) {\n return;\n }\n const match1degrees = Color.parseAngletoDegrees(match[1]);\n\n const h = (((match1degrees % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / 100,\n l = parseFloat(match[3]) / 100;\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n fromAlphaToFloat(match[4]),\n ];\n }\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf Color\n * @param {String} color Color value ex: FF5555\n * @return {Color}\n */\n static fromHex(color: string): Color {\n return new Color(Color.sourceFromHex(color));\n }\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {TRGBAColorSource | undefined} source\n */\n static sourceFromHex(color: string): TRGBAColorSource | undefined {\n if (color.match(reHex())) {\n const value = color.slice(color.indexOf('#') + 1),\n isShortNotation = value.length <= 4;\n let expandedValue: string[];\n if (isShortNotation) {\n expandedValue = value.split('').map((hex) => hex + hex);\n } else {\n expandedValue = value.match(/.{2}/g)!;\n }\n const [r, g, b, a = 255] = expandedValue.map((hexCouple) =>\n parseInt(hexCouple, 16)\n );\n return [r, g, b, a / 255];\n }\n }\n\n /**\n * Converts a string that could be any angle notation (50deg, 0.5turn, 2rad)\n * into degrees without the 'deg' suffix\n * @static\n * @memberOf Color\n * @param {String} value ex: 0deg, 0.5turn, 2rad\n * @return {Number} number in degrees or NaN if inputs are invalid\n */\n static parseAngletoDegrees(value: string): number {\n const lowercase = value.toLowerCase();\n const numeric = parseFloat(lowercase);\n\n if (lowercase.includes('rad')) {\n return radiansToDegrees(numeric);\n }\n\n if (lowercase.includes('turn')) {\n return numeric * 360;\n }\n\n // Value is probably just a number already in degrees eg '50'\n return numeric;\n }\n}\n"],"names":["Color","constructor","color","_defineProperty","setSource","_source","Array","isArray","r","g","b","a","_tryParsingColor","ColorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","isUnrecognised","getSource","source","toRgb","concat","toRgba","join","toHsl","h","s","l","rgb2Hsl","toHsla","toHex","fullHex","toHexa","slice","hexify","Math","round","getAlpha","setAlpha","alpha","toGrayscale","greyAverage","toBlackWhite","threshold","average","bOrW","overlayWith","otherColor","otherAlpha","otherSource","R","G","B","map","value","index","fromRgb","fromRgba","match","reRGBa","parsedValue","parseFloat","endsWith","fromAlphaToFloat","fromHsl","fromHsla","reHSLa","match1degrees","parseAngletoDegrees","q","p","hue2rgb","fromHex","reHex","indexOf","isShortNotation","length","expandedValue","split","hex","hexCouple","parseInt","lowercase","toLowerCase","numeric","includes","radiansToDegrees"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { T2DPipelineState, TWebGLAttributeLocationMap, TWebGLPipelineState, TWebGLProgramCacheItem, TWebGLUniformLocationMap } from './typedefs';
|
|
2
2
|
import type { Abortable } from '../typedefs';
|
|
3
|
-
export declare class BaseFilter {
|
|
3
|
+
export declare class BaseFilter<Name extends string, OwnProps extends Record<string, any> = object> {
|
|
4
4
|
/**
|
|
5
5
|
* Filter type
|
|
6
6
|
* @param {String} type
|
|
7
7
|
* @default
|
|
8
8
|
*/
|
|
9
|
-
get type():
|
|
9
|
+
get type(): Name;
|
|
10
10
|
/**
|
|
11
11
|
* The class type. Used to identify which class this is.
|
|
12
12
|
* This is used for serialization purposes and internally it can be used
|
|
@@ -15,25 +15,22 @@ export declare class BaseFilter {
|
|
|
15
15
|
* to avoid doing that.
|
|
16
16
|
*/
|
|
17
17
|
static type: string;
|
|
18
|
-
static defaults: Record<string, any>;
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* Contains the uniform locations for the fragment shader.
|
|
20
|
+
* uStepW and uStepH are handled by the BaseFilter, each filter class
|
|
21
|
+
* needs to specify all the one that are needed
|
|
22
22
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
* Name of the parameter that can be changed in the filter.
|
|
26
|
-
* Some filters have more than one parameter and there is no
|
|
27
|
-
* mainParameter
|
|
28
|
-
* @private
|
|
29
|
-
*/
|
|
30
|
-
mainParameter?: keyof this | undefined;
|
|
23
|
+
static uniformLocations: string[];
|
|
24
|
+
static defaults: Record<string, unknown>;
|
|
31
25
|
/**
|
|
32
26
|
* Constructor
|
|
33
27
|
* @param {Object} [options] Options object
|
|
34
28
|
*/
|
|
35
|
-
constructor({ type, ...options }?:
|
|
29
|
+
constructor({ type, ...options }?: {
|
|
30
|
+
type?: never;
|
|
31
|
+
} & Partial<OwnProps> & Record<string, any>);
|
|
36
32
|
protected getFragmentSource(): string;
|
|
33
|
+
getVertexSource(): string;
|
|
37
34
|
/**
|
|
38
35
|
* Compile this filter's shader program.
|
|
39
36
|
*
|
|
@@ -57,8 +54,6 @@ export declare class BaseFilter {
|
|
|
57
54
|
/**
|
|
58
55
|
* Return a map of uniform names to WebGLUniformLocation objects.
|
|
59
56
|
*
|
|
60
|
-
* Intended to be overridden by subclasses.
|
|
61
|
-
*
|
|
62
57
|
* @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.
|
|
63
58
|
* @param {WebGLShaderProgram} program The shader program from which to take uniform locations.
|
|
64
59
|
* @returns {Object} A map of uniform names to uniform locations.
|
|
@@ -125,8 +120,6 @@ export declare class BaseFilter {
|
|
|
125
120
|
applyToWebGL(options: TWebGLPipelineState): void;
|
|
126
121
|
bindAdditionalTexture(gl: WebGLRenderingContext, texture: WebGLTexture, textureUnit: number): void;
|
|
127
122
|
unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number): void;
|
|
128
|
-
getMainParameter(): this[keyof this] | undefined;
|
|
129
|
-
setMainParameter(value: any): void;
|
|
130
123
|
/**
|
|
131
124
|
* Send uniform data from this filter to its shader program on the GPU.
|
|
132
125
|
*
|
|
@@ -146,15 +139,15 @@ export declare class BaseFilter {
|
|
|
146
139
|
* @return {Object} Object representation of an instance
|
|
147
140
|
*/
|
|
148
141
|
toObject(): {
|
|
149
|
-
type:
|
|
150
|
-
};
|
|
142
|
+
type: Name;
|
|
143
|
+
} & OwnProps;
|
|
151
144
|
/**
|
|
152
145
|
* Returns a JSON representation of an instance
|
|
153
146
|
* @return {Object} JSON
|
|
154
147
|
*/
|
|
155
148
|
toJSON(): {
|
|
156
|
-
type:
|
|
157
|
-
};
|
|
158
|
-
static fromObject({ type, ...filterOptions }: Record<string, any>, options: Abortable): Promise<BaseFilter
|
|
149
|
+
type: Name;
|
|
150
|
+
} & OwnProps;
|
|
151
|
+
static fromObject({ type, ...filterOptions }: Record<string, any>, options: Abortable): Promise<BaseFilter<string, object>>;
|
|
159
152
|
}
|
|
160
153
|
//# sourceMappingURL=BaseFilter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/BaseFilter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAOpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,qBAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"BaseFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/BaseFilter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAOpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,qBAAa,UAAU,CACrB,IAAI,SAAS,MAAM,EACnB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAE7C;;;;OAIG;IACH,IAAI,IAAI,IAAI,IAAI,CAEf;IAED;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,SAAgB;IAE3B;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEvC,OAAe,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjD;;;OAGG;gBACS,EACV,IAAI,EACJ,GAAG,OAAO,EACX,GAAE;QAAE,IAAI,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAQlE,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC,eAAe,IAAI,MAAM;IAIzB;;;;;;OAMG;IACH,aAAa,CACX,EAAE,EAAE,qBAAqB,EACzB,cAAc,GAAE,MAAiC,EACjD,YAAY,GAAE,MAA+B;;;;;IA4D/C;;;;;;OAMG;IACH,qBAAqB,CACnB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,0BAA0B;IAM7B;;;;;;OAMG;IACH,mBAAmB,CACjB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,wBAAwB;IAc3B;;;;;OAKG;IACH,iBAAiB,CACf,EAAE,EAAE,qBAAqB,EACzB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,aAAa,EAAE,YAAY;IAU7B,iBAAiB,CAAC,OAAO,EAAE,mBAAmB;IA2B9C,aAAa,CAAC,OAAO,EAAE,mBAAmB;IAQ1C;;;;;;QAMI;IAEJ,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO;IAItC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB;IAUvD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI1C;;;;QAII;IACJ,WAAW,IAAI,MAAM;IAIrB;;;;;;OAMG;IACH,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,sBAAsB;IAQpE;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB;IAmBzC,qBAAqB,CACnB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM;IAQrB,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM;IAMtE;;;;;;;OAOG;IACH,eAAe,CACb,EAAE,EAAE,qBAAqB,EACzB,gBAAgB,EAAE,wBAAwB,GACzC,IAAI;IAIP;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,gBAAgB;IASzC;;;OAGG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,QAAQ;IAerC;;;OAGG;IACH,MAAM;;;WAKO,UAAU,CACrB,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/C,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAGvC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as e,objectWithoutProperties as t,objectSpread2 as r}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getEnv as
|
|
1
|
+
import{defineProperty as e,objectWithoutProperties as t,objectSpread2 as r}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{getEnv as o}from"../env/index.min.mjs";import{createCanvasElement as i}from"../util/misc/dom.min.mjs";import{isWebGLPipelineState as a}from"./utils.min.mjs";import{identityFragmentShader as n,vertexSource as s,highPsourceCode as c}from"./shaders/baseFilter.min.mjs";import{FabricError as u}from"../util/internals/console.min.mjs";const h=["type"],m=["type"],p=new RegExp(c,"g");class g{get type(){return this.constructor.type}constructor(){let e=t(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},h);Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return n}getVertexSource(){return s}createProgram(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getFragmentSource(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getVertexSource();const{WebGLProbe:{GLPrecision:i="highp"}}=o();"highp"!==i&&(t=t.replace(p,c.replace("highp",i)));const a=e.createShader(e.VERTEX_SHADER),n=e.createShader(e.FRAGMENT_SHADER),s=e.createProgram();if(!a||!n||!s)throw new u("Vertex, fragment shader or program creation error");if(e.shaderSource(a,r),e.compileShader(a),!e.getShaderParameter(a,e.COMPILE_STATUS))throw new u("Vertex shader compile error for ".concat(this.type,": ").concat(e.getShaderInfoLog(a)));if(e.shaderSource(n,t),e.compileShader(n),!e.getShaderParameter(n,e.COMPILE_STATUS))throw new u("Fragment shader compile error for ".concat(this.type,": ").concat(e.getShaderInfoLog(n)));if(e.attachShader(s,a),e.attachShader(s,n),e.linkProgram(s),!e.getProgramParameter(s,e.LINK_STATUS))throw new u('Shader link error for "'.concat(this.type,'" ').concat(e.getProgramInfoLog(s)));const h=this.getUniformLocations(e,s)||{};return h.uStepW=e.getUniformLocation(s,"uStepW"),h.uStepH=e.getUniformLocation(s,"uStepH"),{program:s,attributeLocations:this.getAttributeLocations(e,s),uniformLocations:h}}getAttributeLocations(e,t){return{aPosition:e.getAttribLocation(t,"aPosition")}}getUniformLocations(e,t){const r=this.constructor.uniformLocations,o={};for(let i=0;i<r.length;i++)o[r[i]]=e.getUniformLocation(t,r[i]);return o}sendAttributeData(e,t,r){const o=t.aPosition,i=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,i),e.enableVertexAttribArray(o),e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0),e.bufferData(e.ARRAY_BUFFER,r,e.STATIC_DRAW)}_setupFrameBuffer(e){const t=e.context;if(e.passes>1){const r=e.destinationWidth,o=e.destinationHeight;e.sourceWidth===r&&e.sourceHeight===o||(t.deleteTexture(e.targetTexture),e.targetTexture=e.filterBackend.createTexture(t,r,o)),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,e.targetTexture,0)}else t.bindFramebuffer(t.FRAMEBUFFER,null),t.finish()}_swapTextures(e){e.passes--,e.pass++;const t=e.targetTexture;e.targetTexture=e.sourceTexture,e.sourceTexture=t}isNeutralState(e){return!1}applyTo(e){a(e)?(this._setupFrameBuffer(e),this.applyToWebGL(e),this._swapTextures(e)):this.applyTo2d(e)}applyTo2d(e){}getCacheKey(){return this.type}retrieveShader(e){const t=this.getCacheKey();return e.programCache[t]||(e.programCache[t]=this.createProgram(e.context)),e.programCache[t]}applyToWebGL(e){const t=e.context,r=this.retrieveShader(e);0===e.pass&&e.originalTexture?t.bindTexture(t.TEXTURE_2D,e.originalTexture):t.bindTexture(t.TEXTURE_2D,e.sourceTexture),t.useProgram(r.program),this.sendAttributeData(t,r.attributeLocations,e.aPosition),t.uniform1f(r.uniformLocations.uStepW,1/e.sourceWidth),t.uniform1f(r.uniformLocations.uStepH,1/e.sourceHeight),this.sendUniformData(t,r.uniformLocations),t.viewport(0,0,e.destinationWidth,e.destinationHeight),t.drawArrays(t.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(e,t,r){e.activeTexture(r),e.bindTexture(e.TEXTURE_2D,t),e.activeTexture(e.TEXTURE0)}unbindAdditionalTexture(e,t){e.activeTexture(t),e.bindTexture(e.TEXTURE_2D,null),e.activeTexture(e.TEXTURE0)}sendUniformData(e,t){}createHelpLayer(e){if(!e.helpLayer){const t=i();t.width=e.sourceWidth,t.height=e.sourceHeight,e.helpLayer=t}}toObject(){const e=Object.keys(this.constructor.defaults);return r({type:this.type},e.reduce(((e,t)=>(e[t]=this[t],e)),{}))}toJSON(){return this.toObject()}static async fromObject(e,r){return new this(t(e,m))}}e(g,"type","BaseFilter"),e(g,"uniformLocations",[]);export{g as BaseFilter};
|
|
2
2
|
//# sourceMappingURL=BaseFilter.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFilter.min.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter {\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n get type(): string {\n return (this.constructor as typeof BaseFilter).type;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n declare static defaults: Record<string, any>;\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n vertexSource = vertexSource;\n\n /**\n * Name of the parameter that can be changed in the filter.\n * Some filters have more than one parameter and there is no\n * mainParameter\n * @private\n */\n declare mainParameter?: keyof this | undefined;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({ type, ...options }: Record<string, any> = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.vertexSource\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision)\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error'\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader\n )}`\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader\n )}`\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {};\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record<string, number>,\n aPositionData: Float32Array\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n const main = this.mainParameter,\n defaultValue = (this.constructor as typeof BaseFilter).defaults[\n main as string\n ];\n if (main) {\n const thisValue = this[main];\n if (Array.isArray(defaultValue) && Array.isArray(thisValue)) {\n return defaultValue.every(\n (value: any, i: number) => value === thisValue[i]\n );\n } else {\n return defaultValue === thisValue;\n }\n } else {\n return false;\n }\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey() {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n getMainParameter() {\n return this.mainParameter ? this[this.mainParameter] : undefined;\n }\n\n setMainParameter(value: any) {\n if (this.mainParameter) {\n this[this.mainParameter] = value;\n }\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const helpLayer = createCanvasElement();\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n const mainP = this.mainParameter;\n return {\n type: this.type,\n ...(mainP ? { [mainP]: this[mainP] } : {}),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record<string, any>,\n options: Abortable\n ) {\n return new this(filterOptions);\n }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","this","constructor","options","_objectWithoutProperties","arguments","length","undefined","_excluded","_defineProperty","vertexSource","Object","assign","defaults","getFragmentSource","identityFragmentShader","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","main","mainParameter","defaultValue","thisValue","Array","isArray","every","value","i","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","createCanvasElement","toObject","mainP","_objectSpread","toJSON","fromObject","_ref2","_excluded2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseFilter.min.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record<string, any> = object\n> {\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record<string, unknown>;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial<OwnProps> & Record<string, any> = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource()\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision)\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error'\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader\n )}`\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader\n )}`\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter<string>)\n .uniformLocations;\n\n const uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i]\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record<string, number>,\n aPositionData: Float32Array\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const helpLayer = createCanvasElement();\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & OwnProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults\n ) as (keyof OwnProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce<OwnProps>((acc, key) => {\n //@ts-expect-error TS doesn't get i want an object that looks like this\n acc[key] = this[key as keyof this];\n return acc;\n }, {} as OwnProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record<string, any>,\n options: Abortable\n ): Promise<BaseFilter<string, object>> {\n return new this(filterOptions);\n }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","this","constructor","options","_objectWithoutProperties","arguments","length","undefined","_excluded","Object","assign","defaults","getFragmentSource","identityFragmentShader","getVertexSource","vertexSource","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","locations","i","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","createHelpLayer","helpLayer","createCanvasElement","toObject","defaultKeys","keys","_objectSpread","reduce","acc","toJSON","fromObject","_ref2","_excluded2","_defineProperty"],"mappings":"+eAkBMA,EAAQ,IAAIC,OAAOC,EAAiB,KAEnC,MAAMC,EASX,QAAIC,GACF,OAAQC,KAAKC,YAAkCF,IACjD,CAwBAE,WAAAA,GAGoE,IAD/DC,EAAOC,EACwDC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAJ,CAAA,EADpDG,GAEVC,OAAOC,OACLT,KACCA,KAAKC,YAAkCS,SACxCR,EAEJ,CAEUS,iBAAAA,GACR,OAAOC,CACT,CAEAC,eAAAA,GACE,OAAOC,CACT,CASAC,aAAAA,CACEC,GAGA,IAFAC,EAAsBb,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAG,GAAAJ,KAAKW,oBAC9BG,EAAoBV,UAAAC,eAAAC,IAAAF,UAAA,GAAAA,UAAG,GAAAJ,KAAKa,kBAE5B,MACEK,YAAYC,YAAEA,EAAc,UAC1BC,IACgB,UAAhBD,IACFF,EAAiBA,EAAeI,QAC9B1B,EACAE,EAAgBwB,QAAQ,QAASF,KAGrC,MAAMG,EAAeN,EAAGO,aAAaP,EAAGQ,eAClCC,EAAiBT,EAAGO,aAAaP,EAAGU,iBACpCC,EAAUX,EAAGD,gBAEnB,IAAKO,IAAiBG,IAAmBE,EACvC,MAAM,IAAIC,EACR,qDAKJ,GAFAZ,EAAGa,aAAaP,EAAcR,GAC9BE,EAAGc,cAAcR,IACZN,EAAGe,mBAAmBT,EAAcN,EAAGgB,gBAC1C,MAAM,IAAIJ,EAAW,mCAAAK,OACgBjC,KAAKD,KAAI,MAAAkC,OAAKjB,EAAGkB,iBAClDZ,KAON,GAFAN,EAAGa,aAAaJ,EAAgBR,GAChCD,EAAGc,cAAcL,IACZT,EAAGe,mBAAmBN,EAAgBT,EAAGgB,gBAC5C,MAAM,IAAIJ,EAAW,qCAAAK,OACkBjC,KAAKD,KAAI,MAAAkC,OAAKjB,EAAGkB,iBACpDT,KAQN,GAHAT,EAAGmB,aAAaR,EAASL,GACzBN,EAAGmB,aAAaR,EAASF,GACzBT,EAAGoB,YAAYT,IACVX,EAAGqB,oBAAoBV,EAASX,EAAGsB,aACtC,MAAM,IAAIV,EAAW,0BAAAK,OACOjC,KAAKD,KAAI,MAAAkC,OAAKjB,EAAGuB,kBAAkBZ,KAIjE,MAAMa,EAAmBxC,KAAKyC,oBAAoBzB,EAAIW,IAAY,GAIlE,OAHAa,EAAiBE,OAAS1B,EAAG2B,mBAAmBhB,EAAS,UACzDa,EAAiBI,OAAS5B,EAAG2B,mBAAmBhB,EAAS,UAElD,CACLA,UACAkB,mBAAoB7C,KAAK8C,sBAAsB9B,EAAIW,GACnDa,mBAEJ,CASAM,qBAAAA,CACE9B,EACAW,GAEA,MAAO,CACLoB,UAAW/B,EAAGgC,kBAAkBrB,EAAS,aAE7C,CASAc,mBAAAA,CACEzB,EACAW,GAEA,MAAMsB,EAAajD,KAAKC,YACrBuC,iBAEGA,EAAgE,CAAA,EACtE,IAAK,IAAIU,EAAI,EAAGA,EAAID,EAAU5C,OAAQ6C,IACpCV,EAAiBS,EAAUC,IAAMlC,EAAG2B,mBAClChB,EACAsB,EAAUC,IAGd,OAAOV,CACT,CAQAW,iBAAAA,CACEnC,EACA6B,EACAO,GAEA,MAAMC,EAAoBR,EAAmBE,UACvCO,EAAStC,EAAGuC,eAClBvC,EAAGwC,WAAWxC,EAAGyC,aAAcH,GAC/BtC,EAAG0C,wBAAwBL,GAC3BrC,EAAG2C,oBAAoBN,EAAmB,EAAGrC,EAAG4C,OAAO,EAAO,EAAG,GACjE5C,EAAG6C,WAAW7C,EAAGyC,aAAcL,EAAepC,EAAG8C,YACnD,CAEAC,iBAAAA,CAAkB7D,GAChB,MAAMc,EAAKd,EAAQ8D,QACnB,GAAI9D,EAAQ+D,OAAS,EAAG,CACtB,MAAMC,EAAQhE,EAAQiE,iBAChBC,EAASlE,EAAQmE,kBACnBnE,EAAQoE,cAAgBJ,GAAShE,EAAQqE,eAAiBH,IAC5DpD,EAAGwD,cAActE,EAAQuE,eACzBvE,EAAQuE,cAAgBvE,EAAQwE,cAAcC,cAC5C3D,EACAkD,EACAE,IAGJpD,EAAG4D,qBACD5D,EAAG6D,YACH7D,EAAG8D,kBACH9D,EAAG+D,WACH7E,EAAQuE,cACR,EAEJ,MAEEzD,EAAGgE,gBAAgBhE,EAAG6D,YAAa,MACnC7D,EAAGiE,QAEP,CAEAC,aAAAA,CAAchF,GACZA,EAAQ+D,SACR/D,EAAQiF,OACR,MAAMC,EAAOlF,EAAQuE,cACrBvE,EAAQuE,cAAgBvE,EAAQmF,cAChCnF,EAAQmF,cAAgBD,CAC1B,CAUAE,cAAAA,CAAepF,GACb,OAAO,CACT,CAeAqF,OAAAA,CAAQrF,GACFsF,EAAqBtF,IACvBF,KAAK+D,kBAAkB7D,GACvBF,KAAKyF,aAAavF,GAClBF,KAAKkF,cAAchF,IAEnBF,KAAK0F,UAAUxF,EAEnB,CAEAwF,SAAAA,CAAUxF,GACR,CAQFyF,WAAAA,GACE,OAAO3F,KAAKD,IACd,CASA6F,cAAAA,CAAe1F,GACb,MAAM2F,EAAM7F,KAAK2F,cAIjB,OAHKzF,EAAQ4F,aAAaD,KACxB3F,EAAQ4F,aAAaD,GAAO7F,KAAKe,cAAcb,EAAQ8D,UAElD9D,EAAQ4F,aAAaD,EAC9B,CAcAJ,YAAAA,CAAavF,GACX,MAAMc,EAAKd,EAAQ8D,QACb+B,EAAS/F,KAAK4F,eAAe1F,GACd,IAAjBA,EAAQiF,MAAcjF,EAAQ8F,gBAChChF,EAAGiF,YAAYjF,EAAG+D,WAAY7E,EAAQ8F,iBAEtChF,EAAGiF,YAAYjF,EAAG+D,WAAY7E,EAAQmF,eAExCrE,EAAGkF,WAAWH,EAAOpE,SACrB3B,KAAKmD,kBAAkBnC,EAAI+E,EAAOlD,mBAAoB3C,EAAQ6C,WAE9D/B,EAAGmF,UAAUJ,EAAOvD,iBAAiBE,OAAQ,EAAIxC,EAAQoE,aACzDtD,EAAGmF,UAAUJ,EAAOvD,iBAAiBI,OAAQ,EAAI1C,EAAQqE,cAEzDvE,KAAKoG,gBAAgBpF,EAAI+E,EAAOvD,kBAChCxB,EAAGqF,SAAS,EAAG,EAAGnG,EAAQiE,iBAAkBjE,EAAQmE,mBACpDrD,EAAGsF,WAAWtF,EAAGuF,eAAgB,EAAG,EACtC,CAEAC,qBAAAA,CACExF,EACAyF,EACAC,GAEA1F,EAAG2F,cAAcD,GACjB1F,EAAGiF,YAAYjF,EAAG+D,WAAY0B,GAE9BzF,EAAG2F,cAAc3F,EAAG4F,SACtB,CAEAC,uBAAAA,CAAwB7F,EAA2B0F,GACjD1F,EAAG2F,cAAcD,GACjB1F,EAAGiF,YAAYjF,EAAG+D,WAAY,MAC9B/D,EAAG2F,cAAc3F,EAAG4F,SACtB,CAUAR,eAAAA,CACEpF,EACAwB,GAEA,CAOFsE,eAAAA,CAAgB5G,GACd,IAAKA,EAAQ6G,UAAW,CACtB,MAAMA,EAAYC,IAClBD,EAAU7C,MAAQhE,EAAQoE,YAC1ByC,EAAU3C,OAASlE,EAAQqE,aAC3BrE,EAAQ6G,UAAYA,CACtB,CACF,CAMAE,QAAAA,GACE,MAAMC,EAAc1G,OAAO2G,KACxBnH,KAAKC,YAAkCS,UAG1C,OAAA0G,EAAA,CACErH,KAAMC,KAAKD,MACRmH,EAAYG,QAAiB,CAACC,EAAKzB,KAEpCyB,EAAIzB,GAAO7F,KAAK6F,GACTyB,IACN,CAAA,GAEP,CAMAC,MAAAA,GAEE,OAAOvH,KAAKiH,UACd,CAEA,uBAAaO,CAAUC,EAErBvH,GAEA,OAAO,IAAIF,KAHaG,EAAAsH,EAAAC,GAI1B,EACDC,EAvYY7H,EAAU,OAoBP,cAEd6H,EAtBW7H,EAAU,mBA2Be"}
|
|
@@ -2,7 +2,7 @@ import { defineProperty as _defineProperty, objectWithoutProperties as _objectWi
|
|
|
2
2
|
import { getEnv } from '../env/index.mjs';
|
|
3
3
|
import { createCanvasElement } from '../util/misc/dom.mjs';
|
|
4
4
|
import { isWebGLPipelineState } from './utils.mjs';
|
|
5
|
-
import {
|
|
5
|
+
import { identityFragmentShader, vertexSource, highPsourceCode } from './shaders/baseFilter.mjs';
|
|
6
6
|
import { FabricError } from '../util/internals/console.mjs';
|
|
7
7
|
|
|
8
8
|
const _excluded = ["type"],
|
|
@@ -26,13 +26,6 @@ class BaseFilter {
|
|
|
26
26
|
* to avoid doing that.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
/**
|
|
30
|
-
* Name of the parameter that can be changed in the filter.
|
|
31
|
-
* Some filters have more than one parameter and there is no
|
|
32
|
-
* mainParameter
|
|
33
|
-
* @private
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
29
|
/**
|
|
37
30
|
* Constructor
|
|
38
31
|
* @param {Object} [options] Options object
|
|
@@ -40,16 +33,14 @@ class BaseFilter {
|
|
|
40
33
|
constructor() {
|
|
41
34
|
let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
42
35
|
options = _objectWithoutProperties(_ref, _excluded);
|
|
43
|
-
/**
|
|
44
|
-
* Array of attributes to send with buffers. do not modify
|
|
45
|
-
* @private
|
|
46
|
-
*/
|
|
47
|
-
_defineProperty(this, "vertexSource", vertexSource);
|
|
48
36
|
Object.assign(this, this.constructor.defaults, options);
|
|
49
37
|
}
|
|
50
38
|
getFragmentSource() {
|
|
51
39
|
return identityFragmentShader;
|
|
52
40
|
}
|
|
41
|
+
getVertexSource() {
|
|
42
|
+
return vertexSource;
|
|
43
|
+
}
|
|
53
44
|
|
|
54
45
|
/**
|
|
55
46
|
* Compile this filter's shader program.
|
|
@@ -60,7 +51,7 @@ class BaseFilter {
|
|
|
60
51
|
*/
|
|
61
52
|
createProgram(gl) {
|
|
62
53
|
let fragmentSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getFragmentSource();
|
|
63
|
-
let vertexSource = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.
|
|
54
|
+
let vertexSource = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getVertexSource();
|
|
64
55
|
const {
|
|
65
56
|
WebGLProbe: {
|
|
66
57
|
GLPrecision = 'highp'
|
|
@@ -117,14 +108,17 @@ class BaseFilter {
|
|
|
117
108
|
/**
|
|
118
109
|
* Return a map of uniform names to WebGLUniformLocation objects.
|
|
119
110
|
*
|
|
120
|
-
* Intended to be overridden by subclasses.
|
|
121
|
-
*
|
|
122
111
|
* @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.
|
|
123
112
|
* @param {WebGLShaderProgram} program The shader program from which to take uniform locations.
|
|
124
113
|
* @returns {Object} A map of uniform names to uniform locations.
|
|
125
114
|
*/
|
|
126
115
|
getUniformLocations(gl, program) {
|
|
127
|
-
|
|
116
|
+
const locations = this.constructor.uniformLocations;
|
|
117
|
+
const uniformLocations = {};
|
|
118
|
+
for (let i = 0; i < locations.length; i++) {
|
|
119
|
+
uniformLocations[locations[i]] = gl.getUniformLocation(program, locations[i]);
|
|
120
|
+
}
|
|
121
|
+
return uniformLocations;
|
|
128
122
|
}
|
|
129
123
|
|
|
130
124
|
/**
|
|
@@ -174,18 +168,7 @@ class BaseFilter {
|
|
|
174
168
|
**/
|
|
175
169
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
176
170
|
isNeutralState(options) {
|
|
177
|
-
|
|
178
|
-
defaultValue = this.constructor.defaults[main];
|
|
179
|
-
if (main) {
|
|
180
|
-
const thisValue = this[main];
|
|
181
|
-
if (Array.isArray(defaultValue) && Array.isArray(thisValue)) {
|
|
182
|
-
return defaultValue.every((value, i) => value === thisValue[i]);
|
|
183
|
-
} else {
|
|
184
|
-
return defaultValue === thisValue;
|
|
185
|
-
}
|
|
186
|
-
} else {
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
171
|
+
return false;
|
|
189
172
|
}
|
|
190
173
|
|
|
191
174
|
/**
|
|
@@ -277,14 +260,6 @@ class BaseFilter {
|
|
|
277
260
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
278
261
|
gl.activeTexture(gl.TEXTURE0);
|
|
279
262
|
}
|
|
280
|
-
getMainParameter() {
|
|
281
|
-
return this.mainParameter ? this[this.mainParameter] : undefined;
|
|
282
|
-
}
|
|
283
|
-
setMainParameter(value) {
|
|
284
|
-
if (this.mainParameter) {
|
|
285
|
-
this[this.mainParameter] = value;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
263
|
|
|
289
264
|
/**
|
|
290
265
|
* Send uniform data from this filter to its shader program on the GPU.
|
|
@@ -316,12 +291,14 @@ class BaseFilter {
|
|
|
316
291
|
* @return {Object} Object representation of an instance
|
|
317
292
|
*/
|
|
318
293
|
toObject() {
|
|
319
|
-
const
|
|
294
|
+
const defaultKeys = Object.keys(this.constructor.defaults);
|
|
320
295
|
return _objectSpread2({
|
|
321
296
|
type: this.type
|
|
322
|
-
},
|
|
323
|
-
|
|
324
|
-
|
|
297
|
+
}, defaultKeys.reduce((acc, key) => {
|
|
298
|
+
//@ts-expect-error TS doesn't get i want an object that looks like this
|
|
299
|
+
acc[key] = this[key];
|
|
300
|
+
return acc;
|
|
301
|
+
}, {}));
|
|
325
302
|
}
|
|
326
303
|
|
|
327
304
|
/**
|
|
@@ -338,6 +315,12 @@ class BaseFilter {
|
|
|
338
315
|
}
|
|
339
316
|
}
|
|
340
317
|
_defineProperty(BaseFilter, "type", 'BaseFilter');
|
|
318
|
+
/**
|
|
319
|
+
* Contains the uniform locations for the fragment shader.
|
|
320
|
+
* uStepW and uStepH are handled by the BaseFilter, each filter class
|
|
321
|
+
* needs to specify all the one that are needed
|
|
322
|
+
*/
|
|
323
|
+
_defineProperty(BaseFilter, "uniformLocations", []);
|
|
341
324
|
|
|
342
325
|
export { BaseFilter };
|
|
343
326
|
//# sourceMappingURL=BaseFilter.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFilter.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter {\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n get type(): string {\n return (this.constructor as typeof BaseFilter).type;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n declare static defaults: Record<string, any>;\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n vertexSource = vertexSource;\n\n /**\n * Name of the parameter that can be changed in the filter.\n * Some filters have more than one parameter and there is no\n * mainParameter\n * @private\n */\n declare mainParameter?: keyof this | undefined;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({ type, ...options }: Record<string, any> = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.vertexSource\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision)\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error'\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader\n )}`\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader\n )}`\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {};\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record<string, number>,\n aPositionData: Float32Array\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n const main = this.mainParameter,\n defaultValue = (this.constructor as typeof BaseFilter).defaults[\n main as string\n ];\n if (main) {\n const thisValue = this[main];\n if (Array.isArray(defaultValue) && Array.isArray(thisValue)) {\n return defaultValue.every(\n (value: any, i: number) => value === thisValue[i]\n );\n } else {\n return defaultValue === thisValue;\n }\n } else {\n return false;\n }\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey() {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n getMainParameter() {\n return this.mainParameter ? this[this.mainParameter] : undefined;\n }\n\n setMainParameter(value: any) {\n if (this.mainParameter) {\n this[this.mainParameter] = value;\n }\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const helpLayer = createCanvasElement();\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n const mainP = this.mainParameter;\n return {\n type: this.type,\n ...(mainP ? { [mainP]: this[mainP] } : {}),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record<string, any>,\n options: Abortable\n ) {\n return new this(filterOptions);\n }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","constructor","_ref","arguments","length","undefined","options","_objectWithoutProperties","_excluded","_defineProperty","vertexSource","Object","assign","defaults","getFragmentSource","identityFragmentShader","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","main","mainParameter","defaultValue","thisValue","Array","isArray","every","value","i","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","createCanvasElement","toObject","mainP","_objectSpread","toJSON","fromObject","_ref2","filterOptions","_excluded2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseFilter.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record<string, any> = object\n> {\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record<string, unknown>;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial<OwnProps> & Record<string, any> = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource()\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision)\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error'\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader\n )}`\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader\n )}`\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter<string>)\n .uniformLocations;\n\n const uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i]\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record<string, number>,\n aPositionData: Float32Array\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const helpLayer = createCanvasElement();\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & OwnProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults\n ) as (keyof OwnProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce<OwnProps>((acc, key) => {\n //@ts-expect-error TS doesn't get i want an object that looks like this\n acc[key] = this[key as keyof this];\n return acc;\n }, {} as OwnProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record<string, any>,\n options: Abortable\n ): Promise<BaseFilter<string, object>> {\n return new this(filterOptions);\n }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","constructor","_ref","arguments","length","undefined","options","_objectWithoutProperties","_excluded","Object","assign","defaults","getFragmentSource","identityFragmentShader","getVertexSource","vertexSource","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","locations","i","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","createHelpLayer","helpLayer","createCanvasElement","toObject","defaultKeys","keys","_objectSpread","reduce","acc","toJSON","fromObject","_ref2","filterOptions","_excluded2","_defineProperty"],"mappings":"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"}
|