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,40 @@
1
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
2
+ import { sendObjectToPlane } from './planeChange';
3
+ import { Group } from '../../shapes/Group';
4
+ /**
5
+ * Merges 2 clip paths into one visually equal clip path
6
+ *
7
+ * **IMPORTANT**:\
8
+ * Does **NOT** clone the arguments, clone them proir if necessary.
9
+ *
10
+ * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.
11
+ * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.
12
+ *
13
+ * In order to handle the `inverted` property we follow logic described in the following cases:\
14
+ * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\
15
+ * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\
16
+ * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.
17
+ *
18
+ * @memberOf fabric.util
19
+ * @param {fabric.Object} c1
20
+ * @param {fabric.Object} c2
21
+ * @returns {fabric.Object} merged clip path
22
+ */
23
+ export const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {
24
+ let a = c1,
25
+ b = c2;
26
+ if (a.inverted && !b.inverted) {
27
+ // case (2)
28
+ a = c2;
29
+ b = c1;
30
+ }
31
+ // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane
32
+ sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());
33
+ // assign the `inverted` prop to the wrapping group
34
+ const inverted = a.inverted && b.inverted;
35
+ if (inverted) {
36
+ // case (1)
37
+ a.inverted = b.inverted = false;
38
+ }
39
+ return new Group([a], { clipPath: b, inverted });
40
+ };
@@ -0,0 +1,189 @@
1
+ import { noop } from '../../constants';
2
+ import type { Gradient } from '../../gradient/Gradient';
3
+ import type { Pattern } from '../../Pattern';
4
+ import type { FabricObject } from '../../shapes/Object/FabricObject';
5
+ import type { TCrossOrigin, TFiller } from '../../typedefs';
6
+ import { createImage } from './dom';
7
+ import { classRegistry } from '../../ClassRegistry';
8
+
9
+ export type LoadImageOptions = {
10
+ /**
11
+ * see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
12
+ */
13
+ signal?: AbortSignal;
14
+ /**
15
+ * cors value for the image loading, default to anonymous
16
+ */
17
+ crossOrigin?: TCrossOrigin;
18
+ };
19
+
20
+ /**
21
+ * Loads image element from given url and resolve it, or catch.
22
+ * @param {String} url URL representing an image
23
+ * @param {LoadImageOptions} [options] image loading options
24
+ * @returns {Promise<HTMLImageElement>} the loaded image.
25
+ */
26
+ export const loadImage = (
27
+ url: string,
28
+ { signal, crossOrigin = null }: LoadImageOptions = {}
29
+ ) =>
30
+ new Promise<HTMLImageElement>(function (resolve, reject) {
31
+ if (signal && signal.aborted) {
32
+ return reject(new Error('`options.signal` is in `aborted` state'));
33
+ }
34
+ const img = createImage();
35
+ let abort: EventListenerOrEventListenerObject;
36
+ if (signal) {
37
+ abort = function (err: Event) {
38
+ img.src = '';
39
+ reject(err);
40
+ };
41
+ signal.addEventListener('abort', abort, { once: true });
42
+ }
43
+ const done = function () {
44
+ img.onload = img.onerror = null;
45
+ abort && signal?.removeEventListener('abort', abort);
46
+ resolve(img);
47
+ };
48
+ if (!url) {
49
+ done();
50
+ return;
51
+ }
52
+ img.onload = done;
53
+ img.onerror = function () {
54
+ abort && signal?.removeEventListener('abort', abort);
55
+ reject(new Error('Error loading ' + img.src));
56
+ };
57
+ crossOrigin && (img.crossOrigin = crossOrigin);
58
+ img.src = url;
59
+ });
60
+
61
+ export type EnlivenObjectOptions = {
62
+ /**
63
+ * handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
64
+ */
65
+ signal?: AbortSignal;
66
+ /**
67
+ * Method for further parsing of object elements,
68
+ * called after each fabric object created.
69
+ */
70
+ reviver?: (
71
+ serializedObj: Record<string, any>,
72
+ instance: FabricObject
73
+ ) => void;
74
+ /**
75
+ * Namespace to get klass "Class" object from
76
+ */
77
+ namespace?: any;
78
+ };
79
+
80
+ /**
81
+ * Creates corresponding fabric instances from their object representations
82
+ * @param {Object[]} objects Objects to enliven
83
+ * @param {EnlivenObjectOptions} [options]
84
+ * @param {object} [options.namespace] Namespace to get klass "Class" object from
85
+ * @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,
86
+ * called after each fabric object created.
87
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
88
+ * @returns {Promise<FabricObject[]>}
89
+ */
90
+ export const enlivenObjects = (
91
+ objects: any[],
92
+ { signal, reviver = noop }: EnlivenObjectOptions = {}
93
+ ) =>
94
+ new Promise<FabricObject[]>((resolve, reject) => {
95
+ const instances: FabricObject[] = [];
96
+ signal && signal.addEventListener('abort', reject, { once: true });
97
+ Promise.all(
98
+ objects.map((obj) =>
99
+ classRegistry
100
+ .getClass(obj.type)
101
+ // @ts-ignore
102
+ .fromObject(obj, {
103
+ signal,
104
+ reviver,
105
+ })
106
+ .then((fabricInstance: FabricObject) => {
107
+ reviver(obj, fabricInstance);
108
+ instances.push(fabricInstance);
109
+ return fabricInstance;
110
+ })
111
+ )
112
+ )
113
+ .then(resolve)
114
+ .catch((error) => {
115
+ // cleanup
116
+ instances.forEach(function (instance) {
117
+ instance.dispose && instance.dispose();
118
+ });
119
+ reject(error);
120
+ })
121
+ .finally(() => {
122
+ signal && signal.removeEventListener('abort', reject);
123
+ });
124
+ });
125
+
126
+ /**
127
+ * Creates corresponding fabric instances residing in an object, e.g. `clipPath`
128
+ * @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
129
+ * @param {object} [options]
130
+ * @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
131
+ * @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values
132
+ */
133
+ export const enlivenObjectEnlivables = <
134
+ R = Record<string, FabricObject | TFiller | null>
135
+ >(
136
+ serializedObject: any,
137
+ { signal }: { signal?: AbortSignal } = {}
138
+ ) =>
139
+ new Promise<R>((resolve, reject) => {
140
+ const instances: (FabricObject | TFiller)[] = [];
141
+ signal && signal.addEventListener('abort', reject, { once: true });
142
+ // enlive every possible property
143
+ const promises = Object.values(serializedObject).map((value: any) => {
144
+ if (!value) {
145
+ return value;
146
+ }
147
+ // gradient
148
+ if (value.colorStops) {
149
+ return new (classRegistry.getClass('gradient'))(value);
150
+ }
151
+ // clipPath
152
+ if (value.type) {
153
+ return enlivenObjects([value], { signal }).then(([enlived]) => {
154
+ instances.push(enlived);
155
+ return enlived;
156
+ });
157
+ }
158
+ // pattern
159
+ if (value.source) {
160
+ return classRegistry
161
+ .getClass('pattern')
162
+ .fromObject(value, { signal })
163
+ .then((pattern: Pattern) => {
164
+ instances.push(pattern);
165
+ return pattern;
166
+ });
167
+ }
168
+ return value;
169
+ });
170
+ const keys = Object.keys(serializedObject);
171
+ Promise.all(promises)
172
+ .then((enlived) => {
173
+ return enlived.reduce((acc, instance, index) => {
174
+ acc[keys[index]] = instance;
175
+ return acc;
176
+ }, {});
177
+ })
178
+ .then(resolve)
179
+ .catch((error) => {
180
+ // cleanup
181
+ instances.forEach((instance: any) => {
182
+ instance.dispose && instance.dispose();
183
+ });
184
+ reject(error);
185
+ })
186
+ .finally(() => {
187
+ signal && signal.removeEventListener('abort', reject);
188
+ });
189
+ });
@@ -0,0 +1,129 @@
1
+ import { Point } from '../../Point';
2
+ import type { FabricObject } from '../../shapes/Object/Object';
3
+ import { TMat2D } from '../../typedefs';
4
+ import { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';
5
+ import type { TScaleMatrixArgs } from './matrix';
6
+ import {
7
+ calcDimensionsMatrix,
8
+ invertTransform,
9
+ multiplyTransformMatrices,
10
+ qrDecompose,
11
+ } from './matrix';
12
+
13
+ /**
14
+ * given an object and a transform, apply the inverse transform to the object,
15
+ * this is equivalent to remove from that object that transformation, so that
16
+ * added in a space with the removed transform, the object will be the same as before.
17
+ * Removing from an object a transform that scale by 2 is like scaling it by 1/2.
18
+ * Removing from an object a transform that rotate by 30deg is like rotating by 30deg
19
+ * in the opposite direction.
20
+ * This util is used to add objects inside transformed groups or nested groups.
21
+ * @param {FabricObject} object the object you want to transform
22
+ * @param {TMat2D} transform the destination transform
23
+ */
24
+ export const removeTransformFromObject = (
25
+ object: FabricObject,
26
+ transform: TMat2D
27
+ ) => {
28
+ const inverted = invertTransform(transform),
29
+ finalTransform = multiplyTransformMatrices(
30
+ inverted,
31
+ object.calcOwnMatrix()
32
+ );
33
+ applyTransformToObject(object, finalTransform);
34
+ };
35
+
36
+ /**
37
+ * given an object and a transform, apply the transform to the object.
38
+ * this is equivalent to change the space where the object is drawn.
39
+ * Adding to an object a transform that scale by 2 is like scaling it by 2.
40
+ * This is used when removing an object from an active selection for example.
41
+ * @param {FabricObject} object the object you want to transform
42
+ * @param {Array} transform the destination transform
43
+ */
44
+ export const addTransformToObject = (object: FabricObject, transform: TMat2D) =>
45
+ applyTransformToObject(
46
+ object,
47
+ multiplyTransformMatrices(transform, object.calcOwnMatrix())
48
+ );
49
+
50
+ /**
51
+ * discard an object transform state and apply the one from the matrix.
52
+ * @param {FabricObject} object the object you want to transform
53
+ * @param {Array} transform the destination transform
54
+ */
55
+ export const applyTransformToObject = (
56
+ object: FabricObject,
57
+ transform: TMat2D
58
+ ) => {
59
+ const { translateX, translateY, scaleX, scaleY, ...otherOptions } =
60
+ qrDecompose(transform),
61
+ center = new Point(translateX, translateY);
62
+ object.flipX = false;
63
+ object.flipY = false;
64
+ Object.assign(object, otherOptions);
65
+ object.set({ scaleX, scaleY });
66
+ object.setPositionByOrigin(center, 'center', 'center');
67
+ };
68
+ /**
69
+ * reset an object transform state to neutral. Top and left are not accounted for
70
+ * @param {FabricObject} target object to transform
71
+ */
72
+ export const resetObjectTransform = (target: FabricObject) => {
73
+ target.scaleX = 1;
74
+ target.scaleY = 1;
75
+ target.skewX = 0;
76
+ target.skewY = 0;
77
+ target.flipX = false;
78
+ target.flipY = false;
79
+ target.rotate(0);
80
+ };
81
+
82
+ /**
83
+ * Extract Object transform values
84
+ * @param {FabricObject} target object to read from
85
+ * @return {Object} Components of transform
86
+ */
87
+ export const saveObjectTransform = (target: FabricObject) => ({
88
+ scaleX: target.scaleX,
89
+ scaleY: target.scaleY,
90
+ skewX: target.skewX,
91
+ skewY: target.skewY,
92
+ angle: target.angle,
93
+ left: target.left,
94
+ flipX: target.flipX,
95
+ flipY: target.flipY,
96
+ top: target.top,
97
+ });
98
+
99
+ /**
100
+ * given a width and height, return the size of the bounding box
101
+ * that can contains the box with width/height with applied transform
102
+ * described in options.
103
+ * Use to calculate the boxes around objects for controls.
104
+ * @param {Number} width
105
+ * @param {Number} height
106
+ * @param {Object} options
107
+ * @param {Number} options.scaleX
108
+ * @param {Number} options.scaleY
109
+ * @param {Number} options.skewX
110
+ * @param {Number} options.skewY
111
+ * @returns {Point} size
112
+ */
113
+ export const sizeAfterTransform = (
114
+ width: number,
115
+ height: number,
116
+ options: TScaleMatrixArgs
117
+ ) => {
118
+ const dimX = width / 2,
119
+ dimY = height / 2,
120
+ transformMatrix = calcDimensionsMatrix(options),
121
+ points = [
122
+ new Point(-dimX, -dimY),
123
+ new Point(dimX, -dimY),
124
+ new Point(-dimX, dimY),
125
+ new Point(dimX, dimY),
126
+ ].map((p) => p.transform(transformMatrix)),
127
+ bbox = makeBoundingBoxFromPoints(points);
128
+ return new Point(bbox.width, bbox.height);
129
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Populates an object with properties of another object
3
+ * @param {Object} source Source object
4
+ * @param {string[]} properties Properties names to include
5
+ * @returns object populated with the picked keys
6
+ */
7
+ export const pick = <T extends Record<string, any>>(
8
+ source: T,
9
+ keys: (keyof T)[] = []
10
+ ) => {
11
+ return keys.reduce((o, key) => {
12
+ if (key in source) {
13
+ o[key] = source[key];
14
+ }
15
+ return o;
16
+ }, {} as Partial<T>);
17
+ };
18
+
19
+ export const pickBy = <T extends Record<string, any>>(
20
+ source: T,
21
+ predicate: <K extends keyof T>(value: T[K], key: K, collection: T) => boolean
22
+ ) => {
23
+ return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {
24
+ if (predicate(source[key], key, source)) {
25
+ o[key] = source[key];
26
+ }
27
+ return o;
28
+ }, {} as Partial<T>);
29
+ };
@@ -0,0 +1,136 @@
1
+ import { iMatrix } from '../../constants';
2
+ import type { Point } from '../../Point';
3
+ import type { FabricObject } from '../../shapes/Object/Object';
4
+ import type { TMat2D } from '../../typedefs';
5
+ import type { StaticCanvas } from '../../canvas/StaticCanvas';
6
+ import { invertTransform, multiplyTransformMatrices } from './matrix';
7
+ import { applyTransformToObject } from './objectTransforms';
8
+
9
+ export const enum ObjectRelation {
10
+ sibling = 'sibling',
11
+ child = 'child',
12
+ }
13
+
14
+ /**
15
+ * We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\
16
+ * The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)
17
+ * @param [from]
18
+ * @param [to]
19
+ * @returns
20
+ */
21
+ export const calcPlaneChangeMatrix = (
22
+ from: TMat2D = iMatrix,
23
+ to: TMat2D = iMatrix
24
+ ) => multiplyTransformMatrices(invertTransform(to), from);
25
+
26
+ /**
27
+ * Sends a point from the source coordinate plane to the destination coordinate plane.\
28
+ * From the canvas/viewer's perspective the point remains unchanged.
29
+ *
30
+ * @example <caption>Send point from canvas plane to group plane</caption>
31
+ * var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });
32
+ * var group = new Group([obj], { strokeWidth: 0 });
33
+ * var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());
34
+ * var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());
35
+ * console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group
36
+ *
37
+ * @see {transformPointRelativeToCanvas} for transforming relative to canvas
38
+ * @param {Point} point
39
+ * @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.
40
+ * @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.
41
+ * @returns {Point} transformed point
42
+ */
43
+ export const sendPointToPlane = (
44
+ point: Point,
45
+ from: TMat2D = iMatrix,
46
+ to: TMat2D = iMatrix
47
+ ): Point =>
48
+ // we are actually looking for the transformation from the destination plane to the source plane (which is a linear mapping)
49
+ // the object will exist on the destination plane and we want it to seem unchanged by it so we reverse the destination matrix (to) and then apply the source matrix (from)
50
+ point.transform(calcPlaneChangeMatrix(from, to));
51
+
52
+ /**
53
+ * Transform point relative to canvas.
54
+ * From the viewport/viewer's perspective the point remains unchanged.
55
+ *
56
+ * `child` relation means `point` exists in the coordinate plane created by `canvas`.
57
+ * In other words point is measured according to canvas' top left corner
58
+ * meaning that if `point` is equal to (0,0) it is positioned at canvas' top left corner.
59
+ *
60
+ * `sibling` relation means `point` exists in the same coordinate plane as canvas.
61
+ * In other words they both relate to the same (0,0) and agree on every point, which is how an event relates to canvas.
62
+ *
63
+ * @param {Point} point
64
+ * @param {StaticCanvas} canvas
65
+ * @param {'sibling'|'child'} relationBefore current relation of point to canvas
66
+ * @param {'sibling'|'child'} relationAfter desired relation of point to canvas
67
+ * @returns {Point} transformed point
68
+ */
69
+ export const transformPointRelativeToCanvas = (
70
+ point: Point,
71
+ canvas: StaticCanvas,
72
+ relationBefore: ObjectRelation,
73
+ relationAfter: ObjectRelation
74
+ ): Point => {
75
+ // is this still needed with TS?
76
+ if (
77
+ relationBefore !== ObjectRelation.child &&
78
+ relationBefore !== ObjectRelation.sibling
79
+ ) {
80
+ throw new Error(`fabric.js: received bad argument ${relationBefore}`);
81
+ }
82
+ if (
83
+ relationAfter !== ObjectRelation.child &&
84
+ relationAfter !== ObjectRelation.sibling
85
+ ) {
86
+ throw new Error(`fabric.js: received bad argument ${relationAfter}`);
87
+ }
88
+ if (relationBefore === relationAfter) {
89
+ return point;
90
+ }
91
+ const t = canvas.viewportTransform;
92
+ return point.transform(relationAfter === 'child' ? invertTransform(t) : t);
93
+ };
94
+
95
+ /**
96
+ *
97
+ * A util that abstracts applying transform to objects.\
98
+ * Sends `object` to the destination coordinate plane by applying the relevant transformations.\
99
+ * Changes the space/plane where `object` is drawn.\
100
+ * From the canvas/viewer's perspective `object` remains unchanged.
101
+ *
102
+ * @example <caption>Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer</caption>
103
+ * let obj, obj2;
104
+ * let clipPath = new Circle({ radius: 50 });
105
+ * obj.clipPath = clipPath;
106
+ * // render
107
+ * sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());
108
+ * obj.clipPath = undefined;
109
+ * obj2.clipPath = clipPath;
110
+ * // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer
111
+ *
112
+ * @example <caption>Clip an object's clip path with an existing object</caption>
113
+ * let obj, existingObj;
114
+ * let clipPath = new Circle({ radius: 50 });
115
+ * obj.clipPath = clipPath;
116
+ * let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());
117
+ * sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);
118
+ * clipPath.clipPath = existingObj;
119
+ *
120
+ * @param {FabricObject} object
121
+ * @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.
122
+ * @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.
123
+ * @returns {Matrix} the transform matrix that was applied to `object`
124
+ */
125
+ export const sendObjectToPlane = (
126
+ object: FabricObject,
127
+ from?: TMat2D,
128
+ to?: TMat2D
129
+ ): TMat2D => {
130
+ const t = calcPlaneChangeMatrix(from, to);
131
+ applyTransformToObject(
132
+ object,
133
+ multiplyTransformMatrices(t, object.calcOwnMatrix())
134
+ );
135
+ return t;
136
+ };
@@ -0,0 +1,112 @@
1
+ import { XY, Point } from '../../../Point';
2
+ import { createVector, getOrthonormalVector, getUnitVector } from '../vectors';
3
+ import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
4
+ import { StrokeProjectionsBase } from './StrokeProjectionsBase';
5
+ import { TProjection, TProjectStrokeOnPointsOptions } from './types';
6
+
7
+ /**
8
+ * class in charge of finding projections for each type of line cap for start/end of an open path
9
+ * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}
10
+ *
11
+ * Reference:
12
+ * - MDN:
13
+ * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap
14
+ * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap
15
+ * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev
16
+ * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
17
+ * - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js
18
+ */
19
+ export class StrokeLineCapProjections extends StrokeProjectionsBase {
20
+ /**
21
+ * edge point
22
+ */
23
+ declare A: Point;
24
+ /**
25
+ * point next to edge point
26
+ */
27
+ declare T: Point;
28
+
29
+ constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {
30
+ super(options);
31
+ this.A = new Point(A);
32
+ this.T = new Point(T);
33
+ }
34
+
35
+ calcOrthogonalProjection(
36
+ from: Point,
37
+ to: Point,
38
+ magnitude: number = this.strokeProjectionMagnitude
39
+ ) {
40
+ const vector = this.createSideVector(from, to);
41
+ return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);
42
+ }
43
+
44
+ /**
45
+ * OPEN PATH START/END - Line cap: Butt
46
+ * Calculation: to find the projections, just find the points orthogonal to the stroke
47
+ *
48
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt
49
+ */
50
+ projectButt() {
51
+ return [
52
+ this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),
53
+ this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),
54
+ ];
55
+ }
56
+
57
+ /**
58
+ * OPEN PATH START/END - Line cap: Round
59
+ * Calculation: same as stroke line join `round`
60
+ *
61
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round
62
+ */
63
+ projectRound() {
64
+ return new StrokeLineJoinProjections(
65
+ this.A,
66
+ this.T,
67
+ this.T,
68
+ this.options
69
+ ).projectRound();
70
+ }
71
+
72
+ /**
73
+ * OPEN PATH START/END - Line cap: Square
74
+ * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`
75
+ *
76
+ * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square
77
+ */
78
+ projectSquare() {
79
+ const orthogonalProjection = this.calcOrthogonalProjection(
80
+ this.A,
81
+ this.T,
82
+ this.strokeProjectionMagnitude
83
+ );
84
+ const strokePointingOut = this.scaleUnitVector(
85
+ getUnitVector(createVector(this.A, this.T)),
86
+ -this.strokeProjectionMagnitude
87
+ );
88
+ const projectedA = this.A.add(strokePointingOut);
89
+ return [
90
+ projectedA.add(orthogonalProjection),
91
+ projectedA.subtract(orthogonalProjection),
92
+ ].map((p) => this.applySkew(p));
93
+ }
94
+
95
+ protected projectPoints() {
96
+ switch (this.options.strokeLineCap) {
97
+ case 'round':
98
+ return this.projectRound();
99
+ case 'square':
100
+ return this.projectSquare();
101
+ default:
102
+ return this.projectButt();
103
+ }
104
+ }
105
+
106
+ public project(): TProjection[] {
107
+ return this.projectPoints().map((point) => ({
108
+ originPoint: this.A,
109
+ projectedPoint: point,
110
+ }));
111
+ }
112
+ }