fabric 5.3.0-browser → 6.0.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +142 -88
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -0,0 +1,136 @@
1
+ import { iMatrix } from '../../constants';
2
+ import type { Point } from '../../Point';
3
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
4
+ import type { TMat2D } from '../../typedefs';
5
+ import type { StaticCanvas } from '../../canvas/StaticCanvas';
6
+ import { invertTransform, multiplyTransformMatrices } from './matrix';
7
+ import { applyTransformToObject } from './objectTransforms';
8
+
9
+ export const enum ObjectRelation {
10
+ sibling = 'sibling',
11
+ child = 'child',
12
+ }
13
+
14
+ /**
15
+ * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\
16
+ * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)
17
+ * @param [from]
18
+ * @param [to]
19
+ * @returns
20
+ */
21
+ export const calcPlaneChangeMatrix = (
22
+ from: TMat2D = iMatrix,
23
+ to: TMat2D = iMatrix
24
+ ) => multiplyTransformMatrices(invertTransform(to), from);
25
+
26
+ /**
27
+ * Sends a point from the source coordinate plane to the destination coordinate plane.\
28
+ * From the canvas/viewer's perspective the point remains unchanged.
29
+ *
30
+ * @example <caption>Send point from canvas plane to group plane</caption>
31
+ * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });
32
+ * var group = new Group([obj], { strokeWidth: 0 });
33
+ * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());
34
+ * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());
35
+ * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group
36
+ *
37
+ * @see {transformPointRelativeToCanvas} for transforming relative to canvas
38
+ * @param {Point} point
39
+ * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.
40
+ * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.
41
+ * @returns {Point} transformed point
42
+ */
43
+ export const sendPointToPlane = (
44
+ point: Point,
45
+ from: TMat2D = iMatrix,
46
+ to: TMat2D = iMatrix
47
+ ): Point =>
48
+ // we are actually looking for the transformation from the destination plane to the source plane (which is a linear mapping)
49
+ // the object will exist on the destination plane and we want it to seem unchanged by it so we reverse the destination matrix (to) and then apply the source matrix (from)
50
+ point.transform(calcPlaneChangeMatrix(from, to));
51
+
52
+ /**
53
+ * Transform point relative to canvas.
54
+ * From the viewport/viewer's perspective the point remains unchanged.
55
+ *
56
+ * `child` relation means `point` exists in the coordinate plane created by `canvas`.
57
+ * In other words point is measured according to canvas' top left corner
58
+ * meaning that if `point` is equal to (0,0) it is positioned at canvas' top left corner.
59
+ *
60
+ * `sibling` relation means `point` exists in the same coordinate plane as canvas.
61
+ * In other words they both relate to the same (0,0) and agree on every point, which is how an event relates to canvas.
62
+ *
63
+ * @param {Point} point
64
+ * @param {StaticCanvas} canvas
65
+ * @param {'sibling'|'child'} relationBefore current relation of point to canvas
66
+ * @param {'sibling'|'child'} relationAfter desired relation of point to canvas
67
+ * @returns {Point} transformed point
68
+ */
69
+ export const transformPointRelativeToCanvas = (
70
+ point: Point,
71
+ canvas: StaticCanvas,
72
+ relationBefore: ObjectRelation,
73
+ relationAfter: ObjectRelation
74
+ ): Point => {
75
+ // is this still needed with TS?
76
+ if (
77
+ relationBefore !== ObjectRelation.child &&
78
+ relationBefore !== ObjectRelation.sibling
79
+ ) {
80
+ throw new Error(`fabric.js: received bad argument ${relationBefore}`);
81
+ }
82
+ if (
83
+ relationAfter !== ObjectRelation.child &&
84
+ relationAfter !== ObjectRelation.sibling
85
+ ) {
86
+ throw new Error(`fabric.js: received bad argument ${relationAfter}`);
87
+ }
88
+ if (relationBefore === relationAfter) {
89
+ return point;
90
+ }
91
+ const t = canvas.viewportTransform;
92
+ return point.transform(relationAfter === 'child' ? invertTransform(t) : t);
93
+ };
94
+
95
+ /**
96
+ *
97
+ * A util that abstracts applying transform to objects.\
98
+ * Sends `object` to the destination coordinate plane by applying the relevant transformations.\
99
+ * Changes the space/plane where `object` is drawn.\
100
+ * From the canvas/viewer's perspective `object` remains unchanged.
101
+ *
102
+ * @example <caption>Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer</caption>
103
+ * let obj, obj2;
104
+ * let clipPath = new Circle({ radius: 50 });
105
+ * obj.clipPath = clipPath;
106
+ * // render
107
+ * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());
108
+ * obj.clipPath = undefined;
109
+ * obj2.clipPath = clipPath;
110
+ * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer
111
+ *
112
+ * @example <caption>Clip an object's clip path with an existing object</caption>
113
+ * let obj, existingObj;
114
+ * let clipPath = new Circle({ radius: 50 });
115
+ * obj.clipPath = clipPath;
116
+ * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());
117
+ * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);
118
+ * clipPath.clipPath = existingObj;
119
+ *
120
+ * @param {FabricObject} object
121
+ * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.
122
+ * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.
123
+ * @returns {Matrix} the transform matrix that was applied to `object`
124
+ */
125
+ export const sendObjectToPlane = (
126
+ object: FabricObject,
127
+ from?: TMat2D,
128
+ to?: TMat2D
129
+ ): TMat2D => {
130
+ const t = calcPlaneChangeMatrix(from, to);
131
+ applyTransformToObject(
132
+ object,
133
+ multiplyTransformMatrices(t, object.calcOwnMatrix())
134
+ );
135
+ return t;
136
+ };
@@ -0,0 +1,112 @@
1
+ import { IPoint, Point } from '../../../Point';
2
+ import { createVector, getOrthonormalVector, getUnitVector } from '../vectors';
3
+ import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
4
+ import { StrokeProjectionsBase } from './StrokeProjectionsBase';
5
+ import { TProjection, TProjectStrokeOnPointsOptions } from './types';
6
+
7
+ /**
8
+ * class in charge of finding projections for each type of line cap for start/end of an open path
9
+ * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}
10
+ *
11
+ * Reference:
12
+ * - MDN:
13
+ * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap
14
+ * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap
15
+ * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev
16
+ * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
17
+ * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js
18
+ */
19
+ export class StrokeLineCapProjections extends StrokeProjectionsBase {
20
+ /**
21
+ * edge point
22
+ */
23
+ declare A: Point;
24
+ /**
25
+ * point next to edge point
26
+ */
27
+ declare T: Point;
28
+
29
+ constructor(A: IPoint, T: IPoint, options: TProjectStrokeOnPointsOptions) {
30
+ super(options);
31
+ this.A = new Point(A);
32
+ this.T = new Point(T);
33
+ }
34
+
35
+ calcOrthogonalProjection(
36
+ from: Point,
37
+ to: Point,
38
+ magnitude: number = this.strokeProjectionMagnitude
39
+ ) {
40
+ const vector = this.createSideVector(from, to);
41
+ return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);
42
+ }
43
+
44
+ /**
45
+ * OPEN PATH START/END - Line cap: Butt
46
+ * Calculation: to find the projections, just find the points orthogonal to the stroke
47
+ *
48
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt
49
+ */
50
+ projectButt() {
51
+ return [
52
+ this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),
53
+ this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),
54
+ ];
55
+ }
56
+
57
+ /**
58
+ * OPEN PATH START/END - Line cap: Round
59
+ * Calculation: same as stroke line join `round`
60
+ *
61
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round
62
+ */
63
+ projectRound() {
64
+ return new StrokeLineJoinProjections(
65
+ this.A,
66
+ this.T,
67
+ this.T,
68
+ this.options
69
+ ).projectRound();
70
+ }
71
+
72
+ /**
73
+ * OPEN PATH START/END - Line cap: Square
74
+ * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`
75
+ *
76
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square
77
+ */
78
+ projectSquare() {
79
+ const orthogonalProjection = this.calcOrthogonalProjection(
80
+ this.A,
81
+ this.T,
82
+ this.strokeProjectionMagnitude
83
+ );
84
+ const strokePointingOut = this.scaleUnitVector(
85
+ getUnitVector(createVector(this.A, this.T)),
86
+ -this.strokeProjectionMagnitude
87
+ );
88
+ const projectedA = this.A.add(strokePointingOut);
89
+ return [
90
+ projectedA.add(orthogonalProjection),
91
+ projectedA.subtract(orthogonalProjection),
92
+ ].map((p) => this.applySkew(p));
93
+ }
94
+
95
+ protected projectPoints() {
96
+ switch (this.options.strokeLineCap) {
97
+ case 'round':
98
+ return this.projectRound();
99
+ case 'square':
100
+ return this.projectSquare();
101
+ default:
102
+ return this.projectButt();
103
+ }
104
+ }
105
+
106
+ public project(): TProjection[] {
107
+ return this.projectPoints().map((point) => ({
108
+ originPoint: this.A,
109
+ projectedPoint: point,
110
+ }));
111
+ }
112
+ }
@@ -0,0 +1,231 @@
1
+ import { IPoint, Point } from '../../../Point';
2
+ import { degreesToRadians } from '../radiansDegreesConversion';
3
+ import { getBisector, getOrthonormalVector, magnitude } from '../vectors';
4
+ import { StrokeProjectionsBase } from './StrokeProjectionsBase';
5
+ import { TProjection, TProjectStrokeOnPointsOptions } from './types';
6
+
7
+ /**
8
+ * class in charge of finding projections for each type of line join
9
+ * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}
10
+ *
11
+ * - MDN:
12
+ * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
13
+ * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin
14
+ * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty
15
+ * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
16
+ * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js
17
+ *
18
+ */
19
+ export class StrokeLineJoinProjections extends StrokeProjectionsBase {
20
+ /**
21
+ * The point being projected (the angle ∠BAC)
22
+ */
23
+ declare A: Point;
24
+ /**
25
+ * The point before A
26
+ */
27
+ declare B: Point;
28
+ /**
29
+ * The point after A
30
+ */
31
+ declare C: Point;
32
+ /**
33
+ * The bisector of A (∠BAC)
34
+ */
35
+ declare bisector: ReturnType<typeof getBisector>;
36
+
37
+ constructor(
38
+ A: IPoint,
39
+ B: IPoint,
40
+ C: IPoint,
41
+ options: TProjectStrokeOnPointsOptions
42
+ ) {
43
+ super(options);
44
+ this.A = new Point(A);
45
+ this.B = new Point(B);
46
+ this.C = new Point(C);
47
+ // First we calculate the bisector between the points. Used in `round` and `miter` cases
48
+ // When the stroke is uniform, scaling changes the arrangement of the points, so we have to take it into account
49
+ this.bisector = this.options.strokeUniform
50
+ ? getBisector(
51
+ this.A.multiply(this.scale),
52
+ this.B.multiply(this.scale),
53
+ this.C.multiply(this.scale)
54
+ )
55
+ : getBisector(this.A, this.B, this.C);
56
+ }
57
+
58
+ get bisectorVector() {
59
+ return this.bisector.vector;
60
+ }
61
+
62
+ get bisectorAngle() {
63
+ return this.bisector.angle;
64
+ }
65
+
66
+ calcOrthogonalProjection(
67
+ from: Point,
68
+ to: Point,
69
+ magnitude: number = this.strokeProjectionMagnitude
70
+ ) {
71
+ const vector = this.createSideVector(from, to);
72
+ const orthogonalProjection = getOrthonormalVector(vector);
73
+ const correctSide = StrokeProjectionsBase.getAcuteAngleFactor(
74
+ orthogonalProjection,
75
+ this.bisectorVector
76
+ );
77
+ return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);
78
+ }
79
+
80
+ /**
81
+ * BEVEL
82
+ * Calculation: the projection points are formed by the vector orthogonal to the vertex.
83
+ *
84
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel
85
+ */
86
+ projectBevel() {
87
+ return [this.B, this.C].map((to) => this.projectOrthogonally(this.A, to));
88
+ }
89
+
90
+ /**
91
+ * MITER
92
+ * Calculation: the corner is formed by extending the outer edges of the stroke
93
+ * at the tangents of the path segments until they intersect.
94
+ *
95
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter
96
+ */
97
+ projectMiter() {
98
+ const alpha = Math.abs(this.bisectorAngle),
99
+ hypotUnitScalar = 1 / Math.sin(alpha / 2),
100
+ miterVector = this.scaleUnitVector(
101
+ this.bisectorVector,
102
+ -this.strokeProjectionMagnitude * hypotUnitScalar
103
+ );
104
+
105
+ // When two line segments meet at a sharp angle, it is possible for the join to extend,
106
+ // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes
107
+ // a limit on the extent of the line join.
108
+ // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
109
+ // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit
110
+ const strokeMiterLimit = this.options.strokeUniform
111
+ ? hypotUnitScalar
112
+ : this.options.strokeMiterLimit;
113
+
114
+ if (
115
+ magnitude(miterVector) / this.strokeProjectionMagnitude <=
116
+ strokeMiterLimit
117
+ ) {
118
+ return [this.applySkew(this.A.add(miterVector))];
119
+ } else {
120
+ // when the miter-limit is reached, the stroke line join becomes of type bevel
121
+ return this.projectBevel();
122
+ }
123
+ }
124
+
125
+ /**
126
+ * ROUND (without skew)
127
+ * Calculation: the projections are the two vectors parallel to X and Y axes
128
+ *
129
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew
130
+ */
131
+ private projectRoundNoSkew() {
132
+ // correctSide is used to only consider projecting for the outer side
133
+ const correctSide = new Point(
134
+ StrokeProjectionsBase.getAcuteAngleFactor(this.bisectorVector),
135
+ StrokeProjectionsBase.getAcuteAngleFactor(
136
+ new Point(this.bisectorVector.y, this.bisectorVector.x)
137
+ )
138
+ ),
139
+ radiusOnAxisX = new Point(1, 0)
140
+ .scalarMultiply(this.strokeProjectionMagnitude)
141
+ .multiply(this.strokeUniformScalar)
142
+ .multiply(correctSide),
143
+ radiusOnAxisY = new Point(0, 1)
144
+ .scalarMultiply(this.strokeProjectionMagnitude)
145
+ .multiply(this.strokeUniformScalar)
146
+ .multiply(correctSide);
147
+
148
+ return [this.A.add(radiusOnAxisX), this.A.add(radiusOnAxisY)];
149
+ }
150
+
151
+ /**
152
+ * ROUND (with skew)
153
+ * Calculation: the projections are the points furthest from the vertex in
154
+ * the direction of the X and Y axes after distortion.
155
+ *
156
+ * @todo TODO:
157
+ * - Consider only projections that are inside the beginning and end of the circle segment
158
+ *
159
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew
160
+ */
161
+ private projectRoundWithSkew() {
162
+ const projections: Point[] = [];
163
+
164
+ // The start and end points of the circle segment
165
+ [this.B, this.C].forEach((to) =>
166
+ projections.push(this.projectOrthogonally(this.A, to))
167
+ );
168
+
169
+ const { skewX, skewY } = this.options;
170
+ // The points furthest from the vertex in the direction of the X and Y axes after distortion
171
+ const circleRadius = new Point()
172
+ .scalarAdd(this.strokeProjectionMagnitude)
173
+ .multiply(this.strokeUniformScalar),
174
+ newY =
175
+ circleRadius.y / Math.sqrt(1 + Math.tan(degreesToRadians(skewY)) ** 2),
176
+ furthestY = new Point(
177
+ Math.sqrt(
178
+ circleRadius.x ** 2 - ((newY * circleRadius.x) / circleRadius.y) ** 2
179
+ ),
180
+ newY
181
+ ),
182
+ newX =
183
+ circleRadius.x / Math.sqrt(1 + Math.tan(degreesToRadians(skewX)) ** 2),
184
+ furthestX = new Point(
185
+ newX,
186
+ Math.sqrt(newY ** 2 - ((newX * newY) / circleRadius.x) ** 2)
187
+ );
188
+
189
+ [furthestX, furthestY].forEach((vector) => {
190
+ projections.push(
191
+ this.applySkew(this.A.add(vector)),
192
+ this.applySkew(this.A.subtract(vector))
193
+ );
194
+ });
195
+
196
+ return projections;
197
+ }
198
+
199
+ projectRound() {
200
+ if (!this.isSkewed()) {
201
+ return this.projectRoundNoSkew();
202
+ } else {
203
+ return this.projectRoundWithSkew();
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Project stroke width on points returning projections for each point as follows:
209
+ * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)
210
+ * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.
211
+ * - `round`: same as `bevel` when it has no skew, with skew are 4 points.
212
+ */
213
+ protected projectPoints() {
214
+ switch (this.options.strokeLineJoin) {
215
+ case 'miter':
216
+ return this.projectMiter();
217
+ case 'round':
218
+ return this.projectRound();
219
+ default:
220
+ return this.projectBevel();
221
+ }
222
+ }
223
+
224
+ public project(): TProjection[] {
225
+ return this.projectPoints().map((point) => ({
226
+ originPoint: this.A,
227
+ projectedPoint: point,
228
+ bisector: this.bisector,
229
+ }));
230
+ }
231
+ }
@@ -0,0 +1,75 @@
1
+ import { halfPI } from '../../../constants';
2
+ import { IPoint, Point } from '../../../Point';
3
+ import { degreesToRadians } from '../radiansDegreesConversion';
4
+ import {
5
+ calcAngleBetweenVectors,
6
+ calcVectorRotation,
7
+ createVector,
8
+ } from '../vectors';
9
+ import { TProjectStrokeOnPointsOptions, TProjection } from './types';
10
+
11
+ /**
12
+ * @see https://github.com/fabricjs/fabric.js/pull/8344
13
+ */
14
+ export abstract class StrokeProjectionsBase {
15
+ declare options: TProjectStrokeOnPointsOptions;
16
+ declare scale: Point;
17
+ declare strokeUniformScalar: Point;
18
+ declare strokeProjectionMagnitude: number;
19
+
20
+ static getAcuteAngleFactor(vector1: Point, vector2?: Point) {
21
+ const angle = vector2
22
+ ? calcAngleBetweenVectors(vector1, vector2)
23
+ : calcVectorRotation(vector1);
24
+ return Math.abs(angle) < halfPI ? -1 : 1;
25
+ }
26
+
27
+ constructor(options: TProjectStrokeOnPointsOptions) {
28
+ this.options = options;
29
+ this.strokeProjectionMagnitude = this.options.strokeWidth / 2;
30
+ this.scale = new Point(this.options.scaleX, this.options.scaleY);
31
+ this.strokeUniformScalar = this.options.strokeUniform
32
+ ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)
33
+ : new Point(1, 1);
34
+ }
35
+
36
+ /**
37
+ * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.
38
+ */
39
+ protected createSideVector(from: IPoint, to: IPoint) {
40
+ const v = createVector(from, to);
41
+ return this.options.strokeUniform ? v.multiply(this.scale) : v;
42
+ }
43
+
44
+ protected abstract calcOrthogonalProjection(
45
+ from: Point,
46
+ to: Point,
47
+ magnitude?: number
48
+ ): Point;
49
+
50
+ protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {
51
+ return this.applySkew(
52
+ from.add(this.calcOrthogonalProjection(from, to, magnitude))
53
+ );
54
+ }
55
+
56
+ protected isSkewed() {
57
+ return this.options.skewX !== 0 || this.options.skewY !== 0;
58
+ }
59
+
60
+ protected applySkew(point: Point) {
61
+ const p = new Point(point);
62
+ // skewY must be applied before skewX as this distortion affects skewX calculation
63
+ p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));
64
+ p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));
65
+ return p;
66
+ }
67
+
68
+ protected scaleUnitVector(unitVector: Point, scalar: number) {
69
+ return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);
70
+ }
71
+
72
+ protected abstract projectPoints(): Point[];
73
+
74
+ public abstract project(): TProjection[];
75
+ }
@@ -0,0 +1,53 @@
1
+ import { IPoint } from '../../../Point';
2
+ import { StrokeLineCapProjections } from './StrokeLineCapProjections';
3
+ import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
4
+ import { TProjection, TProjectStrokeOnPointsOptions } from './types';
5
+
6
+ /**
7
+ *
8
+ * Used to calculate object's bounding box
9
+ *
10
+ * @see https://github.com/fabricjs/fabric.js/pull/8344
11
+ *
12
+ */
13
+ export const projectStrokeOnPoints = (
14
+ points: IPoint[],
15
+ options: TProjectStrokeOnPointsOptions,
16
+ openPath = false
17
+ ): TProjection[] => {
18
+ const projections: TProjection[] = [];
19
+
20
+ if (points.length <= 1) {
21
+ return projections;
22
+ }
23
+
24
+ points.forEach((A, index) => {
25
+ let B: IPoint, C: IPoint;
26
+ if (index === 0) {
27
+ C = points[1];
28
+ B = openPath ? A : points[points.length - 1];
29
+ } else if (index === points.length - 1) {
30
+ B = points[index - 1];
31
+ C = openPath ? A : points[0];
32
+ } else {
33
+ B = points[index - 1];
34
+ C = points[index + 1];
35
+ }
36
+
37
+ if (openPath && (index === 0 || index === points.length - 1)) {
38
+ projections.push(
39
+ ...new StrokeLineCapProjections(
40
+ A,
41
+ index === 0 ? C : B,
42
+ options
43
+ ).project()
44
+ );
45
+ } else {
46
+ projections.push(
47
+ ...new StrokeLineJoinProjections(A, B, C, options).project()
48
+ );
49
+ }
50
+ });
51
+
52
+ return projections;
53
+ };
@@ -0,0 +1,24 @@
1
+ import { Point } from '../../../Point';
2
+ import { TDegree } from '../../../typedefs';
3
+ import { getBisector } from '../vectors';
4
+
5
+ export type TProjectStrokeOnPointsOptions = {
6
+ strokeWidth: number;
7
+ strokeLineCap: CanvasLineCap;
8
+ strokeLineJoin: CanvasLineJoin;
9
+ /**
10
+ * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
11
+ */
12
+ strokeMiterLimit: number;
13
+ strokeUniform: boolean;
14
+ scaleX: number;
15
+ scaleY: number;
16
+ skewX: TDegree;
17
+ skewY: TDegree;
18
+ };
19
+
20
+ export type TProjection = {
21
+ projectedPoint: Point;
22
+ originPoint: Point;
23
+ bisector?: ReturnType<typeof getBisector>;
24
+ };
@@ -0,0 +1,18 @@
1
+ import type { TRadian, TDegree } from '../../typedefs';
2
+ import { PiBy180 } from '../../constants';
3
+
4
+ /**
5
+ * Transforms degrees to radians.
6
+ * @param {TDegree} degrees value in degrees
7
+ * @return {TRadian} value in radians
8
+ */
9
+ export const degreesToRadians = (degrees: TDegree): TRadian =>
10
+ (degrees * PiBy180) as TRadian;
11
+
12
+ /**
13
+ * Transforms radians to degrees.
14
+ * @param {TRadian} radians value in radians
15
+ * @return {TDegree} value in degrees
16
+ */
17
+ export const radiansToDegrees = (radians: TRadian): TDegree =>
18
+ (radians / PiBy180) as TDegree;
@@ -0,0 +1,22 @@
1
+ import { TOriginX, TOriginY } from '../../typedefs';
2
+
3
+ const originOffset = {
4
+ left: -0.5,
5
+ top: -0.5,
6
+ center: 0,
7
+ bottom: 0.5,
8
+ right: 0.5,
9
+ };
10
+ /**
11
+ * Resolves origin value relative to center
12
+ * @private
13
+ * @param {TOriginX | TOriginY} originValue originX / originY
14
+ * @returns number
15
+ */
16
+
17
+ export const resolveOrigin = (
18
+ originValue: TOriginX | TOriginY | number
19
+ ): number =>
20
+ typeof originValue === 'string'
21
+ ? originOffset[originValue]
22
+ : originValue - 0.5;
@@ -0,0 +1,15 @@
1
+ import type { Point } from '../../Point';
2
+ import type { TRadian } from '../../typedefs';
3
+ /**
4
+ * Rotates `point` around `origin` with `radians`
5
+ * @deprecated use the Point.rotate
6
+ * @param {Point} origin The origin of the rotation
7
+ * @param {Point} origin The origin of the rotation
8
+ * @param {TRadian} radians The radians of the angle for the rotation
9
+ * @return {Point} The new rotated point
10
+ */
11
+ export const rotatePoint = (
12
+ point: Point,
13
+ origin: Point,
14
+ radians: TRadian
15
+ ): Point => point.rotate(radians, origin);