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,226 @@
1
+ import { XY, 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(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {
38
+ super(options);
39
+ this.A = new Point(A);
40
+ this.B = new Point(B);
41
+ this.C = new Point(C);
42
+ // First we calculate the bisector between the points. Used in `round` and `miter` cases
43
+ // When the stroke is uniform, scaling changes the arrangement of the points, so we have to take it into account
44
+ this.bisector = this.options.strokeUniform
45
+ ? getBisector(
46
+ this.A.multiply(this.scale),
47
+ this.B.multiply(this.scale),
48
+ this.C.multiply(this.scale)
49
+ )
50
+ : getBisector(this.A, this.B, this.C);
51
+ }
52
+
53
+ get bisectorVector() {
54
+ return this.bisector.vector;
55
+ }
56
+
57
+ get bisectorAngle() {
58
+ return this.bisector.angle;
59
+ }
60
+
61
+ calcOrthogonalProjection(
62
+ from: Point,
63
+ to: Point,
64
+ magnitude: number = this.strokeProjectionMagnitude
65
+ ) {
66
+ const vector = this.createSideVector(from, to);
67
+ const orthogonalProjection = getOrthonormalVector(vector);
68
+ const correctSide = StrokeProjectionsBase.getAcuteAngleFactor(
69
+ orthogonalProjection,
70
+ this.bisectorVector
71
+ );
72
+ return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);
73
+ }
74
+
75
+ /**
76
+ * BEVEL
77
+ * Calculation: the projection points are formed by the vector orthogonal to the vertex.
78
+ *
79
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel
80
+ */
81
+ projectBevel() {
82
+ return [this.B, this.C].map((to) => this.projectOrthogonally(this.A, to));
83
+ }
84
+
85
+ /**
86
+ * MITER
87
+ * Calculation: the corner is formed by extending the outer edges of the stroke
88
+ * at the tangents of the path segments until they intersect.
89
+ *
90
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter
91
+ */
92
+ projectMiter() {
93
+ const alpha = Math.abs(this.bisectorAngle),
94
+ hypotUnitScalar = 1 / Math.sin(alpha / 2),
95
+ miterVector = this.scaleUnitVector(
96
+ this.bisectorVector,
97
+ -this.strokeProjectionMagnitude * hypotUnitScalar
98
+ );
99
+
100
+ // When two line segments meet at a sharp angle, it is possible for the join to extend,
101
+ // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes
102
+ // a limit on the extent of the line join.
103
+ // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
104
+ // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit
105
+ const strokeMiterLimit = this.options.strokeUniform
106
+ ? hypotUnitScalar
107
+ : this.options.strokeMiterLimit;
108
+
109
+ if (
110
+ magnitude(miterVector) / this.strokeProjectionMagnitude <=
111
+ strokeMiterLimit
112
+ ) {
113
+ return [this.applySkew(this.A.add(miterVector))];
114
+ } else {
115
+ // when the miter-limit is reached, the stroke line join becomes of type bevel
116
+ return this.projectBevel();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * ROUND (without skew)
122
+ * Calculation: the projections are the two vectors parallel to X and Y axes
123
+ *
124
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew
125
+ */
126
+ private projectRoundNoSkew() {
127
+ // correctSide is used to only consider projecting for the outer side
128
+ const correctSide = new Point(
129
+ StrokeProjectionsBase.getAcuteAngleFactor(this.bisectorVector),
130
+ StrokeProjectionsBase.getAcuteAngleFactor(
131
+ new Point(this.bisectorVector.y, this.bisectorVector.x)
132
+ )
133
+ ),
134
+ radiusOnAxisX = new Point(1, 0)
135
+ .scalarMultiply(this.strokeProjectionMagnitude)
136
+ .multiply(this.strokeUniformScalar)
137
+ .multiply(correctSide),
138
+ radiusOnAxisY = new Point(0, 1)
139
+ .scalarMultiply(this.strokeProjectionMagnitude)
140
+ .multiply(this.strokeUniformScalar)
141
+ .multiply(correctSide);
142
+
143
+ return [this.A.add(radiusOnAxisX), this.A.add(radiusOnAxisY)];
144
+ }
145
+
146
+ /**
147
+ * ROUND (with skew)
148
+ * Calculation: the projections are the points furthest from the vertex in
149
+ * the direction of the X and Y axes after distortion.
150
+ *
151
+ * @todo TODO:
152
+ * - Consider only projections that are inside the beginning and end of the circle segment
153
+ *
154
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew
155
+ */
156
+ private projectRoundWithSkew() {
157
+ const projections: Point[] = [];
158
+
159
+ // The start and end points of the circle segment
160
+ [this.B, this.C].forEach((to) =>
161
+ projections.push(this.projectOrthogonally(this.A, to))
162
+ );
163
+
164
+ const { skewX, skewY } = this.options;
165
+ // The points furthest from the vertex in the direction of the X and Y axes after distortion
166
+ const circleRadius = new Point()
167
+ .scalarAdd(this.strokeProjectionMagnitude)
168
+ .multiply(this.strokeUniformScalar),
169
+ newY =
170
+ circleRadius.y / Math.sqrt(1 + Math.tan(degreesToRadians(skewY)) ** 2),
171
+ furthestY = new Point(
172
+ Math.sqrt(
173
+ circleRadius.x ** 2 - ((newY * circleRadius.x) / circleRadius.y) ** 2
174
+ ),
175
+ newY
176
+ ),
177
+ newX =
178
+ circleRadius.x / Math.sqrt(1 + Math.tan(degreesToRadians(skewX)) ** 2),
179
+ furthestX = new Point(
180
+ newX,
181
+ Math.sqrt(newY ** 2 - ((newX * newY) / circleRadius.x) ** 2)
182
+ );
183
+
184
+ [furthestX, furthestY].forEach((vector) => {
185
+ projections.push(
186
+ this.applySkew(this.A.add(vector)),
187
+ this.applySkew(this.A.subtract(vector))
188
+ );
189
+ });
190
+
191
+ return projections;
192
+ }
193
+
194
+ projectRound() {
195
+ if (!this.isSkewed()) {
196
+ return this.projectRoundNoSkew();
197
+ } else {
198
+ return this.projectRoundWithSkew();
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Project stroke width on points returning projections for each point as follows:
204
+ * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)
205
+ * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.
206
+ * - `round`: same as `bevel` when it has no skew, with skew are 4 points.
207
+ */
208
+ protected projectPoints() {
209
+ switch (this.options.strokeLineJoin) {
210
+ case 'miter':
211
+ return this.projectMiter();
212
+ case 'round':
213
+ return this.projectRound();
214
+ default:
215
+ return this.projectBevel();
216
+ }
217
+ }
218
+
219
+ public project(): TProjection[] {
220
+ return this.projectPoints().map((point) => ({
221
+ originPoint: this.A,
222
+ projectedPoint: point,
223
+ bisector: this.bisector,
224
+ }));
225
+ }
226
+ }
@@ -0,0 +1,75 @@
1
+ import { halfPI } from '../../../constants';
2
+ import { XY, 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: XY, to: XY) {
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 { XY } 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: XY[],
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: XY, C: XY;
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);
@@ -0,0 +1,26 @@
1
+ import type { TRadian } from '../../typedefs';
2
+ import { halfPI } from '../../constants';
3
+
4
+ /**
5
+ * Calculate the cos of an angle, avoiding returning floats for known results
6
+ * This function is here just to avoid getting 0.999999999999999 when dealing
7
+ * with numbers that are really 1 or 0.
8
+ * @param {TRadian} angle the angle
9
+ * @return {Number} the sin value for angle.
10
+ */
11
+ export const sin = (angle: TRadian): number => {
12
+ if (angle === 0) {
13
+ return 0;
14
+ }
15
+ const angleSlice = angle / halfPI;
16
+ const value = Math.sign(angle);
17
+ switch (angleSlice) {
18
+ case 1:
19
+ return value;
20
+ case 2:
21
+ return 0;
22
+ case 3:
23
+ return -value;
24
+ }
25
+ return Math.sin(angle);
26
+ };
@@ -0,0 +1,181 @@
1
+ import { Color } from '../../color/Color';
2
+ import { config } from '../../config';
3
+ import { DEFAULT_SVG_FONT_SIZE } from '../../constants';
4
+ import {
5
+ SupportedSVGUnit,
6
+ SVGElementName,
7
+ TBBox,
8
+ TMat2D,
9
+ } from '../../typedefs';
10
+ import { toFixed } from './toFixed';
11
+ /**
12
+ * Returns array of attributes for given svg that fabric parses
13
+ * @param {SVGElementName} type Type of svg element (eg. 'circle')
14
+ * @return {Array} string names of supported attributes
15
+ */
16
+ export const getSvgAttributes = (type: SVGElementName) => {
17
+ const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];
18
+ switch (type) {
19
+ case SVGElementName.linearGradient:
20
+ return commonAttributes.concat([
21
+ 'x1',
22
+ 'y1',
23
+ 'x2',
24
+ 'y2',
25
+ 'gradientUnits',
26
+ 'gradientTransform',
27
+ ]);
28
+ case 'radialGradient':
29
+ return commonAttributes.concat([
30
+ 'gradientUnits',
31
+ 'gradientTransform',
32
+ 'cx',
33
+ 'cy',
34
+ 'r',
35
+ 'fx',
36
+ 'fy',
37
+ 'fr',
38
+ ]);
39
+ case 'stop':
40
+ return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);
41
+ }
42
+ return commonAttributes;
43
+ };
44
+
45
+ /**
46
+ * Converts from attribute value to pixel value if applicable.
47
+ * Returns converted pixels or original value not converted.
48
+ * @param {string} value number to operate on
49
+ * @param {number} fontSize
50
+ * @return {number}
51
+ */
52
+ export const parseUnit = (value: string, fontSize: number) => {
53
+ const unit = /\D{0,2}$/.exec(value),
54
+ number = parseFloat(value);
55
+ if (!fontSize) {
56
+ fontSize = DEFAULT_SVG_FONT_SIZE;
57
+ }
58
+ const dpi = config.DPI;
59
+ switch (unit?.[0]) {
60
+ case SupportedSVGUnit.mm:
61
+ return (number * dpi) / 25.4;
62
+
63
+ case SupportedSVGUnit.cm:
64
+ return (number * dpi) / 2.54;
65
+
66
+ case SupportedSVGUnit.in:
67
+ return number * dpi;
68
+
69
+ case SupportedSVGUnit.pt:
70
+ return (number * dpi) / 72; // or * 4 / 3
71
+
72
+ case SupportedSVGUnit.pc:
73
+ return ((number * dpi) / 72) * 12; // or * 16
74
+
75
+ case SupportedSVGUnit.em:
76
+ return number * fontSize;
77
+
78
+ default:
79
+ return number;
80
+ }
81
+ };
82
+
83
+ export const enum MeetOrSlice {
84
+ meet = 'meet',
85
+ slice = 'slice',
86
+ }
87
+
88
+ export const enum MinMidMax {
89
+ min = 'Min',
90
+ mid = 'Mid',
91
+ max = 'Max',
92
+ none = 'none',
93
+ }
94
+
95
+ export type TPreserveArParsed = {
96
+ meetOrSlice: MeetOrSlice;
97
+ alignX: MinMidMax;
98
+ alignY: MinMidMax;
99
+ };
100
+
101
+ // align can be either none or undefined or a combination of mid/max
102
+ const parseAlign = (align: string): MinMidMax[] => {
103
+ //divide align in alignX and alignY
104
+ if (align && align !== MinMidMax.none) {
105
+ return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];
106
+ } else if (align === MinMidMax.none) {
107
+ return [align, align];
108
+ }
109
+ return [MinMidMax.mid, MinMidMax.mid];
110
+ };
111
+
112
+ /**
113
+ * Parse preserveAspectRatio attribute from element
114
+ * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
115
+ * @param {string} attribute to be parsed
116
+ * @return {Object} an object containing align and meetOrSlice attribute
117
+ */
118
+ export const parsePreserveAspectRatioAttribute = (
119
+ attribute: string
120
+ ): TPreserveArParsed => {
121
+ const [firstPart, secondPart] = attribute.trim().split(' ') as [
122
+ MinMidMax,
123
+ MeetOrSlice | undefined
124
+ ];
125
+ const [alignX, alignY] = parseAlign(firstPart);
126
+ return {
127
+ meetOrSlice: secondPart || MeetOrSlice.meet,
128
+ alignX,
129
+ alignY,
130
+ };
131
+ };
132
+
133
+ /**
134
+ * given an array of 6 number returns something like `"matrix(...numbers)"`
135
+ * @param {TMat2D} transform an array with 6 numbers
136
+ * @return {String} transform matrix for svg
137
+ */
138
+ export const matrixToSVG = (transform: TMat2D) =>
139
+ 'matrix(' +
140
+ transform
141
+ .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))
142
+ .join(' ') +
143
+ ')';
144
+
145
+ /**
146
+ * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values
147
+ * we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1
148
+ * @param prop
149
+ * @param value
150
+ * @returns
151
+ */
152
+ export const colorPropToSVG = (prop: string, value?: any) => {
153
+ if (!value) {
154
+ return `${prop}: none; `;
155
+ } else if (value.toLive) {
156
+ return `${prop}: url(#SVGID_${value.id}); `;
157
+ } else {
158
+ const color = new Color(value),
159
+ opacity = color.getAlpha();
160
+
161
+ let str = `${prop}: ${color.toRgb()}; `;
162
+
163
+ if (opacity !== 1) {
164
+ //change the color in rgb + opacity
165
+ str += `${prop}-opacity: ${opacity.toString()}; `;
166
+ }
167
+ return str;
168
+ }
169
+ };
170
+
171
+ export const createSVGRect = (
172
+ color: string,
173
+ { left, top, width, height }: TBBox,
174
+ precision = config.NUM_FRACTION_DIGITS
175
+ ) => {
176
+ const svgColor = colorPropToSVG('fill', color);
177
+ const [x, y, w, h] = [left, top, width, height].map((value) =>
178
+ toFixed(value, precision)
179
+ );
180
+ return `<rect ${svgColor} x="${x}" y="${y}" width="${w}" height="${h}"></rect>`;
181
+ };