fabric 5.3.0-browser → 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 +142 -88
  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,273 @@
1
+ import { Point } from './Point';
2
+
3
+ /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */
4
+
5
+ export type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';
6
+
7
+ /**
8
+ * **Assuming `T`, `A`, `B` are points on the same line**,
9
+ * check if `T` is contained in `[A, B]` by comparing the direction of the vectors from `T` to `A` and `B`
10
+ * @param T
11
+ * @param A
12
+ * @param B
13
+ * @returns true if `T` is contained
14
+ */
15
+ const isContainedInInterval = (T: Point, A: Point, B: Point) => {
16
+ const TA = new Point(T).subtract(A);
17
+ const TB = new Point(T).subtract(B);
18
+ return (
19
+ Math.sign(TA.x) !== Math.sign(TB.x) || Math.sign(TA.y) !== Math.sign(TB.y)
20
+ );
21
+ };
22
+
23
+ export class Intersection {
24
+ declare points: Point[];
25
+
26
+ declare status?: IntersectionType;
27
+
28
+ constructor(status?: IntersectionType) {
29
+ this.status = status;
30
+ this.points = [];
31
+ }
32
+
33
+ /**
34
+ * Used to verify if a point is alredy in the collection
35
+ * @param {Point} point
36
+ * @returns {boolean}
37
+ */
38
+ private includes(point: Point): boolean {
39
+ return this.points.some((p) => p.eq(point));
40
+ }
41
+
42
+ /**
43
+ * Appends points of intersection
44
+ * @param {...Point[]} points
45
+ * @return {Intersection} thisArg
46
+ * @chainable
47
+ */
48
+ private append(...points: Point[]): Intersection {
49
+ this.points = this.points.concat(
50
+ points.filter((point) => {
51
+ return !this.includes(point);
52
+ })
53
+ );
54
+ return this;
55
+ }
56
+
57
+ /**
58
+ * Checks if a line intersects another
59
+ * @static
60
+ * @param {Point} a1
61
+ * @param {Point} a2
62
+ * @param {Point} b1
63
+ * @param {Point} b2
64
+ * @param {boolean} [aInfinite=true] check segment intersection by passing `false`
65
+ * @param {boolean} [bInfinite=true] check segment intersection by passing `false`
66
+ * @return {Intersection}
67
+ */
68
+ static intersectLineLine(
69
+ a1: Point,
70
+ a2: Point,
71
+ b1: Point,
72
+ b2: Point,
73
+ aInfinite = true,
74
+ bInfinite = true
75
+ ): Intersection {
76
+ const b2xb1x = b2.x - b1.x,
77
+ a1yb1y = a1.y - b1.y,
78
+ b2yb1y = b2.y - b1.y,
79
+ a1xb1x = a1.x - b1.x,
80
+ a2ya1y = a2.y - a1.y,
81
+ a2xa1x = a2.x - a1.x,
82
+ uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,
83
+ ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,
84
+ uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;
85
+ if (uB !== 0) {
86
+ const ua = uaT / uB,
87
+ ub = ubT / uB;
88
+ if (
89
+ (aInfinite || (0 <= ua && ua <= 1)) &&
90
+ (bInfinite || (0 <= ub && ub <= 1))
91
+ ) {
92
+ return new Intersection('Intersection').append(
93
+ new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y)
94
+ );
95
+ } else {
96
+ return new Intersection();
97
+ }
98
+ } else {
99
+ if (uaT === 0 || ubT === 0) {
100
+ const segmentsCoincide =
101
+ aInfinite ||
102
+ bInfinite ||
103
+ isContainedInInterval(a1, b1, b2) ||
104
+ isContainedInInterval(a2, b1, b2) ||
105
+ isContainedInInterval(b1, a1, a2) ||
106
+ isContainedInInterval(b2, a1, a2);
107
+ return new Intersection(segmentsCoincide ? 'Coincident' : undefined);
108
+ } else {
109
+ return new Intersection('Parallel');
110
+ }
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Checks if a segment intersects a line
116
+ * @see {@link intersectLineLine} for line intersection
117
+ * @static
118
+ * @param {Point} s1 boundary point of segment
119
+ * @param {Point} s2 other boundary point of segment
120
+ * @param {Point} l1 point on line
121
+ * @param {Point} l2 other point on line
122
+ * @return {Intersection}
123
+ */
124
+ static intersectSegmentLine(
125
+ s1: Point,
126
+ s2: Point,
127
+ l1: Point,
128
+ l2: Point
129
+ ): Intersection {
130
+ return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);
131
+ }
132
+
133
+ /**
134
+ * Checks if a segment intersects another
135
+ * @see {@link intersectLineLine} for line intersection
136
+ * @static
137
+ * @param {Point} a1 boundary point of segment
138
+ * @param {Point} a2 other boundary point of segment
139
+ * @param {Point} b1 boundary point of segment
140
+ * @param {Point} b2 other boundary point of segment
141
+ * @return {Intersection}
142
+ */
143
+ static intersectSegmentSegment(
144
+ a1: Point,
145
+ a2: Point,
146
+ b1: Point,
147
+ b2: Point
148
+ ): Intersection {
149
+ return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);
150
+ }
151
+
152
+ /**
153
+ * Checks if line intersects polygon
154
+ *
155
+ * @todo account for stroke
156
+ *
157
+ * @static
158
+ * @see {@link intersectSegmentPolygon} for segment intersection
159
+ * @param {Point} a1 point on line
160
+ * @param {Point} a2 other point on line
161
+ * @param {Point[]} points polygon points
162
+ * @param {boolean} [infinite=true] check segment intersection by passing `false`
163
+ * @return {Intersection}
164
+ */
165
+ static intersectLinePolygon(
166
+ a1: Point,
167
+ a2: Point,
168
+ points: Point[],
169
+ infinite = true
170
+ ): Intersection {
171
+ const result = new Intersection();
172
+ const length = points.length;
173
+
174
+ for (let i = 0, b1, b2, inter; i < length; i++) {
175
+ b1 = points[i];
176
+ b2 = points[(i + 1) % length];
177
+ inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);
178
+ if (inter.status === 'Coincident') {
179
+ return inter;
180
+ }
181
+ result.append(...inter.points);
182
+ }
183
+
184
+ if (result.points.length > 0) {
185
+ result.status = 'Intersection';
186
+ }
187
+
188
+ return result;
189
+ }
190
+
191
+ /**
192
+ * Checks if segment intersects polygon
193
+ * @static
194
+ * @see {@link intersectLinePolygon} for line intersection
195
+ * @param {Point} a1 boundary point of segment
196
+ * @param {Point} a2 other boundary point of segment
197
+ * @param {Point[]} points polygon points
198
+ * @return {Intersection}
199
+ */
200
+ static intersectSegmentPolygon(
201
+ a1: Point,
202
+ a2: Point,
203
+ points: Point[]
204
+ ): Intersection {
205
+ return Intersection.intersectLinePolygon(a1, a2, points, false);
206
+ }
207
+
208
+ /**
209
+ * Checks if polygon intersects another polygon
210
+ *
211
+ * @todo account for stroke
212
+ *
213
+ * @static
214
+ * @param {Point[]} points1
215
+ * @param {Point[]} points2
216
+ * @return {Intersection}
217
+ */
218
+ static intersectPolygonPolygon(
219
+ points1: Point[],
220
+ points2: Point[]
221
+ ): Intersection {
222
+ const result = new Intersection(),
223
+ length = points1.length;
224
+ const coincidences = [];
225
+
226
+ for (let i = 0; i < length; i++) {
227
+ const a1 = points1[i],
228
+ a2 = points1[(i + 1) % length],
229
+ inter = Intersection.intersectSegmentPolygon(a1, a2, points2);
230
+ if (inter.status === 'Coincident') {
231
+ coincidences.push(inter);
232
+ result.append(a1, a2);
233
+ } else {
234
+ result.append(...inter.points);
235
+ }
236
+ }
237
+
238
+ if (coincidences.length > 0 && coincidences.length === points1.length) {
239
+ return new Intersection('Coincident');
240
+ } else if (result.points.length > 0) {
241
+ result.status = 'Intersection';
242
+ }
243
+
244
+ return result;
245
+ }
246
+
247
+ /**
248
+ * Checks if polygon intersects rectangle
249
+ * @static
250
+ * @see {@link intersectPolygonPolygon} for polygon intersection
251
+ * @param {Point[]} points polygon points
252
+ * @param {Point} r1 top left point of rect
253
+ * @param {Point} r2 bottom right point of rect
254
+ * @return {Intersection}
255
+ */
256
+ static intersectPolygonRectangle(
257
+ points: Point[],
258
+ r1: Point,
259
+ r2: Point
260
+ ): Intersection {
261
+ const min = r1.min(r2),
262
+ max = r1.max(r2),
263
+ topRight = new Point(max.x, min.y),
264
+ bottomLeft = new Point(min.x, max.y);
265
+
266
+ return Intersection.intersectPolygonPolygon(points, [
267
+ min,
268
+ topRight,
269
+ max,
270
+ bottomLeft,
271
+ ]);
272
+ }
273
+ }
@@ -0,0 +1,175 @@
1
+ export type TEventCallback<T = any> = (options: T) => any;
2
+
3
+ type EventRegistryObject<
4
+ K extends string | number | symbol = string,
5
+ E = any
6
+ > = Record<K, TEventCallback<E>>;
7
+
8
+ /**
9
+ * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}
10
+ * @see {@link http://fabricjs.com/events|Events demo}
11
+ */
12
+ export class Observable<EventSpec> {
13
+ private __eventListeners: Record<keyof EventSpec, TEventCallback[]> =
14
+ {} as Record<keyof EventSpec, TEventCallback[]>;
15
+
16
+ /**
17
+ * Observes specified event
18
+ * @alias on
19
+ * @param {string} eventName Event name (eg. 'after:render')
20
+ * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
21
+ * @param {Function} handler Function that receives a notification when an event of the specified type occurs
22
+ * @return {Function} disposer
23
+ */
24
+ on<K extends keyof EventSpec, E extends EventSpec[K]>(
25
+ eventName: K,
26
+ handler: TEventCallback<E>
27
+ ): VoidFunction;
28
+ on<K extends string, E>(
29
+ eventName: K,
30
+ handler: TEventCallback<E>
31
+ ): VoidFunction;
32
+ on<K extends keyof EventSpec, E extends EventSpec[K]>(
33
+ handlers: EventRegistryObject<K, E>
34
+ ): VoidFunction;
35
+ on<K extends keyof EventSpec, E extends EventSpec[K]>(
36
+ arg0: K | EventRegistryObject<K, E>,
37
+ handler?: TEventCallback<E>
38
+ ): VoidFunction {
39
+ if (!this.__eventListeners) {
40
+ this.__eventListeners = {} as Record<keyof EventSpec, TEventCallback[]>;
41
+ }
42
+ if (typeof arg0 === 'object') {
43
+ // one object with key/value pairs was passed
44
+ for (const eventName in arg0) {
45
+ this.on(eventName as K, arg0[eventName]);
46
+ }
47
+ return () => this.off(arg0);
48
+ } else if (handler) {
49
+ const eventName = arg0;
50
+ if (!this.__eventListeners[eventName]) {
51
+ this.__eventListeners[eventName] = [];
52
+ }
53
+ this.__eventListeners[eventName].push(handler);
54
+ return () => this.off(eventName, handler);
55
+ } else {
56
+ // noop
57
+ return () => false;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Observes specified event **once**
63
+ * @alias once
64
+ * @param {string} eventName Event name (eg. 'after:render')
65
+ * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
66
+ * @param {Function} handler Function that receives a notification when an event of the specified type occurs
67
+ * @return {Function} disposer
68
+ */
69
+ once<K extends keyof EventSpec, E extends EventSpec[K]>(
70
+ eventName: K,
71
+ handler: TEventCallback<E>
72
+ ): VoidFunction;
73
+ once<K extends string, E>(
74
+ eventName: K,
75
+ handler: TEventCallback<E>
76
+ ): VoidFunction;
77
+ once<K extends keyof EventSpec, E extends EventSpec[K]>(
78
+ handlers: EventRegistryObject<K, E>
79
+ ): VoidFunction;
80
+ once<K extends keyof EventSpec, E extends EventSpec[K]>(
81
+ arg0: K | EventRegistryObject<K, E>,
82
+ handler?: TEventCallback<E>
83
+ ): VoidFunction {
84
+ if (typeof arg0 === 'object') {
85
+ // one object with key/value pairs was passed
86
+ const disposers: VoidFunction[] = [];
87
+ for (const eventName in arg0) {
88
+ disposers.push(this.once(eventName as K, arg0[eventName]));
89
+ }
90
+ return () => disposers.forEach((d) => d());
91
+ } else if (handler) {
92
+ const disposer = this.on<K, E>(arg0, (...args) => {
93
+ handler(...args);
94
+ disposer();
95
+ });
96
+ return disposer;
97
+ } else {
98
+ // noop
99
+ return () => false;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * @private
105
+ * @param {string} eventName
106
+ * @param {Function} [handler]
107
+ */
108
+ private _removeEventListener<K extends keyof EventSpec>(
109
+ eventName: K,
110
+ handler?: TEventCallback
111
+ ) {
112
+ if (!this.__eventListeners[eventName]) {
113
+ return;
114
+ }
115
+
116
+ if (handler) {
117
+ const eventListener = this.__eventListeners[eventName];
118
+ const index = eventListener.indexOf(handler);
119
+ index > -1 && eventListener.splice(index, 1);
120
+ } else {
121
+ this.__eventListeners[eventName] = [];
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Stops event observing for a particular event handler. Calling this method
127
+ * without arguments removes all handlers for all events
128
+ * @param {string} eventName Event name (eg. 'after:render')
129
+ * @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
130
+ * @param {Function} handler Function to be deleted from EventListeners
131
+ */
132
+ off<K extends keyof EventSpec>(eventName: K, handler: TEventCallback): void;
133
+ off(handlers: EventRegistryObject): void;
134
+ off<K extends keyof EventSpec>(
135
+ arg0?: K | EventRegistryObject,
136
+ handler?: TEventCallback
137
+ ) {
138
+ if (!this.__eventListeners) {
139
+ return;
140
+ }
141
+
142
+ // remove all key/value pairs (event name -> event handler)
143
+ if (typeof arg0 === 'undefined') {
144
+ for (const eventName in this.__eventListeners) {
145
+ this._removeEventListener(eventName);
146
+ }
147
+ }
148
+ // one object with key/value pairs was passed
149
+ else if (typeof arg0 === 'object') {
150
+ for (const eventName in arg0) {
151
+ this._removeEventListener(eventName as K, arg0[eventName]);
152
+ }
153
+ } else {
154
+ this._removeEventListener(arg0, handler);
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Fires event with an optional options object
160
+ * @param {String} eventName Event name to fire
161
+ * @param {Object} [options] Options object
162
+ */
163
+ fire<K extends keyof EventSpec>(eventName: K, options?: EventSpec[K]) {
164
+ if (!this.__eventListeners) {
165
+ return;
166
+ }
167
+
168
+ const listenersForEvent = this.__eventListeners[eventName]?.concat();
169
+ if (listenersForEvent) {
170
+ for (let i = 0; i < listenersForEvent.length; i++) {
171
+ listenersForEvent[i].call(this, options || {});
172
+ }
173
+ }
174
+ }
175
+ }
package/src/Pattern.ts ADDED
@@ -0,0 +1,211 @@
1
+ import { config } from './config';
2
+ import { TCrossOrigin, TMat2D, TSize } from './typedefs';
3
+ import { ifNaN } from './util/internals';
4
+ import { uid } from './util/internals/uid';
5
+ import { loadImage } from './util/misc/objectEnlive';
6
+ import { pick } from './util/misc/pick';
7
+ import { toFixed } from './util/misc/toFixed';
8
+ import { classRegistry } from './util/class_registry';
9
+
10
+ export type TPatternRepeat = 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat';
11
+
12
+ type TExportedKeys =
13
+ | 'crossOrigin'
14
+ | 'offsetX'
15
+ | 'offsetY'
16
+ | 'patternTransform'
17
+ | 'repeat'
18
+ | 'source';
19
+
20
+ export type TPatternOptions = Partial<Pick<Pattern, TExportedKeys>>;
21
+
22
+ export type TPatternSerialized = TPatternOptions & {
23
+ source: string;
24
+ };
25
+
26
+ export type TPatternHydrationOptions = {
27
+ /**
28
+ * handle aborting
29
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
30
+ */
31
+ signal?: AbortSignal;
32
+ };
33
+
34
+ type TImageSource = { source: HTMLImageElement };
35
+ type TCanvasSource = { source: HTMLCanvasElement };
36
+
37
+ /**
38
+ * @see {@link http://fabricjs.com/patterns demo}
39
+ * @see {@link http://fabricjs.com/dynamic-patterns demo}
40
+ */
41
+ export class Pattern {
42
+ type = 'pattern';
43
+
44
+ /**
45
+ * @type TPatternRepeat
46
+ * @defaults
47
+ */
48
+ repeat: TPatternRepeat = 'repeat';
49
+
50
+ /**
51
+ * Pattern horizontal offset from object's left/top corner
52
+ * @type Number
53
+ * @default
54
+ */
55
+ offsetX = 0;
56
+
57
+ /**
58
+ * Pattern vertical offset from object's left/top corner
59
+ * @type Number
60
+ * @default
61
+ */
62
+ offsetY = 0;
63
+
64
+ /**
65
+ * @type TCrossOrigin
66
+ * @default
67
+ */
68
+ crossOrigin: TCrossOrigin = '';
69
+
70
+ /**
71
+ * transform matrix to change the pattern, imported from svgs.
72
+ * @todo verify if using the identity matrix as default makes the rest of the code more easy
73
+ * @type Array
74
+ * @default
75
+ */
76
+ patternTransform: TMat2D | null = null;
77
+
78
+ /**
79
+ * The actual pixel source of the pattern
80
+ */
81
+ declare source: CanvasImageSource;
82
+
83
+ /**
84
+ * If true, this object will not be exported during the serialization of a canvas
85
+ * @type boolean
86
+ */
87
+ declare excludeFromExport?: boolean;
88
+
89
+ /**
90
+ * ID used for SVG export functionalities
91
+ * @type number
92
+ */
93
+ declare readonly id: number;
94
+
95
+ /**
96
+ * Constructor
97
+ * @param {Object} [options] Options object
98
+ * @param {option.source} [source] the pattern source, eventually empty or a drawable
99
+ */
100
+ constructor(options: TPatternOptions = {}) {
101
+ this.id = uid();
102
+ Object.assign(this, options);
103
+ }
104
+
105
+ /**
106
+ * @returns true if {@link source} is an <img> element
107
+ */
108
+ isImageSource(): this is TImageSource {
109
+ return (
110
+ !!this.source && typeof (this.source as HTMLImageElement).src === 'string'
111
+ );
112
+ }
113
+
114
+ /**
115
+ * @returns true if {@link source} is a <canvas> element
116
+ */
117
+ isCanvasSource(): this is TCanvasSource {
118
+ return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;
119
+ }
120
+
121
+ sourceToString(): string {
122
+ return this.isImageSource()
123
+ ? this.source.src
124
+ : this.isCanvasSource()
125
+ ? this.source.toDataURL()
126
+ : '';
127
+ }
128
+
129
+ /**
130
+ * Returns an instance of CanvasPattern
131
+ * @param {CanvasRenderingContext2D} ctx Context to create pattern
132
+ * @return {CanvasPattern}
133
+ */
134
+ toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {
135
+ if (
136
+ // if the image failed to load, return, and allow rest to continue loading
137
+ !this.source ||
138
+ // if an image
139
+ (this.isImageSource() &&
140
+ (!this.source.complete ||
141
+ this.source.naturalWidth === 0 ||
142
+ this.source.naturalHeight === 0))
143
+ ) {
144
+ return null;
145
+ }
146
+
147
+ return ctx.createPattern(this.source, this.repeat)!;
148
+ }
149
+
150
+ /**
151
+ * Returns object representation of a pattern
152
+ * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
153
+ * @return {object} Object representation of a pattern instance
154
+ */
155
+ toObject(propertiesToInclude: string[] = []): Record<string, any> {
156
+ const { repeat, crossOrigin } = this;
157
+ return {
158
+ ...pick(this, propertiesToInclude as (keyof this)[]),
159
+ type: 'pattern',
160
+ source: this.sourceToString(),
161
+ repeat,
162
+ crossOrigin,
163
+ offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),
164
+ offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),
165
+ patternTransform: this.patternTransform
166
+ ? [...this.patternTransform]
167
+ : null,
168
+ };
169
+ }
170
+
171
+ /* _TO_SVG_START_ */
172
+ /**
173
+ * Returns SVG representation of a pattern
174
+ */
175
+ toSVG({ width, height }: TSize): string {
176
+ const { source: patternSource, repeat, id } = this,
177
+ patternOffsetX = ifNaN(this.offsetX / width, 0),
178
+ patternOffsetY = ifNaN(this.offsetY / height, 0),
179
+ patternWidth =
180
+ repeat === 'repeat-y' || repeat === 'no-repeat'
181
+ ? 1 + Math.abs(patternOffsetX || 0)
182
+ : ifNaN((patternSource.width as number) / width, 0),
183
+ patternHeight =
184
+ repeat === 'repeat-x' || repeat === 'no-repeat'
185
+ ? 1 + Math.abs(patternOffsetY || 0)
186
+ : ifNaN((patternSource.height as number) / height, 0);
187
+
188
+ return [
189
+ `<pattern id="SVGID_${id}" x="${patternOffsetX}" y="${patternOffsetY}" width="${patternWidth}" height="${patternHeight}">`,
190
+ `<image x="0" y="0" width="${patternSource.width}" height="${
191
+ patternSource.height
192
+ }" xlink:href="${this.sourceToString()}"></image>`,
193
+ `</pattern>`,
194
+ '',
195
+ ].join('\n');
196
+ }
197
+ /* _TO_SVG_END_ */
198
+
199
+ static async fromObject(
200
+ { source, ...serialized }: TPatternSerialized,
201
+ options: TPatternHydrationOptions
202
+ ): Promise<Pattern> {
203
+ const img = await loadImage(source, {
204
+ ...options,
205
+ crossOrigin: serialized.crossOrigin,
206
+ });
207
+ return new this({ ...serialized, source: img });
208
+ }
209
+ }
210
+
211
+ classRegistry.setClass(Pattern, 'pattern');