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,300 @@
1
+ import { ModifierKey, TEvent } from '../EventTypeDefs';
2
+ import { Point } from '../Point';
3
+ import { Shadow } from '../Shadow';
4
+ import { Path } from '../shapes/Path';
5
+ import { PathData } from '../typedefs';
6
+ import { getSmoothPathFromPoints, joinPath } from '../util/path';
7
+ import type { Canvas } from '../canvas/Canvas';
8
+ import { BaseBrush } from './BaseBrush';
9
+
10
+ /**
11
+ * @private
12
+ * @param {PathData} pathData SVG path commands
13
+ * @returns {boolean}
14
+ */
15
+ function isEmptySVGPath(pathData: PathData): boolean {
16
+ return joinPath(pathData) === 'M 0 0 Q 0 0 0 0 L 0 0';
17
+ }
18
+
19
+ export class PencilBrush extends BaseBrush {
20
+ /**
21
+ * Discard points that are less than `decimate` pixel distant from each other
22
+ * @type Number
23
+ * @default 0.4
24
+ */
25
+ decimate = 0.4;
26
+
27
+ /**
28
+ * Draws a straight line between last recorded point to current pointer
29
+ * Used for `shift` functionality
30
+ *
31
+ * @type boolean
32
+ * @default false
33
+ */
34
+ drawStraightLine = false;
35
+
36
+ /**
37
+ * The event modifier key that makes the brush draw a straight line.
38
+ * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.
39
+ * @type {ModifierKey | undefined | null}
40
+ */
41
+ straightLineKey: ModifierKey | undefined | null = 'shiftKey';
42
+
43
+ private declare _points: Point[];
44
+ private declare _hasStraightLine: boolean;
45
+ private declare oldEnd?: Point;
46
+
47
+ constructor(canvas: Canvas) {
48
+ super(canvas);
49
+ this._points = [];
50
+ this._hasStraightLine = false;
51
+ }
52
+
53
+ needsFullRender() {
54
+ return super.needsFullRender() || this._hasStraightLine;
55
+ }
56
+
57
+ static drawSegment(ctx: CanvasRenderingContext2D, p1: Point, p2: Point) {
58
+ const midPoint = p1.midPointFrom(p2);
59
+ ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);
60
+ return midPoint;
61
+ }
62
+
63
+ /**
64
+ * Invoked on mouse down
65
+ * @param {Point} pointer
66
+ */
67
+ onMouseDown(pointer: Point, { e }: TEvent) {
68
+ if (!this.canvas._isMainEvent(e)) {
69
+ return;
70
+ }
71
+ this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];
72
+ this._prepareForDrawing(pointer);
73
+ // capture coordinates immediately
74
+ // this allows to draw dots (when movement never occurs)
75
+ this._addPoint(pointer);
76
+ this._render();
77
+ }
78
+
79
+ /**
80
+ * Invoked on mouse move
81
+ * @param {Point} pointer
82
+ */
83
+ onMouseMove(pointer: Point, { e }: TEvent) {
84
+ if (!this.canvas._isMainEvent(e)) {
85
+ return;
86
+ }
87
+ this.drawStraightLine = !!this.straightLineKey && e[this.straightLineKey];
88
+ if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {
89
+ return;
90
+ }
91
+ if (this._addPoint(pointer) && this._points.length > 1) {
92
+ if (this.needsFullRender()) {
93
+ // redraw curve
94
+ // clear top canvas
95
+ this.canvas.clearContext(this.canvas.contextTop);
96
+ this._render();
97
+ } else {
98
+ const points = this._points,
99
+ length = points.length,
100
+ ctx = this.canvas.contextTop;
101
+ // draw the curve update
102
+ this._saveAndTransform(ctx);
103
+ if (this.oldEnd) {
104
+ ctx.beginPath();
105
+ ctx.moveTo(this.oldEnd.x, this.oldEnd.y);
106
+ }
107
+ this.oldEnd = PencilBrush.drawSegment(
108
+ ctx,
109
+ points[length - 2],
110
+ points[length - 1]
111
+ );
112
+ ctx.stroke();
113
+ ctx.restore();
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Invoked on mouse up
120
+ */
121
+ onMouseUp({ e }: TEvent) {
122
+ if (!this.canvas._isMainEvent(e)) {
123
+ return true;
124
+ }
125
+ this.drawStraightLine = false;
126
+ this.oldEnd = undefined;
127
+ this._finalizeAndAddPath();
128
+ return false;
129
+ }
130
+
131
+ /**
132
+ * @private
133
+ * @param {Point} pointer Actual mouse position related to the canvas.
134
+ */
135
+ _prepareForDrawing(pointer: Point) {
136
+ this._reset();
137
+ this._addPoint(pointer);
138
+ this.canvas.contextTop.moveTo(pointer.x, pointer.y);
139
+ }
140
+
141
+ /**
142
+ * @private
143
+ * @param {Point} point Point to be added to points array
144
+ */
145
+ _addPoint(point: Point) {
146
+ if (
147
+ this._points.length > 1 &&
148
+ point.eq(this._points[this._points.length - 1])
149
+ ) {
150
+ return false;
151
+ }
152
+ if (this.drawStraightLine && this._points.length > 1) {
153
+ this._hasStraightLine = true;
154
+ this._points.pop();
155
+ }
156
+ this._points.push(point);
157
+ return true;
158
+ }
159
+
160
+ /**
161
+ * Clear points array and set contextTop canvas style.
162
+ * @private
163
+ */
164
+ _reset() {
165
+ this._points = [];
166
+ this._setBrushStyles(this.canvas.contextTop);
167
+ this._setShadow();
168
+ this._hasStraightLine = false;
169
+ }
170
+
171
+ /**
172
+ * Draw a smooth path on the topCanvas using quadraticCurveTo
173
+ * @private
174
+ * @param {CanvasRenderingContext2D} [ctx]
175
+ */
176
+ _render(ctx: CanvasRenderingContext2D = this.canvas.contextTop) {
177
+ let p1 = this._points[0],
178
+ p2 = this._points[1];
179
+ this._saveAndTransform(ctx);
180
+ ctx.beginPath();
181
+ //if we only have 2 points in the path and they are the same
182
+ //it means that the user only clicked the canvas without moving the mouse
183
+ //then we should be drawing a dot. A path isn't drawn between two identical dots
184
+ //that's why we set them apart a bit
185
+ if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {
186
+ const width = this.width / 1000;
187
+ p1.x -= width;
188
+ p2.x += width;
189
+ }
190
+ ctx.moveTo(p1.x, p1.y);
191
+
192
+ for (let i = 1; i < this._points.length; i++) {
193
+ // we pick the point between pi + 1 & pi + 2 as the
194
+ // end point and p1 as our control point.
195
+ PencilBrush.drawSegment(ctx, p1, p2);
196
+ p1 = this._points[i];
197
+ p2 = this._points[i + 1];
198
+ }
199
+ // Draw last line as a straight line while
200
+ // we wait for the next point to be able to calculate
201
+ // the bezier control point
202
+ ctx.lineTo(p1.x, p1.y);
203
+ ctx.stroke();
204
+ ctx.restore();
205
+ }
206
+
207
+ /**
208
+ * Converts points to SVG path
209
+ * @param {Array} points Array of points
210
+ * @return {PathData} SVG path commands
211
+ */
212
+ convertPointsToSVGPath(points: Point[]): PathData {
213
+ const correction = this.width / 1000;
214
+ return getSmoothPathFromPoints(points, correction);
215
+ }
216
+
217
+ /**
218
+ * Creates a Path object to add on canvas
219
+ * @param {PathData} pathData Path data
220
+ * @return {Path} Path to add on canvas
221
+ */
222
+ createPath(pathData: PathData) {
223
+ const path = new Path(pathData, {
224
+ fill: null,
225
+ stroke: this.color,
226
+ strokeWidth: this.width,
227
+ strokeLineCap: this.strokeLineCap,
228
+ strokeMiterLimit: this.strokeMiterLimit,
229
+ strokeLineJoin: this.strokeLineJoin,
230
+ strokeDashArray: this.strokeDashArray,
231
+ });
232
+ if (this.shadow) {
233
+ this.shadow.affectStroke = true;
234
+ path.shadow = new Shadow(this.shadow);
235
+ }
236
+
237
+ return path;
238
+ }
239
+
240
+ /**
241
+ * Decimate points array with the decimate value
242
+ */
243
+ decimatePoints(points: Point[], distance: number) {
244
+ if (points.length <= 2) {
245
+ return points;
246
+ }
247
+ let lastPoint = points[0],
248
+ cDistance;
249
+ const zoom = this.canvas.getZoom(),
250
+ adjustedDistance = Math.pow(distance / zoom, 2),
251
+ l = points.length - 1,
252
+ newPoints = [lastPoint];
253
+ for (let i = 1; i < l - 1; i++) {
254
+ cDistance =
255
+ Math.pow(lastPoint.x - points[i].x, 2) +
256
+ Math.pow(lastPoint.y - points[i].y, 2);
257
+ if (cDistance >= adjustedDistance) {
258
+ lastPoint = points[i];
259
+ newPoints.push(lastPoint);
260
+ }
261
+ }
262
+ // Add the last point from the original line to the end of the array.
263
+ // This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.
264
+ newPoints.push(points[l]);
265
+ return newPoints;
266
+ }
267
+
268
+ /**
269
+ * On mouseup after drawing the path on contextTop canvas
270
+ * we use the points captured to create an new Path object
271
+ * and add it to the canvas.
272
+ */
273
+ _finalizeAndAddPath() {
274
+ const ctx = this.canvas.contextTop;
275
+ ctx.closePath();
276
+ if (this.decimate) {
277
+ this._points = this.decimatePoints(this._points, this.decimate);
278
+ }
279
+ const pathData = this.convertPointsToSVGPath(this._points);
280
+ if (isEmptySVGPath(pathData)) {
281
+ // do not create 0 width/height paths, as they are
282
+ // rendered inconsistently across browsers
283
+ // Firefox 4, for example, renders a dot,
284
+ // whereas Chrome 10 renders nothing
285
+ this.canvas.requestRenderAll();
286
+ return;
287
+ }
288
+
289
+ const path = this.createPath(pathData);
290
+ this.canvas.clearContext(this.canvas.contextTop);
291
+ this.canvas.fire('before:path:created', { path: path });
292
+ this.canvas.add(path);
293
+ this.canvas.requestRenderAll();
294
+ path.setCoords();
295
+ this._resetShadow();
296
+
297
+ // fire event 'path' created
298
+ this.canvas.fire('path:created', { path: path });
299
+ }
300
+ }
@@ -0,0 +1,219 @@
1
+ import { Point } from '../Point';
2
+ import { Group } from '../shapes/Group';
3
+ import { Shadow } from '../Shadow';
4
+ import { Rect } from '../shapes/Rect';
5
+ import { getRandomInt } from '../util/internals';
6
+ import type { Canvas } from '../canvas/Canvas';
7
+ import { BaseBrush } from './BaseBrush';
8
+
9
+ export type SprayBrushPoint = {
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ opacity: number;
14
+ };
15
+
16
+ /**
17
+ *
18
+ * @param rects
19
+ * @returns
20
+ */
21
+ function getUniqueRects(rects: Rect[]) {
22
+ const uniqueRects: Record<string, boolean> = {};
23
+ const uniqueRectsArray: Rect[] = [];
24
+
25
+ for (let i = 0, key: string; i < rects.length; i++) {
26
+ key = `${rects[i].left}${rects[i].top}`;
27
+ if (!uniqueRects[key]) {
28
+ uniqueRects[key] = true;
29
+ uniqueRectsArray.push(rects[i]);
30
+ }
31
+ }
32
+
33
+ return uniqueRectsArray;
34
+ }
35
+
36
+ export class SprayBrush extends BaseBrush {
37
+ /**
38
+ * Width of a spray
39
+ * @type Number
40
+ * @default
41
+ */
42
+ width = 10;
43
+
44
+ /**
45
+ * Density of a spray (number of dots per chunk)
46
+ * @type Number
47
+ * @default
48
+ */
49
+ density = 20;
50
+
51
+ /**
52
+ * Width of spray dots
53
+ * @type Number
54
+ * @default
55
+ */
56
+ dotWidth = 1;
57
+
58
+ /**
59
+ * Width variance of spray dots
60
+ * @type Number
61
+ * @default
62
+ */
63
+ dotWidthVariance = 1;
64
+
65
+ /**
66
+ * Whether opacity of a dot should be random
67
+ * @type Boolean
68
+ * @default
69
+ */
70
+ randomOpacity = false;
71
+
72
+ /**
73
+ * Whether overlapping dots (rectangles) should be removed (for performance reasons)
74
+ * @type Boolean
75
+ * @default
76
+ */
77
+ optimizeOverlapping = true;
78
+
79
+ private declare sprayChunks: SprayBrushPoint[][];
80
+
81
+ private declare sprayChunk: SprayBrushPoint[];
82
+
83
+ /**
84
+ * Constructor
85
+ * @param {Canvas} canvas
86
+ * @return {SprayBrush} Instance of a spray brush
87
+ */
88
+ constructor(canvas: Canvas) {
89
+ super(canvas);
90
+ this.sprayChunks = [];
91
+ this.sprayChunk = [];
92
+ }
93
+
94
+ /**
95
+ * Invoked on mouse down
96
+ * @param {Point} pointer
97
+ */
98
+ onMouseDown(pointer: Point) {
99
+ this.sprayChunks = [];
100
+ this.canvas.clearContext(this.canvas.contextTop);
101
+ this._setShadow();
102
+
103
+ this.addSprayChunk(pointer);
104
+ this.renderChunck(this.sprayChunk);
105
+ }
106
+
107
+ /**
108
+ * Invoked on mouse move
109
+ * @param {Point} pointer
110
+ */
111
+ onMouseMove(pointer: Point) {
112
+ if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {
113
+ return;
114
+ }
115
+ this.addSprayChunk(pointer);
116
+ this.renderChunck(this.sprayChunk);
117
+ }
118
+
119
+ /**
120
+ * Invoked on mouse up
121
+ */
122
+ onMouseUp() {
123
+ const originalRenderOnAddRemove = this.canvas.renderOnAddRemove;
124
+ this.canvas.renderOnAddRemove = false;
125
+
126
+ const rects = [];
127
+
128
+ for (let i = 0; i < this.sprayChunks.length; i++) {
129
+ const sprayChunk = this.sprayChunks[i];
130
+ for (let j = 0; j < sprayChunk.length; j++) {
131
+ const chunck = sprayChunk[j];
132
+ const rect = new Rect({
133
+ width: chunck.width,
134
+ height: chunck.width,
135
+ left: chunck.x + 1,
136
+ top: chunck.y + 1,
137
+ originX: 'center',
138
+ originY: 'center',
139
+ fill: this.color,
140
+ });
141
+ rects.push(rect);
142
+ }
143
+ }
144
+
145
+ const group = new Group(
146
+ this.optimizeOverlapping ? getUniqueRects(rects) : rects,
147
+ {
148
+ objectCaching: true,
149
+ layout: 'fixed',
150
+ subTargetCheck: false,
151
+ interactive: false,
152
+ }
153
+ );
154
+ this.shadow && group.set('shadow', new Shadow(this.shadow));
155
+ this.canvas.fire('before:path:created', { path: group });
156
+ this.canvas.add(group);
157
+ this.canvas.fire('path:created', { path: group });
158
+
159
+ this.canvas.clearContext(this.canvas.contextTop);
160
+ this._resetShadow();
161
+ this.canvas.renderOnAddRemove = originalRenderOnAddRemove;
162
+ this.canvas.requestRenderAll();
163
+ }
164
+
165
+ renderChunck(sprayChunck: SprayBrushPoint[]) {
166
+ const ctx = this.canvas.contextTop;
167
+ ctx.fillStyle = this.color;
168
+
169
+ this._saveAndTransform(ctx);
170
+
171
+ for (let i = 0; i < sprayChunck.length; i++) {
172
+ const point = sprayChunck[i];
173
+ ctx.globalAlpha = point.opacity;
174
+ ctx.fillRect(point.x, point.y, point.width, point.width);
175
+ }
176
+
177
+ ctx.restore();
178
+ }
179
+
180
+ /**
181
+ * Render all spray chunks
182
+ */
183
+ _render() {
184
+ const ctx = this.canvas.contextTop;
185
+ ctx.fillStyle = this.color;
186
+
187
+ this._saveAndTransform(ctx);
188
+
189
+ for (let i = 0; i < this.sprayChunks.length; i++) {
190
+ this.renderChunck(this.sprayChunks[i]);
191
+ }
192
+ ctx.restore();
193
+ }
194
+
195
+ /**
196
+ * @param {Point} pointer
197
+ */
198
+ addSprayChunk(pointer: Point) {
199
+ this.sprayChunk = [];
200
+ const radius = this.width / 2;
201
+
202
+ for (let i = 0; i < this.density; i++) {
203
+ this.sprayChunk.push({
204
+ x: getRandomInt(pointer.x - radius, pointer.x + radius),
205
+ y: getRandomInt(pointer.y - radius, pointer.y + radius),
206
+ width: this.dotWidthVariance
207
+ ? getRandomInt(
208
+ // bottom clamp width to 1
209
+ Math.max(1, this.dotWidth - this.dotWidthVariance),
210
+ this.dotWidth + this.dotWidthVariance
211
+ )
212
+ : this.dotWidth,
213
+ opacity: this.randomOpacity ? getRandomInt(0, 100) / 100 : 1,
214
+ });
215
+ }
216
+
217
+ this.sprayChunks.push(this.sprayChunk);
218
+ }
219
+ }
package/src/cache.ts ADDED
@@ -0,0 +1,89 @@
1
+ import { config } from './config';
2
+
3
+ export class Cache {
4
+ /**
5
+ * Cache of widths of chars in text rendering.
6
+ */
7
+ charWidthsCache: Record<
8
+ /** fontFamily */ string,
9
+ Record<
10
+ /** fontStyleCacheKey */ string,
11
+ Record</** char */ string, /** width */ number>
12
+ >
13
+ > = {};
14
+
15
+ /**
16
+ * @return {Object} reference to cache
17
+ */
18
+ getFontCache({
19
+ fontFamily,
20
+ fontStyle,
21
+ fontWeight,
22
+ }: {
23
+ fontFamily: string;
24
+ fontStyle: string;
25
+ fontWeight: string | number;
26
+ }) {
27
+ fontFamily = fontFamily.toLowerCase();
28
+ if (!this.charWidthsCache[fontFamily]) {
29
+ this.charWidthsCache[fontFamily] = {};
30
+ }
31
+ const fontCache = this.charWidthsCache[fontFamily];
32
+ const cacheKey = `${fontStyle.toLowerCase()}_${(
33
+ fontWeight + ''
34
+ ).toLowerCase()}`;
35
+ if (!fontCache[cacheKey]) {
36
+ fontCache[cacheKey] = {};
37
+ }
38
+ return fontCache[cacheKey];
39
+ }
40
+
41
+ /**
42
+ * Clear char widths cache for the given font family or all the cache if no
43
+ * fontFamily is specified.
44
+ * Use it if you know you are loading fonts in a lazy way and you are not waiting
45
+ * for custom fonts to load properly when adding text objects to the canvas.
46
+ * If a text object is added when its own font is not loaded yet, you will get wrong
47
+ * measurement and so wrong bounding boxes.
48
+ * After the font cache is cleared, either change the textObject text content or call
49
+ * initDimensions() to trigger a recalculation
50
+ * @param {String} [fontFamily] font family to clear
51
+ */
52
+ clearFontCache(fontFamily?: string) {
53
+ fontFamily = (fontFamily || '').toLowerCase();
54
+ if (!fontFamily) {
55
+ this.charWidthsCache = {};
56
+ } else if (this.charWidthsCache[fontFamily]) {
57
+ delete this.charWidthsCache[fontFamily];
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Given current aspect ratio, determines the max width and height that can
63
+ * respect the total allowed area for the cache.
64
+ * @param {number} ar aspect ratio
65
+ * @return {number[]} Limited dimensions X and Y
66
+ */
67
+ limitDimsByArea(ar: number) {
68
+ const { perfLimitSizeTotal } = config;
69
+ const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);
70
+ // we are not returning a point on purpose, to avoid circular dependencies
71
+ // this is an internal utility
72
+ return [
73
+ Math.floor(roughWidth),
74
+ Math.floor(perfLimitSizeTotal / roughWidth),
75
+ ];
76
+ }
77
+
78
+ /**
79
+ * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.
80
+ * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing
81
+ * you do not get any speed benefit and you get a big object in memory.
82
+ * The object was a private variable before, while now is appended to the lib so that you have access to it and you
83
+ * can eventually clear it.
84
+ * It was an internal variable, is accessible since version 2.3.4
85
+ */
86
+ boundsOfCurveCache = {};
87
+ }
88
+
89
+ export const cache = new Cache();