fabric 5.3.0 → 6.0.0-beta3

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 (604) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintignore +3 -0
  5. package/.eslintrc.js +43 -0
  6. package/.eslintrc.json +38 -46
  7. package/.eslintrc_tests +12 -0
  8. package/.gitattributes +2 -0
  9. package/.gitpod.yml +17 -1
  10. package/.prettierignore +19 -0
  11. package/.prettierrc +4 -0
  12. package/CHANGELOG.md +532 -189
  13. package/CONTRIBUTING.md +224 -59
  14. package/README.md +200 -235
  15. package/bower.json +1 -3
  16. package/dist/fabric.d.ts +42 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +27582 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index.min.js +1 -0
  21. package/dist/index.mjs +27519 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/index.node.cjs +27663 -0
  24. package/dist/index.node.cjs.map +1 -0
  25. package/dist/index.node.d.ts +14 -0
  26. package/dist/index.node.mjs +27606 -0
  27. package/dist/index.node.mjs.map +1 -0
  28. package/dist/src/ClassRegistry.d.ts +13 -0
  29. package/dist/src/Collection.d.ts +136 -0
  30. package/dist/src/CommonMethods.d.ts +32 -0
  31. package/dist/src/EventTypeDefs.d.ts +227 -0
  32. package/dist/src/Intersection.d.ts +112 -0
  33. package/dist/src/Observable.d.ts +60 -0
  34. package/dist/src/Pattern.d.ts +113 -0
  35. package/dist/src/Point.d.ts +232 -0
  36. package/dist/src/Shadow.d.ts +97 -0
  37. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  38. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  39. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  40. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  41. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  42. package/dist/src/cache.d.ts +47 -0
  43. package/dist/src/canvas/Canvas.d.ts +548 -0
  44. package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
  45. package/dist/src/canvas/StaticCanvas.d.ts +778 -0
  46. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  47. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  48. package/dist/src/color/Color.d.ts +174 -0
  49. package/dist/src/color/color_map.d.ts +155 -0
  50. package/dist/src/color/constants.d.ts +22 -0
  51. package/dist/src/color/util.d.ts +12 -0
  52. package/dist/src/config.d.ts +115 -0
  53. package/dist/src/constants.d.ts +14 -0
  54. package/dist/src/controls/Control.d.ts +228 -0
  55. package/dist/src/controls/changeWidth.d.ts +13 -0
  56. package/dist/src/controls/commonControls.d.ts +28 -0
  57. package/dist/src/controls/controlRendering.d.ts +29 -0
  58. package/dist/src/controls/drag.d.ts +12 -0
  59. package/dist/src/controls/index.d.ts +13 -0
  60. package/dist/src/controls/polyControl.d.ts +5 -0
  61. package/dist/src/controls/rotate.d.ts +12 -0
  62. package/dist/src/controls/scale.d.ts +47 -0
  63. package/dist/src/controls/scaleSkew.d.ts +39 -0
  64. package/dist/src/controls/skew.d.ts +33 -0
  65. package/dist/src/controls/util.d.ts +41 -0
  66. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  67. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  68. package/dist/src/env/browser.d.ts +3 -0
  69. package/dist/src/env/index.d.ts +15 -0
  70. package/dist/src/env/node.d.ts +5 -0
  71. package/dist/src/env/types.d.ts +15 -0
  72. package/dist/src/filters/BaseFilter.d.ts +153 -0
  73. package/dist/src/filters/BlendColor.d.ts +80 -0
  74. package/dist/src/filters/BlendImage.d.ts +92 -0
  75. package/dist/src/filters/Blur.d.ts +51 -0
  76. package/dist/src/filters/Boilerplate.d.ts +48 -0
  77. package/dist/src/filters/Brightness.d.ts +47 -0
  78. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  79. package/dist/src/filters/ColorMatrix.d.ts +63 -0
  80. package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
  81. package/dist/src/filters/Composed.d.ts +45 -0
  82. package/dist/src/filters/Contrast.d.ts +45 -0
  83. package/dist/src/filters/Convolute.d.ts +82 -0
  84. package/dist/src/filters/FilterBackend.d.ts +14 -0
  85. package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
  86. package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
  87. package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
  88. package/dist/src/filters/Gamma.d.ts +54 -0
  89. package/dist/src/filters/Grayscale.d.ts +46 -0
  90. package/dist/src/filters/HueRotation.d.ts +24 -0
  91. package/dist/src/filters/Invert.d.ts +55 -0
  92. package/dist/src/filters/Noise.d.ts +54 -0
  93. package/dist/src/filters/Pixelate.d.ts +44 -0
  94. package/dist/src/filters/RemoveColor.d.ts +63 -0
  95. package/dist/src/filters/Resize.d.ts +136 -0
  96. package/dist/src/filters/Saturation.d.ts +48 -0
  97. package/dist/src/filters/Vibrance.d.ts +48 -0
  98. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  99. package/dist/src/filters/filters.d.ts +21 -0
  100. package/dist/src/filters/index.d.ts +5 -0
  101. package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
  102. package/dist/src/filters/shaders/blendColor.d.ts +13 -0
  103. package/dist/src/filters/shaders/blendImage.d.ts +3 -0
  104. package/dist/src/filters/shaders/blur.d.ts +2 -0
  105. package/dist/src/filters/shaders/brightness.d.ts +2 -0
  106. package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
  107. package/dist/src/filters/shaders/constrast.d.ts +2 -0
  108. package/dist/src/filters/shaders/convolute.d.ts +11 -0
  109. package/dist/src/filters/shaders/gamma.d.ts +2 -0
  110. package/dist/src/filters/shaders/grayscale.d.ts +3 -0
  111. package/dist/src/filters/shaders/invert.d.ts +2 -0
  112. package/dist/src/filters/shaders/noise.d.ts +2 -0
  113. package/dist/src/filters/shaders/pixelate.d.ts +2 -0
  114. package/dist/src/filters/shaders/removeColor.d.ts +2 -0
  115. package/dist/src/filters/shaders/saturation.d.ts +2 -0
  116. package/dist/src/filters/shaders/vibrance.d.ts +2 -0
  117. package/dist/src/filters/typedefs.d.ts +49 -0
  118. package/dist/src/gradient/Gradient.d.ts +149 -0
  119. package/dist/src/gradient/constants.d.ts +15 -0
  120. package/dist/src/gradient/parser/index.d.ts +4 -0
  121. package/dist/src/gradient/parser/misc.d.ts +4 -0
  122. package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
  123. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  124. package/dist/src/gradient/typedefs.d.ts +93 -0
  125. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  126. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  127. package/dist/src/parkinglot/straighten.d.ts +2 -0
  128. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  129. package/dist/src/parser/attributes.d.ts +6 -0
  130. package/dist/src/parser/constants.d.ts +53 -0
  131. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  132. package/dist/src/parser/elementById.d.ts +6 -0
  133. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  134. package/dist/src/parser/elements_parser.d.ts +3 -0
  135. package/dist/src/parser/getCSSRules.d.ts +7 -0
  136. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  137. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  138. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  139. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  140. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  141. package/dist/src/parser/index.d.ts +10 -0
  142. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  143. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  144. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  145. package/dist/src/parser/normalizeValue.d.ts +2 -0
  146. package/dist/src/parser/parseAttributes.d.ts +9 -0
  147. package/dist/src/parser/parseElements.d.ts +11 -0
  148. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  149. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  150. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  151. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  152. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  153. package/dist/src/parser/parseStyleString.d.ts +2 -0
  154. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  155. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  156. package/dist/src/parser/percent.d.ts +9 -0
  157. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  158. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  159. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  160. package/dist/src/parser/selectorMatches.d.ts +2 -0
  161. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  162. package/dist/src/parser/skewMatrix.d.ts +2 -0
  163. package/dist/src/parser/translateMatrix.d.ts +2 -0
  164. package/dist/src/shapes/ActiveSelection.d.ts +82 -0
  165. package/dist/src/shapes/Circle.d.ts +99 -0
  166. package/dist/src/shapes/Ellipse.d.ts +84 -0
  167. package/dist/src/shapes/Group.d.ts +408 -0
  168. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  169. package/dist/src/shapes/IText/IText.d.ts +335 -0
  170. package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
  171. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
  172. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
  173. package/dist/src/shapes/IText/constants.d.ts +13 -0
  174. package/dist/src/shapes/Image.d.ts +311 -0
  175. package/dist/src/shapes/Line.d.ts +126 -0
  176. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  177. package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
  178. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  179. package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
  180. package/dist/src/shapes/Object/Object.d.ts +594 -0
  181. package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
  182. package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
  183. package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
  184. package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
  185. package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
  186. package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
  187. package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
  188. package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
  189. package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
  190. package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
  191. package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
  192. package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
  193. package/dist/src/shapes/Object/types/index.d.ts +6 -0
  194. package/dist/src/shapes/Path.d.ts +130 -0
  195. package/dist/src/shapes/Polygon.d.ts +9 -0
  196. package/dist/src/shapes/Polyline.d.ts +140 -0
  197. package/dist/src/shapes/Rect.d.ts +76 -0
  198. package/dist/src/shapes/Text/StyledText.d.ts +119 -0
  199. package/dist/src/shapes/Text/Text.d.ts +673 -0
  200. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  201. package/dist/src/shapes/Text/constants.d.ts +7 -0
  202. package/dist/src/shapes/Textbox.d.ts +185 -0
  203. package/dist/src/shapes/Triangle.d.ts +25 -0
  204. package/dist/src/typedefs.d.ts +90 -0
  205. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  206. package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
  207. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  208. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  209. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  210. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  211. package/dist/src/util/animation/animate.d.ts +37 -0
  212. package/dist/src/util/animation/easing.d.ts +130 -0
  213. package/dist/src/util/animation/types.d.ts +87 -0
  214. package/dist/src/util/applyMixins.d.ts +8 -0
  215. package/dist/src/util/dom_event.d.ts +5 -0
  216. package/dist/src/util/dom_misc.d.ts +39 -0
  217. package/dist/src/util/dom_request.d.ts +14 -0
  218. package/dist/src/util/dom_style.d.ts +7 -0
  219. package/dist/src/util/fireEvent.d.ts +3 -0
  220. package/dist/src/util/index.d.ts +35 -0
  221. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  222. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  223. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  224. package/dist/src/util/internals/index.d.ts +4 -0
  225. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  226. package/dist/src/util/internals/uid.d.ts +2 -0
  227. package/dist/src/util/lang_string.d.ts +22 -0
  228. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  229. package/dist/src/util/misc/capValue.d.ts +2 -0
  230. package/dist/src/util/misc/cos.d.ts +10 -0
  231. package/dist/src/util/misc/dom.d.ts +28 -0
  232. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  233. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  234. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  235. package/dist/src/util/misc/matrix.d.ts +92 -0
  236. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  237. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  238. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  239. package/dist/src/util/misc/pick.d.ts +9 -0
  240. package/dist/src/util/misc/planeChange.d.ts +84 -0
  241. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  242. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  243. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  244. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  245. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  246. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  247. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  248. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  249. package/dist/src/util/misc/sin.d.ts +10 -0
  250. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  251. package/dist/src/util/misc/textStyles.d.ts +32 -0
  252. package/dist/src/util/misc/toFixed.d.ts +8 -0
  253. package/dist/src/util/misc/vectors.d.ts +57 -0
  254. package/dist/src/util/path/index.d.ts +96 -0
  255. package/dist/src/util/path/regex.d.ts +3 -0
  256. package/dist/src/util/path/typechecks.d.ts +24 -0
  257. package/dist/src/util/path/typedefs.d.ts +220 -0
  258. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  259. package/dist/src/util/types.d.ts +19 -0
  260. package/fabric.ts +51 -0
  261. package/index.node.ts +37 -0
  262. package/index.ts +1 -0
  263. package/package.json +100 -40
  264. package/publish.js +0 -26
  265. package/rollup.config.mjs +91 -0
  266. package/rollup.test.config.js +24 -0
  267. package/scripts/build.mjs +50 -0
  268. package/scripts/buildLock.mjs +115 -0
  269. package/scripts/buildReporter.mjs +15 -0
  270. package/scripts/buildStats.mjs +139 -0
  271. package/scripts/dirname.mjs +14 -0
  272. package/scripts/git.mjs +36 -0
  273. package/scripts/index.mjs +564 -0
  274. package/scripts/sandbox.mjs +149 -0
  275. package/src/ClassRegistry.ts +56 -0
  276. package/src/Collection.ts +346 -0
  277. package/src/CommonMethods.ts +63 -0
  278. package/src/EventTypeDefs.ts +296 -0
  279. package/src/Intersection.ts +302 -0
  280. package/src/Observable.ts +181 -0
  281. package/src/Pattern.ts +227 -0
  282. package/src/Point.ts +388 -0
  283. package/src/Shadow.ts +214 -0
  284. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  285. package/src/brushes/CircleBrush.ts +145 -0
  286. package/src/brushes/PatternBrush.ts +70 -0
  287. package/src/brushes/PencilBrush.ts +300 -0
  288. package/src/brushes/SprayBrush.ts +219 -0
  289. package/src/cache.ts +90 -0
  290. package/src/canvas/Canvas.ts +1607 -0
  291. package/src/canvas/SelectableCanvas.ts +1608 -0
  292. package/src/canvas/StaticCanvas.ts +1734 -0
  293. package/src/canvas/TextEditingManager.ts +48 -0
  294. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  295. package/src/color/Color.ts +404 -0
  296. package/src/color/color_map.ts +154 -0
  297. package/src/color/constants.ts +26 -0
  298. package/src/color/util.ts +32 -0
  299. package/src/config.ts +159 -0
  300. package/src/constants.ts +20 -0
  301. package/src/controls/Control.ts +380 -0
  302. package/src/controls/changeWidth.ts +52 -0
  303. package/src/controls/commonControls.ts +105 -0
  304. package/src/controls/controlRendering.ts +138 -0
  305. package/src/controls/drag.ts +31 -0
  306. package/src/controls/index.ts +22 -0
  307. package/src/controls/polyControl.ts +135 -0
  308. package/src/controls/rotate.ts +87 -0
  309. package/src/controls/scale.ts +277 -0
  310. package/src/controls/scaleSkew.ts +92 -0
  311. package/src/controls/skew.ts +242 -0
  312. package/src/controls/util.ts +154 -0
  313. package/src/controls/wrapWithFireEvent.ts +25 -0
  314. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  315. package/src/env/browser.ts +32 -0
  316. package/src/env/index.ts +24 -0
  317. package/src/env/node.ts +56 -0
  318. package/src/env/types.ts +15 -0
  319. package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
  320. package/src/filters/BlendColor.ts +217 -0
  321. package/src/filters/BlendImage.ts +228 -0
  322. package/src/filters/Blur.ts +179 -0
  323. package/src/filters/Boilerplate.ts +94 -0
  324. package/src/filters/Brightness.ts +83 -0
  325. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  326. package/src/filters/ColorMatrix.ts +145 -0
  327. package/src/filters/ColorMatrixFilters.ts +77 -0
  328. package/src/filters/Composed.ts +76 -0
  329. package/src/filters/Contrast.ts +82 -0
  330. package/src/filters/Convolute.ts +184 -0
  331. package/src/filters/FilterBackend.ts +34 -0
  332. package/src/filters/GLProbes/GLProbe.ts +11 -0
  333. package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
  334. package/src/filters/GLProbes/WebGLProbe.ts +46 -0
  335. package/src/filters/Gamma.ts +110 -0
  336. package/src/filters/Grayscale.ts +102 -0
  337. package/src/filters/HueRotation.ts +62 -0
  338. package/src/filters/Invert.ts +99 -0
  339. package/src/filters/Noise.ts +94 -0
  340. package/src/filters/Pixelate.ts +96 -0
  341. package/src/filters/RemoveColor.ts +135 -0
  342. package/src/filters/Resize.ts +538 -0
  343. package/src/filters/Saturation.ts +87 -0
  344. package/src/filters/Vibrance.ts +88 -0
  345. package/src/filters/WebGLFilterBackend.ts +430 -0
  346. package/src/filters/filters.ts +28 -0
  347. package/src/filters/index.ts +5 -0
  348. package/src/filters/shaders/baseFilter.ts +19 -0
  349. package/src/filters/shaders/blendColor.ts +33 -0
  350. package/src/filters/shaders/blendImage.ts +32 -0
  351. package/src/filters/shaders/blur.ts +24 -0
  352. package/src/filters/shaders/brightness.ts +11 -0
  353. package/src/filters/shaders/colorMatrix.ts +12 -0
  354. package/src/filters/shaders/constrast.ts +11 -0
  355. package/src/filters/shaders/convolute.ts +154 -0
  356. package/src/filters/shaders/gamma.ts +15 -0
  357. package/src/filters/shaders/grayscale.ts +36 -0
  358. package/src/filters/shaders/invert.ts +19 -0
  359. package/src/filters/shaders/noise.ts +16 -0
  360. package/src/filters/shaders/pixelate.ts +19 -0
  361. package/src/filters/shaders/removeColor.ts +13 -0
  362. package/src/filters/shaders/saturation.ts +15 -0
  363. package/src/filters/shaders/vibrance.ts +16 -0
  364. package/src/filters/typedefs.ts +65 -0
  365. package/src/gradient/Gradient.ts +406 -0
  366. package/src/gradient/constants.ts +12 -0
  367. package/src/gradient/parser/index.ts +3 -0
  368. package/src/gradient/parser/misc.ts +13 -0
  369. package/src/gradient/parser/parseColorStops.ts +56 -0
  370. package/src/gradient/parser/parseCoords.ts +73 -0
  371. package/src/gradient/typedefs.ts +104 -0
  372. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  373. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  374. package/src/parkinglot/straighten.ts +58 -0
  375. package/src/parser/applyViewboxTransform.ts +157 -0
  376. package/src/parser/attributes.ts +25 -0
  377. package/src/parser/constants.ts +115 -0
  378. package/src/parser/doesSomeParentMatch.ts +19 -0
  379. package/src/parser/elementById.ts +21 -0
  380. package/src/parser/elementMatchesRule.ts +16 -0
  381. package/src/parser/elements_parser.ts +191 -0
  382. package/src/parser/getCSSRules.ts +62 -0
  383. package/src/parser/getGlobalStylesForElement.ts +19 -0
  384. package/src/parser/getGradientDefs.ts +31 -0
  385. package/src/parser/getMultipleNodes.ts +15 -0
  386. package/src/parser/getSvgRegex.ts +5 -0
  387. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  388. package/src/parser/index.ts +9 -0
  389. package/src/parser/loadSVGFromString.ts +26 -0
  390. package/src/parser/loadSVGFromURL.ts +40 -0
  391. package/src/parser/normalizeAttr.ts +10 -0
  392. package/src/parser/normalizeValue.ts +63 -0
  393. package/src/parser/parseAttributes.ts +90 -0
  394. package/src/parser/parseElements.ts +28 -0
  395. package/src/parser/parseFontDeclaration.ts +44 -0
  396. package/src/parser/parsePointsAttribute.ts +34 -0
  397. package/src/parser/parseSVGDocument.ts +93 -0
  398. package/src/parser/parseStyleAttribute.ts +27 -0
  399. package/src/parser/parseStyleObject.ts +15 -0
  400. package/src/parser/parseStyleString.ts +16 -0
  401. package/src/parser/parseTransformAttribute.ts +155 -0
  402. package/src/parser/parseUseDirectives.ts +78 -0
  403. package/src/parser/percent.ts +27 -0
  404. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  405. package/src/parser/rotateMatrix.ts +21 -0
  406. package/src/parser/scaleMatrix.ts +9 -0
  407. package/src/parser/selectorMatches.ts +25 -0
  408. package/src/parser/setStrokeFillOpacity.ts +40 -0
  409. package/src/parser/skewMatrix.ts +6 -0
  410. package/src/parser/translateMatrix.ts +8 -0
  411. package/src/shapes/ActiveSelection.ts +189 -0
  412. package/src/shapes/Circle.ts +242 -0
  413. package/src/shapes/Ellipse.ts +179 -0
  414. package/src/shapes/Group.ts +1100 -0
  415. package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
  416. package/src/shapes/IText/IText.ts +693 -0
  417. package/src/shapes/IText/ITextBehavior.ts +1064 -0
  418. package/src/shapes/IText/ITextClickBehavior.ts +325 -0
  419. package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
  420. package/src/shapes/IText/constants.ts +47 -0
  421. package/src/shapes/Image.ts +841 -0
  422. package/src/shapes/Line.ts +346 -0
  423. package/src/shapes/Object/AnimatableObject.ts +106 -0
  424. package/src/shapes/Object/FabricObject.ts +29 -0
  425. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  426. package/src/shapes/Object/InteractiveObject.ts +672 -0
  427. package/src/shapes/Object/Object.ts +1561 -0
  428. package/src/shapes/Object/ObjectGeometry.ts +813 -0
  429. package/src/shapes/Object/ObjectOrigin.ts +276 -0
  430. package/src/shapes/Object/StackedObject.ts +206 -0
  431. package/src/shapes/Object/defaultValues.ts +108 -0
  432. package/src/shapes/Object/types/BaseProps.ts +96 -0
  433. package/src/shapes/Object/types/BorderProps.ts +40 -0
  434. package/src/shapes/Object/types/ControlProps.ts +69 -0
  435. package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
  436. package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
  437. package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
  438. package/src/shapes/Object/types/ObjectProps.ts +46 -0
  439. package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
  440. package/src/shapes/Object/types/index.ts +8 -0
  441. package/src/shapes/Path.ts +416 -0
  442. package/src/shapes/Polygon.ts +20 -0
  443. package/src/shapes/Polyline.ts +359 -0
  444. package/src/shapes/Rect.ts +233 -0
  445. package/src/shapes/Text/StyledText.ts +329 -0
  446. package/src/shapes/Text/Text.ts +1884 -0
  447. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  448. package/src/shapes/Text/constants.ts +91 -0
  449. package/src/shapes/Textbox.ts +477 -0
  450. package/src/shapes/Triangle.ts +60 -0
  451. package/src/typedefs.ts +115 -0
  452. package/src/util/animation/AnimationBase.ts +166 -0
  453. package/src/util/animation/AnimationFrameProvider.ts +9 -0
  454. package/src/util/animation/AnimationRegistry.ts +58 -0
  455. package/src/util/animation/ArrayAnimation.ts +27 -0
  456. package/src/util/animation/ColorAnimation.ts +74 -0
  457. package/src/util/animation/ValueAnimation.ts +29 -0
  458. package/src/util/animation/animate.ts +74 -0
  459. package/src/util/animation/easing.ts +327 -0
  460. package/src/util/animation/types.ts +136 -0
  461. package/src/util/applyMixins.ts +22 -0
  462. package/src/util/dom_event.ts +28 -0
  463. package/src/util/dom_misc.ts +121 -0
  464. package/src/util/dom_request.ts +64 -0
  465. package/src/util/dom_style.ts +20 -0
  466. package/src/util/fireEvent.ts +15 -0
  467. package/src/util/index.ts +102 -0
  468. package/src/util/internals/cloneDeep.ts +2 -0
  469. package/src/util/internals/getRandomInt.ts +8 -0
  470. package/src/util/internals/ifNaN.ts +9 -0
  471. package/src/util/internals/index.ts +3 -0
  472. package/src/util/internals/removeFromArray.ts +14 -0
  473. package/src/util/internals/uid.ts +3 -0
  474. package/src/util/lang_string.ts +79 -0
  475. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  476. package/src/util/misc/capValue.ts +2 -0
  477. package/src/util/misc/cos.ts +24 -0
  478. package/src/util/misc/dom.ts +50 -0
  479. package/src/util/misc/findScaleTo.ts +44 -0
  480. package/src/util/misc/groupSVGElements.ts +15 -0
  481. package/src/util/misc/isTransparent.ts +28 -0
  482. package/src/util/misc/matrix.ts +207 -0
  483. package/src/util/misc/mergeClipPaths.ts +40 -0
  484. package/src/util/misc/objectEnlive.ts +189 -0
  485. package/src/util/misc/objectTransforms.ts +129 -0
  486. package/src/util/misc/pick.ts +29 -0
  487. package/src/util/misc/planeChange.ts +136 -0
  488. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  489. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +226 -0
  490. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  491. package/src/util/misc/projectStroke/index.ts +53 -0
  492. package/src/util/misc/projectStroke/types.ts +24 -0
  493. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  494. package/src/util/misc/resolveOrigin.ts +22 -0
  495. package/src/util/misc/rotatePoint.ts +15 -0
  496. package/src/util/misc/sin.ts +26 -0
  497. package/src/util/misc/svgParsing.ts +181 -0
  498. package/src/util/misc/textStyles.ts +134 -0
  499. package/src/util/misc/toFixed.ts +8 -0
  500. package/src/util/misc/vectors.ts +82 -0
  501. package/src/util/path/index.ts +1038 -0
  502. package/src/util/path/regex.ts +41 -0
  503. package/src/util/path/typechecks.ts +145 -0
  504. package/src/util/path/typedefs.ts +305 -0
  505. package/src/util/transform_matrix_removal.ts +60 -0
  506. package/src/util/types.ts +78 -0
  507. package/tsconfig.json +106 -0
  508. package/HEADER.js +0 -203
  509. package/build.js +0 -287
  510. package/dist/fabric.js +0 -31187
  511. package/dist/fabric.min.js +0 -1
  512. package/old-travis-reference.yml +0 -97
  513. package/src/brushes/circle_brush.class.js +0 -144
  514. package/src/brushes/pattern_brush.class.js +0 -61
  515. package/src/brushes/pencil_brush.class.js +0 -310
  516. package/src/brushes/spray_brush.class.js +0 -219
  517. package/src/canvas.class.js +0 -1312
  518. package/src/color.class.js +0 -636
  519. package/src/control.class.js +0 -339
  520. package/src/controls.actions.js +0 -740
  521. package/src/controls.render.js +0 -99
  522. package/src/elements_parser.js +0 -152
  523. package/src/filters/2d_backend.class.js +0 -65
  524. package/src/filters/blendcolor_filter.class.js +0 -251
  525. package/src/filters/blendimage_filter.class.js +0 -247
  526. package/src/filters/blur_filter.class.js +0 -217
  527. package/src/filters/brightness_filter.class.js +0 -113
  528. package/src/filters/colormatrix_filter.class.js +0 -159
  529. package/src/filters/composed_filter.class.js +0 -72
  530. package/src/filters/contrast_filter.class.js +0 -113
  531. package/src/filters/convolute_filter.class.js +0 -352
  532. package/src/filters/filter_boilerplate.js +0 -111
  533. package/src/filters/filter_generator.js +0 -85
  534. package/src/filters/gamma_filter.class.js +0 -136
  535. package/src/filters/grayscale_filter.class.js +0 -154
  536. package/src/filters/hue_rotation.class.js +0 -107
  537. package/src/filters/invert_filter.class.js +0 -111
  538. package/src/filters/noise_filter.class.js +0 -134
  539. package/src/filters/pixelate_filter.class.js +0 -137
  540. package/src/filters/removecolor_filter.class.js +0 -173
  541. package/src/filters/resize_filter.class.js +0 -490
  542. package/src/filters/saturate_filter.class.js +0 -119
  543. package/src/filters/vibrance_filter.class.js +0 -122
  544. package/src/filters/webgl_backend.class.js +0 -396
  545. package/src/globalFabric.js +0 -4
  546. package/src/gradient.class.js +0 -490
  547. package/src/intersection.class.js +0 -172
  548. package/src/log.js +0 -11
  549. package/src/mixins/animation.mixin.js +0 -231
  550. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  551. package/src/mixins/canvas_events.mixin.js +0 -974
  552. package/src/mixins/canvas_gestures.mixin.js +0 -149
  553. package/src/mixins/canvas_grouping.mixin.js +0 -177
  554. package/src/mixins/canvas_serialization.mixin.js +0 -228
  555. package/src/mixins/collection.mixin.js +0 -170
  556. package/src/mixins/default_controls.js +0 -114
  557. package/src/mixins/itext.svg_export.js +0 -241
  558. package/src/mixins/itext_behavior.mixin.js +0 -940
  559. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  560. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  561. package/src/mixins/object.svg_export.js +0 -258
  562. package/src/mixins/object_geometry.mixin.js +0 -683
  563. package/src/mixins/object_interactivity.mixin.js +0 -314
  564. package/src/mixins/object_origin.mixin.js +0 -255
  565. package/src/mixins/object_stacking.mixin.js +0 -80
  566. package/src/mixins/object_straightening.mixin.js +0 -80
  567. package/src/mixins/observable.mixin.js +0 -141
  568. package/src/mixins/shared_methods.mixin.js +0 -94
  569. package/src/mixins/stateful.mixin.js +0 -107
  570. package/src/mixins/text_style.mixin.js +0 -324
  571. package/src/parser.js +0 -1090
  572. package/src/pattern.class.js +0 -189
  573. package/src/point.class.js +0 -337
  574. package/src/shadow.class.js +0 -195
  575. package/src/shapes/active_selection.class.js +0 -155
  576. package/src/shapes/circle.class.js +0 -210
  577. package/src/shapes/ellipse.class.js +0 -181
  578. package/src/shapes/group.class.js +0 -593
  579. package/src/shapes/image.class.js +0 -764
  580. package/src/shapes/itext.class.js +0 -526
  581. package/src/shapes/line.class.js +0 -324
  582. package/src/shapes/object.class.js +0 -2008
  583. package/src/shapes/path.class.js +0 -384
  584. package/src/shapes/polygon.class.js +0 -81
  585. package/src/shapes/polyline.class.js +0 -268
  586. package/src/shapes/rect.class.js +0 -187
  587. package/src/shapes/text.class.js +0 -1696
  588. package/src/shapes/textbox.class.js +0 -461
  589. package/src/shapes/triangle.class.js +0 -93
  590. package/src/static_canvas.class.js +0 -1881
  591. package/src/util/anim_ease.js +0 -398
  592. package/src/util/animate.js +0 -254
  593. package/src/util/animate_color.js +0 -74
  594. package/src/util/dom_event.js +0 -50
  595. package/src/util/dom_misc.js +0 -300
  596. package/src/util/dom_request.js +0 -54
  597. package/src/util/dom_style.js +0 -70
  598. package/src/util/lang_array.js +0 -94
  599. package/src/util/lang_class.js +0 -115
  600. package/src/util/lang_object.js +0 -75
  601. package/src/util/lang_string.js +0 -110
  602. package/src/util/misc.js +0 -1330
  603. package/src/util/named_accessors.mixin.js +0 -428
  604. 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 { getSmoothPathFromPoints, joinPath } from '../util/path';
6
+ import type { Canvas } from '../canvas/Canvas';
7
+ import { BaseBrush } from './BaseBrush';
8
+ import { TSimplePathData } from '../util/path/typedefs';
9
+
10
+ /**
11
+ * @private
12
+ * @param {TSimplePathData} pathData SVG path commands
13
+ * @returns {boolean}
14
+ */
15
+ function isEmptySVGPath(pathData: TSimplePathData): 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 {Point[]} points Array of points
210
+ * @return {TSimplePathData} SVG path commands
211
+ */
212
+ convertPointsToSVGPath(points: Point[]): TSimplePathData {
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 {TSimplePathData} pathData Path data
220
+ * @return {Path} Path to add on canvas
221
+ */
222
+ createPath(pathData: TSimplePathData): Path {
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: Rect[] = [];
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,90 @@
1
+ import { config } from './config';
2
+ import { TRectBounds } from './typedefs';
3
+
4
+ export class Cache {
5
+ /**
6
+ * Cache of widths of chars in text rendering.
7
+ */
8
+ charWidthsCache: Record<
9
+ /** fontFamily */ string,
10
+ Record<
11
+ /** fontStyleCacheKey */ string,
12
+ Record</** char */ string, /** width */ number>
13
+ >
14
+ > = {};
15
+
16
+ /**
17
+ * @return {Object} reference to cache
18
+ */
19
+ getFontCache({
20
+ fontFamily,
21
+ fontStyle,
22
+ fontWeight,
23
+ }: {
24
+ fontFamily: string;
25
+ fontStyle: string;
26
+ fontWeight: string | number;
27
+ }) {
28
+ fontFamily = fontFamily.toLowerCase();
29
+ if (!this.charWidthsCache[fontFamily]) {
30
+ this.charWidthsCache[fontFamily] = {};
31
+ }
32
+ const fontCache = this.charWidthsCache[fontFamily];
33
+ const cacheKey = `${fontStyle.toLowerCase()}_${(
34
+ fontWeight + ''
35
+ ).toLowerCase()}`;
36
+ if (!fontCache[cacheKey]) {
37
+ fontCache[cacheKey] = {};
38
+ }
39
+ return fontCache[cacheKey];
40
+ }
41
+
42
+ /**
43
+ * Clear char widths cache for the given font family or all the cache if no
44
+ * fontFamily is specified.
45
+ * Use it if you know you are loading fonts in a lazy way and you are not waiting
46
+ * for custom fonts to load properly when adding text objects to the canvas.
47
+ * If a text object is added when its own font is not loaded yet, you will get wrong
48
+ * measurement and so wrong bounding boxes.
49
+ * After the font cache is cleared, either change the textObject text content or call
50
+ * initDimensions() to trigger a recalculation
51
+ * @param {String} [fontFamily] font family to clear
52
+ */
53
+ clearFontCache(fontFamily?: string) {
54
+ fontFamily = (fontFamily || '').toLowerCase();
55
+ if (!fontFamily) {
56
+ this.charWidthsCache = {};
57
+ } else if (this.charWidthsCache[fontFamily]) {
58
+ delete this.charWidthsCache[fontFamily];
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Given current aspect ratio, determines the max width and height that can
64
+ * respect the total allowed area for the cache.
65
+ * @param {number} ar aspect ratio
66
+ * @return {number[]} Limited dimensions X and Y
67
+ */
68
+ limitDimsByArea(ar: number) {
69
+ const { perfLimitSizeTotal } = config;
70
+ const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);
71
+ // we are not returning a point on purpose, to avoid circular dependencies
72
+ // this is an internal utility
73
+ return [
74
+ Math.floor(roughWidth),
75
+ Math.floor(perfLimitSizeTotal / roughWidth),
76
+ ];
77
+ }
78
+
79
+ /**
80
+ * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.
81
+ * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing
82
+ * you do not get any speed benefit and you get a big object in memory.
83
+ * The object was a private variable before, while now is appended to the lib so that you have access to it and you
84
+ * can eventually clear it.
85
+ * It was an internal variable, is accessible since version 2.3.4
86
+ */
87
+ boundsOfCurveCache: Record<string, TRectBounds> = {};
88
+ }
89
+
90
+ export const cache = new Cache();