@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":"WebGLFilterBackend.min.mjs","sources":["../../../src/filters/WebGLFilterBackend.ts"],"sourcesContent":["import { config } from '../config';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n // @ts-expect-error is this a bug? should this be naturalWidth? or is this the pipeline state?\n (source as HTMLImageElement).originalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n // @ts-expect-error is this a bug? should this be naturalHeight? or is this the pipeline state?\n (source as HTMLImageElement).originalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n )!,\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required<WebGLFilterBackend>,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n"],"names":["WebGLFilterBackend","constructor","tileSize","config","textureSize","arguments","length","undefined","_defineProperty","this","Float32Array","setupGLContext","captureGPUInfo","width","height","dispose","createWebGLCanvas","canvas","createCanvasElement","gl","getContext","alpha","premultipliedAlpha","depth","stencil","antialias","clearColor","applyFilters","filters","source","targetCanvas","cacheKey","ctx","cachedTexture","getCachedTexture","pipelineState","originalWidth","originalHeight","sourceWidth","sourceHeight","destinationWidth","destinationHeight","context","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","filterBackend","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","forEach","filter","applyTo","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","setTransform","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","putImageData","gpuInfo","renderer","vendor","ext","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","toLowerCase"],"mappings":"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"}
1
+ {"version":3,"file":"WebGLFilterBackend.min.mjs","sources":["../../../src/filters/WebGLFilterBackend.ts"],"sourcesContent":["import { config } from '../config';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n // @ts-expect-error is this a bug? should this be naturalWidth? or is this the pipeline state?\n (source as HTMLImageElement).originalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n // @ts-expect-error is this a bug? should this be naturalHeight? or is this the pipeline state?\n (source as HTMLImageElement).originalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n )!,\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required<WebGLFilterBackend>,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n"],"names":["WebGLFilterBackend","constructor","tileSize","config","textureSize","arguments","length","undefined","_defineProperty","this","Float32Array","setupGLContext","captureGPUInfo","width","height","dispose","createWebGLCanvas","canvas","createCanvasElement","gl","getContext","alpha","premultipliedAlpha","depth","stencil","antialias","clearColor","applyFilters","filters","source","targetCanvas","cacheKey","ctx","cachedTexture","getCachedTexture","pipelineState","originalWidth","originalHeight","sourceWidth","sourceHeight","destinationWidth","destinationHeight","context","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","filterBackend","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","forEach","filter","applyTo","dWidth","dHeight","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","setTransform","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","putImageData","gpuInfo","renderer","vendor","ext","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","toLowerCase"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLFilterBackend.mjs","sources":["../../../src/filters/WebGLFilterBackend.ts"],"sourcesContent":["import { config } from '../config';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n // @ts-expect-error is this a bug? should this be naturalWidth? or is this the pipeline state?\n (source as HTMLImageElement).originalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n // @ts-expect-error is this a bug? should this be naturalHeight? or is this the pipeline state?\n (source as HTMLImageElement).originalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n )!,\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required<WebGLFilterBackend>,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n"],"names":["WebGLFilterBackend","constructor","tileSize","config","textureSize","arguments","length","undefined","_defineProperty","Float32Array","setupGLContext","captureGPUInfo","width","height","dispose","createWebGLCanvas","canvas","createCanvasElement","glOptions","alpha","premultipliedAlpha","depth","stencil","antialias","gl","getContext","clearColor","applyFilters","filters","source","targetCanvas","cacheKey","ctx","cachedTexture","getCachedTexture","pipelineState","originalWidth","originalHeight","sourceWidth","sourceHeight","destinationWidth","destinationHeight","context","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","filterBackend","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","forEach","filter","applyTo","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","setTransform","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","putImageData","gpuInfo","renderer","vendor","ext","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","toLowerCase"],"mappings":"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"}
1
+ {"version":3,"file":"WebGLFilterBackend.mjs","sources":["../../../src/filters/WebGLFilterBackend.ts"],"sourcesContent":["import { config } from '../config';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n TWebGLPipelineState,\n TProgramCache,\n TTextureCache,\n TPipelineResources,\n} from './typedefs';\nimport type { BaseFilter } from './BaseFilter';\n\nexport class WebGLFilterBackend {\n declare tileSize: number;\n\n /**\n * Define ...\n **/\n aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n\n /**\n * If GLPut data is the fastest operation, or if forced, this buffer will be used\n * to transfer the data back in the 2d logic\n **/\n declare imageBuffer?: ArrayBuffer;\n\n declare canvas: HTMLCanvasElement;\n\n /**\n * The Webgl context that will execute the operations for filtering\n **/\n declare gl: WebGLRenderingContext;\n\n /**\n * Keyed map for shader cache\n **/\n declare programCache: TProgramCache;\n\n /**\n * Keyed map for texture cache\n **/\n declare textureCache: TTextureCache;\n\n /**\n * Contains GPU info for debug\n **/\n declare gpuInfo: any;\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: TPipelineResources = {};\n\n constructor({ tileSize = config.textureSize } = {}) {\n this.tileSize = tileSize;\n this.setupGLContext(tileSize, tileSize);\n this.captureGPUInfo();\n }\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext(width: number, height: number): void {\n this.dispose();\n this.createWebGLCanvas(width, height);\n }\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas(width: number, height: number): void {\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n const glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n },\n gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;\n\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n }\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {TexImageSource} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters(\n filters: BaseFilter<string, Record<string, any>>[],\n source: TexImageSource,\n width: number,\n height: number,\n targetCanvas: HTMLCanvasElement,\n cacheKey?: string\n ): TWebGLPipelineState | undefined {\n const gl = this.gl;\n const ctx = targetCanvas.getContext('2d');\n if (!gl || !ctx) {\n return;\n }\n let cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n const pipelineState: TWebGLPipelineState = {\n originalWidth:\n (source as HTMLImageElement).width ||\n // @ts-expect-error is this a bug? should this be naturalWidth? or is this the pipeline state?\n (source as HTMLImageElement).originalWidth ||\n 0,\n originalHeight:\n (source as HTMLImageElement).height ||\n // @ts-expect-error is this a bug? should this be naturalHeight? or is this the pipeline state?\n (source as HTMLImageElement).originalHeight ||\n 0,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n ),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture:\n cachedTexture ||\n this.createTexture(\n gl,\n width,\n height,\n !cachedTexture ? source : undefined\n )!,\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas,\n };\n const tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach((filter: any) => {\n filter && filter.applyTo(pipelineState);\n });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n }\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose() {\n if (this.canvas) {\n // we are disposing, we don't care about the fact\n // that the canvas shouldn't be null.\n // @ts-expect-error disposing\n this.canvas = null;\n // @ts-expect-error disposing\n this.gl = null;\n }\n this.clearWebGLCaches();\n }\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches() {\n this.programCache = {};\n this.textureCache = {};\n }\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {number} width The width to initialize the texture at.\n * @param {number} height The height to initialize the texture.\n * @param {TexImageSource} textureImageSource A source for the texture data.\n * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.\n * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR\n * @returns {WebGLTexture}\n */\n createTexture(\n gl: WebGLRenderingContext,\n width: number,\n height: number,\n textureImageSource?: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ) {\n const {\n NEAREST,\n TEXTURE_2D,\n RGBA,\n UNSIGNED_BYTE,\n CLAMP_TO_EDGE,\n TEXTURE_MAG_FILTER,\n TEXTURE_MIN_FILTER,\n TEXTURE_WRAP_S,\n TEXTURE_WRAP_T,\n } = gl;\n const texture = gl.createTexture();\n gl.bindTexture(TEXTURE_2D, texture);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);\n gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n RGBA,\n UNSIGNED_BYTE,\n textureImageSource\n );\n } else {\n gl.texImage2D(\n TEXTURE_2D,\n 0,\n RGBA,\n width,\n height,\n 0,\n RGBA,\n UNSIGNED_BYTE,\n null\n );\n }\n return texture;\n }\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture(\n uniqueId: string,\n textureImageSource: TexImageSource,\n filter?:\n | WebGLRenderingContextBase['NEAREST']\n | WebGLRenderingContextBase['LINEAR']\n ): WebGLTexture | null {\n const { textureCache } = this;\n if (textureCache[uniqueId]) {\n return textureCache[uniqueId];\n } else {\n const texture = this.createTexture(\n this.gl,\n (textureImageSource as HTMLImageElement).width,\n (textureImageSource as HTMLImageElement).height,\n textureImageSource,\n filter\n );\n if (texture) {\n textureCache[uniqueId] = texture;\n }\n return texture;\n }\n }\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey(cacheKey: string) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {\n const glCanvas = gl.canvas,\n targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n const sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(\n glCanvas,\n 0,\n sourceY,\n targetCanvas.width,\n targetCanvas.height,\n 0,\n 0,\n targetCanvas.width,\n targetCanvas.height\n );\n }\n\n /**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\n copyGLTo2DPutImageData(\n this: Required<WebGLFilterBackend>,\n gl: WebGLRenderingContext,\n pipelineState: TWebGLPipelineState\n ) {\n const targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n if (!ctx) {\n return;\n }\n const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n const imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n }\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n const gl = this.gl,\n gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n const ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n }\n}\n\nfunction resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {\n const targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width,\n height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n"],"names":["WebGLFilterBackend","constructor","tileSize","config","textureSize","arguments","length","undefined","_defineProperty","Float32Array","setupGLContext","captureGPUInfo","width","height","dispose","createWebGLCanvas","canvas","createCanvasElement","glOptions","alpha","premultipliedAlpha","depth","stencil","antialias","gl","getContext","clearColor","applyFilters","filters","source","targetCanvas","cacheKey","ctx","cachedTexture","getCachedTexture","pipelineState","originalWidth","originalHeight","sourceWidth","sourceHeight","destinationWidth","destinationHeight","context","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","aPosition","programCache","pass","filterBackend","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","forEach","filter","applyTo","resizeCanvasIfNeeded","copyGLTo2D","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","setTransform","clearWebGLCaches","textureCache","textureImageSource","NEAREST","RGBA","UNSIGNED_BYTE","CLAMP_TO_EDGE","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texture","texParameteri","texImage2D","uniqueId","evictCachesForKey","glCanvas","translate","scale","sourceY","drawImage","copyGLTo2DPutImageData","dWidth","dHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","imgData","ImageData","putImageData","gpuInfo","renderer","vendor","ext","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","toLowerCase"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { TBlendImageMode } from '../BlendImage';
2
2
  export declare const fragmentSource: Record<TBlendImageMode, string>;
3
+ export declare const vertexSource: "\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ";
3
4
  //# sourceMappingURL=blendImage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blendImage.d.ts","sourceRoot":"","sources":["../../../../src/filters/shaders/blendImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CA6BjD,CAAC"}
1
+ {"version":3,"file":"blendImage.d.ts","sourceRoot":"","sources":["../../../../src/filters/shaders/blendImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CA6BjD,CAAC;AAEX,eAAO,MAAM,YAAY,8TAUX,CAAC"}
@@ -1,2 +1,2 @@
1
- const o={multiply:"\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n ",mask:"\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n "};export{o as fragmentSource};
1
+ const o={multiply:"\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n ",mask:"\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n "},r="\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ";export{o as fragmentSource,r as vertexSource};
2
2
  //# sourceMappingURL=blendImage.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blendImage.min.mjs","sources":["../../../../src/filters/shaders/blendImage.ts"],"sourcesContent":["import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record<TBlendImageMode, string> = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n"],"names":["fragmentSource","multiply","mask"],"mappings":"AAEO,MAAMA,EAAkD,CAC7DC,SAaG,2XACHC,KAAI"}
1
+ {"version":3,"file":"blendImage.min.mjs","sources":["../../../../src/filters/shaders/blendImage.ts"],"sourcesContent":["import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record<TBlendImageMode, string> = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n"],"names":["fragmentSource","multiply","mask","vertexSource"],"mappings":"AAEO,MAAMA,EAAkD,CAC7DC,SAaG,2XACHC,KAAI,qXAgBOC,EAUC"}
@@ -2,6 +2,7 @@ const fragmentSource = {
2
2
  multiply: "\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n ",
3
3
  mask: "\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n "
4
4
  };
5
+ const vertexSource = "\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ";
5
6
 
6
- export { fragmentSource };
7
+ export { fragmentSource, vertexSource };
7
8
  //# sourceMappingURL=blendImage.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blendImage.mjs","sources":["../../../../src/filters/shaders/blendImage.ts"],"sourcesContent":["import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record<TBlendImageMode, string> = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n"],"names":["fragmentSource","multiply","mask"],"mappings":"AAEO,MAAMA,cAA+C,GAAG;AAC7DC,EAAAA,QAAQ,EAaL,0XAAA;EACHC,IAAI,EAAA,mXAAA;AAcN;;;;"}
1
+ {"version":3,"file":"blendImage.mjs","sources":["../../../../src/filters/shaders/blendImage.ts"],"sourcesContent":["import type { TBlendImageMode } from '../BlendImage';\n\nexport const fragmentSource: Record<TBlendImageMode, string> = {\n multiply: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.rgba *= color2.rgba;\n gl_FragColor = color;\n }\n `,\n mask: `\n precision highp float;\n uniform sampler2D uTexture;\n uniform sampler2D uImage;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n vec4 color2 = texture2D(uImage, vTexCoord2);\n color.a = color2.a;\n gl_FragColor = color;\n }\n `,\n} as const;\n\nexport const vertexSource = `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n ` as const;\n"],"names":["fragmentSource","multiply","mask","vertexSource"],"mappings":"AAEO,MAAMA,cAA+C,GAAG;AAC7DC,EAAAA,QAAQ,EAaL,0XAAA;EACHC,IAAI,EAAA,mXAAA;AAcN,EAAU;AAEH,MAAMC,YAAY,GAUX;;;;"}
@@ -46,4 +46,26 @@ export type TWebGLProgramCacheItem = {
46
46
  uniformLocations: TWebGLUniformLocationMap;
47
47
  };
48
48
  export type TApplyFilterArgs = {};
49
+ export type TMatColorMatrix = [
50
+ number,
51
+ number,
52
+ number,
53
+ number,
54
+ number,
55
+ number,
56
+ number,
57
+ number,
58
+ number,
59
+ number,
60
+ number,
61
+ number,
62
+ number,
63
+ number,
64
+ number,
65
+ number,
66
+ number,
67
+ number,
68
+ number,
69
+ number
70
+ ];
49
71
  //# sourceMappingURL=typedefs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"typedefs.d.ts","sourceRoot":"","sources":["../../../src/filters/typedefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,kBAAkB,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,iBAAiB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,qBAAqB,CAAC;IACrC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,GAAG,EAAE,wBAAwB,CAAC;IAC9B,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,MAAM,EACN,oBAAoB,GAAG,IAAI,CAC5B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,gBAAgB,EAAE,wBAAwB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"typedefs.d.ts","sourceRoot":"","sources":["../../../src/filters/typedefs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC;AAEhC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,kBAAkB,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,iBAAiB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,qBAAqB,CAAC;IACrC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,GAAG,EAAE,wBAAwB,CAAC;IAC9B,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAC3C,MAAM,EACN,oBAAoB,GAAG,IAAI,CAC5B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,kBAAkB,EAAE,0BAA0B,CAAC;IAC/C,gBAAgB,EAAE,wBAAwB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -16,7 +16,7 @@ type NotParsedFabricObject = FabricObject & {
16
16
  export declare class ElementsParser {
17
17
  elements: Element[];
18
18
  options: LoadImageOptions & ParsedViewboxTransform;
19
- reviver: TSvgReviverCallback | undefined;
19
+ reviver?: TSvgReviverCallback;
20
20
  regexUrl: RegExp;
21
21
  doc: Document;
22
22
  clipPaths: Record<string, Element[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"elements_parser.d.ts","sourceRoot":"","sources":["../../../src/parser/elements_parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAQtE,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,qBAAqB,GAAG,YAAY,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,qBAAa,cAAc;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,CAAC;IACnD,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,EAAE,QAAQ,CAAC;gBAGzB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,EAClD,OAAO,EAAE,mBAAmB,GAAG,SAAS,EACxC,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAYtC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAMtC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyB7D,yBAAyB,CACvB,GAAG,EAAE,qBAAqB,EAC1B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,EACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,QAAQ,CAAC,CAAC,GACpD,WAAW,CAAC,OAAO,QAAQ,CAAC,GAAG,SAAS;IAe3C,eAAe,CACb,GAAG,EAAE,qBAAqB,EAC1B,EAAE,EAAE,OAAO,EACX,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAmBvB,eAAe,CAAC,GAAG,EAAE,qBAAqB,EAAE,YAAY,EAAE,OAAO;CAgFxE"}
1
+ {"version":3,"file":"elements_parser.d.ts","sourceRoot":"","sources":["../../../src/parser/elements_parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAQtE,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,qBAAqB,GAAG,YAAY,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,qBAAa,cAAc;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,CAAC;IACnD,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,EAAE,QAAQ,CAAC;gBAGzB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,EAClD,OAAO,EAAE,mBAAmB,GAAG,SAAS,EACxC,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAYtC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAMtC,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyB7D,yBAAyB,CACvB,GAAG,EAAE,qBAAqB,EAC1B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,EACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,QAAQ,CAAC,CAAC,GACpD,WAAW,CAAC,OAAO,QAAQ,CAAC,GAAG,SAAS;IAe3C,eAAe,CACb,GAAG,EAAE,qBAAqB,EAC1B,EAAE,EAAE,OAAO,EACX,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAmBvB,eAAe,CAAC,GAAG,EAAE,qBAAqB,EAAE,YAAY,EAAE,OAAO;CAgFxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"elements_parser.min.mjs","sources":["../../../src/parser/elements_parser.ts"],"sourcesContent":["import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver: TSvgReviverCallback | undefined;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record<string, Element[]>;\n declare gradientDefs: Record<string, SVGGradientElement>;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record<string, Element[]>\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise<Array<FabricObject | null>> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element))\n );\n }\n\n async createObject(el: Element): Promise<FabricObject | null> {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules\n );\n this.resolveGradient(obj, el, 'fill');\n this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute()\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record<string, StorageType[typeof property]>\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke'\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(obj: NotParsedFabricObject, usingElement: Element) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag!);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n })\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(clipPath, clipPathOwner);\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n"],"names":["findTag","el","classRegistry","getSVGClass","getTagName","toLowerCase","ElementsParser","constructor","elements","options","reviver","doc","clipPaths","this","regexUrl","gradientDefs","getGradientDefs","cssRules","getCSSRules","parse","Promise","all","map","element","createObject","klass","obj","fromElement","resolveGradient","FabricImage","_originalElement","removeTransformMatrixForSvgParsing","parsePreserveAspectRatioAttribute","resolveClipPath","extractPropertyDefinition","property","storage","value","regex","test","lastIndex","id","exec","gradientDef","opacityAttr","getAttribute","gradient","Gradient","_objectSpread","opacity","set","usingElement","clipPathElements","objTransformInv","invertTransform","calcTransformMatrix","clipPathTag","parentElement","clipPathOwner","clipPath","appendChild","finalTransform","parseTransformAttribute","concat","setAttribute","join","container","clipPathElement","then","enlivedClippath","fillRule","clipRule","length","Group","gTransform","multiplyTransformMatrices","scaleX","scaleY","angle","skewX","translateX","translateY","qrDecompose","flipX","flipY","skewY","setPositionByOrigin","Point","CENTER"],"mappings":"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"}
1
+ {"version":3,"file":"elements_parser.min.mjs","sources":["../../../src/parser/elements_parser.ts"],"sourcesContent":["import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record<string, Element[]>;\n declare gradientDefs: Record<string, SVGGradientElement>;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record<string, Element[]>\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise<Array<FabricObject | null>> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element))\n );\n }\n\n async createObject(el: Element): Promise<FabricObject | null> {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules\n );\n this.resolveGradient(obj, el, 'fill');\n this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute()\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record<string, StorageType[typeof property]>\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke'\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(obj: NotParsedFabricObject, usingElement: Element) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag!);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n })\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(clipPath, clipPathOwner);\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n"],"names":["findTag","el","classRegistry","getSVGClass","getTagName","toLowerCase","ElementsParser","constructor","elements","options","reviver","doc","clipPaths","this","regexUrl","gradientDefs","getGradientDefs","cssRules","getCSSRules","parse","Promise","all","map","element","createObject","klass","obj","fromElement","resolveGradient","FabricImage","_originalElement","removeTransformMatrixForSvgParsing","parsePreserveAspectRatioAttribute","resolveClipPath","extractPropertyDefinition","property","storage","value","regex","test","lastIndex","id","exec","gradientDef","opacityAttr","getAttribute","gradient","Gradient","_objectSpread","opacity","set","usingElement","clipPathElements","objTransformInv","invertTransform","calcTransformMatrix","clipPathTag","parentElement","clipPathOwner","clipPath","appendChild","finalTransform","parseTransformAttribute","concat","setAttribute","join","container","clipPathElement","then","enlivedClippath","fillRule","clipRule","length","Group","gTransform","multiplyTransformMatrices","scaleX","scaleY","angle","skewX","translateX","translateY","qrDecompose","flipX","flipY","skewY","setPositionByOrigin","Point","CENTER"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"elements_parser.mjs","sources":["../../../src/parser/elements_parser.ts"],"sourcesContent":["import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver: TSvgReviverCallback | undefined;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record<string, Element[]>;\n declare gradientDefs: Record<string, SVGGradientElement>;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record<string, Element[]>\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise<Array<FabricObject | null>> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element))\n );\n }\n\n async createObject(el: Element): Promise<FabricObject | null> {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules\n );\n this.resolveGradient(obj, el, 'fill');\n this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute()\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record<string, StorageType[typeof property]>\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke'\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(obj: NotParsedFabricObject, usingElement: Element) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag!);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n })\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(clipPath, clipPathOwner);\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n"],"names":["findTag","el","classRegistry","getSVGClass","getTagName","toLowerCase","ElementsParser","constructor","elements","options","reviver","doc","clipPaths","regexUrl","gradientDefs","getGradientDefs","cssRules","getCSSRules","parse","Promise","all","map","element","createObject","klass","obj","fromElement","resolveGradient","FabricImage","_originalElement","removeTransformMatrixForSvgParsing","parsePreserveAspectRatioAttribute","resolveClipPath","extractPropertyDefinition","property","storage","value","regex","test","undefined","lastIndex","id","exec","gradientDef","opacityAttr","getAttribute","gradient","Gradient","_objectSpread","opacity","set","usingElement","clipPathElements","objTransformInv","invertTransform","calcTransformMatrix","clipPathTag","parentElement","clipPathOwner","clipPath","appendChild","finalTransform","parseTransformAttribute","concat","setAttribute","join","container","clipPathElement","then","enlivedClippath","fillRule","clipRule","length","Group","gTransform","multiplyTransformMatrices","scaleX","scaleY","angle","skewX","translateX","translateY","qrDecompose","flipX","flipY","skewY","setPositionByOrigin","Point","CENTER"],"mappings":"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"}
1
+ {"version":3,"file":"elements_parser.mjs","sources":["../../../src/parser/elements_parser.ts"],"sourcesContent":["import { Gradient } from '../gradient/Gradient';\nimport { Group } from '../shapes/Group';\nimport { FabricImage } from '../shapes/Image';\nimport { classRegistry } from '../ClassRegistry';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n qrDecompose,\n} from '../util/misc/matrix';\nimport { removeTransformMatrixForSvgParsing } from '../util/transform_matrix_removal';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { Point } from '../Point';\nimport { CENTER } from '../constants';\nimport { getGradientDefs } from './getGradientDefs';\nimport { getCSSRules } from './getCSSRules';\nimport type { LoadImageOptions } from '../util';\nimport type { CSSRules, TSvgReviverCallback } from './typedefs';\nimport type { ParsedViewboxTransform } from './applyViewboxTransform';\nimport type { SVGOptions } from '../gradient';\nimport { getTagName } from './getTagName';\nimport { parseTransformAttribute } from './parseTransformAttribute';\n\nconst findTag = (el: Element) =>\n classRegistry.getSVGClass(getTagName(el).toLowerCase());\n\ntype StorageType = {\n fill: SVGGradientElement;\n stroke: SVGGradientElement;\n clipPath: Element[];\n};\n\ntype NotParsedFabricObject = FabricObject & {\n fill: string;\n stroke: string;\n clipPath?: string;\n clipRule?: CanvasFillRule;\n};\n\nexport class ElementsParser {\n declare elements: Element[];\n declare options: LoadImageOptions & ParsedViewboxTransform;\n declare reviver?: TSvgReviverCallback;\n declare regexUrl: RegExp;\n declare doc: Document;\n declare clipPaths: Record<string, Element[]>;\n declare gradientDefs: Record<string, SVGGradientElement>;\n declare cssRules: CSSRules;\n\n constructor(\n elements: Element[],\n options: LoadImageOptions & ParsedViewboxTransform,\n reviver: TSvgReviverCallback | undefined,\n doc: Document,\n clipPaths: Record<string, Element[]>\n ) {\n this.elements = elements;\n this.options = options;\n this.reviver = reviver;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n this.clipPaths = clipPaths;\n this.gradientDefs = getGradientDefs(doc);\n this.cssRules = getCSSRules(doc);\n }\n\n parse(): Promise<Array<FabricObject | null>> {\n return Promise.all(\n this.elements.map((element) => this.createObject(element))\n );\n }\n\n async createObject(el: Element): Promise<FabricObject | null> {\n const klass = findTag(el);\n if (klass) {\n const obj: NotParsedFabricObject = await klass.fromElement(\n el,\n this.options,\n this.cssRules\n );\n this.resolveGradient(obj, el, 'fill');\n this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof FabricImage && obj._originalElement) {\n removeTransformMatrixForSvgParsing(\n obj,\n obj.parsePreserveAspectRatioAttribute()\n );\n } else {\n removeTransformMatrixForSvgParsing(obj);\n }\n await this.resolveClipPath(obj, el);\n this.reviver && this.reviver(el, obj);\n return obj;\n }\n return null;\n }\n\n extractPropertyDefinition(\n obj: NotParsedFabricObject,\n property: 'fill' | 'stroke' | 'clipPath',\n storage: Record<string, StorageType[typeof property]>\n ): StorageType[typeof property] | undefined {\n const value = obj[property]!,\n regex = this.regexUrl;\n if (!regex.test(value)) {\n return undefined;\n }\n // verify: can we remove the 'g' flag? and remove lastIndex changes?\n regex.lastIndex = 0;\n // we passed the regex test, so we know is not null;\n const id = regex.exec(value)![1];\n regex.lastIndex = 0;\n // @todo fix this\n return storage[id];\n }\n\n resolveGradient(\n obj: NotParsedFabricObject,\n el: Element,\n property: 'fill' | 'stroke'\n ) {\n const gradientDef = this.extractPropertyDefinition(\n obj,\n property,\n this.gradientDefs\n ) as SVGGradientElement;\n if (gradientDef) {\n const opacityAttr = el.getAttribute(property + '-opacity');\n const gradient = Gradient.fromElement(gradientDef, obj, {\n ...this.options,\n opacity: opacityAttr,\n } as SVGOptions);\n obj.set(property, gradient);\n }\n }\n\n // TODO: resolveClipPath could be run once per clippath with minor work per object.\n // is a refactor that i m not sure is worth on this code\n async resolveClipPath(obj: NotParsedFabricObject, usingElement: Element) {\n const clipPathElements = this.extractPropertyDefinition(\n obj,\n 'clipPath',\n this.clipPaths\n ) as Element[];\n if (clipPathElements) {\n const objTransformInv = invertTransform(obj.calcTransformMatrix());\n const clipPathTag = clipPathElements[0].parentElement!;\n let clipPathOwner = usingElement;\n while (\n clipPathOwner.parentElement &&\n clipPathOwner.getAttribute('clip-path') !== obj.clipPath\n ) {\n clipPathOwner = clipPathOwner.parentElement;\n }\n // move the clipPath tag as sibling to the real element that is using it\n clipPathOwner.parentElement!.appendChild(clipPathTag!);\n\n // this multiplication order could be opposite.\n // but i don't have an svg to test it\n // at the first SVG that has a transform on both places and is misplaced\n // try to invert this multiplication order\n const finalTransform = parseTransformAttribute(\n `${clipPathOwner.getAttribute('transform') || ''} ${\n clipPathTag.getAttribute('originalTransform') || ''\n }`\n );\n\n clipPathTag.setAttribute(\n 'transform',\n `matrix(${finalTransform.join(',')})`\n );\n\n const container = await Promise.all(\n clipPathElements.map((clipPathElement) => {\n return findTag(clipPathElement)\n .fromElement(clipPathElement, this.options, this.cssRules)\n .then((enlivedClippath: NotParsedFabricObject) => {\n removeTransformMatrixForSvgParsing(enlivedClippath);\n enlivedClippath.fillRule = enlivedClippath.clipRule!;\n delete enlivedClippath.clipRule;\n return enlivedClippath;\n });\n })\n );\n const clipPath =\n container.length === 1 ? container[0] : new Group(container);\n const gTransform = multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n await this.resolveClipPath(clipPath, clipPathOwner);\n }\n const { scaleX, scaleY, angle, skewX, translateX, translateY } =\n qrDecompose(gTransform);\n clipPath.set({\n flipX: false,\n flipY: false,\n });\n clipPath.set({\n scaleX,\n scaleY,\n angle,\n skewX,\n skewY: 0,\n });\n clipPath.setPositionByOrigin(\n new Point(translateX, translateY),\n CENTER,\n CENTER\n );\n obj.clipPath = clipPath;\n } else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n return;\n }\n }\n}\n"],"names":["findTag","el","classRegistry","getSVGClass","getTagName","toLowerCase","ElementsParser","constructor","elements","options","reviver","doc","clipPaths","regexUrl","gradientDefs","getGradientDefs","cssRules","getCSSRules","parse","Promise","all","map","element","createObject","klass","obj","fromElement","resolveGradient","FabricImage","_originalElement","removeTransformMatrixForSvgParsing","parsePreserveAspectRatioAttribute","resolveClipPath","extractPropertyDefinition","property","storage","value","regex","test","undefined","lastIndex","id","exec","gradientDef","opacityAttr","getAttribute","gradient","Gradient","_objectSpread","opacity","set","usingElement","clipPathElements","objTransformInv","invertTransform","calcTransformMatrix","clipPathTag","parentElement","clipPathOwner","clipPath","appendChild","finalTransform","parseTransformAttribute","concat","setAttribute","join","container","clipPathElement","then","enlivedClippath","fillRule","clipRule","length","Group","gTransform","multiplyTransformMatrices","scaleX","scaleY","angle","skewX","translateX","translateY","qrDecompose","flipX","flipY","skewY","setPositionByOrigin","Point","CENTER"],"mappings":"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"}
@@ -35,7 +35,7 @@ export declare class ActiveSelection extends Group {
35
35
  * @default `canvas-stacking`
36
36
  */
37
37
  multiSelectionStacking: MultiSelectionStacking;
38
- constructor(objects?: FabricObject[], { layoutManager, ...options }?: Partial<ActiveSelectionOptions>);
38
+ constructor(objects?: FabricObject[], options?: Partial<ActiveSelectionOptions>);
39
39
  /**
40
40
  * @private
41
41
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveSelection.d.ts","sourceRoot":"","sources":["../../../src/shapes/ActiveSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAO1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAE7F,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE3E,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,sBAAsB,EAAE,sBAAsB,CAAC;CAChD;AAOD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,CAAC,IAAI,SAAqB;IAEhC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAgC;IAEvE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIzC;;;OAGG;IACK,aAAa,EAAE,4BAA4B,CAAC;IAEpD;;;;;;OAMG;IACK,sBAAsB,EAAE,sBAAsB,CAAC;gBAGrD,OAAO,GAAE,YAAY,EAAO,EAC5B,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,GAAE,OAAO,CAAC,sBAAsB,CAAM;IASrE;;OAEG;IACH,sBAAsB;IAItB;;;OAGG;IACH,wBAAwB;IAIxB;;;OAGG;IACH,cAAc,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE;IAkBzC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY;IAiBlC;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAmBhE;;;;;OAKG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAM/D;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAoBxE;;OAEG;IACH,UAAU;IAKV;;;OAGG;IACH,QAAQ;IAIR;;;;;;;OAOG;IACH,WAAW;IAIX;;;OAGG;IACH,UAAU;IAIV;;;;;OAKG;IACH,eAAe,CACb,GAAG,EAAE,wBAAwB,EAC7B,aAAa,CAAC,EAAE,6BAA6B,EAC7C,gBAAgB,CAAC,EAAE,6BAA6B;CAenD"}
1
+ {"version":3,"file":"ActiveSelection.d.ts","sourceRoot":"","sources":["../../../src/shapes/ActiveSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAO1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAE7F,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE3E,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,sBAAsB,EAAE,sBAAsB,CAAC;CAChD;AAOD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,CAAC,IAAI,SAAqB;IAEhC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAgC;IAEvE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIzC;;;OAGG;IACK,aAAa,EAAE,4BAA4B,CAAC;IAEpD;;;;;;OAMG;IACK,sBAAsB,EAAE,sBAAsB,CAAC;gBAGrD,OAAO,GAAE,YAAY,EAAO,EAC5B,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IAa/C;;OAEG;IACH,sBAAsB;IAItB;;;OAGG;IACH,wBAAwB;IAIxB;;;OAGG;IACH,cAAc,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE;IAkBzC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY;IAiBlC;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAmBhE;;;;;OAKG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,OAAO;IAM/D;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;IAoBxE;;OAEG;IACH,UAAU;IAKV;;;OAGG;IACH,QAAQ;IAIR;;;;;;;OAOG;IACH,WAAW;IAIX;;;OAGG;IACH,UAAU;IAIV;;;;;OAKG;IACH,eAAe,CACb,GAAG,EAAE,wBAAwB,EAC7B,aAAa,CAAC,EAAE,6BAA6B,EAC7C,gBAAgB,CAAC,EAAE,6BAA6B;CAenD"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,objectSpread2 as t,objectWithoutProperties as r}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{classRegistry as o}from"../ClassRegistry.min.mjs";import{Group as n}from"./Group.min.mjs";import{LAYOUT_TYPE_REMOVED as s,LAYOUT_TYPE_ADDED as i}from"../LayoutManager/constants.min.mjs";import{log as a}from"../util/internals/console.min.mjs";import{ActiveSelectionLayoutManager as c}from"../LayoutManager/ActiveSelectionLayoutManager.min.mjs";const l=["layoutManager"];class u extends n{static getDefaults(){return t(t({},super.getDefaults()),u.ownDefaults)}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{layoutManager:o}=t,n=r(t,l);super(e,{layoutManager:null!=o?o:new c}),Object.assign(this,u.ownDefaults),this.setOptions(n)}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach((e=>{const t=this._objects.findIndex((t=>t.isInFrontOf(e))),r=-1===t?this.size():t;this.insertAt(r,e)}))}canEnterGroup(e){return this.getObjects().some((t=>t.isDescendantOf(e)||e.isDescendantOf(t)))?(a("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(e)}enterGroup(e,t){e.parent&&e.parent===e.group?e.parent._exitGroup(e):e.group&&e.parent!==e.group&&e.group.remove(e),this._enterGroup(e,t)}exitGroup(e,t){this._exitGroup(e,t),e.parent&&e.parent._enterGroup(e,!0)}_onAfterObjectsChange(e,t){super._onAfterObjectsChange(e,t);const r=new Set;t.forEach((e=>{const{parent:t}=e;t&&r.add(t)})),e===s?r.forEach((e=>{e._onAfterObjectsChange(i,t)})):r.forEach((e=>{e._set("dirty",!0)}))}onDeselect(){return this.removeAll(),!1}toString(){return"#<ActiveSelection: (".concat(this.complexity(),")>")}shouldCache(){return!1}isOnACache(){return!1}_renderControls(e,r,o){e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const n=t(t({hasControls:!1},o),{},{forActiveSelection:!0});for(let t=0;t<this._objects.length;t++)this._objects[t]._renderControls(e,n);super._renderControls(e,r),e.restore()}}e(u,"type","ActiveSelection"),e(u,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),o.setClass(u),o.setClass(u,"activeSelection");export{u as ActiveSelection};
1
+ import{defineProperty as e,objectSpread2 as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{classRegistry as r}from"../ClassRegistry.min.mjs";import{Group as o}from"./Group.min.mjs";import{LAYOUT_TYPE_REMOVED as n,LAYOUT_TYPE_ADDED as s}from"../LayoutManager/constants.min.mjs";import{log as i}from"../util/internals/console.min.mjs";import{ActiveSelectionLayoutManager as a}from"../LayoutManager/ActiveSelectionLayoutManager.min.mjs";class c extends o{static getDefaults(){return t(t({},super.getDefaults()),c.ownDefaults)}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,c.ownDefaults),this.setOptions(t);const{left:r,top:o,layoutManager:n}=t;this.groupInit(e,{left:r,top:o,layoutManager:null!=n?n:new a})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach((e=>{const t=this._objects.findIndex((t=>t.isInFrontOf(e))),r=-1===t?this.size():t;this.insertAt(r,e)}))}canEnterGroup(e){return this.getObjects().some((t=>t.isDescendantOf(e)||e.isDescendantOf(t)))?(i("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(e)}enterGroup(e,t){e.parent&&e.parent===e.group?e.parent._exitGroup(e):e.group&&e.parent!==e.group&&e.group.remove(e),this._enterGroup(e,t)}exitGroup(e,t){this._exitGroup(e,t),e.parent&&e.parent._enterGroup(e,!0)}_onAfterObjectsChange(e,t){super._onAfterObjectsChange(e,t);const r=new Set;t.forEach((e=>{const{parent:t}=e;t&&r.add(t)})),e===n?r.forEach((e=>{e._onAfterObjectsChange(s,t)})):r.forEach((e=>{e._set("dirty",!0)}))}onDeselect(){return this.removeAll(),!1}toString(){return"#<ActiveSelection: (".concat(this.complexity(),")>")}shouldCache(){return!1}isOnACache(){return!1}_renderControls(e,r,o){e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;const n=t(t({hasControls:!1},o),{},{forActiveSelection:!0});for(let t=0;t<this._objects.length;t++)this._objects[t]._renderControls(e,n);super._renderControls(e,r),e.restore()}}e(c,"type","ActiveSelection"),e(c,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),r.setClass(c),r.setClass(c,"activeSelection");export{c as ActiveSelection};
2
2
  //# sourceMappingURL=ActiveSelection.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveSelection.min.mjs","sources":["../../../src/shapes/ActiveSelection.ts"],"sourcesContent":["import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial<TClassProperties<ActiveSelection>> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record<string, any> = activeSelectionDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n { layoutManager, ...options }: Partial<ActiveSelectionOptions> = {}\n ) {\n super(objects, {\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o)\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect'\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set<Group>();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#<ActiveSelection: (${this.complexity()})>`;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n"],"names":["ActiveSelection","Group","getDefaults","_objectSpread","super","ownDefaults","constructor","objects","arguments","length","undefined","_ref","layoutManager","options","_objectWithoutProperties","_excluded","ActiveSelectionLayoutManager","Object","assign","this","setOptions","_shouldSetNestedCoords","__objectSelectionMonitor","multiSelectAdd","_len","targets","Array","_key","multiSelectionStacking","add","forEach","target","index","_objects","findIndex","obj","isInFrontOf","insertAt","size","canEnterGroup","object","getObjects","some","o","isDescendantOf","log","enterGroup","removeParentTransform","parent","group","_exitGroup","remove","_enterGroup","exitGroup","_onAfterObjectsChange","type","groups","Set","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_ADDED","_set","onDeselect","removeAll","toString","concat","complexity","shouldCache","isOnACache","_renderControls","ctx","styleOverride","childrenOverride","save","globalAlpha","isMoving","borderOpacityWhenMoving","hasControls","forActiveSelection","i","restore","_defineProperty","classRegistry","setClass"],"mappings":"0fAmCO,MAAMA,UAAwBC,EAKnC,kBAAOC,GACL,OAAAC,EAAAA,EAAA,GAAYC,MAAMF,eAAkBF,EAAgBK,YACtD,CAiBAC,WAAAA,GAGE,IAFAC,EAAuBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAEG,EAAAH,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GACqC,CAAE,GAAnEI,cAAEA,GAA4DD,EAA1CE,EAAOC,EAAAH,EAAAI,GAE3BX,MAAMG,EAAS,CACbK,cAAeA,QAAAA,EAAiB,IAAII,IAEtCC,OAAOC,OAAOC,KAAMnB,EAAgBK,aACpCc,KAAKC,WAAWP,EAClB,CAKAQ,sBAAAA,GACE,OAAO,CACT,CAMAC,wBAAAA,GACE,CAOFC,cAAAA,GAA2C,IAAA,IAAAC,EAAAhB,UAAAC,OAAzBgB,EAAOC,IAAAA,MAAAF,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAPF,EAAOE,GAAAnB,UAAAmB,GACa,oBAAhCR,KAAKS,uBACPT,KAAKU,OAAOJ,GAIZA,EAAQK,SAASC,IACf,MAAMC,EAAQb,KAAKc,SAASC,WAAWC,GAAQA,EAAIC,YAAYL,KACzDM,GACO,IAAXL,EAEIb,KAAKmB,OACLN,EACNb,KAAKkB,SAASA,EAAUN,EAAO,GAGrC,CAKAQ,aAAAA,CAAcC,GACZ,OACErB,KAAKsB,aAAaC,MACfC,GAAMA,EAAEC,eAAeJ,IAAWA,EAAOI,eAAeD,MAI3DE,EACE,QACA,sFAEK,GAGFzC,MAAMmC,cAAcC,EAC7B,CASAM,UAAAA,CAAWN,EAAsBO,GAI3BP,EAAOQ,QAAUR,EAAOQ,SAAWR,EAAOS,MAG5CT,EAAOQ,OAAOE,WAAWV,GAEhBA,EAAOS,OAAST,EAAOQ,SAAWR,EAAOS,OAElDT,EAAOS,MAAME,OAAOX,GAKtBrB,KAAKiC,YAAYZ,EAAQO,EAC3B,CAQAM,SAAAA,CAAUb,EAAsBO,GAC9B5B,KAAK+B,WAAWV,EAAQO,GAExBP,EAAOQ,QAAUR,EAAOQ,OAAOI,YAAYZ,GAAQ,EACrD,CAOAc,qBAAAA,CAAsBC,EAA2B9B,GAC/CrB,MAAMkD,sBAAsBC,EAAM9B,GAClC,MAAM+B,EAAS,IAAIC,IACnBhC,EAAQK,SAASU,IACf,MAAMQ,OAAEA,GAAWR,EACnBQ,GAAUQ,EAAO3B,IAAImB,EAAO,IAE1BO,IAASG,EAEXF,EAAO1B,SAASmB,IACdA,EAAMK,sBAAsBK,EAAmBlC,EAAQ,IAIzD+B,EAAO1B,SAASmB,IACdA,EAAMW,KAAK,SAAS,EAAK,GAG/B,CAKAC,UAAAA,GAEE,OADA1C,KAAK2C,aACE,CACT,CAMAC,QAAAA,GACE,MAAA,uBAAAC,OAA8B7C,KAAK8C,aAAY,KACjD,CAUAC,WAAAA,GACE,OAAO,CACT,CAMAC,UAAAA,GACE,OAAO,CACT,CAQAC,eAAAA,CACEC,EACAC,EACAC,GAEAF,EAAIG,OACJH,EAAII,YAActD,KAAKuD,SAAWvD,KAAKwD,wBAA0B,EACjE,MAAM9D,EAAOV,EAAAA,EAAA,CACXyE,aAAa,GACVL,GAAgB,GAAA,CACnBM,oBAAoB,IAEtB,IAAK,IAAIC,EAAI,EAAGA,EAAI3D,KAAKc,SAASxB,OAAQqE,IACxC3D,KAAKc,SAAS6C,GAAGV,gBAAgBC,EAAKxD,GAExCT,MAAMgE,gBAAgBC,EAAKC,GAC3BD,EAAIU,SACN,EACDC,EAvNYhF,EAAe,OACZ,mBAAiBgF,EADpBhF,EAAe,cAf1B,CACE4B,uBAAwB,oBAuO5BqD,EAAcC,SAASlF,GACvBiF,EAAcC,SAASlF,EAAiB"}
1
+ {"version":3,"file":"ActiveSelection.min.mjs","sources":["../../../src/shapes/ActiveSelection.ts"],"sourcesContent":["import type { ControlRenderingStyleOverride } from '../controls/controlRendering';\nimport { classRegistry } from '../ClassRegistry';\nimport type { GroupProps } from './Group';\nimport { Group } from './Group';\nimport type { FabricObject } from './Object/FabricObject';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { TClassProperties } from '../typedefs';\nimport { log } from '../util/internals/console';\nimport { ActiveSelectionLayoutManager } from '../LayoutManager/ActiveSelectionLayoutManager';\n\nexport type MultiSelectionStacking = 'canvas-stacking' | 'selection-order';\n\nexport interface ActiveSelectionOptions extends GroupProps {\n multiSelectionStacking: MultiSelectionStacking;\n}\n\nconst activeSelectionDefaultValues: Partial<TClassProperties<ActiveSelection>> =\n {\n multiSelectionStacking: 'canvas-stacking',\n };\n\n/**\n * Used by Canvas to manage selection.\n *\n * @example\n * class MyActiveSelection extends ActiveSelection {\n * ...\n * }\n *\n * // override the default `ActiveSelection` class\n * classRegistry.setClass(MyActiveSelection)\n */\nexport class ActiveSelection extends Group {\n static type = 'ActiveSelection';\n\n static ownDefaults: Record<string, any> = activeSelectionDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...ActiveSelection.ownDefaults };\n }\n\n /**\n * The ActiveSelection needs to use the ActiveSelectionLayoutManager\n * or selections on interactive groups may be broken\n */\n declare layoutManager: ActiveSelectionLayoutManager;\n\n /**\n * controls how selected objects are added during a multiselection event\n * - `canvas-stacking` adds the selected object to the active selection while respecting canvas object stacking order\n * - `selection-order` adds the selected object to the top of the stack,\n * meaning that the stack is ordered by the order in which objects were selected\n * @default `canvas-stacking`\n */\n declare multiSelectionStacking: MultiSelectionStacking;\n\n constructor(\n objects: FabricObject[] = [],\n options: Partial<ActiveSelectionOptions> = {}\n ) {\n super();\n Object.assign(this, ActiveSelection.ownDefaults);\n this.setOptions(options);\n const { left, top, layoutManager } = options;\n this.groupInit(objects, {\n left,\n top,\n layoutManager: layoutManager ?? new ActiveSelectionLayoutManager(),\n });\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return true;\n }\n\n /**\n * @private\n * @override we don't want the selection monitor to be active\n */\n __objectSelectionMonitor() {\n // noop\n }\n\n /**\n * Adds objects with respect to {@link multiSelectionStacking}\n * @param targets object to add to selection\n */\n multiSelectAdd(...targets: FabricObject[]) {\n if (this.multiSelectionStacking === 'selection-order') {\n this.add(...targets);\n } else {\n // respect object stacking as it is on canvas\n // perf enhancement for large ActiveSelection: consider a binary search of `isInFrontOf`\n targets.forEach((target) => {\n const index = this._objects.findIndex((obj) => obj.isInFrontOf(target));\n const insertAt =\n index === -1\n ? // `target` is in front of all other objects\n this.size()\n : index;\n this.insertAt(insertAt, target);\n });\n }\n }\n\n /**\n * @override block ancestors/descendants of selected objects from being selected to prevent a circular object tree\n */\n canEnterGroup(object: FabricObject) {\n if (\n this.getObjects().some(\n (o) => o.isDescendantOf(object) || object.isDescendantOf(o)\n )\n ) {\n // prevent circular object tree\n log(\n 'error',\n 'ActiveSelection: circular object trees are not supported, this call has no effect'\n );\n return false;\n }\n\n return super.canEnterGroup(object);\n }\n\n /**\n * Change an object so that it can be part of an active selection.\n * this method is called by multiselectAdd from canvas code.\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n // This condition check that the object has currently a group, and the group\n // is also its parent, meaning that is not in an active selection, but is\n // in a normal group.\n if (object.parent && object.parent === object.group) {\n // Disconnect the object from the group functionalities, but keep the ref parent intact\n // for later re-enter\n object.parent._exitGroup(object);\n // in this case the object is probably inside an active selection.\n } else if (object.group && object.parent !== object.group) {\n // in this case group.remove will also clear the old parent reference.\n object.group.remove(object);\n }\n // enter the active selection from a render perspective\n // the object will be in the objects array of both the ActiveSelection and the Group\n // but referenced in the group's _activeObjects so that it won't be rendered twice.\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * we want objects to retain their canvas ref when exiting instance\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n // return to parent\n object.parent && object.parent._enterGroup(object, true);\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n super._onAfterObjectsChange(type, targets);\n const groups = new Set<Group>();\n targets.forEach((object) => {\n const { parent } = object;\n parent && groups.add(parent);\n });\n if (type === LAYOUT_TYPE_REMOVED) {\n // invalidate groups' layout and mark as dirty\n groups.forEach((group) => {\n group._onAfterObjectsChange(LAYOUT_TYPE_ADDED, targets);\n });\n } else {\n // mark groups as dirty\n groups.forEach((group) => {\n group._set('dirty', true);\n });\n }\n }\n\n /**\n * @override remove all objects\n */\n onDeselect() {\n this.removeAll();\n return false;\n }\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString() {\n return `#<ActiveSelection: (${this.complexity()})>`;\n }\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache() {\n return false;\n }\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache() {\n return false;\n }\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls(\n ctx: CanvasRenderingContext2D,\n styleOverride?: ControlRenderingStyleOverride,\n childrenOverride?: ControlRenderingStyleOverride\n ) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n const options = {\n hasControls: false,\n ...childrenOverride,\n forActiveSelection: true,\n };\n for (let i = 0; i < this._objects.length; i++) {\n this._objects[i]._renderControls(ctx, options);\n }\n super._renderControls(ctx, styleOverride);\n ctx.restore();\n }\n}\n\nclassRegistry.setClass(ActiveSelection);\nclassRegistry.setClass(ActiveSelection, 'activeSelection');\n"],"names":["ActiveSelection","Group","getDefaults","_objectSpread","super","ownDefaults","constructor","objects","arguments","length","undefined","options","Object","assign","this","setOptions","left","top","layoutManager","groupInit","ActiveSelectionLayoutManager","_shouldSetNestedCoords","__objectSelectionMonitor","multiSelectAdd","_len","targets","Array","_key","multiSelectionStacking","add","forEach","target","index","_objects","findIndex","obj","isInFrontOf","insertAt","size","canEnterGroup","object","getObjects","some","o","isDescendantOf","log","enterGroup","removeParentTransform","parent","group","_exitGroup","remove","_enterGroup","exitGroup","_onAfterObjectsChange","type","groups","Set","LAYOUT_TYPE_REMOVED","LAYOUT_TYPE_ADDED","_set","onDeselect","removeAll","toString","concat","complexity","shouldCache","isOnACache","_renderControls","ctx","styleOverride","childrenOverride","save","globalAlpha","isMoving","borderOpacityWhenMoving","hasControls","forActiveSelection","i","restore","_defineProperty","classRegistry","setClass"],"mappings":"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"}