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
package/src/parser.js DELETED
@@ -1,1090 +0,0 @@
1
- (function(global) {
2
-
3
- 'use strict';
4
-
5
- /**
6
- * @name fabric
7
- * @namespace
8
- */
9
-
10
- var fabric = global.fabric || (global.fabric = { }),
11
- extend = fabric.util.object.extend,
12
- clone = fabric.util.object.clone,
13
- toFixed = fabric.util.toFixed,
14
- parseUnit = fabric.util.parseUnit,
15
- multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,
16
-
17
- svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',
18
- 'image', 'text'],
19
- svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],
20
- svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],
21
- svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],
22
-
23
- attributesMap = {
24
- cx: 'left',
25
- x: 'left',
26
- r: 'radius',
27
- cy: 'top',
28
- y: 'top',
29
- display: 'visible',
30
- visibility: 'visible',
31
- transform: 'transformMatrix',
32
- 'fill-opacity': 'fillOpacity',
33
- 'fill-rule': 'fillRule',
34
- 'font-family': 'fontFamily',
35
- 'font-size': 'fontSize',
36
- 'font-style': 'fontStyle',
37
- 'font-weight': 'fontWeight',
38
- 'letter-spacing': 'charSpacing',
39
- 'paint-order': 'paintFirst',
40
- 'stroke-dasharray': 'strokeDashArray',
41
- 'stroke-dashoffset': 'strokeDashOffset',
42
- 'stroke-linecap': 'strokeLineCap',
43
- 'stroke-linejoin': 'strokeLineJoin',
44
- 'stroke-miterlimit': 'strokeMiterLimit',
45
- 'stroke-opacity': 'strokeOpacity',
46
- 'stroke-width': 'strokeWidth',
47
- 'text-decoration': 'textDecoration',
48
- 'text-anchor': 'textAnchor',
49
- opacity: 'opacity',
50
- 'clip-path': 'clipPath',
51
- 'clip-rule': 'clipRule',
52
- 'vector-effect': 'strokeUniform',
53
- 'image-rendering': 'imageSmoothing',
54
- },
55
-
56
- colorAttributes = {
57
- stroke: 'strokeOpacity',
58
- fill: 'fillOpacity'
59
- },
60
-
61
- fSize = 'font-size', cPath = 'clip-path';
62
-
63
- fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);
64
- fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);
65
- fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);
66
- fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);
67
-
68
- fabric.cssRules = { };
69
- fabric.gradientDefs = { };
70
- fabric.clipPaths = { };
71
-
72
- function normalizeAttr(attr) {
73
- // transform attribute names
74
- if (attr in attributesMap) {
75
- return attributesMap[attr];
76
- }
77
- return attr;
78
- }
79
-
80
- function normalizeValue(attr, value, parentAttributes, fontSize) {
81
- var isArray = Array.isArray(value), parsed;
82
-
83
- if ((attr === 'fill' || attr === 'stroke') && value === 'none') {
84
- value = '';
85
- }
86
- else if (attr === 'strokeUniform') {
87
- return (value === 'non-scaling-stroke');
88
- }
89
- else if (attr === 'strokeDashArray') {
90
- if (value === 'none') {
91
- value = null;
92
- }
93
- else {
94
- value = value.replace(/,/g, ' ').split(/\s+/).map(parseFloat);
95
- }
96
- }
97
- else if (attr === 'transformMatrix') {
98
- if (parentAttributes && parentAttributes.transformMatrix) {
99
- value = multiplyTransformMatrices(
100
- parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));
101
- }
102
- else {
103
- value = fabric.parseTransformAttribute(value);
104
- }
105
- }
106
- else if (attr === 'visible') {
107
- value = value !== 'none' && value !== 'hidden';
108
- // display=none on parent element always takes precedence over child element
109
- if (parentAttributes && parentAttributes.visible === false) {
110
- value = false;
111
- }
112
- }
113
- else if (attr === 'opacity') {
114
- value = parseFloat(value);
115
- if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {
116
- value *= parentAttributes.opacity;
117
- }
118
- }
119
- else if (attr === 'textAnchor' /* text-anchor */) {
120
- value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';
121
- }
122
- else if (attr === 'charSpacing') {
123
- // parseUnit returns px and we convert it to em
124
- parsed = parseUnit(value, fontSize) / fontSize * 1000;
125
- }
126
- else if (attr === 'paintFirst') {
127
- var fillIndex = value.indexOf('fill');
128
- var strokeIndex = value.indexOf('stroke');
129
- var value = 'fill';
130
- if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {
131
- value = 'stroke';
132
- }
133
- else if (fillIndex === -1 && strokeIndex > -1) {
134
- value = 'stroke';
135
- }
136
- }
137
- else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {
138
- return value;
139
- }
140
- else if (attr === 'imageSmoothing') {
141
- return (value === 'optimizeQuality');
142
- }
143
- else {
144
- parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);
145
- }
146
-
147
- return (!isArray && isNaN(parsed) ? value : parsed);
148
- }
149
-
150
- /**
151
- * @private
152
- */
153
- function getSvgRegex(arr) {
154
- return new RegExp('^(' + arr.join('|') + ')\\b', 'i');
155
- }
156
-
157
- /**
158
- * @private
159
- * @param {Object} attributes Array of attributes to parse
160
- */
161
- function _setStrokeFillOpacity(attributes) {
162
- for (var attr in colorAttributes) {
163
-
164
- if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {
165
- continue;
166
- }
167
-
168
- if (typeof attributes[attr] === 'undefined') {
169
- if (!fabric.Object.prototype[attr]) {
170
- continue;
171
- }
172
- attributes[attr] = fabric.Object.prototype[attr];
173
- }
174
-
175
- if (attributes[attr].indexOf('url(') === 0) {
176
- continue;
177
- }
178
-
179
- var color = new fabric.Color(attributes[attr]);
180
- attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();
181
- }
182
- return attributes;
183
- }
184
-
185
- /**
186
- * @private
187
- */
188
- function _getMultipleNodes(doc, nodeNames) {
189
- var nodeName, nodeArray = [], nodeList, i, len;
190
- for (i = 0, len = nodeNames.length; i < len; i++) {
191
- nodeName = nodeNames[i];
192
- nodeList = doc.getElementsByTagName(nodeName);
193
- nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));
194
- }
195
- return nodeArray;
196
- }
197
-
198
- /**
199
- * Parses "transform" attribute, returning an array of values
200
- * @static
201
- * @function
202
- * @memberOf fabric
203
- * @param {String} attributeValue String containing attribute value
204
- * @return {Array} Array of 6 elements representing transformation matrix
205
- */
206
- fabric.parseTransformAttribute = (function() {
207
- function rotateMatrix(matrix, args) {
208
- var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),
209
- x = 0, y = 0;
210
- if (args.length === 3) {
211
- x = args[1];
212
- y = args[2];
213
- }
214
-
215
- matrix[0] = cos;
216
- matrix[1] = sin;
217
- matrix[2] = -sin;
218
- matrix[3] = cos;
219
- matrix[4] = x - (cos * x - sin * y);
220
- matrix[5] = y - (sin * x + cos * y);
221
- }
222
-
223
- function scaleMatrix(matrix, args) {
224
- var multiplierX = args[0],
225
- multiplierY = (args.length === 2) ? args[1] : args[0];
226
-
227
- matrix[0] = multiplierX;
228
- matrix[3] = multiplierY;
229
- }
230
-
231
- function skewMatrix(matrix, args, pos) {
232
- matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));
233
- }
234
-
235
- function translateMatrix(matrix, args) {
236
- matrix[4] = args[0];
237
- if (args.length === 2) {
238
- matrix[5] = args[1];
239
- }
240
- }
241
-
242
- // identity matrix
243
- var iMatrix = fabric.iMatrix,
244
-
245
- // == begin transform regexp
246
- number = fabric.reNum,
247
-
248
- commaWsp = fabric.commaWsp,
249
-
250
- skewX = '(?:(skewX)\\s*\\(\\s*(' + number + ')\\s*\\))',
251
-
252
- skewY = '(?:(skewY)\\s*\\(\\s*(' + number + ')\\s*\\))',
253
-
254
- rotate = '(?:(rotate)\\s*\\(\\s*(' + number + ')(?:' +
255
- commaWsp + '(' + number + ')' +
256
- commaWsp + '(' + number + '))?\\s*\\))',
257
-
258
- scale = '(?:(scale)\\s*\\(\\s*(' + number + ')(?:' +
259
- commaWsp + '(' + number + '))?\\s*\\))',
260
-
261
- translate = '(?:(translate)\\s*\\(\\s*(' + number + ')(?:' +
262
- commaWsp + '(' + number + '))?\\s*\\))',
263
-
264
- matrix = '(?:(matrix)\\s*\\(\\s*' +
265
- '(' + number + ')' + commaWsp +
266
- '(' + number + ')' + commaWsp +
267
- '(' + number + ')' + commaWsp +
268
- '(' + number + ')' + commaWsp +
269
- '(' + number + ')' + commaWsp +
270
- '(' + number + ')' +
271
- '\\s*\\))',
272
-
273
- transform = '(?:' +
274
- matrix + '|' +
275
- translate + '|' +
276
- scale + '|' +
277
- rotate + '|' +
278
- skewX + '|' +
279
- skewY +
280
- ')',
281
-
282
- transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',
283
-
284
- transformList = '^\\s*(?:' + transforms + '?)\\s*$',
285
-
286
- // http://www.w3.org/TR/SVG/coords.html#TransformAttribute
287
- reTransformList = new RegExp(transformList),
288
- // == end transform regexp
289
-
290
- reTransform = new RegExp(transform, 'g');
291
-
292
- return function(attributeValue) {
293
-
294
- // start with identity matrix
295
- var matrix = iMatrix.concat(),
296
- matrices = [];
297
-
298
- // return if no argument was given or
299
- // an argument does not match transform attribute regexp
300
- if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {
301
- return matrix;
302
- }
303
-
304
- attributeValue.replace(reTransform, function(match) {
305
-
306
- var m = new RegExp(transform).exec(match).filter(function (match) {
307
- // match !== '' && match != null
308
- return (!!match);
309
- }),
310
- operation = m[1],
311
- args = m.slice(2).map(parseFloat);
312
-
313
- switch (operation) {
314
- case 'translate':
315
- translateMatrix(matrix, args);
316
- break;
317
- case 'rotate':
318
- args[0] = fabric.util.degreesToRadians(args[0]);
319
- rotateMatrix(matrix, args);
320
- break;
321
- case 'scale':
322
- scaleMatrix(matrix, args);
323
- break;
324
- case 'skewX':
325
- skewMatrix(matrix, args, 2);
326
- break;
327
- case 'skewY':
328
- skewMatrix(matrix, args, 1);
329
- break;
330
- case 'matrix':
331
- matrix = args;
332
- break;
333
- }
334
-
335
- // snapshot current matrix into matrices array
336
- matrices.push(matrix.concat());
337
- // reset
338
- matrix = iMatrix.concat();
339
- });
340
-
341
- var combinedMatrix = matrices[0];
342
- while (matrices.length > 1) {
343
- matrices.shift();
344
- combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);
345
- }
346
- return combinedMatrix;
347
- };
348
- })();
349
-
350
- /**
351
- * @private
352
- */
353
- function parseStyleString(style, oStyle) {
354
- var attr, value;
355
- style.replace(/;\s*$/, '').split(';').forEach(function (chunk) {
356
- var pair = chunk.split(':');
357
-
358
- attr = pair[0].trim().toLowerCase();
359
- value = pair[1].trim();
360
-
361
- oStyle[attr] = value;
362
- });
363
- }
364
-
365
- /**
366
- * @private
367
- */
368
- function parseStyleObject(style, oStyle) {
369
- var attr, value;
370
- for (var prop in style) {
371
- if (typeof style[prop] === 'undefined') {
372
- continue;
373
- }
374
-
375
- attr = prop.toLowerCase();
376
- value = style[prop];
377
-
378
- oStyle[attr] = value;
379
- }
380
- }
381
-
382
- /**
383
- * @private
384
- */
385
- function getGlobalStylesForElement(element, svgUid) {
386
- var styles = { };
387
- for (var rule in fabric.cssRules[svgUid]) {
388
- if (elementMatchesRule(element, rule.split(' '))) {
389
- for (var property in fabric.cssRules[svgUid][rule]) {
390
- styles[property] = fabric.cssRules[svgUid][rule][property];
391
- }
392
- }
393
- }
394
- return styles;
395
- }
396
-
397
- /**
398
- * @private
399
- */
400
- function elementMatchesRule(element, selectors) {
401
- var firstMatching, parentMatching = true;
402
- //start from rightmost selector.
403
- firstMatching = selectorMatches(element, selectors.pop());
404
- if (firstMatching && selectors.length) {
405
- parentMatching = doesSomeParentMatch(element, selectors);
406
- }
407
- return firstMatching && parentMatching && (selectors.length === 0);
408
- }
409
-
410
- function doesSomeParentMatch(element, selectors) {
411
- var selector, parentMatching = true;
412
- while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {
413
- if (parentMatching) {
414
- selector = selectors.pop();
415
- }
416
- element = element.parentNode;
417
- parentMatching = selectorMatches(element, selector);
418
- }
419
- return selectors.length === 0;
420
- }
421
-
422
- /**
423
- * @private
424
- */
425
- function selectorMatches(element, selector) {
426
- var nodeName = element.nodeName,
427
- classNames = element.getAttribute('class'),
428
- id = element.getAttribute('id'), matcher, i;
429
- // i check if a selector matches slicing away part from it.
430
- // if i get empty string i should match
431
- matcher = new RegExp('^' + nodeName, 'i');
432
- selector = selector.replace(matcher, '');
433
- if (id && selector.length) {
434
- matcher = new RegExp('#' + id + '(?![a-zA-Z\\-]+)', 'i');
435
- selector = selector.replace(matcher, '');
436
- }
437
- if (classNames && selector.length) {
438
- classNames = classNames.split(' ');
439
- for (i = classNames.length; i--;) {
440
- matcher = new RegExp('\\.' + classNames[i] + '(?![a-zA-Z\\-]+)', 'i');
441
- selector = selector.replace(matcher, '');
442
- }
443
- }
444
- return selector.length === 0;
445
- }
446
-
447
- /**
448
- * @private
449
- * to support IE8 missing getElementById on SVGdocument and on node xmlDOM
450
- */
451
- function elementById(doc, id) {
452
- var el;
453
- doc.getElementById && (el = doc.getElementById(id));
454
- if (el) {
455
- return el;
456
- }
457
- var node, i, len, nodelist = doc.getElementsByTagName('*');
458
- for (i = 0, len = nodelist.length; i < len; i++) {
459
- node = nodelist[i];
460
- if (id === node.getAttribute('id')) {
461
- return node;
462
- }
463
- }
464
- }
465
-
466
- /**
467
- * @private
468
- */
469
- function parseUseDirectives(doc) {
470
- var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;
471
- while (nodelist.length && i < nodelist.length) {
472
- var el = nodelist[i],
473
- xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');
474
-
475
- if (xlinkAttribute === null) {
476
- return;
477
- }
478
-
479
- var xlink = xlinkAttribute.slice(1),
480
- x = el.getAttribute('x') || 0,
481
- y = el.getAttribute('y') || 0,
482
- el2 = elementById(doc, xlink).cloneNode(true),
483
- currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',
484
- parentNode,
485
- oldLength = nodelist.length, attr,
486
- j,
487
- attrs,
488
- len,
489
- namespace = fabric.svgNS;
490
-
491
- applyViewboxTransform(el2);
492
- if (/^svg$/i.test(el2.nodeName)) {
493
- var el3 = el2.ownerDocument.createElementNS(namespace, 'g');
494
- for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {
495
- attr = attrs.item(j);
496
- el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);
497
- }
498
- // el2.firstChild != null
499
- while (el2.firstChild) {
500
- el3.appendChild(el2.firstChild);
501
- }
502
- el2 = el3;
503
- }
504
-
505
- for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {
506
- attr = attrs.item(j);
507
- if (attr.nodeName === 'x' || attr.nodeName === 'y' ||
508
- attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {
509
- continue;
510
- }
511
-
512
- if (attr.nodeName === 'transform') {
513
- currentTrans = attr.nodeValue + ' ' + currentTrans;
514
- }
515
- else {
516
- el2.setAttribute(attr.nodeName, attr.nodeValue);
517
- }
518
- }
519
-
520
- el2.setAttribute('transform', currentTrans);
521
- el2.setAttribute('instantiated_by_use', '1');
522
- el2.removeAttribute('id');
523
- parentNode = el.parentNode;
524
- parentNode.replaceChild(el2, el);
525
- // some browsers do not shorten nodelist after replaceChild (IE8)
526
- if (nodelist.length === oldLength) {
527
- i++;
528
- }
529
- }
530
- }
531
-
532
- // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute
533
- // matches, e.g.: +14.56e-12, etc.
534
- var reViewBoxAttrValue = new RegExp(
535
- '^' +
536
- '\\s*(' + fabric.reNum + '+)\\s*,?' +
537
- '\\s*(' + fabric.reNum + '+)\\s*,?' +
538
- '\\s*(' + fabric.reNum + '+)\\s*,?' +
539
- '\\s*(' + fabric.reNum + '+)\\s*' +
540
- '$'
541
- );
542
-
543
- /**
544
- * Add a <g> element that envelop all child elements and makes the viewbox transformMatrix descend on all elements
545
- */
546
- function applyViewboxTransform(element) {
547
- if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {
548
- return {};
549
- }
550
- var viewBoxAttr = element.getAttribute('viewBox'),
551
- scaleX = 1,
552
- scaleY = 1,
553
- minX = 0,
554
- minY = 0,
555
- viewBoxWidth, viewBoxHeight, matrix, el,
556
- widthAttr = element.getAttribute('width'),
557
- heightAttr = element.getAttribute('height'),
558
- x = element.getAttribute('x') || 0,
559
- y = element.getAttribute('y') || 0,
560
- preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',
561
- missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),
562
- missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),
563
- toBeParsed = missingViewBox && missingDimAttr,
564
- parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;
565
-
566
- parsedDim.width = 0;
567
- parsedDim.height = 0;
568
- parsedDim.toBeParsed = toBeParsed;
569
-
570
- if (missingViewBox) {
571
- if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {
572
- translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';
573
- matrix = (element.getAttribute('transform') || '') + translateMatrix;
574
- element.setAttribute('transform', matrix);
575
- element.removeAttribute('x');
576
- element.removeAttribute('y');
577
- }
578
- }
579
-
580
- if (toBeParsed) {
581
- return parsedDim;
582
- }
583
-
584
- if (missingViewBox) {
585
- parsedDim.width = parseUnit(widthAttr);
586
- parsedDim.height = parseUnit(heightAttr);
587
- // set a transform for elements that have x y and are inner(only) SVGs
588
- return parsedDim;
589
- }
590
- minX = -parseFloat(viewBoxAttr[1]);
591
- minY = -parseFloat(viewBoxAttr[2]);
592
- viewBoxWidth = parseFloat(viewBoxAttr[3]);
593
- viewBoxHeight = parseFloat(viewBoxAttr[4]);
594
- parsedDim.minX = minX;
595
- parsedDim.minY = minY;
596
- parsedDim.viewBoxWidth = viewBoxWidth;
597
- parsedDim.viewBoxHeight = viewBoxHeight;
598
- if (!missingDimAttr) {
599
- parsedDim.width = parseUnit(widthAttr);
600
- parsedDim.height = parseUnit(heightAttr);
601
- scaleX = parsedDim.width / viewBoxWidth;
602
- scaleY = parsedDim.height / viewBoxHeight;
603
- }
604
- else {
605
- parsedDim.width = viewBoxWidth;
606
- parsedDim.height = viewBoxHeight;
607
- }
608
-
609
- // default is to preserve aspect ratio
610
- preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);
611
- if (preserveAspectRatio.alignX !== 'none') {
612
- //translate all container for the effect of Mid, Min, Max
613
- if (preserveAspectRatio.meetOrSlice === 'meet') {
614
- scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);
615
- // calculate additional translation to move the viewbox
616
- }
617
- if (preserveAspectRatio.meetOrSlice === 'slice') {
618
- scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);
619
- // calculate additional translation to move the viewbox
620
- }
621
- widthDiff = parsedDim.width - viewBoxWidth * scaleX;
622
- heightDiff = parsedDim.height - viewBoxHeight * scaleX;
623
- if (preserveAspectRatio.alignX === 'Mid') {
624
- widthDiff /= 2;
625
- }
626
- if (preserveAspectRatio.alignY === 'Mid') {
627
- heightDiff /= 2;
628
- }
629
- if (preserveAspectRatio.alignX === 'Min') {
630
- widthDiff = 0;
631
- }
632
- if (preserveAspectRatio.alignY === 'Min') {
633
- heightDiff = 0;
634
- }
635
- }
636
-
637
- if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {
638
- return parsedDim;
639
- }
640
- if ((x || y) && element.parentNode.nodeName !== '#document') {
641
- translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';
642
- }
643
-
644
- matrix = translateMatrix + ' matrix(' + scaleX +
645
- ' 0' +
646
- ' 0 ' +
647
- scaleY + ' ' +
648
- (minX * scaleX + widthDiff) + ' ' +
649
- (minY * scaleY + heightDiff) + ') ';
650
- // seems unused.
651
- // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);
652
- if (element.nodeName === 'svg') {
653
- el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');
654
- // element.firstChild != null
655
- while (element.firstChild) {
656
- el.appendChild(element.firstChild);
657
- }
658
- element.appendChild(el);
659
- }
660
- else {
661
- el = element;
662
- el.removeAttribute('x');
663
- el.removeAttribute('y');
664
- matrix = el.getAttribute('transform') + matrix;
665
- }
666
- el.setAttribute('transform', matrix);
667
- return parsedDim;
668
- }
669
-
670
- function hasAncestorWithNodeName(element, nodeName) {
671
- while (element && (element = element.parentNode)) {
672
- if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))
673
- && !element.getAttribute('instantiated_by_use')) {
674
- return true;
675
- }
676
- }
677
- return false;
678
- }
679
-
680
- /**
681
- * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback
682
- * @static
683
- * @function
684
- * @memberOf fabric
685
- * @param {SVGDocument} doc SVG document to parse
686
- * @param {Function} callback Callback to call when parsing is finished;
687
- * It's being passed an array of elements (parsed from a document).
688
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
689
- * @param {Object} [parsingOptions] options for parsing document
690
- * @param {String} [parsingOptions.crossOrigin] crossOrigin settings
691
- */
692
- fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {
693
- if (!doc) {
694
- return;
695
- }
696
-
697
- parseUseDirectives(doc);
698
-
699
- var svgUid = fabric.Object.__uid++, i, len,
700
- options = applyViewboxTransform(doc),
701
- descendants = fabric.util.toArray(doc.getElementsByTagName('*'));
702
- options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;
703
- options.svgUid = svgUid;
704
-
705
- if (descendants.length === 0 && fabric.isLikelyNode) {
706
- // we're likely in node, where "o3-xml" library fails to gEBTN("*")
707
- // https://github.com/ajaxorg/node-o3-xml/issues/21
708
- descendants = doc.selectNodes('//*[name(.)!="svg"]');
709
- var arr = [];
710
- for (i = 0, len = descendants.length; i < len; i++) {
711
- arr[i] = descendants[i];
712
- }
713
- descendants = arr;
714
- }
715
-
716
- var elements = descendants.filter(function(el) {
717
- applyViewboxTransform(el);
718
- return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&
719
- !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement
720
- });
721
- if (!elements || (elements && !elements.length)) {
722
- callback && callback([], {});
723
- return;
724
- }
725
- var clipPaths = { };
726
- descendants.filter(function(el) {
727
- return el.nodeName.replace('svg:', '') === 'clipPath';
728
- }).forEach(function(el) {
729
- var id = el.getAttribute('id');
730
- clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {
731
- return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));
732
- });
733
- });
734
- fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);
735
- fabric.cssRules[svgUid] = fabric.getCSSRules(doc);
736
- fabric.clipPaths[svgUid] = clipPaths;
737
- // Precedence of rules: style > class > attribute
738
- fabric.parseElements(elements, function(instances, elements) {
739
- if (callback) {
740
- callback(instances, options, elements, descendants);
741
- delete fabric.gradientDefs[svgUid];
742
- delete fabric.cssRules[svgUid];
743
- delete fabric.clipPaths[svgUid];
744
- }
745
- }, clone(options), reviver, parsingOptions);
746
- };
747
-
748
- function recursivelyParseGradientsXlink(doc, gradient) {
749
- var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],
750
- xlinkAttr = 'xlink:href',
751
- xLink = gradient.getAttribute(xlinkAttr).slice(1),
752
- referencedGradient = elementById(doc, xLink);
753
- if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {
754
- recursivelyParseGradientsXlink(doc, referencedGradient);
755
- }
756
- gradientsAttrs.forEach(function(attr) {
757
- if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {
758
- gradient.setAttribute(attr, referencedGradient.getAttribute(attr));
759
- }
760
- });
761
- if (!gradient.children.length) {
762
- var referenceClone = referencedGradient.cloneNode(true);
763
- while (referenceClone.firstChild) {
764
- gradient.appendChild(referenceClone.firstChild);
765
- }
766
- }
767
- gradient.removeAttribute(xlinkAttr);
768
- }
769
-
770
- var reFontDeclaration = new RegExp(
771
- '(normal|italic)?\\s*(normal|small-caps)?\\s*' +
772
- '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' +
773
- fabric.reNum +
774
- '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)');
775
-
776
- extend(fabric, {
777
- /**
778
- * Parses a short font declaration, building adding its properties to a style object
779
- * @static
780
- * @function
781
- * @memberOf fabric
782
- * @param {String} value font declaration
783
- * @param {Object} oStyle definition
784
- */
785
- parseFontDeclaration: function(value, oStyle) {
786
- var match = value.match(reFontDeclaration);
787
-
788
- if (!match) {
789
- return;
790
- }
791
- var fontStyle = match[1],
792
- // font variant is not used
793
- // fontVariant = match[2],
794
- fontWeight = match[3],
795
- fontSize = match[4],
796
- lineHeight = match[5],
797
- fontFamily = match[6];
798
-
799
- if (fontStyle) {
800
- oStyle.fontStyle = fontStyle;
801
- }
802
- if (fontWeight) {
803
- oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);
804
- }
805
- if (fontSize) {
806
- oStyle.fontSize = parseUnit(fontSize);
807
- }
808
- if (fontFamily) {
809
- oStyle.fontFamily = fontFamily;
810
- }
811
- if (lineHeight) {
812
- oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;
813
- }
814
- },
815
-
816
- /**
817
- * Parses an SVG document, returning all of the gradient declarations found in it
818
- * @static
819
- * @function
820
- * @memberOf fabric
821
- * @param {SVGDocument} doc SVG document to parse
822
- * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element
823
- */
824
- getGradientDefs: function(doc) {
825
- var tagArray = [
826
- 'linearGradient',
827
- 'radialGradient',
828
- 'svg:linearGradient',
829
- 'svg:radialGradient'],
830
- elList = _getMultipleNodes(doc, tagArray),
831
- el, j = 0, gradientDefs = { };
832
- j = elList.length;
833
- while (j--) {
834
- el = elList[j];
835
- if (el.getAttribute('xlink:href')) {
836
- recursivelyParseGradientsXlink(doc, el);
837
- }
838
- gradientDefs[el.getAttribute('id')] = el;
839
- }
840
- return gradientDefs;
841
- },
842
-
843
- /**
844
- * Returns an object of attributes' name/value, given element and an array of attribute names;
845
- * Parses parent "g" nodes recursively upwards.
846
- * @static
847
- * @memberOf fabric
848
- * @param {DOMElement} element Element to parse
849
- * @param {Array} attributes Array of attributes to parse
850
- * @return {Object} object containing parsed attributes' names/values
851
- */
852
- parseAttributes: function(element, attributes, svgUid) {
853
-
854
- if (!element) {
855
- return;
856
- }
857
-
858
- var value,
859
- parentAttributes = { },
860
- fontSize, parentFontSize;
861
-
862
- if (typeof svgUid === 'undefined') {
863
- svgUid = element.getAttribute('svgUid');
864
- }
865
- // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards
866
- if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {
867
- parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);
868
- }
869
-
870
- var ownAttributes = attributes.reduce(function(memo, attr) {
871
- value = element.getAttribute(attr);
872
- if (value) { // eslint-disable-line
873
- memo[attr] = value;
874
- }
875
- return memo;
876
- }, { });
877
- // add values parsed from style, which take precedence over attributes
878
- // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)
879
- var cssAttrs = extend(
880
- getGlobalStylesForElement(element, svgUid),
881
- fabric.parseStyleAttribute(element)
882
- );
883
- ownAttributes = extend(
884
- ownAttributes,
885
- cssAttrs
886
- );
887
- if (cssAttrs[cPath]) {
888
- element.setAttribute(cPath, cssAttrs[cPath]);
889
- }
890
- fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;
891
- if (ownAttributes[fSize]) {
892
- // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.
893
- ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);
894
- }
895
-
896
- var normalizedAttr, normalizedValue, normalizedStyle = {};
897
- for (var attr in ownAttributes) {
898
- normalizedAttr = normalizeAttr(attr);
899
- normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);
900
- normalizedStyle[normalizedAttr] = normalizedValue;
901
- }
902
- if (normalizedStyle && normalizedStyle.font) {
903
- fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);
904
- }
905
- var mergedAttrs = extend(parentAttributes, normalizedStyle);
906
- return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);
907
- },
908
-
909
- /**
910
- * Transforms an array of svg elements to corresponding fabric.* instances
911
- * @static
912
- * @memberOf fabric
913
- * @param {Array} elements Array of elements to parse
914
- * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)
915
- * @param {Object} [options] Options object
916
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
917
- */
918
- parseElements: function(elements, callback, options, reviver, parsingOptions) {
919
- new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();
920
- },
921
-
922
- /**
923
- * Parses "style" attribute, retuning an object with values
924
- * @static
925
- * @memberOf fabric
926
- * @param {SVGElement} element Element to parse
927
- * @return {Object} Objects with values parsed from style attribute of an element
928
- */
929
- parseStyleAttribute: function(element) {
930
- var oStyle = { },
931
- style = element.getAttribute('style');
932
-
933
- if (!style) {
934
- return oStyle;
935
- }
936
-
937
- if (typeof style === 'string') {
938
- parseStyleString(style, oStyle);
939
- }
940
- else {
941
- parseStyleObject(style, oStyle);
942
- }
943
-
944
- return oStyle;
945
- },
946
-
947
- /**
948
- * Parses "points" attribute, returning an array of values
949
- * @static
950
- * @memberOf fabric
951
- * @param {String} points points attribute string
952
- * @return {Array} array of points
953
- */
954
- parsePointsAttribute: function(points) {
955
-
956
- // points attribute is required and must not be empty
957
- if (!points) {
958
- return null;
959
- }
960
-
961
- // replace commas with whitespace and remove bookending whitespace
962
- points = points.replace(/,/g, ' ').trim();
963
-
964
- points = points.split(/\s+/);
965
- var parsedPoints = [], i, len;
966
-
967
- for (i = 0, len = points.length; i < len; i += 2) {
968
- parsedPoints.push({
969
- x: parseFloat(points[i]),
970
- y: parseFloat(points[i + 1])
971
- });
972
- }
973
-
974
- // odd number of points is an error
975
- // if (parsedPoints.length % 2 !== 0) {
976
- // return null;
977
- // }
978
-
979
- return parsedPoints;
980
- },
981
-
982
- /**
983
- * Returns CSS rules for a given SVG document
984
- * @static
985
- * @function
986
- * @memberOf fabric
987
- * @param {SVGDocument} doc SVG document to parse
988
- * @return {Object} CSS rules of this document
989
- */
990
- getCSSRules: function(doc) {
991
- var styles = doc.getElementsByTagName('style'), i, len,
992
- allRules = { }, rules;
993
-
994
- // very crude parsing of style contents
995
- for (i = 0, len = styles.length; i < len; i++) {
996
- var styleContents = styles[i].textContent;
997
-
998
- // remove comments
999
- styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, '');
1000
- if (styleContents.trim() === '') {
1001
- continue;
1002
- }
1003
- // recovers all the rule in this form `body { style code... }`
1004
- // rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g);
1005
- rules = styleContents.split('}');
1006
- // remove empty rules.
1007
- rules = rules.filter(function(rule) { return rule.trim(); });
1008
- // at this point we have hopefully an array of rules `body { style code... `
1009
- // eslint-disable-next-line no-loop-func
1010
- rules.forEach(function(rule) {
1011
-
1012
- var match = rule.split('{'),
1013
- ruleObj = { }, declaration = match[1].trim(),
1014
- propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); });
1015
-
1016
- for (i = 0, len = propertyValuePairs.length; i < len; i++) {
1017
- var pair = propertyValuePairs[i].split(':'),
1018
- property = pair[0].trim(),
1019
- value = pair[1].trim();
1020
- ruleObj[property] = value;
1021
- }
1022
- rule = match[0].trim();
1023
- rule.split(',').forEach(function(_rule) {
1024
- _rule = _rule.replace(/^svg/i, '').trim();
1025
- if (_rule === '') {
1026
- return;
1027
- }
1028
- if (allRules[_rule]) {
1029
- fabric.util.object.extend(allRules[_rule], ruleObj);
1030
- }
1031
- else {
1032
- allRules[_rule] = fabric.util.object.clone(ruleObj);
1033
- }
1034
- });
1035
- });
1036
- }
1037
- return allRules;
1038
- },
1039
-
1040
- /**
1041
- * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.
1042
- * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)
1043
- * @memberOf fabric
1044
- * @param {String} url
1045
- * @param {Function} callback
1046
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
1047
- * @param {Object} [options] Object containing options for parsing
1048
- * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources
1049
- */
1050
- loadSVGFromURL: function(url, callback, reviver, options) {
1051
-
1052
- url = url.replace(/^\n\s*/, '').trim();
1053
- new fabric.util.request(url, {
1054
- method: 'get',
1055
- onComplete: onComplete
1056
- });
1057
-
1058
- function onComplete(r) {
1059
-
1060
- var xml = r.responseXML;
1061
- if (!xml || !xml.documentElement) {
1062
- callback && callback(null);
1063
- return false;
1064
- }
1065
-
1066
- fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {
1067
- callback && callback(results, _options, elements, allElements);
1068
- }, reviver, options);
1069
- }
1070
- },
1071
-
1072
- /**
1073
- * Takes string corresponding to an SVG document, and parses it into a set of fabric objects
1074
- * @memberOf fabric
1075
- * @param {String} string
1076
- * @param {Function} callback
1077
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
1078
- * @param {Object} [options] Object containing options for parsing
1079
- * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources
1080
- */
1081
- loadSVGFromString: function(string, callback, reviver, options) {
1082
- var parser = new fabric.window.DOMParser(),
1083
- doc = parser.parseFromString(string.trim(), 'text/xml');
1084
- fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {
1085
- callback(results, _options, elements, allElements);
1086
- }, reviver, options);
1087
- }
1088
- });
1089
-
1090
- })(typeof exports !== 'undefined' ? exports : this);