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,406 @@
1
+ //@ts-nocheck
2
+ import { Color } from '../color/Color';
3
+ import { iMatrix } from '../constants';
4
+ import { parseTransformAttribute } from '../parser/parseTransformAttribute';
5
+ import type { FabricObject } from '../shapes/Object/FabricObject';
6
+ import { FabricObject as BaseFabricObject } from '../shapes/Object/Object';
7
+ import { TMat2D } from '../typedefs';
8
+ import { uid } from '../util/internals/uid';
9
+ import { pick } from '../util/misc/pick';
10
+ import { matrixToSVG } from '../util/misc/svgParsing';
11
+ import { linearDefaultCoords, radialDefaultCoords } from './constants';
12
+ import {
13
+ parseColorStops,
14
+ parseCoords,
15
+ parseGradientUnits,
16
+ parseType,
17
+ } from './parser';
18
+ import {
19
+ ColorStop,
20
+ GradientCoords,
21
+ GradientOptions,
22
+ GradientType,
23
+ GradientUnits,
24
+ SVGOptions,
25
+ } from './typedefs';
26
+ import { classRegistry } from '../ClassRegistry';
27
+
28
+ /**
29
+ * Gradient class
30
+ * @class Gradient
31
+ * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}
32
+ */
33
+ export class Gradient<
34
+ S,
35
+ T extends GradientType = S extends GradientType ? S : 'linear'
36
+ > {
37
+ /**
38
+ * Horizontal offset for aligning gradients coming from SVG when outside pathgroups
39
+ * @type Number
40
+ * @default 0
41
+ */
42
+ declare offsetX: number;
43
+
44
+ /**
45
+ * Vertical offset for aligning gradients coming from SVG when outside pathgroups
46
+ * @type Number
47
+ * @default 0
48
+ */
49
+ declare offsetY: number;
50
+
51
+ /**
52
+ * A transform matrix to apply to the gradient before painting.
53
+ * Imported from svg gradients, is not applied with the current transform in the center.
54
+ * Before this transform is applied, the origin point is at the top left corner of the object
55
+ * plus the addition of offsetY and offsetX.
56
+ * @type Number[]
57
+ * @default null
58
+ */
59
+ declare gradientTransform: TMat2D | null;
60
+
61
+ /**
62
+ * coordinates units for coords.
63
+ * If `pixels`, the number of coords are in the same unit of width / height.
64
+ * If set as `percentage` the coords are still a number, but 1 means 100% of width
65
+ * for the X and 100% of the height for the y. It can be bigger than 1 and negative.
66
+ * allowed values pixels or percentage.
67
+ * @type GradientUnits
68
+ * @default 'pixels'
69
+ */
70
+ declare gradientUnits: GradientUnits;
71
+
72
+ /**
73
+ * Gradient type linear or radial
74
+ * @type GradientType
75
+ * @default 'linear'
76
+ */
77
+ declare type: T;
78
+
79
+ /**
80
+ * Defines how the gradient is located in space and spread
81
+ * @type GradientCoords
82
+ */
83
+ declare coords: GradientCoords<T>;
84
+
85
+ /**
86
+ * Defines how many colors a gradient has and how they are located on the axis
87
+ * defined by coords
88
+ * @type GradientCoords
89
+ */
90
+ declare colorStops: ColorStop[];
91
+
92
+ /**
93
+ * If true, this object will not be exported during the serialization of a canvas
94
+ * @type boolean
95
+ */
96
+ declare excludeFromExport?: boolean;
97
+
98
+ /**
99
+ * ID used for SVG export functionalities
100
+ * @type number | string
101
+ */
102
+ declare readonly id: string | number;
103
+
104
+ constructor({
105
+ type = 'linear' as T,
106
+ gradientUnits = 'pixels',
107
+ coords,
108
+ colorStops = [],
109
+ offsetX = 0,
110
+ offsetY = 0,
111
+ gradientTransform = null,
112
+ id,
113
+ }: GradientOptions<T>) {
114
+ this.id = id ? `${id}_${uid()}` : uid();
115
+ this.type = type;
116
+ this.gradientUnits = gradientUnits;
117
+ this.gradientTransform = gradientTransform;
118
+ this.offsetX = offsetX;
119
+ this.offsetY = offsetY;
120
+ this.coords = {
121
+ ...(this.type === 'radial' ? radialDefaultCoords : linearDefaultCoords),
122
+ ...coords,
123
+ } as GradientCoords<T>;
124
+ this.colorStops = colorStops.slice();
125
+ }
126
+
127
+ // isType<S extends GradientType>(type: S): this is Gradient<S> {
128
+ // return (this.type as GradientType) === type;
129
+ // }
130
+
131
+ /**
132
+ * Adds another colorStop
133
+ * @param {Record<string, string>} colorStop Object with offset and color
134
+ * @return {Gradient} thisArg
135
+ */
136
+ addColorStop(colorStops: Record<string, string>) {
137
+ for (const position in colorStops) {
138
+ const color = new Color(colorStops[position]);
139
+ this.colorStops.push({
140
+ offset: parseFloat(position),
141
+ color: color.toRgb(),
142
+ opacity: color.getAlpha(),
143
+ });
144
+ }
145
+ return this;
146
+ }
147
+
148
+ /**
149
+ * Returns object representation of a gradient
150
+ * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output
151
+ * @return {object}
152
+ */
153
+ toObject(propertiesToInclude?: (keyof this | string)[]) {
154
+ return {
155
+ ...pick(this, propertiesToInclude),
156
+ type: this.type,
157
+ coords: this.coords,
158
+ colorStops: this.colorStops,
159
+ offsetX: this.offsetX,
160
+ offsetY: this.offsetY,
161
+ gradientUnits: this.gradientUnits,
162
+ gradientTransform: this.gradientTransform
163
+ ? this.gradientTransform.concat()
164
+ : this.gradientTransform,
165
+ };
166
+ }
167
+
168
+ /* _TO_SVG_START_ */
169
+ /**
170
+ * Returns SVG representation of an gradient
171
+ * @param {FabricObject} object Object to create a gradient for
172
+ * @return {String} SVG representation of an gradient (linear/radial)
173
+ */
174
+ toSVG(
175
+ object: FabricObject,
176
+ { additionalTransform: preTransform }: { additionalTransform?: string } = {}
177
+ ) {
178
+ const markup = [],
179
+ transform = (
180
+ this.gradientTransform
181
+ ? this.gradientTransform.concat()
182
+ : iMatrix.concat()
183
+ ) as TMat2D,
184
+ gradientUnits =
185
+ this.gradientUnits === 'pixels'
186
+ ? 'userSpaceOnUse'
187
+ : 'objectBoundingBox';
188
+ // colorStops must be sorted ascending, and guarded against deep mutations
189
+ const colorStops = this.colorStops
190
+ .map((colorStop) => ({ ...colorStop }))
191
+ .sort((a, b) => {
192
+ return a.offset - b.offset;
193
+ });
194
+
195
+ let offsetX = -this.offsetX,
196
+ offsetY = -this.offsetY;
197
+ if (gradientUnits === 'objectBoundingBox') {
198
+ offsetX /= object.width;
199
+ offsetY /= object.height;
200
+ } else {
201
+ offsetX += object.width / 2;
202
+ offsetY += object.height / 2;
203
+ }
204
+ if (
205
+ object instanceof BaseFabricObject &&
206
+ object.isType('Path') &&
207
+ this.gradientUnits !== 'percentage'
208
+ ) {
209
+ offsetX -= object.pathOffset.x;
210
+ offsetY -= object.pathOffset.y;
211
+ }
212
+ transform[4] -= offsetX;
213
+ transform[5] -= offsetY;
214
+
215
+ const commonAttributes = [
216
+ `id="SVGID_${this.id}"`,
217
+ `gradientUnits="${gradientUnits}"`,
218
+ `gradientTransform="${
219
+ preTransform ? preTransform + ' ' : ''
220
+ }${matrixToSVG(transform)}"`,
221
+ '',
222
+ ].join(' ');
223
+
224
+ if (this.type === 'linear') {
225
+ const { x1, y1, x2, y2 } = this.coords;
226
+ markup.push(
227
+ '<linearGradient ',
228
+ commonAttributes,
229
+ ' x1="',
230
+ x1,
231
+ '" y1="',
232
+ y1,
233
+ '" x2="',
234
+ x2,
235
+ '" y2="',
236
+ y2,
237
+ '">\n'
238
+ );
239
+ } else if (this.type === 'radial') {
240
+ const { x1, y1, x2, y2, r1, r2 } = this
241
+ .coords as GradientCoords<'radial'>;
242
+ const needsSwap = r1 > r2;
243
+ // svg radial gradient has just 1 radius. the biggest.
244
+ markup.push(
245
+ '<radialGradient ',
246
+ commonAttributes,
247
+ ' cx="',
248
+ needsSwap ? x1 : x2,
249
+ '" cy="',
250
+ needsSwap ? y1 : y2,
251
+ '" r="',
252
+ needsSwap ? r1 : r2,
253
+ '" fx="',
254
+ needsSwap ? x2 : x1,
255
+ '" fy="',
256
+ needsSwap ? y2 : y1,
257
+ '">\n'
258
+ );
259
+ if (needsSwap) {
260
+ // svg goes from internal to external radius. if radius are inverted, swap color stops.
261
+ colorStops.reverse(); // mutates array
262
+ colorStops.forEach((colorStop) => {
263
+ colorStop.offset = 1 - colorStop.offset;
264
+ });
265
+ }
266
+ const minRadius = Math.min(r1, r2);
267
+ if (minRadius > 0) {
268
+ // i have to shift all colorStops and add new one in 0.
269
+ const maxRadius = Math.max(r1, r2),
270
+ percentageShift = minRadius / maxRadius;
271
+ colorStops.forEach((colorStop) => {
272
+ colorStop.offset += percentageShift * (1 - colorStop.offset);
273
+ });
274
+ }
275
+ }
276
+
277
+ colorStops.forEach(({ color, offset, opacity }) => {
278
+ markup.push(
279
+ '<stop ',
280
+ 'offset="',
281
+ offset * 100 + '%',
282
+ '" style="stop-color:',
283
+ color,
284
+ typeof opacity !== 'undefined' ? ';stop-opacity: ' + opacity : ';',
285
+ '"/>\n'
286
+ );
287
+ });
288
+
289
+ markup.push(
290
+ this.type === 'linear' ? '</linearGradient>' : '</radialGradient>',
291
+ '\n'
292
+ );
293
+
294
+ return markup.join('');
295
+ }
296
+ /* _TO_SVG_END_ */
297
+
298
+ /**
299
+ * Returns an instance of CanvasGradient
300
+ * @param {CanvasRenderingContext2D} ctx Context to render on
301
+ * @return {CanvasGradient}
302
+ */
303
+ toLive(ctx: CanvasRenderingContext2D): CanvasGradient {
304
+ const coords = this.coords as GradientCoords<'radial'>;
305
+ const gradient =
306
+ this.type === 'linear'
307
+ ? ctx.createLinearGradient(coords.x1, coords.y1, coords.x2, coords.y2)
308
+ : ctx.createRadialGradient(
309
+ coords.x1,
310
+ coords.y1,
311
+ coords.r1,
312
+ coords.x2,
313
+ coords.y2,
314
+ coords.r2
315
+ );
316
+
317
+ this.colorStops.forEach(({ color, opacity, offset }) => {
318
+ gradient.addColorStop(
319
+ offset,
320
+ typeof opacity !== 'undefined'
321
+ ? new Color(color).setAlpha(opacity).toRgba()
322
+ : color
323
+ );
324
+ });
325
+
326
+ return gradient;
327
+ }
328
+
329
+ /* _FROM_SVG_START_ */
330
+ /**
331
+ * Returns {@link Gradient} instance from an SVG element
332
+ * @static
333
+ * @memberOf Gradient
334
+ * @param {SVGGradientElement} el SVG gradient element
335
+ * @param {FabricObject} instance
336
+ * @param {String} opacity A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.
337
+ * @param {SVGOptions} svgOptions an object containing the size of the SVG in order to parse correctly gradients
338
+ * that uses gradientUnits as 'userSpaceOnUse' and percentages.
339
+ * @return {Gradient} Gradient instance
340
+ * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement
341
+ * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement
342
+ *
343
+ * @example
344
+ *
345
+ * <linearGradient id="linearGrad1">
346
+ * <stop offset="0%" stop-color="white"/>
347
+ * <stop offset="100%" stop-color="black"/>
348
+ * </linearGradient>
349
+ *
350
+ * OR
351
+ *
352
+ * <linearGradient id="linearGrad2">
353
+ * <stop offset="0" style="stop-color:rgb(255,255,255)"/>
354
+ * <stop offset="1" style="stop-color:rgb(0,0,0)"/>
355
+ * </linearGradient>
356
+ *
357
+ * OR
358
+ *
359
+ * <radialGradient id="radialGrad1">
360
+ * <stop offset="0%" stop-color="white" stop-opacity="1" />
361
+ * <stop offset="50%" stop-color="black" stop-opacity="0.5" />
362
+ * <stop offset="100%" stop-color="white" stop-opacity="1" />
363
+ * </radialGradient>
364
+ *
365
+ * OR
366
+ *
367
+ * <radialGradient id="radialGrad2">
368
+ * <stop offset="0" stop-color="rgb(255,255,255)" />
369
+ * <stop offset="0.5" stop-color="rgb(0,0,0)" />
370
+ * <stop offset="1" stop-color="rgb(255,255,255)" />
371
+ * </radialGradient>
372
+ *
373
+ */
374
+ static fromElement(
375
+ el: SVGGradientElement,
376
+ instance: FabricObject,
377
+ svgOptions: SVGOptions
378
+ ): Gradient<GradientType> {
379
+ const gradientUnits = parseGradientUnits(el);
380
+ return new this({
381
+ id: el.getAttribute('id') || undefined,
382
+ type: parseType(el),
383
+ coords: parseCoords(el, {
384
+ width: svgOptions.viewBoxWidth || svgOptions.width,
385
+ height: svgOptions.viewBoxHeight || svgOptions.height,
386
+ }),
387
+ colorStops: parseColorStops(el, svgOptions.opacity),
388
+ gradientUnits,
389
+ gradientTransform: parseTransformAttribute(
390
+ el.getAttribute('gradientTransform') || ''
391
+ ),
392
+ ...(gradientUnits === 'pixels'
393
+ ? {
394
+ offsetX: -instance.left,
395
+ offsetY: -instance.top,
396
+ }
397
+ : {
398
+ offsetX: 0,
399
+ offsetY: 0,
400
+ }),
401
+ });
402
+ }
403
+ /* _FROM_SVG_END_ */
404
+ }
405
+
406
+ classRegistry.setClass(Gradient, 'gradient');
@@ -0,0 +1,12 @@
1
+ export const linearDefaultCoords = {
2
+ x1: 0,
3
+ y1: 0,
4
+ x2: 0,
5
+ y2: 0,
6
+ };
7
+
8
+ export const radialDefaultCoords = {
9
+ ...linearDefaultCoords,
10
+ r1: 0,
11
+ r2: 0,
12
+ };
@@ -0,0 +1,3 @@
1
+ export * from './misc';
2
+ export * from './parseColorStops';
3
+ export * from './parseCoords';
@@ -0,0 +1,13 @@
1
+ import { GradientType, GradientUnits } from '../typedefs';
2
+
3
+ export function parseType(el: SVGGradientElement): GradientType {
4
+ return el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT'
5
+ ? 'linear'
6
+ : 'radial';
7
+ }
8
+
9
+ export function parseGradientUnits(el: SVGGradientElement): GradientUnits {
10
+ return el.getAttribute('gradientUnits') === 'userSpaceOnUse'
11
+ ? 'pixels'
12
+ : 'percentage';
13
+ }
@@ -0,0 +1,56 @@
1
+ import { Color } from '../../color/Color';
2
+ import { parsePercent } from '../../parser/percent';
3
+ import { ifNaN } from '../../util/internals';
4
+ import { ColorStop } from '../typedefs';
5
+
6
+ const RE_KEY_VALUE_PAIRS = /\s*;\s*/;
7
+ const RE_KEY_VALUE = /\s*:\s*/;
8
+
9
+ function parseColorStop(el: SVGStopElement, multiplier: number) {
10
+ let colorValue, opacity;
11
+ const style = el.getAttribute('style');
12
+ if (style) {
13
+ const keyValuePairs = style.split(RE_KEY_VALUE_PAIRS);
14
+
15
+ if (keyValuePairs[keyValuePairs.length - 1] === '') {
16
+ keyValuePairs.pop();
17
+ }
18
+
19
+ for (let i = keyValuePairs.length; i--; ) {
20
+ const [key, value] = keyValuePairs[i]
21
+ .split(RE_KEY_VALUE)
22
+ .map((s) => s.trim());
23
+ if (key === 'stop-color') {
24
+ colorValue = value;
25
+ } else if (key === 'stop-opacity') {
26
+ opacity = value;
27
+ }
28
+ }
29
+ }
30
+
31
+ const color = new Color(
32
+ colorValue || el.getAttribute('stop-color') || 'rgb(0,0,0)'
33
+ );
34
+
35
+ return {
36
+ offset: parsePercent(el.getAttribute('offset'), 0),
37
+ color: color.toRgb(),
38
+ opacity:
39
+ ifNaN(parseFloat(opacity || el.getAttribute('stop-opacity') || ''), 1) *
40
+ color.getAlpha() *
41
+ multiplier,
42
+ };
43
+ }
44
+
45
+ export function parseColorStops(
46
+ el: SVGGradientElement,
47
+ opacityAttr: string | null
48
+ ) {
49
+ const colorStops: ColorStop[] = [],
50
+ colorStopEls = el.getElementsByTagName('stop'),
51
+ multiplier = parsePercent(opacityAttr, 1);
52
+ for (let i = colorStopEls.length; i--; ) {
53
+ colorStops.push(parseColorStop(colorStopEls[i], multiplier));
54
+ }
55
+ return colorStops;
56
+ }
@@ -0,0 +1,73 @@
1
+ import { isPercent } from '../../parser/percent';
2
+ import { TSize } from '../../typedefs';
3
+ import { GradientCoords, GradientType, GradientUnits } from '../typedefs';
4
+ import { parseGradientUnits, parseType } from './misc';
5
+
6
+ function convertPercentUnitsToValues<
7
+ T extends GradientType,
8
+ K extends keyof GradientCoords<T>
9
+ >(
10
+ valuesToConvert: Record<K, string | number>,
11
+ { width, height, gradientUnits }: TSize & { gradientUnits: GradientUnits }
12
+ ) {
13
+ let finalValue;
14
+ return (Object.keys(valuesToConvert) as K[]).reduce((acc, prop) => {
15
+ const propValue = valuesToConvert[prop];
16
+ if (propValue === 'Infinity') {
17
+ finalValue = 1;
18
+ } else if (propValue === '-Infinity') {
19
+ finalValue = 0;
20
+ } else {
21
+ finalValue =
22
+ typeof propValue === 'string' ? parseFloat(propValue) : propValue;
23
+ if (typeof propValue === 'string' && isPercent(propValue)) {
24
+ finalValue *= 0.01;
25
+ if (gradientUnits === 'pixels') {
26
+ // then we need to fix those percentages here in svg parsing
27
+ if (prop === 'x1' || prop === 'x2' || prop === 'r2') {
28
+ finalValue *= width;
29
+ }
30
+ if (prop === 'y1' || prop === 'y2') {
31
+ finalValue *= height;
32
+ }
33
+ }
34
+ }
35
+ }
36
+ acc[prop] = finalValue;
37
+ return acc;
38
+ }, {} as Record<K, number>);
39
+ }
40
+
41
+ function getValue(el: SVGGradientElement, key: string) {
42
+ return el.getAttribute(key);
43
+ }
44
+
45
+ export function parseLinearCoords(el: SVGGradientElement) {
46
+ return {
47
+ x1: getValue(el, 'x1') || 0,
48
+ y1: getValue(el, 'y1') || 0,
49
+ x2: getValue(el, 'x2') || '100%',
50
+ y2: getValue(el, 'y2') || 0,
51
+ };
52
+ }
53
+
54
+ export function parseRadialCoords(el: SVGGradientElement) {
55
+ return {
56
+ x1: getValue(el, 'fx') || getValue(el, 'cx') || '50%',
57
+ y1: getValue(el, 'fy') || getValue(el, 'cy') || '50%',
58
+ r1: 0,
59
+ x2: getValue(el, 'cx') || '50%',
60
+ y2: getValue(el, 'cy') || '50%',
61
+ r2: getValue(el, 'r') || '50%',
62
+ };
63
+ }
64
+
65
+ export function parseCoords(el: SVGGradientElement, size: TSize) {
66
+ return convertPercentUnitsToValues(
67
+ parseType(el) === 'linear' ? parseLinearCoords(el) : parseRadialCoords(el),
68
+ {
69
+ ...size,
70
+ gradientUnits: parseGradientUnits(el),
71
+ }
72
+ );
73
+ }
@@ -0,0 +1,104 @@
1
+ import { Percent, TMat2D } from '../typedefs';
2
+
3
+ export type GradientUnits = 'pixels' | 'percentage';
4
+
5
+ export type GradientType = 'linear' | 'radial';
6
+
7
+ export type GradientCoordValue = number | Percent | string;
8
+
9
+ export type ColorStop = {
10
+ color: string;
11
+ offset: number;
12
+ opacity?: number;
13
+ };
14
+
15
+ export type LinearGradientCoords<T extends GradientCoordValue> = {
16
+ /**
17
+ * X coordiante of the first point
18
+ */
19
+ x1: T;
20
+ /**
21
+ * Y coordiante of the first point
22
+ */
23
+ y1: T;
24
+ /**
25
+ * X coordiante of the second point
26
+ */
27
+ x2: T;
28
+ /**
29
+ * Y coordiante of the second point
30
+ */
31
+ y2: T;
32
+ };
33
+
34
+ export type RadialGradientCoords<T extends GradientCoordValue> = {
35
+ /**
36
+ * X coordiante of the first focal point
37
+ */
38
+ x1: T;
39
+ /**
40
+ * Y coordiante of the first focal point
41
+ */
42
+ y1: T;
43
+ /**
44
+ * X coordiante of the second focal point
45
+ */
46
+ x2: T;
47
+ /**
48
+ * Y coordiante of the second focal point
49
+ */
50
+ y2: T;
51
+ /**
52
+ * radius of the inner circle
53
+ */
54
+ r1: T;
55
+ /**
56
+ * radius of the outer circle
57
+ */
58
+ r2: T;
59
+ };
60
+
61
+ export type GradientCoords<T extends GradientType> = T extends 'linear'
62
+ ? LinearGradientCoords<number>
63
+ : RadialGradientCoords<number>;
64
+
65
+ export type GradientOptions<T extends GradientType> = {
66
+ type?: T;
67
+ gradientUnits?: GradientUnits;
68
+ colorStops?: ColorStop[];
69
+ coords: Partial<GradientCoords<T>>;
70
+ /**
71
+ * @todo rename?
72
+ */
73
+ gradientTransform?: TMat2D;
74
+ id?: string;
75
+ /**
76
+ * SVG import compatibility
77
+ */
78
+ offsetX?: number;
79
+ /**
80
+ * SVG import compatibility
81
+ */
82
+ offsetY?: number;
83
+ };
84
+
85
+ export type SVGOptions = {
86
+ /**
87
+ * width part of the viewBox attribute on svg
88
+ */
89
+ viewBoxWidth: number;
90
+ /**
91
+ * height part of the viewBox attribute on svg
92
+ */
93
+ viewBoxHeight: number;
94
+ /**
95
+ * width part of the svg tag if viewBox is not specified
96
+ */
97
+ width: number;
98
+ /**
99
+ * height part of the svg tag if viewBox is not specified
100
+ */
101
+ height: number;
102
+
103
+ opacity: string | null;
104
+ };