fabric 5.3.0 → 6.0.0-beta1

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 (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -0,0 +1,103 @@
1
+ import type { TClassProperties } from '../typedefs';
2
+ import { BaseFilter } from './BaseFilter';
3
+ import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
4
+ import { classRegistry } from '../util/class_registry';
5
+
6
+ /**
7
+ * Vibrance filter class
8
+ * @example
9
+ * const filter = new Vibrance({
10
+ * vibrance: 1
11
+ * });
12
+ * object.filters.push(filter);
13
+ * object.applyFilters();
14
+ */
15
+ export class Vibrance extends BaseFilter {
16
+ /**
17
+ * Vibrance value, from -1 to 1.
18
+ * Increases/decreases the saturation of more muted colors with less effect on saturated colors.
19
+ * A value of 0 has no effect.
20
+ *
21
+ * @param {Number} vibrance
22
+ * @default
23
+ */
24
+ declare vibrance: number;
25
+
26
+ /**
27
+ * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.
28
+ *
29
+ * @param {Object} options
30
+ * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
31
+ */
32
+ applyTo2d({ imageData: { data } }: T2DPipelineState) {
33
+ if (this.vibrance === 0) {
34
+ return;
35
+ }
36
+ const adjust = -this.vibrance;
37
+ for (let i = 0; i < data.length; i += 4) {
38
+ const max = Math.max(data[i], data[i + 1], data[i + 2]);
39
+ const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
40
+ const amt = ((Math.abs(max - avg) * 2) / 255) * adjust;
41
+ data[i] += max !== data[i] ? (max - data[i]) * amt : 0;
42
+ data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;
43
+ data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Return WebGL uniform locations for this filter's shader.
49
+ *
50
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
51
+ * @param {WebGLShaderProgram} program This filter's compiled shader program.
52
+ */
53
+ getUniformLocations(
54
+ gl: WebGLRenderingContext,
55
+ program: WebGLProgram
56
+ ): TWebGLUniformLocationMap {
57
+ return {
58
+ uVibrance: gl.getUniformLocation(program, 'uVibrance'),
59
+ };
60
+ }
61
+
62
+ /**
63
+ * Send data from this filter to its shader program's uniforms.
64
+ *
65
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
66
+ * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
67
+ */
68
+ sendUniformData(
69
+ gl: WebGLRenderingContext,
70
+ uniformLocations: TWebGLUniformLocationMap
71
+ ) {
72
+ gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);
73
+ }
74
+
75
+ static async fromObject(object: any) {
76
+ return new Vibrance(object);
77
+ }
78
+ }
79
+
80
+ export const vibranceDefaultValues: Partial<TClassProperties<Vibrance>> = {
81
+ type: 'Vibrance',
82
+ fragmentSource: `
83
+ precision highp float;
84
+ uniform sampler2D uTexture;
85
+ uniform float uVibrance;
86
+ varying vec2 vTexCoord;
87
+ void main() {
88
+ vec4 color = texture2D(uTexture, vTexCoord);
89
+ float max = max(color.r, max(color.g, color.b));
90
+ float avg = (color.r + color.g + color.b) / 3.0;
91
+ float amt = (abs(max - avg) * 2.0) * uVibrance;
92
+ color.r += max != color.r ? (max - color.r) * amt : 0.00;
93
+ color.g += max != color.g ? (max - color.g) * amt : 0.00;
94
+ color.b += max != color.b ? (max - color.b) * amt : 0.00;
95
+ gl_FragColor = color;
96
+ }
97
+ `,
98
+ vibrance: 0,
99
+ mainParameter: 'vibrance',
100
+ };
101
+
102
+ Object.assign(Vibrance.prototype, vibranceDefaultValues);
103
+ classRegistry.setClass(Vibrance);
@@ -0,0 +1,430 @@
1
+ import { getEnv } from '../env';
2
+ import { config } from '../config';
3
+ import { createCanvasElement } from '../util/misc/dom';
4
+ import {
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 = getEnv().window.performance.now();
101
+ this.copyGLTo2D.call(testContext, this.gl, testPipelineState);
102
+ const drawImageTime = getEnv().window.performance.now() - startTime;
103
+
104
+ startTime = getEnv().window.performance.now();
105
+ copyGLTo2DPutImageData.call(testContext, this.gl, testPipelineState);
106
+ const putImageDataTime = getEnv().window.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 {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.
249
+ * @returns {WebGLTexture}
250
+ */
251
+ createTexture(
252
+ gl: WebGLRenderingContext,
253
+ width: number,
254
+ height: number,
255
+ textureImageSource?: TexImageSource
256
+ ) {
257
+ const texture = gl.createTexture();
258
+ gl.bindTexture(gl.TEXTURE_2D, texture);
259
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
260
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
261
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
262
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
263
+ if (textureImageSource) {
264
+ gl.texImage2D(
265
+ gl.TEXTURE_2D,
266
+ 0,
267
+ gl.RGBA,
268
+ gl.RGBA,
269
+ gl.UNSIGNED_BYTE,
270
+ textureImageSource
271
+ );
272
+ } else {
273
+ gl.texImage2D(
274
+ gl.TEXTURE_2D,
275
+ 0,
276
+ gl.RGBA,
277
+ width,
278
+ height,
279
+ 0,
280
+ gl.RGBA,
281
+ gl.UNSIGNED_BYTE,
282
+ null
283
+ );
284
+ }
285
+ return texture;
286
+ }
287
+
288
+ /**
289
+ * Can be optionally used to get a texture from the cache array
290
+ *
291
+ * If an existing texture is not found, a new texture is created and cached.
292
+ *
293
+ * @param {String} uniqueId A cache key to use to find an existing texture.
294
+ * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the
295
+ * texture cache entry if one does not already exist.
296
+ */
297
+ getCachedTexture(uniqueId: string, textureImageSource: TexImageSource) {
298
+ if (this.textureCache[uniqueId]) {
299
+ return this.textureCache[uniqueId];
300
+ } else {
301
+ const texture = this.createTexture(
302
+ this.gl,
303
+ textureImageSource.width,
304
+ textureImageSource.height,
305
+ textureImageSource
306
+ );
307
+ this.textureCache[uniqueId] = texture;
308
+ return texture;
309
+ }
310
+ }
311
+
312
+ /**
313
+ * Clear out cached resources related to a source image that has been
314
+ * filtered previously.
315
+ *
316
+ * @param {String} cacheKey The cache key provided when the source image was filtered.
317
+ */
318
+ evictCachesForKey(cacheKey: string) {
319
+ if (this.textureCache[cacheKey]) {
320
+ this.gl.deleteTexture(this.textureCache[cacheKey]);
321
+ delete this.textureCache[cacheKey];
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Copy an input WebGL canvas on to an output 2D canvas.
327
+ *
328
+ * The WebGL canvas is assumed to be upside down, with the top-left pixel of the
329
+ * desired output image appearing in the bottom-left corner of the WebGL canvas.
330
+ *
331
+ * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.
332
+ * @param {Object} pipelineState The 2D target canvas to copy on to.
333
+ */
334
+ copyGLTo2D(gl: WebGLRenderingContext, pipelineState: TWebGLPipelineState) {
335
+ const glCanvas = gl.canvas,
336
+ targetCanvas = pipelineState.targetCanvas,
337
+ ctx = targetCanvas.getContext('2d');
338
+ if (!ctx) {
339
+ return;
340
+ }
341
+ ctx.translate(0, targetCanvas.height); // move it down again
342
+ ctx.scale(1, -1); // vertical flip
343
+ // where is my image on the big glcanvas?
344
+ const sourceY = glCanvas.height - targetCanvas.height;
345
+ ctx.drawImage(
346
+ glCanvas,
347
+ 0,
348
+ sourceY,
349
+ targetCanvas.width,
350
+ targetCanvas.height,
351
+ 0,
352
+ 0,
353
+ targetCanvas.width,
354
+ targetCanvas.height
355
+ );
356
+ }
357
+
358
+ /**
359
+ * Attempt to extract GPU information strings from a WebGL context.
360
+ *
361
+ * Useful information when debugging or blacklisting specific GPUs.
362
+ *
363
+ * @returns {Object} A GPU info object with renderer and vendor strings.
364
+ */
365
+ captureGPUInfo() {
366
+ if (this.gpuInfo) {
367
+ return this.gpuInfo;
368
+ }
369
+ const gl = this.gl,
370
+ gpuInfo = { renderer: '', vendor: '' };
371
+ if (!gl) {
372
+ return gpuInfo;
373
+ }
374
+ const ext = gl.getExtension('WEBGL_debug_renderer_info');
375
+ if (ext) {
376
+ const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
377
+ const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
378
+ if (renderer) {
379
+ gpuInfo.renderer = renderer.toLowerCase();
380
+ }
381
+ if (vendor) {
382
+ gpuInfo.vendor = vendor.toLowerCase();
383
+ }
384
+ }
385
+ this.gpuInfo = gpuInfo;
386
+ return gpuInfo;
387
+ }
388
+ }
389
+
390
+ function resizeCanvasIfNeeded(pipelineState: TWebGLPipelineState): void {
391
+ const targetCanvas = pipelineState.targetCanvas,
392
+ width = targetCanvas.width,
393
+ height = targetCanvas.height,
394
+ dWidth = pipelineState.destinationWidth,
395
+ dHeight = pipelineState.destinationHeight;
396
+
397
+ if (width !== dWidth || height !== dHeight) {
398
+ targetCanvas.width = dWidth;
399
+ targetCanvas.height = dHeight;
400
+ }
401
+ }
402
+
403
+ /**
404
+ * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData
405
+ * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).
406
+ *
407
+ * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.
408
+ * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.
409
+ * @param {Object} pipelineState The 2D target canvas to copy on to.
410
+ */
411
+ function copyGLTo2DPutImageData(
412
+ this: Required<WebGLFilterBackend>,
413
+ gl: WebGLRenderingContext,
414
+ pipelineState: TWebGLPipelineState
415
+ ) {
416
+ const targetCanvas = pipelineState.targetCanvas,
417
+ ctx = targetCanvas.getContext('2d'),
418
+ dWidth = pipelineState.destinationWidth,
419
+ dHeight = pipelineState.destinationHeight,
420
+ numBytes = dWidth * dHeight * 4;
421
+ if (!ctx) {
422
+ return;
423
+ }
424
+ const u8 = new Uint8Array(this.imageBuffer, 0, numBytes);
425
+ const u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);
426
+
427
+ gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);
428
+ const imgData = new ImageData(u8Clamped, dWidth, dHeight);
429
+ ctx.putImageData(imgData, 0, 0);
430
+ }
@@ -0,0 +1,62 @@
1
+ import { getEnv } from '../env';
2
+ import { createCanvasElement } from '../util/misc/dom';
3
+
4
+ export enum WebGLPrecision {
5
+ low = 'lowp',
6
+ medium = 'mediump',
7
+ high = 'highp',
8
+ }
9
+
10
+ /**
11
+ * Lazy initialize WebGL constants
12
+ */
13
+ class WebGLProbe {
14
+ declare maxTextureSize?: number;
15
+
16
+ declare webGLPrecision: WebGLPrecision | undefined;
17
+
18
+ /**
19
+ * Tests if webgl supports certain precision
20
+ * @param {WebGL} Canvas WebGL context to test on
21
+ * @param {WebGLPrecision} Precision to test can be any of following
22
+ * @returns {Boolean} Whether the user's browser WebGL supports given precision.
23
+ */
24
+ private testPrecision(
25
+ gl: WebGLRenderingContext,
26
+ precision: WebGLPrecision
27
+ ): boolean {
28
+ const fragmentSource = `precision ${precision} float;\nvoid main(){}`;
29
+ const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
30
+ if (!fragmentShader) {
31
+ return false;
32
+ }
33
+ gl.shaderSource(fragmentShader, fragmentSource);
34
+ gl.compileShader(fragmentShader);
35
+ return !!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS);
36
+ }
37
+
38
+ /**
39
+ * query browser for WebGL
40
+ * @returns config object if true
41
+ */
42
+ queryWebGL() {
43
+ if (getEnv().isLikelyNode) {
44
+ return;
45
+ }
46
+ const canvas = createCanvasElement();
47
+ const gl = canvas.getContext('webgl');
48
+ if (gl) {
49
+ this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
50
+ this.webGLPrecision = Object.values(WebGLPrecision).find((precision) =>
51
+ this.testPrecision(gl, precision)
52
+ );
53
+ console.log(`fabric: max texture size ${this.maxTextureSize}`);
54
+ }
55
+ }
56
+
57
+ isSupported(textureSize: number) {
58
+ return this.maxTextureSize && this.maxTextureSize >= textureSize;
59
+ }
60
+ }
61
+
62
+ export const webGLProbe = new WebGLProbe();
@@ -0,0 +1,65 @@
1
+ import type { WebGLFilterBackend } from './WebGLFilterBackend';
2
+ import type { Canvas2dFilterBackend } from './Canvas2dFilterBackend';
3
+
4
+ export type TProgramCache = any;
5
+
6
+ export type TTextureCache = any;
7
+
8
+ export type TPipelineResources = {
9
+ blendImage?: HTMLCanvasElement;
10
+ blurLayer1?: HTMLCanvasElement;
11
+ blurLayer2?: HTMLCanvasElement;
12
+ } & Record<string, unknown>;
13
+
14
+ export type TWebGLPipelineState = {
15
+ filterBackend: WebGLFilterBackend;
16
+ originalWidth: number;
17
+ originalHeight: number;
18
+ sourceWidth: number;
19
+ sourceHeight: number;
20
+ destinationWidth: number;
21
+ destinationHeight: number;
22
+ context: WebGLRenderingContext;
23
+ sourceTexture: WebGLTexture | null;
24
+ targetTexture: WebGLTexture | null;
25
+ originalTexture: WebGLTexture;
26
+ passes: number;
27
+ webgl: boolean;
28
+ aPosition: Float32Array;
29
+ programCache: TProgramCache;
30
+ pass: number;
31
+ targetCanvas: HTMLCanvasElement;
32
+ };
33
+
34
+ export type T2DPipelineState = {
35
+ sourceWidth: number;
36
+ sourceHeight: number;
37
+ filterBackend: Canvas2dFilterBackend;
38
+ canvasEl: HTMLCanvasElement;
39
+ imageData: ImageData;
40
+ originalEl: CanvasImageSource;
41
+ originalImageData?: ImageData;
42
+ ctx: CanvasRenderingContext2D;
43
+ helpLayer?: HTMLCanvasElement;
44
+ };
45
+
46
+ export type TWebGLUniformLocationMap = Record<
47
+ string,
48
+ WebGLUniformLocation | null
49
+ >;
50
+
51
+ export type TWebGLAttributeLocationMap = Record<string, number>;
52
+
53
+ export type TWebGLProgramCacheItem = {
54
+ program: WebGLProgram;
55
+ attributeLocations: TWebGLAttributeLocationMap;
56
+ uniformLocations: TWebGLUniformLocationMap;
57
+ };
58
+
59
+ export type TApplyFilterArgs = {};
60
+
61
+ export const isWebGLPipelineState = (
62
+ options: TWebGLPipelineState | T2DPipelineState
63
+ ): options is TWebGLPipelineState => {
64
+ return (options as TWebGLPipelineState).webgl !== undefined;
65
+ };