fabric 5.3.0 → 6.0.0-beta10

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 (634) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +51 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +615 -189
  13. package/CONTRIBUTING.md +233 -59
  14. package/README.md +200 -235
  15. package/babel-jest.config.js +6 -0
  16. package/bower.json +1 -3
  17. package/dist/fabric.d.ts +54 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +28452 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.min.js +1 -0
  22. package/dist/index.mjs +28385 -0
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/index.node.cjs +28538 -0
  25. package/dist/index.node.cjs.map +1 -0
  26. package/dist/index.node.d.ts +20 -0
  27. package/dist/index.node.mjs +28477 -0
  28. package/dist/index.node.mjs.map +1 -0
  29. package/dist/src/ClassRegistry.d.ts +13 -0
  30. package/dist/src/Collection.d.ts +136 -0
  31. package/dist/src/CommonMethods.d.ts +32 -0
  32. package/dist/src/EventTypeDefs.d.ts +227 -0
  33. package/dist/src/Intersection.d.ts +112 -0
  34. package/dist/src/Observable.d.ts +60 -0
  35. package/dist/src/Pattern/Pattern.d.ts +99 -0
  36. package/dist/src/Pattern/index.d.ts +3 -0
  37. package/dist/src/Pattern/types.d.ts +9 -0
  38. package/dist/src/Point.d.ts +232 -0
  39. package/dist/src/Shadow.d.ts +96 -0
  40. package/dist/src/brushes/BaseBrush.d.ts +101 -0
  41. package/dist/src/brushes/CircleBrush.d.ts +44 -0
  42. package/dist/src/brushes/CircleBrush.test.d.ts +2 -0
  43. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  44. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  45. package/dist/src/brushes/SprayBrush.d.ts +74 -0
  46. package/dist/src/brushes/typedefs.d.ts +18 -0
  47. package/dist/src/cache.d.ts +47 -0
  48. package/dist/src/canvas/Canvas.d.ts +364 -0
  49. package/dist/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
  50. package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
  51. package/dist/src/canvas/DOMManagers/util.d.ts +24 -0
  52. package/dist/src/canvas/DOMManagers/util.spec.d.ts +2 -0
  53. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  54. package/dist/src/canvas/StaticCanvas.d.ts +747 -0
  55. package/dist/src/canvas/TextEditingManager.d.ts +21 -0
  56. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  57. package/dist/src/color/Color.d.ts +152 -0
  58. package/dist/src/color/color_map.d.ts +155 -0
  59. package/dist/src/color/constants.d.ts +104 -0
  60. package/dist/src/color/typedefs.d.ts +16 -0
  61. package/dist/src/color/util.d.ts +27 -0
  62. package/dist/src/config.d.ts +115 -0
  63. package/dist/src/constants.d.ts +21 -0
  64. package/dist/src/controls/Control.d.ts +229 -0
  65. package/dist/src/controls/changeWidth.d.ts +13 -0
  66. package/dist/src/controls/commonControls.d.ts +28 -0
  67. package/dist/src/controls/controlRendering.d.ts +29 -0
  68. package/dist/src/controls/drag.d.ts +12 -0
  69. package/dist/src/controls/fireEvent.d.ts +3 -0
  70. package/dist/src/controls/index.d.ts +13 -0
  71. package/dist/src/controls/polyControl.d.ts +5 -0
  72. package/dist/src/controls/rotate.d.ts +12 -0
  73. package/dist/src/controls/scale.d.ts +47 -0
  74. package/dist/src/controls/scaleSkew.d.ts +39 -0
  75. package/dist/src/controls/skew.d.ts +33 -0
  76. package/dist/src/controls/util.d.ts +41 -0
  77. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  78. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  79. package/dist/src/env/browser.d.ts +3 -0
  80. package/dist/src/env/index.d.ts +28 -0
  81. package/dist/src/env/node.d.ts +6 -0
  82. package/dist/src/env/types.d.ts +15 -0
  83. package/dist/src/filters/BaseFilter.d.ts +160 -0
  84. package/dist/src/filters/BlendColor.d.ts +81 -0
  85. package/dist/src/filters/BlendImage.d.ts +93 -0
  86. package/dist/src/filters/Blur.d.ts +52 -0
  87. package/dist/src/filters/Boilerplate.d.ts +48 -0
  88. package/dist/src/filters/Brightness.d.ts +48 -0
  89. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  90. package/dist/src/filters/ColorMatrix.d.ts +64 -0
  91. package/dist/src/filters/ColorMatrixFilters.d.ts +537 -0
  92. package/dist/src/filters/Composed.d.ts +46 -0
  93. package/dist/src/filters/Contrast.d.ts +46 -0
  94. package/dist/src/filters/Convolute.d.ts +83 -0
  95. package/dist/src/filters/FilterBackend.d.ts +15 -0
  96. package/dist/src/filters/GLProbes/GLProbe.d.ts +7 -0
  97. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  98. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  99. package/dist/src/filters/Gamma.d.ts +55 -0
  100. package/dist/src/filters/Grayscale.d.ts +47 -0
  101. package/dist/src/filters/HueRotation.d.ts +25 -0
  102. package/dist/src/filters/Invert.d.ts +56 -0
  103. package/dist/src/filters/Noise.d.ts +55 -0
  104. package/dist/src/filters/Pixelate.d.ts +45 -0
  105. package/dist/src/filters/RemoveColor.d.ts +64 -0
  106. package/dist/src/filters/Resize.d.ts +137 -0
  107. package/dist/src/filters/Saturation.d.ts +49 -0
  108. package/dist/src/filters/Vibrance.d.ts +49 -0
  109. package/dist/src/filters/WebGLFilterBackend.d.ts +128 -0
  110. package/dist/src/filters/filters.d.ts +21 -0
  111. package/dist/src/filters/index.d.ts +7 -0
  112. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  113. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  114. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  115. package/dist/src/filters/shaders/blur.d.ts +2 -0
  116. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  117. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  118. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  119. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  120. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  121. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  122. package/dist/src/filters/shaders/invert.d.ts +2 -0
  123. package/dist/src/filters/shaders/noise.d.ts +2 -0
  124. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  125. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  126. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  127. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  128. package/dist/src/filters/typedefs.d.ts +48 -0
  129. package/dist/src/filters/utils.d.ts +3 -0
  130. package/dist/src/gradient/Gradient.d.ts +150 -0
  131. package/dist/src/gradient/constants.d.ts +15 -0
  132. package/dist/src/gradient/index.d.ts +3 -0
  133. package/dist/src/gradient/parser/index.d.ts +4 -0
  134. package/dist/src/gradient/parser/misc.d.ts +4 -0
  135. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  136. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  137. package/dist/src/gradient/typedefs.d.ts +93 -0
  138. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  139. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  140. package/dist/src/parkinglot/straighten.d.ts +2 -0
  141. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  142. package/dist/src/parser/attributes.d.ts +6 -0
  143. package/dist/src/parser/constants.d.ts +53 -0
  144. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  145. package/dist/src/parser/elementById.d.ts +6 -0
  146. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  147. package/dist/src/parser/elements_parser.d.ts +3 -0
  148. package/dist/src/parser/getCSSRules.d.ts +7 -0
  149. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  150. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  151. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  152. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  153. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  154. package/dist/src/parser/index.d.ts +9 -0
  155. package/dist/src/parser/loadSVGFromString.d.ts +18 -0
  156. package/dist/src/parser/loadSVGFromURL.d.ts +19 -0
  157. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  158. package/dist/src/parser/normalizeValue.d.ts +2 -0
  159. package/dist/src/parser/parseAttributes.d.ts +9 -0
  160. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  161. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  162. package/dist/src/parser/parseSVGDocument.d.ts +23 -0
  163. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  164. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  165. package/dist/src/parser/parseStyleString.d.ts +2 -0
  166. package/dist/src/parser/parseTransformAttribute.d.ts +11 -0
  167. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  168. package/dist/src/parser/percent.d.ts +9 -0
  169. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  170. package/dist/src/parser/selectorMatches.d.ts +2 -0
  171. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  172. package/dist/src/parser/typedefs.d.ts +9 -0
  173. package/dist/src/shapes/ActiveSelection.d.ts +83 -0
  174. package/dist/src/shapes/Circle.d.ts +99 -0
  175. package/dist/src/shapes/Ellipse.d.ts +84 -0
  176. package/dist/src/shapes/Group.d.ts +407 -0
  177. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  178. package/dist/src/shapes/IText/IText.d.ts +336 -0
  179. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  180. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +73 -0
  181. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  182. package/dist/src/shapes/IText/constants.d.ts +13 -0
  183. package/dist/src/shapes/Image.d.ts +309 -0
  184. package/dist/src/shapes/Line.d.ts +121 -0
  185. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  186. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  187. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  188. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  189. package/dist/src/shapes/Object/Object.d.ts +599 -0
  190. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  191. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  192. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  193. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  194. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  195. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  196. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  197. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  198. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  199. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  200. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  201. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  202. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  203. package/dist/src/shapes/Path.d.ts +214 -0
  204. package/dist/src/shapes/Polygon.d.ts +10 -0
  205. package/dist/src/shapes/Polyline.d.ts +147 -0
  206. package/dist/src/shapes/Rect.d.ts +82 -0
  207. package/dist/src/shapes/Text/StyledText.d.ts +123 -0
  208. package/dist/src/shapes/Text/Text.d.ts +688 -0
  209. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  210. package/dist/src/shapes/Text/constants.d.ts +13 -0
  211. package/dist/src/shapes/Textbox.d.ts +204 -0
  212. package/dist/src/shapes/Triangle.d.ts +26 -0
  213. package/dist/src/typedefs.d.ts +96 -0
  214. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  215. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  216. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  217. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  218. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  219. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  220. package/dist/src/util/animation/animate.d.ts +37 -0
  221. package/dist/src/util/animation/easing.d.ts +130 -0
  222. package/dist/src/util/animation/index.d.ts +3 -0
  223. package/dist/src/util/animation/types.d.ts +87 -0
  224. package/dist/src/util/applyMixins.d.ts +8 -0
  225. package/dist/src/util/dom_event.d.ts +5 -0
  226. package/dist/src/util/dom_misc.d.ts +12 -0
  227. package/dist/src/util/dom_request.d.ts +14 -0
  228. package/dist/src/util/dom_style.d.ts +7 -0
  229. package/dist/src/util/index.d.ts +36 -0
  230. package/dist/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
  231. package/dist/src/util/internals/cleanupSvgAttribute.test.d.ts +2 -0
  232. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  233. package/dist/src/util/internals/cloneDeep.test.d.ts +2 -0
  234. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  235. package/dist/src/util/internals/getRandomInt.test.d.ts +2 -0
  236. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  237. package/dist/src/util/internals/index.d.ts +4 -0
  238. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  239. package/dist/src/util/internals/uid.d.ts +2 -0
  240. package/dist/src/util/lang_string.d.ts +22 -0
  241. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  242. package/dist/src/util/misc/capValue.d.ts +2 -0
  243. package/dist/src/util/misc/cos.d.ts +10 -0
  244. package/dist/src/util/misc/dom.d.ts +28 -0
  245. package/dist/src/util/misc/findScaleTo.d.ts +20 -0
  246. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  247. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  248. package/dist/src/util/misc/matrix.d.ts +168 -0
  249. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  250. package/dist/src/util/misc/objectEnlive.d.ts +41 -0
  251. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  252. package/dist/src/util/misc/pick.d.ts +9 -0
  253. package/dist/src/util/misc/planeChange.d.ts +81 -0
  254. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
  255. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +82 -0
  256. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +26 -0
  257. package/dist/src/util/misc/projectStroke/index.d.ts +12 -0
  258. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  259. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  260. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  261. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  262. package/dist/src/util/misc/sin.d.ts +10 -0
  263. package/dist/src/util/misc/svgParsing.d.ts +45 -0
  264. package/dist/src/util/misc/textStyles.d.ts +32 -0
  265. package/dist/src/util/misc/toFixed.d.ts +8 -0
  266. package/dist/src/util/misc/vectors.d.ts +58 -0
  267. package/dist/src/util/path/index.d.ts +96 -0
  268. package/dist/src/util/path/regex.d.ts +2 -0
  269. package/dist/src/util/path/typechecks.d.ts +24 -0
  270. package/dist/src/util/path/typedefs.d.ts +220 -0
  271. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  272. package/dist/src/util/typeAssertions.d.ts +19 -0
  273. package/e2e/site/index.html +25 -0
  274. package/e2e/utils/objects.ts +36 -0
  275. package/fabric.ts +72 -0
  276. package/index.node.ts +43 -0
  277. package/index.ts +1 -0
  278. package/jest.config.js +194 -0
  279. package/lib/aligning_guidelines.js +2 -2
  280. package/package.json +110 -40
  281. package/playwright.config.ts +64 -0
  282. package/publish.js +0 -26
  283. package/rollup.config.mjs +99 -0
  284. package/rollup.test.config.js +24 -0
  285. package/scripts/build.mjs +50 -0
  286. package/scripts/buildLock.mjs +115 -0
  287. package/scripts/buildReporter.mjs +15 -0
  288. package/scripts/buildStats.mjs +139 -0
  289. package/scripts/dirname.mjs +14 -0
  290. package/scripts/git.mjs +36 -0
  291. package/scripts/index.mjs +564 -0
  292. package/scripts/sandbox.mjs +149 -0
  293. package/src/ClassRegistry.ts +56 -0
  294. package/src/Collection.ts +346 -0
  295. package/src/CommonMethods.ts +63 -0
  296. package/src/EventTypeDefs.ts +298 -0
  297. package/src/Intersection.ts +302 -0
  298. package/src/Observable.ts +181 -0
  299. package/src/Pattern/Pattern.ts +207 -0
  300. package/src/Pattern/index.ts +2 -0
  301. package/src/Pattern/types.ts +17 -0
  302. package/src/Point.ts +388 -0
  303. package/src/Shadow.ts +214 -0
  304. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +63 -42
  305. package/src/brushes/CircleBrush.test.ts +11 -0
  306. package/src/brushes/CircleBrush.ts +140 -0
  307. package/src/brushes/PatternBrush.ts +70 -0
  308. package/src/brushes/PencilBrush.ts +300 -0
  309. package/src/brushes/SprayBrush.ts +214 -0
  310. package/src/brushes/typedefs.ts +18 -0
  311. package/src/cache.ts +90 -0
  312. package/src/canvas/Canvas.ts +1598 -0
  313. package/src/canvas/DOMManagers/CanvasDOMManager.ts +124 -0
  314. package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +80 -0
  315. package/src/canvas/DOMManagers/util.spec.ts +26 -0
  316. package/src/canvas/DOMManagers/util.ts +98 -0
  317. package/src/canvas/SelectableCanvas.ts +1506 -0
  318. package/src/canvas/StaticCanvas.ts +1634 -0
  319. package/src/canvas/TextEditingManager.ts +70 -0
  320. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  321. package/src/color/Color.ts +320 -0
  322. package/src/color/color_map.ts +154 -0
  323. package/src/color/constants.ts +107 -0
  324. package/src/color/typedefs.ts +18 -0
  325. package/src/color/util.ts +93 -0
  326. package/src/config.ts +159 -0
  327. package/src/constants.ts +29 -0
  328. package/src/controls/Control.ts +385 -0
  329. package/src/controls/changeWidth.ts +53 -0
  330. package/src/controls/commonControls.ts +105 -0
  331. package/src/controls/controlRendering.ts +138 -0
  332. package/src/controls/drag.ts +32 -0
  333. package/src/controls/fireEvent.ts +18 -0
  334. package/src/controls/index.ts +22 -0
  335. package/src/controls/polyControl.ts +135 -0
  336. package/src/controls/rotate.ts +87 -0
  337. package/src/controls/scale.ts +277 -0
  338. package/src/controls/scaleSkew.ts +92 -0
  339. package/src/controls/skew.ts +243 -0
  340. package/src/controls/util.ts +155 -0
  341. package/src/controls/wrapWithFireEvent.ts +25 -0
  342. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  343. package/src/env/browser.ts +32 -0
  344. package/src/env/index.ts +38 -0
  345. package/src/env/node.ts +58 -0
  346. package/src/env/types.ts +15 -0
  347. package/src/filters/{base_filter.class.js → BaseFilter.ts} +203 -151
  348. package/src/filters/BlendColor.ts +219 -0
  349. package/src/filters/BlendImage.ts +230 -0
  350. package/src/filters/Blur.ts +181 -0
  351. package/src/filters/Boilerplate.ts +94 -0
  352. package/src/filters/Brightness.ts +85 -0
  353. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  354. package/src/filters/ColorMatrix.ts +147 -0
  355. package/src/filters/ColorMatrixFilters.ts +79 -0
  356. package/src/filters/Composed.ts +78 -0
  357. package/src/filters/Contrast.ts +84 -0
  358. package/src/filters/Convolute.ts +186 -0
  359. package/src/filters/FilterBackend.ts +38 -0
  360. package/src/filters/GLProbes/GLProbe.ts +7 -0
  361. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  362. package/src/filters/GLProbes/WebGLProbe.ts +47 -0
  363. package/src/filters/Gamma.ts +112 -0
  364. package/src/filters/Grayscale.ts +104 -0
  365. package/src/filters/HueRotation.ts +64 -0
  366. package/src/filters/Invert.ts +101 -0
  367. package/src/filters/Noise.ts +96 -0
  368. package/src/filters/Pixelate.ts +98 -0
  369. package/src/filters/RemoveColor.ts +137 -0
  370. package/src/filters/Resize.ts +540 -0
  371. package/src/filters/Saturation.ts +89 -0
  372. package/src/filters/Vibrance.ts +90 -0
  373. package/src/filters/WebGLFilterBackend.ts +456 -0
  374. package/src/filters/filters.ts +28 -0
  375. package/src/filters/index.ts +12 -0
  376. package/src/filters/shaders/baseFilter.ts +17 -0
  377. package/src/filters/shaders/blendColor.ts +33 -0
  378. package/src/filters/shaders/blendImage.ts +32 -0
  379. package/src/filters/shaders/blur.ts +24 -0
  380. package/src/filters/shaders/brightness.ts +11 -0
  381. package/src/filters/shaders/colorMatrix.ts +12 -0
  382. package/src/filters/shaders/constrast.ts +11 -0
  383. package/src/filters/shaders/convolute.ts +154 -0
  384. package/src/filters/shaders/gamma.ts +15 -0
  385. package/src/filters/shaders/grayscale.ts +36 -0
  386. package/src/filters/shaders/invert.ts +19 -0
  387. package/src/filters/shaders/noise.ts +16 -0
  388. package/src/filters/shaders/pixelate.ts +19 -0
  389. package/src/filters/shaders/removeColor.ts +13 -0
  390. package/src/filters/shaders/saturation.ts +15 -0
  391. package/src/filters/shaders/vibrance.ts +16 -0
  392. package/src/filters/typedefs.ts +59 -0
  393. package/src/filters/utils.ts +7 -0
  394. package/src/gradient/Gradient.ts +409 -0
  395. package/src/gradient/constants.ts +12 -0
  396. package/src/gradient/index.ts +2 -0
  397. package/src/gradient/parser/index.ts +3 -0
  398. package/src/gradient/parser/misc.ts +13 -0
  399. package/src/gradient/parser/parseColorStops.ts +56 -0
  400. package/src/gradient/parser/parseCoords.ts +73 -0
  401. package/src/gradient/typedefs.ts +104 -0
  402. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  403. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  404. package/src/parkinglot/straighten.ts +58 -0
  405. package/src/parser/applyViewboxTransform.ts +158 -0
  406. package/src/parser/attributes.ts +25 -0
  407. package/src/parser/constants.ts +116 -0
  408. package/src/parser/doesSomeParentMatch.ts +18 -0
  409. package/src/parser/elementById.ts +21 -0
  410. package/src/parser/elementMatchesRule.ts +16 -0
  411. package/src/parser/elements_parser.ts +158 -0
  412. package/src/parser/getCSSRules.ts +61 -0
  413. package/src/parser/getGlobalStylesForElement.ts +19 -0
  414. package/src/parser/getGradientDefs.ts +31 -0
  415. package/src/parser/getMultipleNodes.ts +15 -0
  416. package/src/parser/getSvgRegex.ts +3 -0
  417. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  418. package/src/parser/index.ts +8 -0
  419. package/src/parser/loadSVGFromString.ts +29 -0
  420. package/src/parser/loadSVGFromURL.ts +47 -0
  421. package/src/parser/normalizeAttr.ts +10 -0
  422. package/src/parser/normalizeValue.ts +64 -0
  423. package/src/parser/parseAttributes.ts +90 -0
  424. package/src/parser/parseFontDeclaration.ts +44 -0
  425. package/src/parser/parsePointsAttribute.ts +34 -0
  426. package/src/parser/parseSVGDocument.ts +118 -0
  427. package/src/parser/parseStyleAttribute.ts +27 -0
  428. package/src/parser/parseStyleObject.ts +15 -0
  429. package/src/parser/parseStyleString.ts +16 -0
  430. package/src/parser/parseTransformAttribute.ts +94 -0
  431. package/src/parser/parseUseDirectives.ts +78 -0
  432. package/src/parser/percent.ts +27 -0
  433. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  434. package/src/parser/selectorMatches.ts +25 -0
  435. package/src/parser/setStrokeFillOpacity.ts +40 -0
  436. package/src/parser/typedefs.ts +13 -0
  437. package/src/shapes/ActiveSelection.ts +192 -0
  438. package/src/shapes/Circle.ts +236 -0
  439. package/src/shapes/Ellipse.ts +177 -0
  440. package/src/shapes/Group.ts +1103 -0
  441. package/src/shapes/IText/DraggableTextDelegate.ts +385 -0
  442. package/src/shapes/IText/IText.ts +696 -0
  443. package/src/shapes/IText/ITextBehavior.ts +1073 -0
  444. package/src/shapes/IText/ITextClickBehavior.ts +292 -0
  445. package/src/shapes/IText/ITextKeyBehavior.ts +675 -0
  446. package/src/shapes/IText/constants.ts +53 -0
  447. package/src/shapes/Image.ts +848 -0
  448. package/src/shapes/Line.ts +285 -0
  449. package/src/shapes/Object/AnimatableObject.ts +103 -0
  450. package/src/shapes/Object/FabricObject.ts +29 -0
  451. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +278 -0
  452. package/src/shapes/Object/InteractiveObject.ts +669 -0
  453. package/src/shapes/Object/Object.ts +1589 -0
  454. package/src/shapes/Object/ObjectGeometry.ts +814 -0
  455. package/src/shapes/Object/ObjectOrigin.ts +277 -0
  456. package/src/shapes/Object/StackedObject.ts +206 -0
  457. package/src/shapes/Object/defaultValues.ts +110 -0
  458. package/src/shapes/Object/types/BaseProps.ts +96 -0
  459. package/src/shapes/Object/types/BorderProps.ts +40 -0
  460. package/src/shapes/Object/types/ControlProps.ts +69 -0
  461. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  462. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  463. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  464. package/src/shapes/Object/types/ObjectProps.ts +49 -0
  465. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  466. package/src/shapes/Object/types/index.ts +8 -0
  467. package/src/shapes/Path.ts +434 -0
  468. package/src/shapes/Polygon.ts +22 -0
  469. package/src/shapes/Polyline.ts +364 -0
  470. package/src/shapes/Rect.ts +230 -0
  471. package/src/shapes/Text/StyledText.ts +323 -0
  472. package/src/shapes/Text/Text.ts +1891 -0
  473. package/src/shapes/Text/TextSVGExportMixin.ts +289 -0
  474. package/src/shapes/Text/constants.ts +111 -0
  475. package/src/shapes/Textbox.ts +526 -0
  476. package/src/shapes/Triangle.ts +62 -0
  477. package/src/typedefs.ts +121 -0
  478. package/src/util/animation/AnimationBase.ts +166 -0
  479. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  480. package/src/util/animation/AnimationRegistry.ts +58 -0
  481. package/src/util/animation/ArrayAnimation.ts +27 -0
  482. package/src/util/animation/ColorAnimation.ts +74 -0
  483. package/src/util/animation/ValueAnimation.ts +29 -0
  484. package/src/util/animation/animate.ts +74 -0
  485. package/src/util/animation/easing.ts +327 -0
  486. package/src/util/animation/index.ts +2 -0
  487. package/src/util/animation/types.ts +136 -0
  488. package/src/util/applyMixins.ts +22 -0
  489. package/src/util/dom_event.ts +28 -0
  490. package/src/util/dom_misc.ts +44 -0
  491. package/src/util/dom_request.ts +64 -0
  492. package/src/util/dom_style.ts +20 -0
  493. package/src/util/index.ts +106 -0
  494. package/src/util/internals/cleanupSvgAttribute.test.ts +16 -0
  495. package/src/util/internals/cleanupSvgAttribute.ts +8 -0
  496. package/src/util/internals/cloneDeep.test.ts +16 -0
  497. package/src/util/internals/cloneDeep.ts +2 -0
  498. package/src/util/internals/getRandomInt.test.ts +33 -0
  499. package/src/util/internals/getRandomInt.ts +8 -0
  500. package/src/util/internals/ifNaN.ts +9 -0
  501. package/src/util/internals/index.ts +3 -0
  502. package/src/util/internals/removeFromArray.ts +14 -0
  503. package/src/util/internals/uid.ts +3 -0
  504. package/src/util/lang_string.ts +79 -0
  505. package/src/util/misc/boundingBoxFromPoints.ts +38 -0
  506. package/src/util/misc/capValue.ts +2 -0
  507. package/src/util/misc/cos.ts +24 -0
  508. package/src/util/misc/dom.ts +55 -0
  509. package/src/util/misc/findScaleTo.ts +29 -0
  510. package/src/util/misc/groupSVGElements.ts +15 -0
  511. package/src/util/misc/isTransparent.ts +28 -0
  512. package/src/util/misc/matrix.ts +313 -0
  513. package/src/util/misc/mergeClipPaths.ts +40 -0
  514. package/src/util/misc/objectEnlive.ts +174 -0
  515. package/src/util/misc/objectTransforms.ts +130 -0
  516. package/src/util/misc/pick.ts +29 -0
  517. package/src/util/misc/planeChange.ts +127 -0
  518. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +113 -0
  519. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +227 -0
  520. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +76 -0
  521. package/src/util/misc/projectStroke/index.ts +55 -0
  522. package/src/util/misc/projectStroke/types.ts +24 -0
  523. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  524. package/src/util/misc/resolveOrigin.ts +22 -0
  525. package/src/util/misc/rotatePoint.ts +15 -0
  526. package/src/util/misc/sin.ts +26 -0
  527. package/src/util/misc/svgParsing.ts +171 -0
  528. package/src/util/misc/textStyles.ts +132 -0
  529. package/src/util/misc/toFixed.ts +8 -0
  530. package/src/util/misc/vectors.ts +83 -0
  531. package/src/util/path/index.ts +1039 -0
  532. package/src/util/path/regex.ts +39 -0
  533. package/src/util/path/typechecks.ts +145 -0
  534. package/src/util/path/typedefs.ts +305 -0
  535. package/src/util/transform_matrix_removal.ts +61 -0
  536. package/src/util/typeAssertions.ts +78 -0
  537. package/tsconfig.json +106 -0
  538. package/HEADER.js +0 -203
  539. package/build.js +0 -287
  540. package/dist/fabric.js +0 -31187
  541. package/dist/fabric.min.js +0 -1
  542. package/old-travis-reference.yml +0 -97
  543. package/src/brushes/circle_brush.class.js +0 -144
  544. package/src/brushes/pattern_brush.class.js +0 -61
  545. package/src/brushes/pencil_brush.class.js +0 -310
  546. package/src/brushes/spray_brush.class.js +0 -219
  547. package/src/canvas.class.js +0 -1312
  548. package/src/color.class.js +0 -636
  549. package/src/control.class.js +0 -339
  550. package/src/controls.actions.js +0 -740
  551. package/src/controls.render.js +0 -99
  552. package/src/elements_parser.js +0 -152
  553. package/src/filters/2d_backend.class.js +0 -65
  554. package/src/filters/blendcolor_filter.class.js +0 -251
  555. package/src/filters/blendimage_filter.class.js +0 -247
  556. package/src/filters/blur_filter.class.js +0 -217
  557. package/src/filters/brightness_filter.class.js +0 -113
  558. package/src/filters/colormatrix_filter.class.js +0 -159
  559. package/src/filters/composed_filter.class.js +0 -72
  560. package/src/filters/contrast_filter.class.js +0 -113
  561. package/src/filters/convolute_filter.class.js +0 -352
  562. package/src/filters/filter_boilerplate.js +0 -111
  563. package/src/filters/filter_generator.js +0 -85
  564. package/src/filters/gamma_filter.class.js +0 -136
  565. package/src/filters/grayscale_filter.class.js +0 -154
  566. package/src/filters/hue_rotation.class.js +0 -107
  567. package/src/filters/invert_filter.class.js +0 -111
  568. package/src/filters/noise_filter.class.js +0 -134
  569. package/src/filters/pixelate_filter.class.js +0 -137
  570. package/src/filters/removecolor_filter.class.js +0 -173
  571. package/src/filters/resize_filter.class.js +0 -490
  572. package/src/filters/saturate_filter.class.js +0 -119
  573. package/src/filters/vibrance_filter.class.js +0 -122
  574. package/src/filters/webgl_backend.class.js +0 -396
  575. package/src/globalFabric.js +0 -4
  576. package/src/gradient.class.js +0 -490
  577. package/src/intersection.class.js +0 -172
  578. package/src/log.js +0 -11
  579. package/src/mixins/animation.mixin.js +0 -231
  580. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  581. package/src/mixins/canvas_events.mixin.js +0 -974
  582. package/src/mixins/canvas_gestures.mixin.js +0 -149
  583. package/src/mixins/canvas_grouping.mixin.js +0 -177
  584. package/src/mixins/canvas_serialization.mixin.js +0 -228
  585. package/src/mixins/collection.mixin.js +0 -170
  586. package/src/mixins/default_controls.js +0 -114
  587. package/src/mixins/itext.svg_export.js +0 -241
  588. package/src/mixins/itext_behavior.mixin.js +0 -940
  589. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  590. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  591. package/src/mixins/object.svg_export.js +0 -258
  592. package/src/mixins/object_geometry.mixin.js +0 -683
  593. package/src/mixins/object_interactivity.mixin.js +0 -314
  594. package/src/mixins/object_origin.mixin.js +0 -255
  595. package/src/mixins/object_stacking.mixin.js +0 -80
  596. package/src/mixins/object_straightening.mixin.js +0 -80
  597. package/src/mixins/observable.mixin.js +0 -141
  598. package/src/mixins/shared_methods.mixin.js +0 -94
  599. package/src/mixins/stateful.mixin.js +0 -107
  600. package/src/mixins/text_style.mixin.js +0 -324
  601. package/src/parser.js +0 -1090
  602. package/src/pattern.class.js +0 -189
  603. package/src/point.class.js +0 -337
  604. package/src/shadow.class.js +0 -195
  605. package/src/shapes/active_selection.class.js +0 -155
  606. package/src/shapes/circle.class.js +0 -210
  607. package/src/shapes/ellipse.class.js +0 -181
  608. package/src/shapes/group.class.js +0 -593
  609. package/src/shapes/image.class.js +0 -764
  610. package/src/shapes/itext.class.js +0 -526
  611. package/src/shapes/line.class.js +0 -324
  612. package/src/shapes/object.class.js +0 -2008
  613. package/src/shapes/path.class.js +0 -384
  614. package/src/shapes/polygon.class.js +0 -81
  615. package/src/shapes/polyline.class.js +0 -268
  616. package/src/shapes/rect.class.js +0 -187
  617. package/src/shapes/text.class.js +0 -1696
  618. package/src/shapes/textbox.class.js +0 -461
  619. package/src/shapes/triangle.class.js +0 -93
  620. package/src/static_canvas.class.js +0 -1881
  621. package/src/util/anim_ease.js +0 -398
  622. package/src/util/animate.js +0 -254
  623. package/src/util/animate_color.js +0 -74
  624. package/src/util/dom_event.js +0 -50
  625. package/src/util/dom_misc.js +0 -300
  626. package/src/util/dom_request.js +0 -54
  627. package/src/util/dom_style.js +0 -70
  628. package/src/util/lang_array.js +0 -94
  629. package/src/util/lang_class.js +0 -115
  630. package/src/util/lang_object.js +0 -75
  631. package/src/util/lang_string.js +0 -110
  632. package/src/util/misc.js +0 -1330
  633. package/src/util/named_accessors.mixin.js +0 -428
  634. package/src/util/path.js +0 -829
@@ -0,0 +1,456 @@
1
+ import { getFabricWindow } from '../env';
2
+ import { config } from '../config';
3
+ import { createCanvasElement } from '../util/misc/dom';
4
+ import type {
5
+ TWebGLPipelineState,
6
+ TProgramCache,
7
+ TTextureCache,
8
+ TPipelineResources,
9
+ } from './typedefs';
10
+
11
+ export class WebGLFilterBackend {
12
+ declare tileSize: number;
13
+
14
+ /**
15
+ * Define ...
16
+ **/
17
+ aPosition: Float32Array = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);
18
+
19
+ /**
20
+ * If GLPut data is the fastest operation, or if forced, this buffer will be used
21
+ * to transfer the data back in the 2d logic
22
+ **/
23
+ declare imageBuffer?: ArrayBuffer;
24
+
25
+ declare canvas: HTMLCanvasElement;
26
+
27
+ /**
28
+ * The Webgl context that will execute the operations for filtering
29
+ **/
30
+ declare gl: WebGLRenderingContext;
31
+
32
+ /**
33
+ * Keyed map for shader cache
34
+ **/
35
+ declare programCache: TProgramCache;
36
+
37
+ /**
38
+ * Keyed map for texture cache
39
+ **/
40
+ declare textureCache: TTextureCache;
41
+
42
+ /**
43
+ * Contains GPU info for debug
44
+ **/
45
+ declare gpuInfo: any;
46
+
47
+ /**
48
+ * Experimental. This object is a sort of repository of help layers used to avoid
49
+ * of recreating them during frequent filtering. If you are previewing a filter with
50
+ * a slider you probably do not want to create help layers every filter step.
51
+ * in this object there will be appended some canvases, created once, resized sometimes
52
+ * cleared never. Clearing is left to the developer.
53
+ **/
54
+ resources: TPipelineResources = {};
55
+
56
+ constructor({ tileSize = config.textureSize } = {}) {
57
+ this.tileSize = tileSize;
58
+ this.setupGLContext(tileSize, tileSize);
59
+ this.captureGPUInfo();
60
+ }
61
+
62
+ /**
63
+ * Setup a WebGL context suitable for filtering, and bind any needed event handlers.
64
+ */
65
+ setupGLContext(width: number, height: number): void {
66
+ this.dispose();
67
+ this.createWebGLCanvas(width, height);
68
+ // eslint-disable-next-line
69
+ this.chooseFastestCopyGLTo2DMethod(width, height);
70
+ }
71
+
72
+ /**
73
+ * Pick a method to copy data from GL context to 2d canvas. In some browsers using
74
+ * drawImage should be faster, but is also bugged for a small combination of old hardware
75
+ * and drivers.
76
+ * putImageData is faster than drawImage for that specific operation.
77
+ */
78
+ chooseFastestCopyGLTo2DMethod(width: number, height: number): void {
79
+ const targetCanvas = createCanvasElement();
80
+ // eslint-disable-next-line no-undef
81
+ const imageBuffer = new ArrayBuffer(width * height * 4);
82
+ if (config.forceGLPutImageData) {
83
+ this.imageBuffer = imageBuffer;
84
+ this.copyGLTo2D = copyGLTo2DPutImageData;
85
+ return;
86
+ }
87
+
88
+ const testContext = {
89
+ imageBuffer: imageBuffer,
90
+ } as unknown as Required<WebGLFilterBackend>;
91
+ const testPipelineState = {
92
+ destinationWidth: width,
93
+ destinationHeight: height,
94
+ targetCanvas: targetCanvas,
95
+ } as unknown as TWebGLPipelineState;
96
+ let startTime;
97
+ targetCanvas.width = width;
98
+ targetCanvas.height = height;
99
+
100
+ startTime = getFabricWindow().performance.now();
101
+ this.copyGLTo2D.call(testContext, this.gl, testPipelineState);
102
+ const drawImageTime = getFabricWindow().performance.now() - startTime;
103
+
104
+ startTime = getFabricWindow().performance.now();
105
+ copyGLTo2DPutImageData.call(testContext, this.gl, testPipelineState);
106
+ const putImageDataTime = getFabricWindow().performance.now() - startTime;
107
+
108
+ if (drawImageTime > putImageDataTime) {
109
+ this.imageBuffer = imageBuffer;
110
+ this.copyGLTo2D = copyGLTo2DPutImageData;
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Create a canvas element and associated WebGL context and attaches them as
116
+ * class properties to the GLFilterBackend class.
117
+ */
118
+ createWebGLCanvas(width: number, height: number): void {
119
+ const canvas = createCanvasElement();
120
+ canvas.width = width;
121
+ canvas.height = height;
122
+ const glOptions = {
123
+ alpha: true,
124
+ premultipliedAlpha: false,
125
+ depth: false,
126
+ stencil: false,
127
+ antialias: false,
128
+ },
129
+ gl = canvas.getContext('webgl', glOptions) as WebGLRenderingContext;
130
+
131
+ if (!gl) {
132
+ return;
133
+ }
134
+ gl.clearColor(0, 0, 0, 0);
135
+ // this canvas can fire webglcontextlost and webglcontextrestored
136
+ this.canvas = canvas;
137
+ this.gl = gl;
138
+ }
139
+
140
+ /**
141
+ * Attempts to apply the requested filters to the source provided, drawing the filtered output
142
+ * to the provided target canvas.
143
+ *
144
+ * @param {Array} filters The filters to apply.
145
+ * @param {TexImageSource} source The source to be filtered.
146
+ * @param {Number} width The width of the source input.
147
+ * @param {Number} height The height of the source input.
148
+ * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.
149
+ * @param {String|undefined} cacheKey A key used to cache resources related to the source. If
150
+ * omitted, caching will be skipped.
151
+ */
152
+ applyFilters(
153
+ filters: any[],
154
+ source: TexImageSource,
155
+ width: number,
156
+ height: number,
157
+ targetCanvas: HTMLCanvasElement,
158
+ cacheKey?: string
159
+ ): TWebGLPipelineState | undefined {
160
+ const gl = this.gl;
161
+ const ctx = targetCanvas.getContext('2d');
162
+ if (!gl || !ctx) {
163
+ return;
164
+ }
165
+ let cachedTexture;
166
+ if (cacheKey) {
167
+ cachedTexture = this.getCachedTexture(cacheKey, source);
168
+ }
169
+ const pipelineState: TWebGLPipelineState = {
170
+ // @ts-ignore
171
+ originalWidth: source.width || source.originalWidth || 0,
172
+ // @ts-ignore
173
+ originalHeight: source.height || source.originalHeight || 0,
174
+ sourceWidth: width,
175
+ sourceHeight: height,
176
+ destinationWidth: width,
177
+ destinationHeight: height,
178
+ context: gl,
179
+ sourceTexture: this.createTexture(
180
+ gl,
181
+ width,
182
+ height,
183
+ !cachedTexture ? source : undefined
184
+ ),
185
+ targetTexture: this.createTexture(gl, width, height),
186
+ originalTexture:
187
+ cachedTexture ||
188
+ this.createTexture(
189
+ gl,
190
+ width,
191
+ height,
192
+ !cachedTexture ? source : undefined
193
+ )!,
194
+ passes: filters.length,
195
+ webgl: true,
196
+ aPosition: this.aPosition,
197
+ programCache: this.programCache,
198
+ pass: 0,
199
+ filterBackend: this,
200
+ targetCanvas: targetCanvas,
201
+ };
202
+ const tempFbo = gl.createFramebuffer();
203
+ gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);
204
+ filters.forEach((filter: any) => {
205
+ filter && filter.applyTo(pipelineState);
206
+ });
207
+ resizeCanvasIfNeeded(pipelineState);
208
+ this.copyGLTo2D(gl, pipelineState);
209
+ gl.bindTexture(gl.TEXTURE_2D, null);
210
+ gl.deleteTexture(pipelineState.sourceTexture);
211
+ gl.deleteTexture(pipelineState.targetTexture);
212
+ gl.deleteFramebuffer(tempFbo);
213
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
214
+ return pipelineState;
215
+ }
216
+
217
+ /**
218
+ * Detach event listeners, remove references, and clean up caches.
219
+ */
220
+ dispose() {
221
+ if (this.canvas) {
222
+ // we are disposing, we don't care about the fact
223
+ // that the canvas shouldn't be null.
224
+ // @ts-ignore
225
+ this.canvas = null;
226
+ // @ts-ignore
227
+ this.gl = null;
228
+ }
229
+ this.clearWebGLCaches();
230
+ }
231
+
232
+ /**
233
+ * Wipe out WebGL-related caches.
234
+ */
235
+ clearWebGLCaches() {
236
+ this.programCache = {};
237
+ this.textureCache = {};
238
+ }
239
+
240
+ /**
241
+ * Create a WebGL texture object.
242
+ *
243
+ * Accepts specific dimensions to initialize the texture to or a source image.
244
+ *
245
+ * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.
246
+ * @param {number} width The width to initialize the texture at.
247
+ * @param {number} height The height to initialize the texture.
248
+ * @param {TexImageSource} textureImageSource A source for the texture data.
249
+ * @param {number} filter gl.NEAREST default or gl.LINEAR filters for the texture.
250
+ * This filter is very useful for LUTs filters. If you need interpolation use gl.LINEAR
251
+ * @returns {WebGLTexture}
252
+ */
253
+ createTexture(
254
+ gl: WebGLRenderingContext,
255
+ width: number,
256
+ height: number,
257
+ textureImageSource?: TexImageSource,
258
+ filter?:
259
+ | WebGLRenderingContextBase['NEAREST']
260
+ | WebGLRenderingContextBase['LINEAR']
261
+ ) {
262
+ const {
263
+ NEAREST,
264
+ TEXTURE_2D,
265
+ RGBA,
266
+ UNSIGNED_BYTE,
267
+ CLAMP_TO_EDGE,
268
+ TEXTURE_MAG_FILTER,
269
+ TEXTURE_MIN_FILTER,
270
+ TEXTURE_WRAP_S,
271
+ TEXTURE_WRAP_T,
272
+ } = gl;
273
+ const texture = gl.createTexture();
274
+ gl.bindTexture(TEXTURE_2D, texture);
275
+ gl.texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, filter || NEAREST);
276
+ gl.texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, filter || NEAREST);
277
+ gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);
278
+ gl.texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);
279
+ if (textureImageSource) {
280
+ gl.texImage2D(
281
+ TEXTURE_2D,
282
+ 0,
283
+ RGBA,
284
+ RGBA,
285
+ UNSIGNED_BYTE,
286
+ textureImageSource
287
+ );
288
+ } else {
289
+ gl.texImage2D(
290
+ TEXTURE_2D,
291
+ 0,
292
+ RGBA,
293
+ width,
294
+ height,
295
+ 0,
296
+ RGBA,
297
+ UNSIGNED_BYTE,
298
+ null
299
+ );
300
+ }
301
+ return texture;
302
+ }
303
+
304
+ /**
305
+ * Can be optionally used to get a texture from the cache array
306
+ *
307
+ * If an existing texture is not found, a new texture is created and cached.
308
+ *
309
+ * @param {String} uniqueId A cache key to use to find an existing texture.
310
+ * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the
311
+ * texture cache entry if one does not already exist.
312
+ */
313
+ getCachedTexture(
314
+ uniqueId: string,
315
+ textureImageSource: TexImageSource,
316
+ filter?:
317
+ | WebGLRenderingContextBase['NEAREST']
318
+ | WebGLRenderingContextBase['LINEAR']
319
+ ): WebGLTexture | null {
320
+ const { textureCache } = this;
321
+ if (textureCache[uniqueId]) {
322
+ return textureCache[uniqueId];
323
+ } else {
324
+ const texture = this.createTexture(
325
+ this.gl,
326
+ textureImageSource.width,
327
+ textureImageSource.height,
328
+ textureImageSource,
329
+ filter
330
+ );
331
+ if (texture) {
332
+ textureCache[uniqueId] = texture;
333
+ }
334
+ return texture;
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Clear out cached resources related to a source image that has been
340
+ * filtered previously.
341
+ *
342
+ * @param {String} cacheKey The cache key provided when the source image was filtered.
343
+ */
344
+ evictCachesForKey(cacheKey: string) {
345
+ if (this.textureCache[cacheKey]) {
346
+ this.gl.deleteTexture(this.textureCache[cacheKey]);
347
+ delete this.textureCache[cacheKey];
348
+ }
349
+ }
350
+
351
+ /**
352
+ * Copy an input WebGL canvas on to an output 2D canvas.
353
+ *
354
+ * The WebGL canvas is assumed to be upside down, with the top-left pixel of the
355
+ * desired output image appearing in the bottom-left corner of the WebGL canvas.
356
+ *
357
+ * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.
358
+ * @param {Object} pipelineState The 2D target canvas to copy on to.
359
+ */
360
+ copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {
361
+ const glCanvas = gl.canvas,
362
+ targetCanvas = pipelineState.targetCanvas,
363
+ ctx = targetCanvas.getContext('2d');
364
+ if (!ctx) {
365
+ return;
366
+ }
367
+ ctx.translate(0, targetCanvas.height); // move it down again
368
+ ctx.scale(1, -1); // vertical flip
369
+ // where is my image on the big glcanvas?
370
+ const sourceY = glCanvas.height - targetCanvas.height;
371
+ ctx.drawImage(
372
+ glCanvas,
373
+ 0,
374
+ sourceY,
375
+ targetCanvas.width,
376
+ targetCanvas.height,
377
+ 0,
378
+ 0,
379
+ targetCanvas.width,
380
+ targetCanvas.height
381
+ );
382
+ }
383
+
384
+ /**
385
+ * Attempt to extract GPU information strings from a WebGL context.
386
+ *
387
+ * Useful information when debugging or blacklisting specific GPUs.
388
+ *
389
+ * @returns {Object} A GPU info object with renderer and vendor strings.
390
+ */
391
+ captureGPUInfo() {
392
+ if (this.gpuInfo) {
393
+ return this.gpuInfo;
394
+ }
395
+ const gl = this.gl,
396
+ gpuInfo = { renderer: '', vendor: '' };
397
+ if (!gl) {
398
+ return gpuInfo;
399
+ }
400
+ const ext = gl.getExtension('WEBGL_debug_renderer_info');
401
+ if (ext) {
402
+ const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
403
+ const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
404
+ if (renderer) {
405
+ gpuInfo.renderer = renderer.toLowerCase();
406
+ }
407
+ if (vendor) {
408
+ gpuInfo.vendor = vendor.toLowerCase();
409
+ }
410
+ }
411
+ this.gpuInfo = gpuInfo;
412
+ return gpuInfo;
413
+ }
414
+ }
415
+
416
+ function resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {
417
+ const targetCanvas = pipelineState.targetCanvas,
418
+ width = targetCanvas.width,
419
+ height = targetCanvas.height,
420
+ dWidth = pipelineState.destinationWidth,
421
+ dHeight = pipelineState.destinationHeight;
422
+
423
+ if (width !== dWidth || height !== dHeight) {
424
+ targetCanvas.width = dWidth;
425
+ targetCanvas.height = dHeight;
426
+ }
427
+ }
428
+
429
+ /**
430
+ * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData
431
+ * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).
432
+ *
433
+ * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.
434
+ * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.
435
+ * @param {Object} pipelineState The 2D target canvas to copy on to.
436
+ */
437
+ function copyGLTo2DPutImageData(
438
+ this: Required<WebGLFilterBackend>,
439
+ gl: WebGLRenderingContext,
440
+ pipelineState: TWebGLPipelineState
441
+ ) {
442
+ const targetCanvas = pipelineState.targetCanvas,
443
+ ctx = targetCanvas.getContext('2d'),
444
+ dWidth = pipelineState.destinationWidth,
445
+ dHeight = pipelineState.destinationHeight,
446
+ numBytes = dWidth * dHeight * 4;
447
+ if (!ctx) {
448
+ return;
449
+ }
450
+ const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);
451
+ const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);
452
+
453
+ gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);
454
+ const imgData = new ImageData(u8Clamped, dWidth, dHeight);
455
+ ctx.putImageData(imgData, 0, 0);
456
+ }
@@ -0,0 +1,28 @@
1
+ export { BaseFilter } from './BaseFilter';
2
+ export { BlendColor } from './BlendColor';
3
+ export { BlendImage } from './BlendImage';
4
+ export { Blur } from './Blur';
5
+ export { Brightness } from './Brightness';
6
+ export { ColorMatrix } from './ColorMatrix';
7
+ export {
8
+ BlackWhite,
9
+ Brownie,
10
+ Kodachrome,
11
+ Polaroid,
12
+ Sepia,
13
+ Technicolor,
14
+ Vintage,
15
+ } from './ColorMatrixFilters';
16
+ export { Composed } from './Composed';
17
+ export { Contrast } from './Contrast';
18
+ export { Convolute } from './Convolute';
19
+ export { Gamma } from './Gamma';
20
+ export { Grayscale } from './Grayscale';
21
+ export { HueRotation } from './HueRotation';
22
+ export { Invert } from './Invert';
23
+ export { Noise } from './Noise';
24
+ export { Pixelate } from './Pixelate';
25
+ export { RemoveColor } from './RemoveColor';
26
+ export { Resize } from './Resize';
27
+ export { Saturation } from './Saturation';
28
+ export { Vibrance } from './Vibrance';
@@ -0,0 +1,12 @@
1
+ export * as filters from './filters';
2
+
3
+ export {
4
+ getFilterBackend,
5
+ initFilterBackend,
6
+ setFilterBackend,
7
+ } from './FilterBackend';
8
+ export { Canvas2dFilterBackend } from './Canvas2dFilterBackend';
9
+ export { WebGLFilterBackend } from './WebGLFilterBackend';
10
+ export { isWebGLPipelineState } from './utils';
11
+
12
+ export * from './typedefs';
@@ -0,0 +1,17 @@
1
+ export const highPsourceCode = `precision highp float`;
2
+
3
+ export const identityFragmentShader = `
4
+ ${highPsourceCode};
5
+ varying vec2 vTexCoord;
6
+ uniform sampler2D uTexture;
7
+ void main() {
8
+ gl_FragColor = texture2D(uTexture, vTexCoord);
9
+ }`;
10
+
11
+ export const vertexSource = `
12
+ attribute vec2 aPosition;
13
+ varying vec2 vTexCoord;
14
+ void main() {
15
+ vTexCoord = aPosition;
16
+ gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);
17
+ }`;
@@ -0,0 +1,33 @@
1
+ export const blendColorFragmentSource = {
2
+ multiply: 'gl_FragColor.rgb *= uColor.rgb;\n',
3
+ screen:
4
+ 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n',
5
+ add: 'gl_FragColor.rgb += uColor.rgb;\n',
6
+ difference: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n',
7
+ subtract: 'gl_FragColor.rgb -= uColor.rgb;\n',
8
+ lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n',
9
+ darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n',
10
+ exclusion:
11
+ 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n',
12
+ overlay: `
13
+ if (uColor.r < 0.5) {
14
+ gl_FragColor.r *= 2.0 * uColor.r;
15
+ } else {
16
+ gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);
17
+ }
18
+ if (uColor.g < 0.5) {
19
+ gl_FragColor.g *= 2.0 * uColor.g;
20
+ } else {
21
+ gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);
22
+ }
23
+ if (uColor.b < 0.5) {
24
+ gl_FragColor.b *= 2.0 * uColor.b;
25
+ } else {
26
+ gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);
27
+ }
28
+ `,
29
+ tint: `
30
+ gl_FragColor.rgb *= (1.0 - uColor.a);
31
+ gl_FragColor.rgb += uColor.rgb;
32
+ `,
33
+ } as const;
@@ -0,0 +1,32 @@
1
+ import type { TBlendImageMode } from '../BlendImage';
2
+
3
+ export const fragmentSource: Record<TBlendImageMode, string> = {
4
+ multiply: `
5
+ precision highp float;
6
+ uniform sampler2D uTexture;
7
+ uniform sampler2D uImage;
8
+ uniform vec4 uColor;
9
+ varying vec2 vTexCoord;
10
+ varying vec2 vTexCoord2;
11
+ void main() {
12
+ vec4 color = texture2D(uTexture, vTexCoord);
13
+ vec4 color2 = texture2D(uImage, vTexCoord2);
14
+ color.rgba *= color2.rgba;
15
+ gl_FragColor = color;
16
+ }
17
+ `,
18
+ mask: `
19
+ precision highp float;
20
+ uniform sampler2D uTexture;
21
+ uniform sampler2D uImage;
22
+ uniform vec4 uColor;
23
+ varying vec2 vTexCoord;
24
+ varying vec2 vTexCoord2;
25
+ void main() {
26
+ vec4 color = texture2D(uTexture, vTexCoord);
27
+ vec4 color2 = texture2D(uImage, vTexCoord2);
28
+ color.a = color2.a;
29
+ gl_FragColor = color;
30
+ }
31
+ `,
32
+ } as const;
@@ -0,0 +1,24 @@
1
+ export const fragmentSource = `
2
+ precision highp float;
3
+ uniform sampler2D uTexture;
4
+ uniform vec2 uDelta;
5
+ varying vec2 vTexCoord;
6
+ const float nSamples = 15.0;
7
+ vec3 v3offset = vec3(12.9898, 78.233, 151.7182);
8
+ float random(vec3 scale) {
9
+ /* use the fragment position for a different seed per-pixel */
10
+ return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);
11
+ }
12
+ void main() {
13
+ vec4 color = vec4(0.0);
14
+ float total = 0.0;
15
+ float offset = random(v3offset);
16
+ for (float t = -nSamples; t <= nSamples; t++) {
17
+ float percent = (t + offset - 0.5) / nSamples;
18
+ float weight = 1.0 - abs(percent);
19
+ color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;
20
+ total += weight;
21
+ }
22
+ gl_FragColor = color / total;
23
+ }
24
+ ` as const;
@@ -0,0 +1,11 @@
1
+ export const fragmentSource = `
2
+ precision highp float;
3
+ uniform sampler2D uTexture;
4
+ uniform float uBrightness;
5
+ varying vec2 vTexCoord;
6
+ void main() {
7
+ vec4 color = texture2D(uTexture, vTexCoord);
8
+ color.rgb += uBrightness;
9
+ gl_FragColor = color;
10
+ }
11
+ `;
@@ -0,0 +1,12 @@
1
+ export const fragmentSource = `
2
+ precision highp float;
3
+ uniform sampler2D uTexture;
4
+ varying vec2 vTexCoord;
5
+ uniform mat4 uColorMatrix;
6
+ uniform vec4 uConstants;
7
+ void main() {
8
+ vec4 color = texture2D(uTexture, vTexCoord);
9
+ color *= uColorMatrix;
10
+ color += uConstants;
11
+ gl_FragColor = color;
12
+ }`;
@@ -0,0 +1,11 @@
1
+ export const fragmentSource = `
2
+ precision highp float;
3
+ uniform sampler2D uTexture;
4
+ uniform float uContrast;
5
+ varying vec2 vTexCoord;
6
+ void main() {
7
+ vec4 color = texture2D(uTexture, vTexCoord);
8
+ float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));
9
+ color.rgb = contrastF * (color.rgb - 0.5) + 0.5;
10
+ gl_FragColor = color;
11
+ }`;