fabric 5.3.0 → 6.0.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
package/src/util/path.js DELETED
@@ -1,829 +0,0 @@
1
- (function() {
2
- var _join = Array.prototype.join,
3
- commandLengths = {
4
- m: 2,
5
- l: 2,
6
- h: 1,
7
- v: 1,
8
- c: 6,
9
- s: 4,
10
- q: 4,
11
- t: 2,
12
- a: 7
13
- },
14
- repeatedCommands = {
15
- m: 'l',
16
- M: 'L'
17
- };
18
- function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {
19
- var costh2 = fabric.util.cos(th2),
20
- sinth2 = fabric.util.sin(th2),
21
- costh3 = fabric.util.cos(th3),
22
- sinth3 = fabric.util.sin(th3),
23
- toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,
24
- toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,
25
- cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),
26
- cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),
27
- cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),
28
- cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);
29
-
30
- return ['C',
31
- cp1X, cp1Y,
32
- cp2X, cp2Y,
33
- toX, toY
34
- ];
35
- }
36
-
37
- /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp
38
- * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here
39
- * http://mozilla.org/MPL/2.0/
40
- */
41
- function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {
42
- var PI = Math.PI, th = rotateX * PI / 180,
43
- sinTh = fabric.util.sin(th),
44
- cosTh = fabric.util.cos(th),
45
- fromX = 0, fromY = 0;
46
-
47
- rx = Math.abs(rx);
48
- ry = Math.abs(ry);
49
-
50
- var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,
51
- py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,
52
- rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,
53
- pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,
54
- root = 0;
55
-
56
- if (pl < 0) {
57
- var s = Math.sqrt(1 - pl / (rx2 * ry2));
58
- rx *= s;
59
- ry *= s;
60
- }
61
- else {
62
- root = (large === sweep ? -1.0 : 1.0) *
63
- Math.sqrt( pl / (rx2 * py2 + ry2 * px2));
64
- }
65
-
66
- var cx = root * rx * py / ry,
67
- cy = -root * ry * px / rx,
68
- cx1 = cosTh * cx - sinTh * cy + toX * 0.5,
69
- cy1 = sinTh * cx + cosTh * cy + toY * 0.5,
70
- mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),
71
- dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);
72
-
73
- if (sweep === 0 && dtheta > 0) {
74
- dtheta -= 2 * PI;
75
- }
76
- else if (sweep === 1 && dtheta < 0) {
77
- dtheta += 2 * PI;
78
- }
79
-
80
- // Convert into cubic bezier segments <= 90deg
81
- var segments = Math.ceil(Math.abs(dtheta / PI * 2)),
82
- result = [], mDelta = dtheta / segments,
83
- mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),
84
- th3 = mTheta + mDelta;
85
-
86
- for (var i = 0; i < segments; i++) {
87
- result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);
88
- fromX = result[i][5];
89
- fromY = result[i][6];
90
- mTheta = th3;
91
- th3 += mDelta;
92
- }
93
- return result;
94
- }
95
-
96
- /*
97
- * Private
98
- */
99
- function calcVectorAngle(ux, uy, vx, vy) {
100
- var ta = Math.atan2(uy, ux),
101
- tb = Math.atan2(vy, vx);
102
- if (tb >= ta) {
103
- return tb - ta;
104
- }
105
- else {
106
- return 2 * Math.PI - (ta - tb);
107
- }
108
- }
109
-
110
- /**
111
- * Calculate bounding box of a beziercurve
112
- * @param {Number} x0 starting point
113
- * @param {Number} y0
114
- * @param {Number} x1 first control point
115
- * @param {Number} y1
116
- * @param {Number} x2 secondo control point
117
- * @param {Number} y2
118
- * @param {Number} x3 end of bezier
119
- * @param {Number} y3
120
- */
121
- // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.
122
- // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?
123
- function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {
124
- var argsString;
125
- if (fabric.cachesBoundsOfCurve) {
126
- argsString = _join.call(arguments);
127
- if (fabric.boundsOfCurveCache[argsString]) {
128
- return fabric.boundsOfCurveCache[argsString];
129
- }
130
- }
131
-
132
- var sqrt = Math.sqrt,
133
- min = Math.min, max = Math.max,
134
- abs = Math.abs, tvalues = [],
135
- bounds = [[], []],
136
- a, b, c, t, t1, t2, b2ac, sqrtb2ac;
137
-
138
- b = 6 * x0 - 12 * x1 + 6 * x2;
139
- a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;
140
- c = 3 * x1 - 3 * x0;
141
-
142
- for (var i = 0; i < 2; ++i) {
143
- if (i > 0) {
144
- b = 6 * y0 - 12 * y1 + 6 * y2;
145
- a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;
146
- c = 3 * y1 - 3 * y0;
147
- }
148
-
149
- if (abs(a) < 1e-12) {
150
- if (abs(b) < 1e-12) {
151
- continue;
152
- }
153
- t = -c / b;
154
- if (0 < t && t < 1) {
155
- tvalues.push(t);
156
- }
157
- continue;
158
- }
159
- b2ac = b * b - 4 * c * a;
160
- if (b2ac < 0) {
161
- continue;
162
- }
163
- sqrtb2ac = sqrt(b2ac);
164
- t1 = (-b + sqrtb2ac) / (2 * a);
165
- if (0 < t1 && t1 < 1) {
166
- tvalues.push(t1);
167
- }
168
- t2 = (-b - sqrtb2ac) / (2 * a);
169
- if (0 < t2 && t2 < 1) {
170
- tvalues.push(t2);
171
- }
172
- }
173
-
174
- var x, y, j = tvalues.length, jlen = j, mt;
175
- while (j--) {
176
- t = tvalues[j];
177
- mt = 1 - t;
178
- x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);
179
- bounds[0][j] = x;
180
-
181
- y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);
182
- bounds[1][j] = y;
183
- }
184
-
185
- bounds[0][jlen] = x0;
186
- bounds[1][jlen] = y0;
187
- bounds[0][jlen + 1] = x3;
188
- bounds[1][jlen + 1] = y3;
189
- var result = [
190
- {
191
- x: min.apply(null, bounds[0]),
192
- y: min.apply(null, bounds[1])
193
- },
194
- {
195
- x: max.apply(null, bounds[0]),
196
- y: max.apply(null, bounds[1])
197
- }
198
- ];
199
- if (fabric.cachesBoundsOfCurve) {
200
- fabric.boundsOfCurveCache[argsString] = result;
201
- }
202
- return result;
203
- }
204
-
205
- /**
206
- * Converts arc to a bunch of bezier curves
207
- * @param {Number} fx starting point x
208
- * @param {Number} fy starting point y
209
- * @param {Array} coords Arc command
210
- */
211
- function fromArcToBeziers(fx, fy, coords) {
212
- var rx = coords[1],
213
- ry = coords[2],
214
- rot = coords[3],
215
- large = coords[4],
216
- sweep = coords[5],
217
- tx = coords[6],
218
- ty = coords[7],
219
- segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);
220
-
221
- for (var i = 0, len = segsNorm.length; i < len; i++) {
222
- segsNorm[i][1] += fx;
223
- segsNorm[i][2] += fy;
224
- segsNorm[i][3] += fx;
225
- segsNorm[i][4] += fy;
226
- segsNorm[i][5] += fx;
227
- segsNorm[i][6] += fy;
228
- }
229
- return segsNorm;
230
- };
231
-
232
- /**
233
- * This function take a parsed SVG path and make it simpler for fabricJS logic.
234
- * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )
235
- * S converted in C, T converted in Q, A converted in C.
236
- * @param {Array} path the array of commands of a parsed svg path for fabric.Path
237
- * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path
238
- */
239
- function makePathSimpler(path) {
240
- // x and y represent the last point of the path. the previous command point.
241
- // we add them to each relative command to make it an absolute comment.
242
- // we also swap the v V h H with L, because are easier to transform.
243
- var x = 0, y = 0, len = path.length,
244
- // x1 and y1 represent the last point of the subpath. the subpath is started with
245
- // m or M command. When a z or Z command is drawn, x and y need to be resetted to
246
- // the last x1 and y1.
247
- x1 = 0, y1 = 0, current, i, converted,
248
- // previous will host the letter of the previous command, to handle S and T.
249
- // controlX and controlY will host the previous reflected control point
250
- destinationPath = [], previous, controlX, controlY;
251
- for (i = 0; i < len; ++i) {
252
- converted = false;
253
- current = path[i].slice(0);
254
- switch (current[0]) { // first letter
255
- case 'l': // lineto, relative
256
- current[0] = 'L';
257
- current[1] += x;
258
- current[2] += y;
259
- // falls through
260
- case 'L':
261
- x = current[1];
262
- y = current[2];
263
- break;
264
- case 'h': // horizontal lineto, relative
265
- current[1] += x;
266
- // falls through
267
- case 'H':
268
- current[0] = 'L';
269
- current[2] = y;
270
- x = current[1];
271
- break;
272
- case 'v': // vertical lineto, relative
273
- current[1] += y;
274
- // falls through
275
- case 'V':
276
- current[0] = 'L';
277
- y = current[1];
278
- current[1] = x;
279
- current[2] = y;
280
- break;
281
- case 'm': // moveTo, relative
282
- current[0] = 'M';
283
- current[1] += x;
284
- current[2] += y;
285
- // falls through
286
- case 'M':
287
- x = current[1];
288
- y = current[2];
289
- x1 = current[1];
290
- y1 = current[2];
291
- break;
292
- case 'c': // bezierCurveTo, relative
293
- current[0] = 'C';
294
- current[1] += x;
295
- current[2] += y;
296
- current[3] += x;
297
- current[4] += y;
298
- current[5] += x;
299
- current[6] += y;
300
- // falls through
301
- case 'C':
302
- controlX = current[3];
303
- controlY = current[4];
304
- x = current[5];
305
- y = current[6];
306
- break;
307
- case 's': // shorthand cubic bezierCurveTo, relative
308
- current[0] = 'S';
309
- current[1] += x;
310
- current[2] += y;
311
- current[3] += x;
312
- current[4] += y;
313
- // falls through
314
- case 'S':
315
- // would be sScC but since we are swapping sSc for C, we check just that.
316
- if (previous === 'C') {
317
- // calculate reflection of previous control points
318
- controlX = 2 * x - controlX;
319
- controlY = 2 * y - controlY;
320
- }
321
- else {
322
- // If there is no previous command or if the previous command was not a C, c, S, or s,
323
- // the control point is coincident with the current point
324
- controlX = x;
325
- controlY = y;
326
- }
327
- x = current[3];
328
- y = current[4];
329
- current[0] = 'C';
330
- current[5] = current[3];
331
- current[6] = current[4];
332
- current[3] = current[1];
333
- current[4] = current[2];
334
- current[1] = controlX;
335
- current[2] = controlY;
336
- // current[3] and current[4] are NOW the second control point.
337
- // we keep it for the next reflection.
338
- controlX = current[3];
339
- controlY = current[4];
340
- break;
341
- case 'q': // quadraticCurveTo, relative
342
- current[0] = 'Q';
343
- current[1] += x;
344
- current[2] += y;
345
- current[3] += x;
346
- current[4] += y;
347
- // falls through
348
- case 'Q':
349
- controlX = current[1];
350
- controlY = current[2];
351
- x = current[3];
352
- y = current[4];
353
- break;
354
- case 't': // shorthand quadraticCurveTo, relative
355
- current[0] = 'T';
356
- current[1] += x;
357
- current[2] += y;
358
- // falls through
359
- case 'T':
360
- if (previous === 'Q') {
361
- // calculate reflection of previous control point
362
- controlX = 2 * x - controlX;
363
- controlY = 2 * y - controlY;
364
- }
365
- else {
366
- // If there is no previous command or if the previous command was not a Q, q, T or t,
367
- // assume the control point is coincident with the current point
368
- controlX = x;
369
- controlY = y;
370
- }
371
- current[0] = 'Q';
372
- x = current[1];
373
- y = current[2];
374
- current[1] = controlX;
375
- current[2] = controlY;
376
- current[3] = x;
377
- current[4] = y;
378
- break;
379
- case 'a':
380
- current[0] = 'A';
381
- current[6] += x;
382
- current[7] += y;
383
- // falls through
384
- case 'A':
385
- converted = true;
386
- destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));
387
- x = current[6];
388
- y = current[7];
389
- break;
390
- case 'z':
391
- case 'Z':
392
- x = x1;
393
- y = y1;
394
- break;
395
- default:
396
- }
397
- if (!converted) {
398
- destinationPath.push(current);
399
- }
400
- previous = current[0];
401
- }
402
- return destinationPath;
403
- };
404
-
405
- /**
406
- * Calc length from point x1,y1 to x2,y2
407
- * @param {Number} x1 starting point x
408
- * @param {Number} y1 starting point y
409
- * @param {Number} x2 starting point x
410
- * @param {Number} y2 starting point y
411
- * @return {Number} length of segment
412
- */
413
- function calcLineLength(x1, y1, x2, y2) {
414
- return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
415
- }
416
-
417
- // functions for the Cubic beizer
418
- // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350
419
- function CB1(t) {
420
- return t * t * t;
421
- }
422
- function CB2(t) {
423
- return 3 * t * t * (1 - t);
424
- }
425
- function CB3(t) {
426
- return 3 * t * (1 - t) * (1 - t);
427
- }
428
- function CB4(t) {
429
- return (1 - t) * (1 - t) * (1 - t);
430
- }
431
-
432
- function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {
433
- return function(pct) {
434
- var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);
435
- return {
436
- x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,
437
- y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4
438
- };
439
- };
440
- }
441
-
442
- function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {
443
- return function (pct) {
444
- var invT = 1 - pct,
445
- tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +
446
- (3 * pct * pct * (p4x - p3x)),
447
- tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +
448
- (3 * pct * pct * (p4y - p3y));
449
- return Math.atan2(tangentY, tangentX);
450
- };
451
- }
452
-
453
- function QB1(t) {
454
- return t * t;
455
- }
456
-
457
- function QB2(t) {
458
- return 2 * t * (1 - t);
459
- }
460
-
461
- function QB3(t) {
462
- return (1 - t) * (1 - t);
463
- }
464
-
465
- function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {
466
- return function(pct) {
467
- var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);
468
- return {
469
- x: p3x * c1 + p2x * c2 + p1x * c3,
470
- y: p3y * c1 + p2y * c2 + p1y * c3
471
- };
472
- };
473
- }
474
-
475
- function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {
476
- return function (pct) {
477
- var invT = 1 - pct,
478
- tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),
479
- tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));
480
- return Math.atan2(tangentY, tangentX);
481
- };
482
- }
483
-
484
-
485
- // this will run over a path segment ( a cubic or quadratic segment) and approximate it
486
- // with 100 segemnts. This will good enough to calculate the length of the curve
487
- function pathIterator(iterator, x1, y1) {
488
- var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;
489
- for (perc = 1; perc <= 100; perc += 1) {
490
- p = iterator(perc / 100);
491
- tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);
492
- tempP = p;
493
- }
494
- return tmpLen;
495
- }
496
-
497
- /**
498
- * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1
499
- * that correspond to that pixels run over the path.
500
- * The percentage will be then used to find the correct point on the canvas for the path.
501
- * @param {Array} segInfo fabricJS collection of information on a parsed path
502
- * @param {Number} distance from starting point, in pixels.
503
- * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;
504
- */
505
- function findPercentageForDistance(segInfo, distance) {
506
- var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },
507
- p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;
508
- // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100
509
- // the path
510
- while (tmpLen < distance && nextStep > 0.0001) {
511
- p = iterator(perc);
512
- lastPerc = perc;
513
- nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);
514
- // compare tmpLen each cycle with distance, decide next perc to test.
515
- if ((nextLen + tmpLen) > distance) {
516
- // we discard this step and we make smaller steps.
517
- perc -= nextStep;
518
- nextStep /= 2;
519
- }
520
- else {
521
- tempP = p;
522
- perc += nextStep;
523
- tmpLen += nextLen;
524
- }
525
- }
526
- p.angle = angleFinder(lastPerc);
527
- return p;
528
- }
529
-
530
- /**
531
- * Run over a parsed and simplifed path and extrac some informations.
532
- * informations are length of each command and starting point
533
- * @param {Array} path fabricJS parsed path commands
534
- * @return {Array} path commands informations
535
- */
536
- function getPathSegmentsInfo(path) {
537
- var totalLength = 0, len = path.length, current,
538
- //x2 and y2 are the coords of segment start
539
- //x1 and y1 are the coords of the current point
540
- x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;
541
- for (var i = 0; i < len; i++) {
542
- current = path[i];
543
- tempInfo = {
544
- x: x1,
545
- y: y1,
546
- command: current[0],
547
- };
548
- switch (current[0]) { //first letter
549
- case 'M':
550
- tempInfo.length = 0;
551
- x2 = x1 = current[1];
552
- y2 = y1 = current[2];
553
- break;
554
- case 'L':
555
- tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);
556
- x1 = current[1];
557
- y1 = current[2];
558
- break;
559
- case 'C':
560
- iterator = getPointOnCubicBezierIterator(
561
- x1,
562
- y1,
563
- current[1],
564
- current[2],
565
- current[3],
566
- current[4],
567
- current[5],
568
- current[6]
569
- );
570
- angleFinder = getTangentCubicIterator(
571
- x1,
572
- y1,
573
- current[1],
574
- current[2],
575
- current[3],
576
- current[4],
577
- current[5],
578
- current[6]
579
- );
580
- tempInfo.iterator = iterator;
581
- tempInfo.angleFinder = angleFinder;
582
- tempInfo.length = pathIterator(iterator, x1, y1);
583
- x1 = current[5];
584
- y1 = current[6];
585
- break;
586
- case 'Q':
587
- iterator = getPointOnQuadraticBezierIterator(
588
- x1,
589
- y1,
590
- current[1],
591
- current[2],
592
- current[3],
593
- current[4]
594
- );
595
- angleFinder = getTangentQuadraticIterator(
596
- x1,
597
- y1,
598
- current[1],
599
- current[2],
600
- current[3],
601
- current[4]
602
- );
603
- tempInfo.iterator = iterator;
604
- tempInfo.angleFinder = angleFinder;
605
- tempInfo.length = pathIterator(iterator, x1, y1);
606
- x1 = current[3];
607
- y1 = current[4];
608
- break;
609
- case 'Z':
610
- case 'z':
611
- // we add those in order to ease calculations later
612
- tempInfo.destX = x2;
613
- tempInfo.destY = y2;
614
- tempInfo.length = calcLineLength(x1, y1, x2, y2);
615
- x1 = x2;
616
- y1 = y2;
617
- break;
618
- }
619
- totalLength += tempInfo.length;
620
- info.push(tempInfo);
621
- }
622
- info.push({ length: totalLength, x: x1, y: y1 });
623
- return info;
624
- }
625
-
626
- function getPointOnPath(path, distance, infos) {
627
- if (!infos) {
628
- infos = getPathSegmentsInfo(path);
629
- }
630
- var i = 0;
631
- while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {
632
- distance -= infos[i].length;
633
- i++;
634
- }
635
- // var distance = infos[infos.length - 1] * perc;
636
- var segInfo = infos[i], segPercent = distance / segInfo.length,
637
- command = segInfo.command, segment = path[i], info;
638
-
639
- switch (command) {
640
- case 'M':
641
- return { x: segInfo.x, y: segInfo.y, angle: 0 };
642
- case 'Z':
643
- case 'z':
644
- info = new fabric.Point(segInfo.x, segInfo.y).lerp(
645
- new fabric.Point(segInfo.destX, segInfo.destY),
646
- segPercent
647
- );
648
- info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);
649
- return info;
650
- case 'L':
651
- info = new fabric.Point(segInfo.x, segInfo.y).lerp(
652
- new fabric.Point(segment[1], segment[2]),
653
- segPercent
654
- );
655
- info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);
656
- return info;
657
- case 'C':
658
- return findPercentageForDistance(segInfo, distance);
659
- case 'Q':
660
- return findPercentageForDistance(segInfo, distance);
661
- }
662
- }
663
-
664
- /**
665
- *
666
- * @param {string} pathString
667
- * @return {(string|number)[][]} An array of SVG path commands
668
- * @example <caption>Usage</caption>
669
- * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [
670
- * ['M', 3, 4],
671
- * ['Q', 3, 5, 2, 1, 4, 0],
672
- * ['Q', 9, 12, 2, 1, 4, 0],
673
- * ];
674
- *
675
- */
676
- function parsePath(pathString) {
677
- var result = [],
678
- coords = [],
679
- currentPath,
680
- parsed,
681
- re = fabric.rePathCommand,
682
- rNumber = '[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*',
683
- rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,
684
- rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',
685
- rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +
686
- rNumberCommaWsp + '?(' + rNumber + ')',
687
- regArcArgumentSequence = new RegExp(rArcSeq, 'g'),
688
- match,
689
- coordsStr,
690
- // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)
691
- path;
692
- if (!pathString || !pathString.match) {
693
- return result;
694
- }
695
- path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);
696
-
697
- for (var i = 0, coordsParsed, len = path.length; i < len; i++) {
698
- currentPath = path[i];
699
-
700
- coordsStr = currentPath.slice(1).trim();
701
- coords.length = 0;
702
-
703
- var command = currentPath.charAt(0);
704
- coordsParsed = [command];
705
-
706
- if (command.toLowerCase() === 'a') {
707
- // arcs have special flags that apparently don't require spaces so handle special
708
- for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {
709
- for (var j = 1; j < args.length; j++) {
710
- coords.push(args[j]);
711
- }
712
- }
713
- }
714
- else {
715
- while ((match = re.exec(coordsStr))) {
716
- coords.push(match[0]);
717
- }
718
- }
719
-
720
- for (var j = 0, jlen = coords.length; j < jlen; j++) {
721
- parsed = parseFloat(coords[j]);
722
- if (!isNaN(parsed)) {
723
- coordsParsed.push(parsed);
724
- }
725
- }
726
-
727
- var commandLength = commandLengths[command.toLowerCase()],
728
- repeatedCommand = repeatedCommands[command] || command;
729
-
730
- if (coordsParsed.length - 1 > commandLength) {
731
- for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {
732
- result.push([command].concat(coordsParsed.slice(k, k + commandLength)));
733
- command = repeatedCommand;
734
- }
735
- }
736
- else {
737
- result.push(coordsParsed);
738
- }
739
- }
740
-
741
- return result;
742
- };
743
-
744
- /**
745
- *
746
- * Converts points to a smooth SVG path
747
- * @param {{ x: number,y: number }[]} points Array of points
748
- * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.
749
- * @return {(string|number)[][]} An array of SVG path commands
750
- */
751
- function getSmoothPathFromPoints(points, correction) {
752
- var path = [], i,
753
- p1 = new fabric.Point(points[0].x, points[0].y),
754
- p2 = new fabric.Point(points[1].x, points[1].y),
755
- len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;
756
- correction = correction || 0;
757
-
758
- if (manyPoints) {
759
- multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;
760
- multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;
761
- }
762
- path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);
763
- for (i = 1; i < len; i++) {
764
- if (!p1.eq(p2)) {
765
- var midPoint = p1.midPointFrom(p2);
766
- // p1 is our bezier control point
767
- // midpoint is our endpoint
768
- // start point is p(i-1) value.
769
- path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);
770
- }
771
- p1 = points[i];
772
- if ((i + 1) < points.length) {
773
- p2 = points[i + 1];
774
- }
775
- }
776
- if (manyPoints) {
777
- multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;
778
- multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;
779
- }
780
- path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);
781
- return path;
782
- }
783
- /**
784
- * Transform a path by transforming each segment.
785
- * it has to be a simplified path or it won't work.
786
- * WARNING: this depends from pathOffset for correct operation
787
- * @param {Array} path fabricJS parsed and simplified path commands
788
- * @param {Array} transform matrix that represent the transformation
789
- * @param {Object} [pathOffset] the fabric.Path pathOffset
790
- * @param {Number} pathOffset.x
791
- * @param {Number} pathOffset.y
792
- * @returns {Array} the transformed path
793
- */
794
- function transformPath(path, transform, pathOffset) {
795
- if (pathOffset) {
796
- transform = fabric.util.multiplyTransformMatrices(
797
- transform,
798
- [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]
799
- );
800
- }
801
- return path.map(function(pathSegment) {
802
- var newSegment = pathSegment.slice(0), point = {};
803
- for (var i = 1; i < pathSegment.length - 1; i += 2) {
804
- point.x = pathSegment[i];
805
- point.y = pathSegment[i + 1];
806
- point = fabric.util.transformPoint(point, transform);
807
- newSegment[i] = point.x;
808
- newSegment[i + 1] = point.y;
809
- }
810
- return newSegment;
811
- });
812
- }
813
-
814
- /**
815
- * Join path commands to go back to svg format
816
- * @param {Array} pathData fabricJS parsed path commands
817
- * @return {String} joined path 'M 0 0 L 20 30'
818
- */
819
- fabric.util.joinPath = function(pathData) {
820
- return pathData.map(function (segment) { return segment.join(' '); }).join(' ');
821
- };
822
- fabric.util.parsePath = parsePath;
823
- fabric.util.makePathSimpler = makePathSimpler;
824
- fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;
825
- fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;
826
- fabric.util.getBoundsOfCurve = getBoundsOfCurve;
827
- fabric.util.getPointOnPath = getPointOnPath;
828
- fabric.util.transformPath = transformPath;
829
- })();