@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.
Files changed (268) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/dist/index.js +229 -491
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/dist/index.min.mjs +1 -1
  7. package/dist/index.min.mjs.map +1 -1
  8. package/dist/index.mjs +229 -491
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/index.node.cjs +229 -491
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.mjs +229 -491
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/canvas/Canvas.d.ts.map +1 -1
  17. package/dist/src/canvas/Canvas.min.mjs +1 -1
  18. package/dist/src/canvas/Canvas.min.mjs.map +1 -1
  19. package/dist/src/canvas/Canvas.mjs +8 -9
  20. package/dist/src/canvas/Canvas.mjs.map +1 -1
  21. package/dist/src/canvas/SelectableCanvas.d.ts +1 -1
  22. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  23. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  24. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  25. package/dist/src/canvas/SelectableCanvas.mjs +1 -1
  26. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  27. package/dist/src/canvas/StaticCanvas.d.ts +4 -4
  28. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  29. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  30. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  31. package/dist/src/canvas/StaticCanvas.mjs +0 -13
  32. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  33. package/dist/src/color/Color.d.ts +1 -0
  34. package/dist/src/color/Color.d.ts.map +1 -1
  35. package/dist/src/color/Color.min.mjs +1 -1
  36. package/dist/src/color/Color.min.mjs.map +1 -1
  37. package/dist/src/color/Color.mjs +3 -1
  38. package/dist/src/color/Color.mjs.map +1 -1
  39. package/dist/src/filters/BaseFilter.d.ts +16 -23
  40. package/dist/src/filters/BaseFilter.d.ts.map +1 -1
  41. package/dist/src/filters/BaseFilter.min.mjs +1 -1
  42. package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
  43. package/dist/src/filters/BaseFilter.mjs +24 -41
  44. package/dist/src/filters/BaseFilter.mjs.map +1 -1
  45. package/dist/src/filters/BlendColor.d.ts +13 -24
  46. package/dist/src/filters/BlendColor.d.ts.map +1 -1
  47. package/dist/src/filters/BlendColor.min.mjs +1 -1
  48. package/dist/src/filters/BlendColor.min.mjs.map +1 -1
  49. package/dist/src/filters/BlendColor.mjs +1 -25
  50. package/dist/src/filters/BlendColor.mjs.map +1 -1
  51. package/dist/src/filters/BlendImage.d.ts +18 -19
  52. package/dist/src/filters/BlendImage.d.ts.map +1 -1
  53. package/dist/src/filters/BlendImage.min.mjs +1 -1
  54. package/dist/src/filters/BlendImage.min.mjs.map +1 -1
  55. package/dist/src/filters/BlendImage.mjs +13 -24
  56. package/dist/src/filters/BlendImage.mjs.map +1 -1
  57. package/dist/src/filters/Blur.d.ts +10 -12
  58. package/dist/src/filters/Blur.d.ts.map +1 -1
  59. package/dist/src/filters/Blur.min.mjs +1 -1
  60. package/dist/src/filters/Blur.min.mjs.map +1 -1
  61. package/dist/src/filters/Blur.mjs +5 -14
  62. package/dist/src/filters/Blur.mjs.map +1 -1
  63. package/dist/src/filters/Boilerplate.d.ts +11 -13
  64. package/dist/src/filters/Boilerplate.d.ts.map +1 -1
  65. package/dist/src/filters/Brightness.d.ts +10 -12
  66. package/dist/src/filters/Brightness.d.ts.map +1 -1
  67. package/dist/src/filters/Brightness.min.mjs +1 -1
  68. package/dist/src/filters/Brightness.min.mjs.map +1 -1
  69. package/dist/src/filters/Brightness.mjs +4 -16
  70. package/dist/src/filters/Brightness.mjs.map +1 -1
  71. package/dist/src/filters/Canvas2dFilterBackend.d.ts +1 -1
  72. package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +1 -1
  73. package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
  74. package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
  75. package/dist/src/filters/ColorMatrix.d.ts +17 -15
  76. package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
  77. package/dist/src/filters/ColorMatrix.min.mjs +1 -1
  78. package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
  79. package/dist/src/filters/ColorMatrix.mjs +7 -27
  80. package/dist/src/filters/ColorMatrix.mjs.map +1 -1
  81. package/dist/src/filters/ColorMatrixFilters.d.ts +63 -497
  82. package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
  83. package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
  84. package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
  85. package/dist/src/filters/ColorMatrixFilters.mjs +13 -8
  86. package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
  87. package/dist/src/filters/Composed.d.ts +11 -10
  88. package/dist/src/filters/Composed.d.ts.map +1 -1
  89. package/dist/src/filters/Composed.min.mjs +1 -1
  90. package/dist/src/filters/Composed.min.mjs.map +1 -1
  91. package/dist/src/filters/Composed.mjs +7 -12
  92. package/dist/src/filters/Composed.mjs.map +1 -1
  93. package/dist/src/filters/Contrast.d.ts +10 -12
  94. package/dist/src/filters/Contrast.d.ts.map +1 -1
  95. package/dist/src/filters/Contrast.min.mjs +1 -1
  96. package/dist/src/filters/Contrast.min.mjs.map +1 -1
  97. package/dist/src/filters/Contrast.mjs +6 -17
  98. package/dist/src/filters/Contrast.mjs.map +1 -1
  99. package/dist/src/filters/Convolute.d.ts +11 -14
  100. package/dist/src/filters/Convolute.d.ts.map +1 -1
  101. package/dist/src/filters/Convolute.min.mjs +1 -1
  102. package/dist/src/filters/Convolute.min.mjs.map +1 -1
  103. package/dist/src/filters/Convolute.mjs +1 -15
  104. package/dist/src/filters/Convolute.mjs.map +1 -1
  105. package/dist/src/filters/Gamma.d.ts +17 -14
  106. package/dist/src/filters/Gamma.d.ts.map +1 -1
  107. package/dist/src/filters/Gamma.min.mjs +1 -1
  108. package/dist/src/filters/Gamma.min.mjs.map +1 -1
  109. package/dist/src/filters/Gamma.mjs +20 -24
  110. package/dist/src/filters/Gamma.mjs.map +1 -1
  111. package/dist/src/filters/Grayscale.d.ts +8 -11
  112. package/dist/src/filters/Grayscale.d.ts.map +1 -1
  113. package/dist/src/filters/Grayscale.min.mjs +1 -1
  114. package/dist/src/filters/Grayscale.min.mjs.map +1 -1
  115. package/dist/src/filters/Grayscale.mjs +2 -14
  116. package/dist/src/filters/Grayscale.mjs.map +1 -1
  117. package/dist/src/filters/HueRotation.d.ts +11 -5
  118. package/dist/src/filters/HueRotation.d.ts.map +1 -1
  119. package/dist/src/filters/HueRotation.min.mjs +1 -1
  120. package/dist/src/filters/HueRotation.min.mjs.map +1 -1
  121. package/dist/src/filters/HueRotation.mjs +10 -5
  122. package/dist/src/filters/HueRotation.mjs.map +1 -1
  123. package/dist/src/filters/Invert.d.ts +10 -13
  124. package/dist/src/filters/Invert.d.ts.map +1 -1
  125. package/dist/src/filters/Invert.min.mjs +1 -1
  126. package/dist/src/filters/Invert.min.mjs.map +1 -1
  127. package/dist/src/filters/Invert.mjs +2 -15
  128. package/dist/src/filters/Invert.mjs.map +1 -1
  129. package/dist/src/filters/Noise.d.ts +9 -20
  130. package/dist/src/filters/Noise.d.ts.map +1 -1
  131. package/dist/src/filters/Noise.min.mjs +1 -1
  132. package/dist/src/filters/Noise.min.mjs.map +1 -1
  133. package/dist/src/filters/Noise.mjs +4 -27
  134. package/dist/src/filters/Noise.mjs.map +1 -1
  135. package/dist/src/filters/Pixelate.d.ts +8 -12
  136. package/dist/src/filters/Pixelate.d.ts.map +1 -1
  137. package/dist/src/filters/Pixelate.min.mjs +1 -1
  138. package/dist/src/filters/Pixelate.min.mjs.map +1 -1
  139. package/dist/src/filters/Pixelate.mjs +2 -16
  140. package/dist/src/filters/Pixelate.mjs.map +1 -1
  141. package/dist/src/filters/RemoveColor.d.ts +12 -23
  142. package/dist/src/filters/RemoveColor.d.ts.map +1 -1
  143. package/dist/src/filters/RemoveColor.min.mjs +1 -1
  144. package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
  145. package/dist/src/filters/RemoveColor.mjs +2 -25
  146. package/dist/src/filters/RemoveColor.mjs.map +1 -1
  147. package/dist/src/filters/Resize.d.ts +14 -30
  148. package/dist/src/filters/Resize.d.ts.map +1 -1
  149. package/dist/src/filters/Resize.min.mjs +1 -1
  150. package/dist/src/filters/Resize.min.mjs.map +1 -1
  151. package/dist/src/filters/Resize.mjs +3 -30
  152. package/dist/src/filters/Resize.mjs.map +1 -1
  153. package/dist/src/filters/Saturation.d.ts +9 -12
  154. package/dist/src/filters/Saturation.d.ts.map +1 -1
  155. package/dist/src/filters/Saturation.min.mjs +1 -1
  156. package/dist/src/filters/Saturation.min.mjs.map +1 -1
  157. package/dist/src/filters/Saturation.mjs +8 -20
  158. package/dist/src/filters/Saturation.mjs.map +1 -1
  159. package/dist/src/filters/Vibrance.d.ts +10 -13
  160. package/dist/src/filters/Vibrance.d.ts.map +1 -1
  161. package/dist/src/filters/Vibrance.min.mjs +1 -1
  162. package/dist/src/filters/Vibrance.min.mjs.map +1 -1
  163. package/dist/src/filters/Vibrance.mjs +6 -18
  164. package/dist/src/filters/Vibrance.mjs.map +1 -1
  165. package/dist/src/filters/WebGLFilterBackend.d.ts +1 -1
  166. package/dist/src/filters/WebGLFilterBackend.d.ts.map +1 -1
  167. package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
  168. package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
  169. package/dist/src/filters/shaders/blendImage.d.ts +1 -0
  170. package/dist/src/filters/shaders/blendImage.d.ts.map +1 -1
  171. package/dist/src/filters/shaders/blendImage.min.mjs +1 -1
  172. package/dist/src/filters/shaders/blendImage.min.mjs.map +1 -1
  173. package/dist/src/filters/shaders/blendImage.mjs +2 -1
  174. package/dist/src/filters/shaders/blendImage.mjs.map +1 -1
  175. package/dist/src/filters/typedefs.d.ts +22 -0
  176. package/dist/src/filters/typedefs.d.ts.map +1 -1
  177. package/dist/src/parser/elements_parser.d.ts +1 -1
  178. package/dist/src/parser/elements_parser.d.ts.map +1 -1
  179. package/dist/src/parser/elements_parser.min.mjs.map +1 -1
  180. package/dist/src/parser/elements_parser.mjs.map +1 -1
  181. package/dist/src/shapes/ActiveSelection.d.ts +1 -1
  182. package/dist/src/shapes/ActiveSelection.d.ts.map +1 -1
  183. package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
  184. package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
  185. package/dist/src/shapes/ActiveSelection.mjs +13 -10
  186. package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
  187. package/dist/src/shapes/Group.d.ts +9 -0
  188. package/dist/src/shapes/Group.d.ts.map +1 -1
  189. package/dist/src/shapes/Group.min.mjs +1 -1
  190. package/dist/src/shapes/Group.min.mjs.map +1 -1
  191. package/dist/src/shapes/Group.mjs +10 -1
  192. package/dist/src/shapes/Group.mjs.map +1 -1
  193. package/dist/src/shapes/Image.d.ts +4 -4
  194. package/dist/src/shapes/Image.d.ts.map +1 -1
  195. package/dist/src/shapes/Image.min.mjs.map +1 -1
  196. package/dist/src/shapes/Image.mjs.map +1 -1
  197. package/dist/src/shapes/Object/InteractiveObject.d.ts +3 -0
  198. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  199. package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
  200. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  201. package/dist/src/shapes/Object/InteractiveObject.mjs +3 -1
  202. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  203. package/dist/src/shapes/Object/Object.d.ts +1 -16
  204. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  205. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  206. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  207. package/dist/src/shapes/Object/Object.mjs +9 -10
  208. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  209. package/dist/src/shapes/Object/StackedObject.d.ts +8 -15
  210. package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
  211. package/dist/src/shapes/Object/StackedObject.min.mjs +1 -1
  212. package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
  213. package/dist/src/shapes/Object/StackedObject.mjs +11 -21
  214. package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
  215. package/dist/src/shapes/Path.d.ts +2 -2
  216. package/dist/src/shapes/Path.d.ts.map +1 -1
  217. package/dist/src/shapes/Path.min.mjs.map +1 -1
  218. package/dist/src/shapes/Path.mjs +2 -2
  219. package/dist/src/shapes/Path.mjs.map +1 -1
  220. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +1 -1
  221. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  222. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  223. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  224. package/dist/src/util/misc/objectEnlive.d.ts +2 -2
  225. package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
  226. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  227. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  228. package/package.json +2 -2
  229. package/src/canvas/Canvas.ts +6 -9
  230. package/src/canvas/SelectableCanvas.ts +2 -2
  231. package/src/canvas/StaticCanvas.ts +4 -18
  232. package/src/color/Color.ts +2 -1
  233. package/src/color/color.test.ts +6 -0
  234. package/src/filters/BaseFilter.ts +45 -51
  235. package/src/filters/BlendColor.ts +13 -35
  236. package/src/filters/BlendImage.ts +26 -40
  237. package/src/filters/Blur.ts +13 -20
  238. package/src/filters/Boilerplate.ts +13 -22
  239. package/src/filters/Brightness.ts +12 -21
  240. package/src/filters/Canvas2dFilterBackend.ts +1 -1
  241. package/src/filters/ColorMatrix.ts +29 -34
  242. package/src/filters/ColorMatrixFilters.ts +15 -9
  243. package/src/filters/Composed.ts +26 -16
  244. package/src/filters/Contrast.ts +15 -23
  245. package/src/filters/Convolute.ts +11 -23
  246. package/src/filters/Gamma.ts +32 -24
  247. package/src/filters/Grayscale.ts +8 -19
  248. package/src/filters/HueRotation.ts +21 -11
  249. package/src/filters/Invert.ts +11 -22
  250. package/src/filters/Noise.ts +11 -30
  251. package/src/filters/Pixelate.ts +9 -22
  252. package/src/filters/RemoveColor.ts +21 -35
  253. package/src/filters/Resize.ts +20 -44
  254. package/src/filters/Saturation.ts +16 -27
  255. package/src/filters/Vibrance.ts +14 -24
  256. package/src/filters/WebGLFilterBackend.ts +1 -1
  257. package/src/filters/shaders/blendImage.ts +12 -0
  258. package/src/filters/typedefs.ts +23 -0
  259. package/src/parser/elements_parser.ts +1 -1
  260. package/src/shapes/ActiveSelection.ts +8 -4
  261. package/src/shapes/Group.ts +16 -1
  262. package/src/shapes/Image.ts +8 -6
  263. package/src/shapes/Object/InteractiveObject.ts +3 -1
  264. package/src/shapes/Object/Object.ts +10 -35
  265. package/src/shapes/Object/StackedObject.ts +28 -44
  266. package/src/shapes/Path.ts +4 -4
  267. package/src/shapes/Text/TextSVGExportMixin.ts +1 -1
  268. 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(): string;
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
- * Array of attributes to send with buffers. do not modify
21
- * @private
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
- vertexSource: string;
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 }?: Record<string, any>);
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: string;
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: string;
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;IACrB;;;;OAIG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,SAAgB;IAE3B,OAAe,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE7C;;;OAGG;IACH,YAAY,SAAgB;IAE5B;;;;;OAKG;IACK,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC;IAE/C;;;OAGG;gBACS,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAQ1D,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC;;;;;;OAMG;IACH,aAAa,CACX,EAAE,EAAE,qBAAqB,EACzB,cAAc,GAAE,MAAiC,EACjD,YAAY,GAAE,MAA0B;;;;;IA2D1C;;;;;;OAMG;IACH,qBAAqB,CACnB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,0BAA0B;IAM7B;;;;;;;;OAQG;IACH,mBAAmB,CACjB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,wBAAwB;IAI3B;;;;;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;IAmBtC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB;IAUvD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI1C;;;;QAII;IACJ,WAAW;IAIX;;;;;;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,gBAAgB;IAIhB,gBAAgB,CAAC,KAAK,EAAE,GAAG;IAM3B;;;;;;;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;;;IAQR;;;OAGG;IACH,MAAM;;;WAKO,UAAU,CACrB,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/C,OAAO,EAAE,SAAS;CAIrB"}
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 i}from"../env/index.min.mjs";import{createCanvasElement as a}from"../util/misc/dom.min.mjs";import{isWebGLPipelineState as o}from"./utils.min.mjs";import{vertexSource as n,identityFragmentShader 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 r=t(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},h);e(this,"vertexSource",n),Object.assign(this,this.constructor.defaults,r)}getFragmentSource(){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.vertexSource;const{WebGLProbe:{GLPrecision:a="highp"}}=i();"highp"!==a&&(t=t.replace(p,c.replace("highp",a)));const o=e.createShader(e.VERTEX_SHADER),n=e.createShader(e.FRAGMENT_SHADER),s=e.createProgram();if(!o||!n||!s)throw new u("Vertex, fragment shader or program creation error");if(e.shaderSource(o,r),e.compileShader(o),!e.getShaderParameter(o,e.COMPILE_STATUS))throw new u("Vertex shader compile error for ".concat(this.type,": ").concat(e.getShaderInfoLog(o)));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,o),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){return{}}sendAttributeData(e,t,r){const i=t.aPosition,a=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,a),e.enableVertexAttribArray(i),e.vertexAttribPointer(i,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,i=e.destinationHeight;e.sourceWidth===r&&e.sourceHeight===i||(t.deleteTexture(e.targetTexture),e.targetTexture=e.filterBackend.createTexture(t,r,i)),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){const t=this.mainParameter,r=this.constructor.defaults[t];if(t){const e=this[t];return Array.isArray(r)&&Array.isArray(e)?r.every(((t,r)=>t===e[r])):r===e}return!1}applyTo(e){o(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)}getMainParameter(){return this.mainParameter?this[this.mainParameter]:void 0}setMainParameter(e){this.mainParameter&&(this[this.mainParameter]=e)}sendUniformData(e,t){}createHelpLayer(e){if(!e.helpLayer){const t=a();t.width=e.sourceWidth,t.height=e.sourceHeight,e.helpLayer=t}}toObject(){const e=this.mainParameter;return r({type:this.type},e?{[e]:this[e]}:{})}toJSON(){return this.toObject()}static async fromObject(e,r){return new this(t(e,m))}}e(g,"type","BaseFilter");export{g as BaseFilter};
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":"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"}
@@ -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 { vertexSource, identityFragmentShader, highPsourceCode } from './shaders/baseFilter.mjs';
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.vertexSource;
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
- return {};
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
- const main = this.mainParameter,
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 mainP = this.mainParameter;
294
+ const defaultKeys = Object.keys(this.constructor.defaults);
320
295
  return _objectSpread2({
321
296
  type: this.type
322
- }, mainP ? {
323
- [mainP]: this[mainP]
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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"}