fabric 5.3.0 → 6.0.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/.babelrc +11 -0
  2. package/.babelrcAlt +19 -0
  3. package/.browserslistrc +5 -0
  4. package/.eslintrc.js +43 -0
  5. package/.eslintrc.json +38 -46
  6. package/.eslintrc_tests +12 -0
  7. package/.gitattributes +2 -0
  8. package/.prettierignore +16 -0
  9. package/.prettierrc +4 -0
  10. package/CHANGELOG.md +491 -189
  11. package/CONTRIBUTING.md +226 -58
  12. package/README.md +188 -239
  13. package/bower.json +1 -3
  14. package/dist/fabric.d.ts +1021 -0
  15. package/dist/index.cjs +28027 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.min.js +1 -0
  19. package/dist/index.mjs +27964 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/index.node.cjs +28092 -0
  22. package/dist/index.node.cjs.map +1 -0
  23. package/dist/index.node.d.ts +15 -0
  24. package/dist/index.node.mjs +28035 -0
  25. package/dist/index.node.mjs.map +1 -0
  26. package/dist/src/Collection.d.ts +126 -0
  27. package/dist/src/CommonMethods.d.ts +32 -0
  28. package/dist/src/EventTypeDefs.d.ts +226 -0
  29. package/dist/src/Intersection.d.ts +100 -0
  30. package/dist/src/Observable.d.ts +54 -0
  31. package/dist/src/Pattern.d.ts +104 -0
  32. package/dist/src/Point.d.ts +232 -0
  33. package/dist/src/Shadow.d.ts +87 -0
  34. package/dist/src/brushes/BaseBrush.d.ts +105 -0
  35. package/dist/src/brushes/CircleBrush.d.ts +49 -0
  36. package/dist/src/brushes/PatternBrush.d.ts +23 -0
  37. package/dist/src/brushes/PencilBrush.d.ts +92 -0
  38. package/dist/src/brushes/SprayBrush.d.ts +79 -0
  39. package/dist/src/cache.d.ts +46 -0
  40. package/dist/src/canvas/Canvas.d.ts +567 -0
  41. package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
  42. package/dist/src/canvas/StaticCanvas.d.ts +751 -0
  43. package/dist/src/canvas/TextEditingManager.d.ts +17 -0
  44. package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
  45. package/dist/src/color/Color.d.ts +174 -0
  46. package/dist/src/color/color_map.d.ts +155 -0
  47. package/dist/src/color/constants.d.ts +22 -0
  48. package/dist/src/color/util.d.ts +12 -0
  49. package/dist/src/config.d.ts +115 -0
  50. package/dist/src/constants.d.ts +14 -0
  51. package/dist/src/controls/Control.d.ts +228 -0
  52. package/dist/src/controls/changeWidth.d.ts +13 -0
  53. package/dist/src/controls/controls.render.d.ts +29 -0
  54. package/dist/src/controls/default_controls.d.ts +50 -0
  55. package/dist/src/controls/drag.d.ts +12 -0
  56. package/dist/src/controls/polyControl.d.ts +5 -0
  57. package/dist/src/controls/rotate.d.ts +12 -0
  58. package/dist/src/controls/scale.d.ts +47 -0
  59. package/dist/src/controls/scaleSkew.d.ts +39 -0
  60. package/dist/src/controls/skew.d.ts +33 -0
  61. package/dist/src/controls/util.d.ts +41 -0
  62. package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
  63. package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
  64. package/dist/src/env/browser.d.ts +3 -0
  65. package/dist/src/env/index.d.ts +7 -0
  66. package/dist/src/env/node.d.ts +3 -0
  67. package/dist/src/env/types.d.ts +15 -0
  68. package/dist/src/filters/BaseFilter.d.ts +156 -0
  69. package/dist/src/filters/BlendColor.d.ts +80 -0
  70. package/dist/src/filters/BlendImage.d.ts +90 -0
  71. package/dist/src/filters/Blur.d.ts +50 -0
  72. package/dist/src/filters/Boilerplate.d.ts +46 -0
  73. package/dist/src/filters/Brightness.d.ts +46 -0
  74. package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
  75. package/dist/src/filters/ColorMatrix.d.ts +62 -0
  76. package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
  77. package/dist/src/filters/Composed.d.ts +47 -0
  78. package/dist/src/filters/Contrast.d.ts +44 -0
  79. package/dist/src/filters/Convolute.d.ts +82 -0
  80. package/dist/src/filters/FilterBackend.d.ts +14 -0
  81. package/dist/src/filters/Gamma.d.ts +53 -0
  82. package/dist/src/filters/Grayscale.d.ts +45 -0
  83. package/dist/src/filters/HueRotation.d.ts +24 -0
  84. package/dist/src/filters/Invert.d.ts +54 -0
  85. package/dist/src/filters/Noise.d.ts +53 -0
  86. package/dist/src/filters/Pixelate.d.ts +43 -0
  87. package/dist/src/filters/RemoveColor.d.ts +62 -0
  88. package/dist/src/filters/Resize.d.ts +134 -0
  89. package/dist/src/filters/Saturation.d.ts +47 -0
  90. package/dist/src/filters/Vibrance.d.ts +47 -0
  91. package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
  92. package/dist/src/filters/WebGLProbe.d.ts +28 -0
  93. package/dist/src/filters/typedefs.d.ts +49 -0
  94. package/dist/src/gradient/Gradient.d.ts +149 -0
  95. package/dist/src/gradient/constants.d.ts +15 -0
  96. package/dist/src/gradient/parser/index.d.ts +4 -0
  97. package/dist/src/gradient/parser/misc.d.ts +4 -0
  98. package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
  99. package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
  100. package/dist/src/gradient/typedefs.d.ts +93 -0
  101. package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
  102. package/dist/src/mixins/stateful.mixin.d.ts +18 -0
  103. package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
  104. package/dist/src/parkinglot/straighten.d.ts +2 -0
  105. package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
  106. package/dist/src/parser/attributes.d.ts +6 -0
  107. package/dist/src/parser/constants.d.ts +54 -0
  108. package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
  109. package/dist/src/parser/elementById.d.ts +6 -0
  110. package/dist/src/parser/elementMatchesRule.d.ts +5 -0
  111. package/dist/src/parser/elements_parser.d.ts +3 -0
  112. package/dist/src/parser/getCSSRules.d.ts +7 -0
  113. package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
  114. package/dist/src/parser/getGradientDefs.d.ts +7 -0
  115. package/dist/src/parser/getMultipleNodes.d.ts +2 -0
  116. package/dist/src/parser/getSvgRegex.d.ts +2 -0
  117. package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
  118. package/dist/src/parser/loadSVGFromString.d.ts +12 -0
  119. package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
  120. package/dist/src/parser/normalizeAttr.d.ts +2 -0
  121. package/dist/src/parser/normalizeValue.d.ts +2 -0
  122. package/dist/src/parser/parseAttributes.d.ts +9 -0
  123. package/dist/src/parser/parseElements.d.ts +11 -0
  124. package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
  125. package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
  126. package/dist/src/parser/parseSVGDocument.d.ts +15 -0
  127. package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
  128. package/dist/src/parser/parseStyleObject.d.ts +2 -0
  129. package/dist/src/parser/parseStyleString.d.ts +2 -0
  130. package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
  131. package/dist/src/parser/parseUseDirectives.d.ts +2 -0
  132. package/dist/src/parser/percent.d.ts +9 -0
  133. package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
  134. package/dist/src/parser/rotateMatrix.d.ts +2 -0
  135. package/dist/src/parser/scaleMatrix.d.ts +2 -0
  136. package/dist/src/parser/selectorMatches.d.ts +2 -0
  137. package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
  138. package/dist/src/parser/skewMatrix.d.ts +2 -0
  139. package/dist/src/parser/translateMatrix.d.ts +2 -0
  140. package/dist/src/shapes/ActiveSelection.d.ts +66 -0
  141. package/dist/src/shapes/Circle.d.ts +80 -0
  142. package/dist/src/shapes/Ellipse.d.ts +74 -0
  143. package/dist/src/shapes/Group.d.ts +381 -0
  144. package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
  145. package/dist/src/shapes/IText/IText.d.ts +322 -0
  146. package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
  147. package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
  148. package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
  149. package/dist/src/shapes/IText/constants.d.ts +13 -0
  150. package/dist/src/shapes/Image.d.ts +283 -0
  151. package/dist/src/shapes/Line.d.ts +117 -0
  152. package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
  153. package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
  154. package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
  155. package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
  156. package/dist/src/shapes/Object/Object.d.ts +906 -0
  157. package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
  158. package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
  159. package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
  160. package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
  161. package/dist/src/shapes/Path.d.ts +123 -0
  162. package/dist/src/shapes/Polygon.d.ts +7 -0
  163. package/dist/src/shapes/Polyline.d.ts +130 -0
  164. package/dist/src/shapes/Rect.d.ts +62 -0
  165. package/dist/src/shapes/Text/StyledText.d.ts +118 -0
  166. package/dist/src/shapes/Text/Text.d.ts +656 -0
  167. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
  168. package/dist/src/shapes/Textbox.d.ts +170 -0
  169. package/dist/src/shapes/Triangle.d.ts +17 -0
  170. package/dist/src/typedefs.d.ts +93 -0
  171. package/dist/src/util/animation/AnimationBase.d.ts +54 -0
  172. package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
  173. package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
  174. package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
  175. package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
  176. package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
  177. package/dist/src/util/animation/animate.d.ts +37 -0
  178. package/dist/src/util/animation/easing.d.ts +130 -0
  179. package/dist/src/util/animation/types.d.ts +87 -0
  180. package/dist/src/util/applyMixins.d.ts +8 -0
  181. package/dist/src/util/class_registry.d.ts +14 -0
  182. package/dist/src/util/dom_event.d.ts +5 -0
  183. package/dist/src/util/dom_misc.d.ts +40 -0
  184. package/dist/src/util/dom_request.d.ts +14 -0
  185. package/dist/src/util/dom_style.d.ts +7 -0
  186. package/dist/src/util/fireEvent.d.ts +3 -0
  187. package/dist/src/util/internals/cloneDeep.d.ts +2 -0
  188. package/dist/src/util/internals/getRandomInt.d.ts +8 -0
  189. package/dist/src/util/internals/ifNaN.d.ts +8 -0
  190. package/dist/src/util/internals/index.d.ts +4 -0
  191. package/dist/src/util/internals/removeFromArray.d.ts +9 -0
  192. package/dist/src/util/internals/uid.d.ts +2 -0
  193. package/dist/src/util/lang_class.d.ts +12 -0
  194. package/dist/src/util/lang_string.d.ts +22 -0
  195. package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
  196. package/dist/src/util/misc/capValue.d.ts +2 -0
  197. package/dist/src/util/misc/cos.d.ts +10 -0
  198. package/dist/src/util/misc/dom.d.ts +28 -0
  199. package/dist/src/util/misc/findScaleTo.d.ts +29 -0
  200. package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
  201. package/dist/src/util/misc/isTransparent.d.ts +11 -0
  202. package/dist/src/util/misc/matrix.d.ts +92 -0
  203. package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
  204. package/dist/src/util/misc/objectEnlive.d.ts +56 -0
  205. package/dist/src/util/misc/objectTransforms.d.ts +68 -0
  206. package/dist/src/util/misc/pick.d.ts +8 -0
  207. package/dist/src/util/misc/planeChange.d.ts +84 -0
  208. package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
  209. package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
  210. package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
  211. package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
  212. package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
  213. package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
  214. package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
  215. package/dist/src/util/misc/rotatePoint.d.ts +12 -0
  216. package/dist/src/util/misc/sin.d.ts +10 -0
  217. package/dist/src/util/misc/svgParsing.d.ts +53 -0
  218. package/dist/src/util/misc/textStyles.d.ts +32 -0
  219. package/dist/src/util/misc/toFixed.d.ts +8 -0
  220. package/dist/src/util/misc/vectors.d.ts +57 -0
  221. package/dist/src/util/path.d.ts +108 -0
  222. package/dist/src/util/transform_matrix_removal.d.ts +14 -0
  223. package/dist/src/util/types.d.ts +19 -0
  224. package/fabric.ts +427 -0
  225. package/index.node.ts +43 -0
  226. package/index.ts +1 -0
  227. package/package.json +90 -39
  228. package/publish.js +0 -26
  229. package/rollup.config.mjs +79 -0
  230. package/rollup.test.config.js +24 -0
  231. package/scripts/build.mjs +50 -0
  232. package/scripts/buildLock.mjs +115 -0
  233. package/scripts/buildReporter.mjs +15 -0
  234. package/scripts/buildStats.mjs +139 -0
  235. package/scripts/dirname.mjs +14 -0
  236. package/scripts/index.mjs +679 -0
  237. package/scripts/transform_files.mjs +504 -0
  238. package/src/Collection.ts +311 -0
  239. package/src/CommonMethods.ts +63 -0
  240. package/src/EventTypeDefs.ts +294 -0
  241. package/src/Intersection.ts +273 -0
  242. package/src/Observable.ts +175 -0
  243. package/src/Pattern.ts +211 -0
  244. package/src/Point.ts +388 -0
  245. package/src/Shadow.ts +215 -0
  246. package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
  247. package/src/brushes/CircleBrush.ts +145 -0
  248. package/src/brushes/PatternBrush.ts +70 -0
  249. package/src/brushes/PencilBrush.ts +300 -0
  250. package/src/brushes/SprayBrush.ts +219 -0
  251. package/src/cache.ts +89 -0
  252. package/src/canvas/Canvas.ts +1672 -0
  253. package/src/canvas/SelectableCanvas.ts +1636 -0
  254. package/src/canvas/StaticCanvas.ts +1709 -0
  255. package/src/canvas/TextEditingManager.ts +48 -0
  256. package/src/canvas/canvas_gestures.mixin.ts +207 -0
  257. package/src/color/Color.ts +404 -0
  258. package/src/color/color_map.ts +154 -0
  259. package/src/color/constants.ts +26 -0
  260. package/src/color/util.ts +32 -0
  261. package/src/config.ts +159 -0
  262. package/src/constants.ts +19 -0
  263. package/src/controls/Control.ts +377 -0
  264. package/src/controls/changeWidth.ts +52 -0
  265. package/src/controls/controls.render.ts +138 -0
  266. package/src/controls/default_controls.ts +132 -0
  267. package/src/controls/drag.ts +31 -0
  268. package/src/controls/polyControl.ts +135 -0
  269. package/src/controls/rotate.ts +87 -0
  270. package/src/controls/scale.ts +277 -0
  271. package/src/controls/scaleSkew.ts +92 -0
  272. package/src/controls/skew.ts +242 -0
  273. package/src/controls/util.ts +154 -0
  274. package/src/controls/wrapWithFireEvent.ts +25 -0
  275. package/src/controls/wrapWithFixedAnchor.ts +20 -0
  276. package/src/env/browser.ts +28 -0
  277. package/src/env/index.ts +19 -0
  278. package/src/env/node.ts +52 -0
  279. package/src/env/types.ts +15 -0
  280. package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
  281. package/src/filters/BlendColor.ts +258 -0
  282. package/src/filters/BlendImage.ts +254 -0
  283. package/src/filters/Blur.ts +202 -0
  284. package/src/filters/Boilerplate.ts +91 -0
  285. package/src/filters/Brightness.ts +93 -0
  286. package/src/filters/Canvas2dFilterBackend.ts +65 -0
  287. package/src/filters/ColorMatrix.ts +156 -0
  288. package/src/filters/ColorMatrixFilters.ts +106 -0
  289. package/src/filters/Composed.ts +85 -0
  290. package/src/filters/Contrast.ts +94 -0
  291. package/src/filters/Convolute.ts +341 -0
  292. package/src/filters/FilterBackend.ts +32 -0
  293. package/src/filters/Gamma.ts +127 -0
  294. package/src/filters/Grayscale.ts +137 -0
  295. package/src/filters/HueRotation.ts +66 -0
  296. package/src/filters/Invert.ts +117 -0
  297. package/src/filters/Noise.ts +109 -0
  298. package/src/filters/Pixelate.ts +114 -0
  299. package/src/filters/RemoveColor.ts +148 -0
  300. package/src/filters/Resize.ts +540 -0
  301. package/src/filters/Saturation.ts +100 -0
  302. package/src/filters/Vibrance.ts +103 -0
  303. package/src/filters/WebGLFilterBackend.ts +430 -0
  304. package/src/filters/WebGLProbe.ts +62 -0
  305. package/src/filters/typedefs.ts +65 -0
  306. package/src/gradient/Gradient.ts +401 -0
  307. package/src/gradient/constants.ts +12 -0
  308. package/src/gradient/parser/index.ts +3 -0
  309. package/src/gradient/parser/misc.ts +13 -0
  310. package/src/gradient/parser/parseColorStops.ts +55 -0
  311. package/src/gradient/parser/parseCoords.ts +73 -0
  312. package/src/gradient/typedefs.ts +104 -0
  313. package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
  314. package/src/mixins/stateful.mixin.ts +104 -0
  315. package/src/parkinglot/canvas_animation.mixin.ts +121 -0
  316. package/src/parkinglot/straighten.ts +58 -0
  317. package/src/parser/applyViewboxTransform.ts +162 -0
  318. package/src/parser/attributes.ts +25 -0
  319. package/src/parser/constants.ts +118 -0
  320. package/src/parser/doesSomeParentMatch.ts +19 -0
  321. package/src/parser/elementById.ts +23 -0
  322. package/src/parser/elementMatchesRule.ts +19 -0
  323. package/src/parser/elements_parser.ts +191 -0
  324. package/src/parser/getCSSRules.ts +62 -0
  325. package/src/parser/getGlobalStylesForElement.ts +19 -0
  326. package/src/parser/getGradientDefs.ts +32 -0
  327. package/src/parser/getMultipleNodes.ts +15 -0
  328. package/src/parser/getSvgRegex.ts +5 -0
  329. package/src/parser/hasAncestorWithNodeName.ts +14 -0
  330. package/src/parser/loadSVGFromString.ts +26 -0
  331. package/src/parser/loadSVGFromURL.ts +40 -0
  332. package/src/parser/normalizeAttr.ts +10 -0
  333. package/src/parser/normalizeValue.ts +63 -0
  334. package/src/parser/parseAttributes.ts +90 -0
  335. package/src/parser/parseElements.ts +28 -0
  336. package/src/parser/parseFontDeclaration.ts +44 -0
  337. package/src/parser/parsePointsAttribute.ts +36 -0
  338. package/src/parser/parseSVGDocument.ts +106 -0
  339. package/src/parser/parseStyleAttribute.ts +27 -0
  340. package/src/parser/parseStyleObject.ts +15 -0
  341. package/src/parser/parseStyleString.ts +16 -0
  342. package/src/parser/parseTransformAttribute.ts +155 -0
  343. package/src/parser/parseUseDirectives.ts +79 -0
  344. package/src/parser/percent.ts +27 -0
  345. package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
  346. package/src/parser/rotateMatrix.ts +21 -0
  347. package/src/parser/scaleMatrix.ts +9 -0
  348. package/src/parser/selectorMatches.ts +25 -0
  349. package/src/parser/setStrokeFillOpacity.ts +40 -0
  350. package/src/parser/skewMatrix.ts +6 -0
  351. package/src/parser/translateMatrix.ts +8 -0
  352. package/src/shapes/ActiveSelection.ts +157 -0
  353. package/src/shapes/Circle.ts +205 -0
  354. package/src/shapes/Ellipse.ts +154 -0
  355. package/src/shapes/Group.ts +1053 -0
  356. package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
  357. package/src/shapes/IText/IText.ts +666 -0
  358. package/src/shapes/IText/ITextBehavior.ts +1055 -0
  359. package/src/shapes/IText/ITextClickBehavior.ts +321 -0
  360. package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
  361. package/src/shapes/IText/constants.ts +47 -0
  362. package/src/shapes/Image.ts +789 -0
  363. package/src/shapes/Line.ts +329 -0
  364. package/src/shapes/Object/AnimatableObject.ts +106 -0
  365. package/src/shapes/Object/FabricObject.ts +19 -0
  366. package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
  367. package/src/shapes/Object/InteractiveObject.ts +645 -0
  368. package/src/shapes/Object/Object.ts +1896 -0
  369. package/src/shapes/Object/ObjectGeometry.ts +830 -0
  370. package/src/shapes/Object/ObjectOrigin.ts +354 -0
  371. package/src/shapes/Object/StackedObject.ts +191 -0
  372. package/src/shapes/Object/defaultValues.ts +112 -0
  373. package/src/shapes/Path.ts +395 -0
  374. package/src/shapes/Polygon.ts +19 -0
  375. package/src/shapes/Polyline.ts +333 -0
  376. package/src/shapes/Rect.ts +199 -0
  377. package/src/shapes/Text/StyledText.ts +319 -0
  378. package/src/shapes/Text/Text.ts +1948 -0
  379. package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
  380. package/src/shapes/Textbox.ts +471 -0
  381. package/src/shapes/Triangle.ts +45 -0
  382. package/src/typedefs.ts +119 -0
  383. package/src/util/animation/AnimationBase.ts +166 -0
  384. package/src/util/animation/AnimationFrameProvider.ts +28 -0
  385. package/src/util/animation/AnimationRegistry.ts +58 -0
  386. package/src/util/animation/ArrayAnimation.ts +27 -0
  387. package/src/util/animation/ColorAnimation.ts +74 -0
  388. package/src/util/animation/ValueAnimation.ts +29 -0
  389. package/src/util/animation/animate.ts +74 -0
  390. package/src/util/animation/easing.ts +327 -0
  391. package/src/util/animation/types.ts +136 -0
  392. package/src/util/applyMixins.ts +22 -0
  393. package/src/util/class_registry.ts +54 -0
  394. package/src/util/dom_event.ts +28 -0
  395. package/src/util/dom_misc.ts +138 -0
  396. package/src/util/dom_request.ts +64 -0
  397. package/src/util/dom_style.ts +20 -0
  398. package/src/util/fireEvent.ts +15 -0
  399. package/src/util/internals/cloneDeep.ts +2 -0
  400. package/src/util/internals/getRandomInt.ts +8 -0
  401. package/src/util/internals/ifNaN.ts +9 -0
  402. package/src/util/internals/index.ts +3 -0
  403. package/src/util/internals/removeFromArray.ts +14 -0
  404. package/src/util/internals/uid.ts +3 -0
  405. package/src/util/lang_class.ts +90 -0
  406. package/src/util/lang_string.ts +79 -0
  407. package/src/util/misc/boundingBoxFromPoints.ts +37 -0
  408. package/src/util/misc/capValue.ts +2 -0
  409. package/src/util/misc/cos.ts +24 -0
  410. package/src/util/misc/dom.ts +50 -0
  411. package/src/util/misc/findScaleTo.ts +44 -0
  412. package/src/util/misc/groupSVGElements.ts +15 -0
  413. package/src/util/misc/isTransparent.ts +51 -0
  414. package/src/util/misc/matrix.ts +207 -0
  415. package/src/util/misc/mergeClipPaths.ts +40 -0
  416. package/src/util/misc/objectEnlive.ts +189 -0
  417. package/src/util/misc/objectTransforms.ts +129 -0
  418. package/src/util/misc/pick.ts +17 -0
  419. package/src/util/misc/planeChange.ts +136 -0
  420. package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
  421. package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
  422. package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
  423. package/src/util/misc/projectStroke/index.ts +53 -0
  424. package/src/util/misc/projectStroke/types.ts +24 -0
  425. package/src/util/misc/radiansDegreesConversion.ts +18 -0
  426. package/src/util/misc/resolveOrigin.ts +22 -0
  427. package/src/util/misc/rotatePoint.ts +15 -0
  428. package/src/util/misc/sin.ts +26 -0
  429. package/src/util/misc/svgParsing.ts +181 -0
  430. package/src/util/misc/textStyles.ts +133 -0
  431. package/src/util/misc/toFixed.ts +8 -0
  432. package/src/util/misc/vectors.ts +82 -0
  433. package/src/util/path.ts +941 -0
  434. package/src/util/transform_matrix_removal.ts +60 -0
  435. package/src/util/types.ts +78 -0
  436. package/tsconfig.json +106 -0
  437. package/HEADER.js +0 -203
  438. package/build.js +0 -287
  439. package/dist/fabric.js +0 -31187
  440. package/dist/fabric.min.js +0 -1
  441. package/old-travis-reference.yml +0 -97
  442. package/src/brushes/circle_brush.class.js +0 -144
  443. package/src/brushes/pattern_brush.class.js +0 -61
  444. package/src/brushes/pencil_brush.class.js +0 -310
  445. package/src/brushes/spray_brush.class.js +0 -219
  446. package/src/canvas.class.js +0 -1312
  447. package/src/color.class.js +0 -636
  448. package/src/control.class.js +0 -339
  449. package/src/controls.actions.js +0 -740
  450. package/src/controls.render.js +0 -99
  451. package/src/elements_parser.js +0 -152
  452. package/src/filters/2d_backend.class.js +0 -65
  453. package/src/filters/blendcolor_filter.class.js +0 -251
  454. package/src/filters/blendimage_filter.class.js +0 -247
  455. package/src/filters/blur_filter.class.js +0 -217
  456. package/src/filters/brightness_filter.class.js +0 -113
  457. package/src/filters/colormatrix_filter.class.js +0 -159
  458. package/src/filters/composed_filter.class.js +0 -72
  459. package/src/filters/contrast_filter.class.js +0 -113
  460. package/src/filters/convolute_filter.class.js +0 -352
  461. package/src/filters/filter_boilerplate.js +0 -111
  462. package/src/filters/filter_generator.js +0 -85
  463. package/src/filters/gamma_filter.class.js +0 -136
  464. package/src/filters/grayscale_filter.class.js +0 -154
  465. package/src/filters/hue_rotation.class.js +0 -107
  466. package/src/filters/invert_filter.class.js +0 -111
  467. package/src/filters/noise_filter.class.js +0 -134
  468. package/src/filters/pixelate_filter.class.js +0 -137
  469. package/src/filters/removecolor_filter.class.js +0 -173
  470. package/src/filters/resize_filter.class.js +0 -490
  471. package/src/filters/saturate_filter.class.js +0 -119
  472. package/src/filters/vibrance_filter.class.js +0 -122
  473. package/src/filters/webgl_backend.class.js +0 -396
  474. package/src/globalFabric.js +0 -4
  475. package/src/gradient.class.js +0 -490
  476. package/src/intersection.class.js +0 -172
  477. package/src/log.js +0 -11
  478. package/src/mixins/animation.mixin.js +0 -231
  479. package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
  480. package/src/mixins/canvas_events.mixin.js +0 -974
  481. package/src/mixins/canvas_gestures.mixin.js +0 -149
  482. package/src/mixins/canvas_grouping.mixin.js +0 -177
  483. package/src/mixins/canvas_serialization.mixin.js +0 -228
  484. package/src/mixins/collection.mixin.js +0 -170
  485. package/src/mixins/default_controls.js +0 -114
  486. package/src/mixins/itext.svg_export.js +0 -241
  487. package/src/mixins/itext_behavior.mixin.js +0 -940
  488. package/src/mixins/itext_click_behavior.mixin.js +0 -278
  489. package/src/mixins/itext_key_behavior.mixin.js +0 -694
  490. package/src/mixins/object.svg_export.js +0 -258
  491. package/src/mixins/object_geometry.mixin.js +0 -683
  492. package/src/mixins/object_interactivity.mixin.js +0 -314
  493. package/src/mixins/object_origin.mixin.js +0 -255
  494. package/src/mixins/object_stacking.mixin.js +0 -80
  495. package/src/mixins/object_straightening.mixin.js +0 -80
  496. package/src/mixins/observable.mixin.js +0 -141
  497. package/src/mixins/shared_methods.mixin.js +0 -94
  498. package/src/mixins/stateful.mixin.js +0 -107
  499. package/src/mixins/text_style.mixin.js +0 -324
  500. package/src/parser.js +0 -1090
  501. package/src/pattern.class.js +0 -189
  502. package/src/point.class.js +0 -337
  503. package/src/shadow.class.js +0 -195
  504. package/src/shapes/active_selection.class.js +0 -155
  505. package/src/shapes/circle.class.js +0 -210
  506. package/src/shapes/ellipse.class.js +0 -181
  507. package/src/shapes/group.class.js +0 -593
  508. package/src/shapes/image.class.js +0 -764
  509. package/src/shapes/itext.class.js +0 -526
  510. package/src/shapes/line.class.js +0 -324
  511. package/src/shapes/object.class.js +0 -2008
  512. package/src/shapes/path.class.js +0 -384
  513. package/src/shapes/polygon.class.js +0 -81
  514. package/src/shapes/polyline.class.js +0 -268
  515. package/src/shapes/rect.class.js +0 -187
  516. package/src/shapes/text.class.js +0 -1696
  517. package/src/shapes/textbox.class.js +0 -461
  518. package/src/shapes/triangle.class.js +0 -93
  519. package/src/static_canvas.class.js +0 -1881
  520. package/src/util/anim_ease.js +0 -398
  521. package/src/util/animate.js +0 -254
  522. package/src/util/animate_color.js +0 -74
  523. package/src/util/dom_event.js +0 -50
  524. package/src/util/dom_misc.js +0 -300
  525. package/src/util/dom_request.js +0 -54
  526. package/src/util/dom_style.js +0 -70
  527. package/src/util/lang_array.js +0 -94
  528. package/src/util/lang_class.js +0 -115
  529. package/src/util/lang_object.js +0 -75
  530. package/src/util/lang_string.js +0 -110
  531. package/src/util/misc.js +0 -1330
  532. package/src/util/named_accessors.mixin.js +0 -428
  533. package/src/util/path.js +0 -829
@@ -0,0 +1,258 @@
1
+ import { Color } from '../color/Color';
2
+ import { TClassProperties } from '../typedefs';
3
+ import { AbstractBaseFilter } from './BaseFilter';
4
+ import { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
5
+ import { classRegistry } from '../util/class_registry';
6
+
7
+ /**
8
+ * Color Blend filter class
9
+ * @example
10
+ * const filter = new BlendColor({
11
+ * color: '#000',
12
+ * mode: 'multiply'
13
+ * });
14
+ *
15
+ * const filter = new BlendImage({
16
+ * image: fabricImageObject,
17
+ * mode: 'multiply',
18
+ * alpha: 0.5
19
+ * });
20
+ * object.filters.push(filter);
21
+ * object.applyFilters();
22
+ * canvas.renderAll();
23
+ */
24
+ export class BlendColor extends AbstractBaseFilter<Record<string, string>> {
25
+ /**
26
+ * Color to make the blend operation with. default to a reddish color since black or white
27
+ * gives always strong result.
28
+ * @type String
29
+ * @default
30
+ **/
31
+ declare color: string;
32
+
33
+ declare mode:
34
+ | 'multiply'
35
+ | 'add'
36
+ | 'diff'
37
+ | 'difference'
38
+ | 'screen'
39
+ | 'subtract'
40
+ | 'darken'
41
+ | 'lighten'
42
+ | 'overlay'
43
+ | 'exclusion'
44
+ | 'tint';
45
+
46
+ /**
47
+ * alpha value. represent the strength of the blend color operation.
48
+ * @type Number
49
+ * @default
50
+ **/
51
+ declare alpha: number;
52
+
53
+ /**
54
+ * build the fragment source for the filters, joining the common part with
55
+ * the specific one.
56
+ * @param {String} mode the mode of the filter, a key of this.fragmentSource
57
+ * @return {String} the source to be compiled
58
+ * @private
59
+ */
60
+ buildSource(mode: string) {
61
+ return `
62
+ precision highp float;
63
+ uniform sampler2D uTexture;
64
+ uniform vec4 uColor;
65
+ varying vec2 vTexCoord;
66
+ void main() {
67
+ vec4 color = texture2D(uTexture, vTexCoord);
68
+ gl_FragColor = color;
69
+ if (color.a > 0.0) {
70
+ ${this.fragmentSource[mode]}
71
+ }
72
+ }
73
+ `;
74
+ }
75
+
76
+ getCacheKey() {
77
+ return `${this.type}_${this.mode}`;
78
+ }
79
+
80
+ getFragmentSource(): string {
81
+ return this.buildSource(this.mode);
82
+ }
83
+
84
+ /**
85
+ * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.
86
+ *
87
+ * @param {Object} options
88
+ * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
89
+ */
90
+ applyTo2d({ imageData: { data } }: T2DPipelineState) {
91
+ const source = new Color(this.color).getSource();
92
+ const tr = source[0] * this.alpha;
93
+ const tg = source[1] * this.alpha;
94
+ const tb = source[2] * this.alpha;
95
+ const alpha1 = 1 - this.alpha;
96
+
97
+ for (let i = 0; i < data.length; i += 4) {
98
+ const r = data[i];
99
+ const g = data[i + 1];
100
+ const b = data[i + 2];
101
+
102
+ switch (this.mode) {
103
+ case 'multiply':
104
+ data[i] = (r * tr) / 255;
105
+ data[i + 1] = (g * tg) / 255;
106
+ data[i + 2] = (b * tb) / 255;
107
+ break;
108
+ case 'screen':
109
+ data[i] = 255 - ((255 - r) * (255 - tr)) / 255;
110
+ data[i + 1] = 255 - ((255 - g) * (255 - tg)) / 255;
111
+ data[i + 2] = 255 - ((255 - b) * (255 - tb)) / 255;
112
+ break;
113
+ case 'add':
114
+ data[i] = r + tr;
115
+ data[i + 1] = g + tg;
116
+ data[i + 2] = b + tb;
117
+ break;
118
+ case 'diff':
119
+ case 'difference':
120
+ data[i] = Math.abs(r - tr);
121
+ data[i + 1] = Math.abs(g - tg);
122
+ data[i + 2] = Math.abs(b - tb);
123
+ break;
124
+ case 'subtract':
125
+ data[i] = r - tr;
126
+ data[i + 1] = g - tg;
127
+ data[i + 2] = b - tb;
128
+ break;
129
+ case 'darken':
130
+ data[i] = Math.min(r, tr);
131
+ data[i + 1] = Math.min(g, tg);
132
+ data[i + 2] = Math.min(b, tb);
133
+ break;
134
+ case 'lighten':
135
+ data[i] = Math.max(r, tr);
136
+ data[i + 1] = Math.max(g, tg);
137
+ data[i + 2] = Math.max(b, tb);
138
+ break;
139
+ case 'overlay':
140
+ data[i] =
141
+ tr < 128
142
+ ? (2 * r * tr) / 255
143
+ : 255 - (2 * (255 - r) * (255 - tr)) / 255;
144
+ data[i + 1] =
145
+ tg < 128
146
+ ? (2 * g * tg) / 255
147
+ : 255 - (2 * (255 - g) * (255 - tg)) / 255;
148
+ data[i + 2] =
149
+ tb < 128
150
+ ? (2 * b * tb) / 255
151
+ : 255 - (2 * (255 - b) * (255 - tb)) / 255;
152
+ break;
153
+ case 'exclusion':
154
+ data[i] = tr + r - (2 * tr * r) / 255;
155
+ data[i + 1] = tg + g - (2 * tg * g) / 255;
156
+ data[i + 2] = tb + b - (2 * tb * b) / 255;
157
+ break;
158
+ case 'tint':
159
+ data[i] = tr + r * alpha1;
160
+ data[i + 1] = tg + g * alpha1;
161
+ data[i + 2] = tb + b * alpha1;
162
+ }
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Return WebGL uniform locations for this filter's shader.
168
+ *
169
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
170
+ * @param {WebGLShaderProgram} program This filter's compiled shader program.
171
+ */
172
+ getUniformLocations(
173
+ gl: WebGLRenderingContext,
174
+ program: WebGLProgram
175
+ ): TWebGLUniformLocationMap {
176
+ return {
177
+ uColor: gl.getUniformLocation(program, 'uColor'),
178
+ };
179
+ }
180
+
181
+ /**
182
+ * Send data from this filter to its shader program's uniforms.
183
+ *
184
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
185
+ * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
186
+ */
187
+ sendUniformData(
188
+ gl: WebGLRenderingContext,
189
+ uniformLocations: TWebGLUniformLocationMap
190
+ ) {
191
+ const source = new Color(this.color).getSource();
192
+ source[0] = (this.alpha * source[0]) / 255;
193
+ source[1] = (this.alpha * source[1]) / 255;
194
+ source[2] = (this.alpha * source[2]) / 255;
195
+ source[3] = this.alpha;
196
+ gl.uniform4fv(uniformLocations.uColor, source);
197
+ }
198
+
199
+ /**
200
+ * Returns object representation of an instance
201
+ * @return {Object} Object representation of an instance
202
+ */
203
+ toObject() {
204
+ return {
205
+ type: this.type,
206
+ color: this.color,
207
+ mode: this.mode,
208
+ alpha: this.alpha,
209
+ };
210
+ }
211
+
212
+ static async fromObject(object: any) {
213
+ return new BlendColor(object);
214
+ }
215
+ }
216
+
217
+ export const blendColorDefaultValues: Partial<TClassProperties<BlendColor>> = {
218
+ type: 'BlendColor',
219
+ color: '#F95C63',
220
+ mode: 'multiply',
221
+ alpha: 1,
222
+ fragmentSource: {
223
+ multiply: 'gl_FragColor.rgb *= uColor.rgb;\n',
224
+ screen:
225
+ 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n',
226
+ add: 'gl_FragColor.rgb += uColor.rgb;\n',
227
+ diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n',
228
+ subtract: 'gl_FragColor.rgb -= uColor.rgb;\n',
229
+ lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n',
230
+ darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n',
231
+ exclusion:
232
+ 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n',
233
+ overlay: `
234
+ if (uColor.r < 0.5) {
235
+ gl_FragColor.r *= 2.0 * uColor.r;
236
+ } else {
237
+ gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);
238
+ }
239
+ if (uColor.g < 0.5) {
240
+ gl_FragColor.g *= 2.0 * uColor.g;
241
+ } else {
242
+ gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);
243
+ }
244
+ if (uColor.b < 0.5) {
245
+ gl_FragColor.b *= 2.0 * uColor.b;
246
+ } else {
247
+ gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);
248
+ }
249
+ `,
250
+ tint: `
251
+ gl_FragColor.rgb *= (1.0 - uColor.a);
252
+ gl_FragColor.rgb += uColor.rgb;
253
+ `,
254
+ },
255
+ };
256
+
257
+ Object.assign(BlendColor.prototype, blendColorDefaultValues);
258
+ classRegistry.setClass(BlendColor);
@@ -0,0 +1,254 @@
1
+ import { Image } from '../shapes/Image';
2
+ import type { TClassProperties } from '../typedefs';
3
+ import { createCanvasElement } from '../util/misc/dom';
4
+ import { AbstractBaseFilter } from './BaseFilter';
5
+ import type {
6
+ T2DPipelineState,
7
+ TWebGLPipelineState,
8
+ TWebGLUniformLocationMap,
9
+ } from './typedefs';
10
+ import { WebGLFilterBackend } from './WebGLFilterBackend';
11
+ import { classRegistry } from '../util/class_registry';
12
+
13
+ /**
14
+ * Image Blend filter class
15
+ * @example
16
+ * const filter = new filters.BlendColor({
17
+ * color: '#000',
18
+ * mode: 'multiply'
19
+ * });
20
+ *
21
+ * const filter = new BlendImage({
22
+ * image: fabricImageObject,
23
+ * mode: 'multiply',
24
+ * alpha: 0.5
25
+ * });
26
+ * object.filters.push(filter);
27
+ * object.applyFilters();
28
+ * canvas.renderAll();
29
+ */
30
+ export class BlendImage extends AbstractBaseFilter<Record<string, string>> {
31
+ /**
32
+ * Color to make the blend operation with. default to a reddish color since black or white
33
+ * gives always strong result.
34
+ **/
35
+ declare image: Image;
36
+
37
+ declare mode: 'multiply' | 'mask';
38
+
39
+ /**
40
+ * alpha value. represent the strength of the blend image operation.
41
+ * not implemented.
42
+ **/
43
+ declare alpha: number;
44
+
45
+ getCacheKey() {
46
+ return `${this.type}_${this.mode}`;
47
+ }
48
+
49
+ getFragmentSource(): string {
50
+ return this.fragmentSource[this.mode];
51
+ }
52
+
53
+ applyToWebGL(options: TWebGLPipelineState) {
54
+ const gl = options.context,
55
+ texture = this.createTexture(options.filterBackend, this.image);
56
+ this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);
57
+ super.applyToWebGL(options);
58
+ this.unbindAdditionalTexture(gl, gl.TEXTURE1);
59
+ }
60
+
61
+ createTexture(backend: WebGLFilterBackend, image: Image) {
62
+ return backend.getCachedTexture(image.cacheKey, image.getElement());
63
+ }
64
+
65
+ /**
66
+ * Calculate a transformMatrix to adapt the image to blend over
67
+ * @param {Object} options
68
+ * @param {WebGLRenderingContext} options.context The GL context used for rendering.
69
+ * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.
70
+ */
71
+ calculateMatrix() {
72
+ const image = this.image,
73
+ { width, height } = image.getElement();
74
+ return [
75
+ 1 / image.scaleX,
76
+ 0,
77
+ 0,
78
+ 0,
79
+ 1 / image.scaleY,
80
+ 0,
81
+ -image.left / width,
82
+ -image.top / height,
83
+ 1,
84
+ ];
85
+ }
86
+
87
+ /**
88
+ * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.
89
+ *
90
+ * @param {Object} options
91
+ * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
92
+ */
93
+ applyTo2d({
94
+ imageData: { data, width, height },
95
+ filterBackend: { resources },
96
+ }: T2DPipelineState) {
97
+ const image = this.image;
98
+ if (!resources.blendImage) {
99
+ resources.blendImage = createCanvasElement();
100
+ }
101
+ const canvas1 = resources.blendImage;
102
+ const context = canvas1.getContext('2d')!;
103
+ if (canvas1.width !== width || canvas1.height !== height) {
104
+ canvas1.width = width;
105
+ canvas1.height = height;
106
+ } else {
107
+ context.clearRect(0, 0, width, height);
108
+ }
109
+ context.setTransform(
110
+ image.scaleX,
111
+ 0,
112
+ 0,
113
+ image.scaleY,
114
+ image.left,
115
+ image.top
116
+ );
117
+ context.drawImage(image.getElement(), 0, 0, width, height);
118
+ const blendData = context.getImageData(0, 0, width, height).data;
119
+ for (let i = 0; i < data.length; i += 4) {
120
+ const r = data[i];
121
+ const g = data[i + 1];
122
+ const b = data[i + 2];
123
+ const a = data[i + 3];
124
+
125
+ const tr = blendData[i];
126
+ const tg = blendData[i + 1];
127
+ const tb = blendData[i + 2];
128
+ const ta = blendData[i + 3];
129
+
130
+ switch (this.mode) {
131
+ case 'multiply':
132
+ data[i] = (r * tr) / 255;
133
+ data[i + 1] = (g * tg) / 255;
134
+ data[i + 2] = (b * tb) / 255;
135
+ data[i + 3] = (a * ta) / 255;
136
+ break;
137
+ case 'mask':
138
+ data[i + 3] = ta;
139
+ break;
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Return WebGL uniform locations for this filter's shader.
146
+ *
147
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
148
+ * @param {WebGLShaderProgram} program This filter's compiled shader program.
149
+ */
150
+ getUniformLocations(
151
+ gl: WebGLRenderingContext,
152
+ program: WebGLProgram
153
+ ): TWebGLUniformLocationMap {
154
+ return {
155
+ uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),
156
+ uImage: gl.getUniformLocation(program, 'uImage'),
157
+ };
158
+ }
159
+
160
+ /**
161
+ * Send data from this filter to its shader program's uniforms.
162
+ *
163
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
164
+ * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
165
+ */
166
+ sendUniformData(
167
+ gl: WebGLRenderingContext,
168
+ uniformLocations: TWebGLUniformLocationMap
169
+ ) {
170
+ const matrix = this.calculateMatrix();
171
+ gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.
172
+ gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);
173
+ }
174
+
175
+ /**
176
+ * Returns object representation of an instance
177
+ * @return {Object} Object representation of an instance
178
+ */
179
+ toObject() {
180
+ return {
181
+ type: this.type,
182
+ image: this.image && this.image.toObject(),
183
+ mode: this.mode,
184
+ alpha: this.alpha,
185
+ };
186
+ }
187
+
188
+ /**
189
+ * Create filter instance from an object representation
190
+ * @static
191
+ * @param {object} object Object to create an instance from
192
+ * @param {object} [options]
193
+ * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
194
+ * @returns {Promise<BlendImage>}
195
+ */
196
+ static fromObject(
197
+ object: Record<string, any>,
198
+ options: { signal: AbortSignal }
199
+ ) {
200
+ return Image.fromObject(object.image, options).then(
201
+ (image) => new BlendImage({ ...object, image })
202
+ );
203
+ }
204
+ }
205
+
206
+ export const blendImageDefaultValues: Partial<TClassProperties<BlendImage>> = {
207
+ type: 'BlendImage',
208
+ mode: 'multiply',
209
+ alpha: 1,
210
+ vertexSource: `
211
+ attribute vec2 aPosition;
212
+ varying vec2 vTexCoord;
213
+ varying vec2 vTexCoord2;
214
+ uniform mat3 uTransformMatrix;
215
+ void main() {
216
+ vTexCoord = aPosition;
217
+ vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;
218
+ gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);
219
+ }
220
+ `,
221
+ fragmentSource: {
222
+ multiply: `
223
+ precision highp float;
224
+ uniform sampler2D uTexture;
225
+ uniform sampler2D uImage;
226
+ uniform vec4 uColor;
227
+ varying vec2 vTexCoord;
228
+ varying vec2 vTexCoord2;
229
+ void main() {
230
+ vec4 color = texture2D(uTexture, vTexCoord);
231
+ vec4 color2 = texture2D(uImage, vTexCoord2);
232
+ color.rgba *= color2.rgba;
233
+ gl_FragColor = color;
234
+ }
235
+ `,
236
+ mask: `
237
+ precision highp float;
238
+ uniform sampler2D uTexture;
239
+ uniform sampler2D uImage;
240
+ uniform vec4 uColor;
241
+ varying vec2 vTexCoord;
242
+ varying vec2 vTexCoord2;
243
+ void main() {
244
+ vec4 color = texture2D(uTexture, vTexCoord);
245
+ vec4 color2 = texture2D(uImage, vTexCoord2);
246
+ color.a = color2.a;
247
+ gl_FragColor = color;
248
+ }
249
+ `,
250
+ },
251
+ };
252
+
253
+ Object.assign(BlendImage.prototype, blendImageDefaultValues);
254
+ classRegistry.setClass(BlendImage);
@@ -0,0 +1,202 @@
1
+ import type { TClassProperties } from '../typedefs';
2
+ import { createCanvasElement } from '../util/misc/dom';
3
+ import { BaseFilter } from './BaseFilter';
4
+ import type {
5
+ TWebGLPipelineState,
6
+ T2DPipelineState,
7
+ TWebGLUniformLocationMap,
8
+ } from './typedefs';
9
+ import { isWebGLPipelineState } from './typedefs';
10
+ import { classRegistry } from '../util/class_registry';
11
+
12
+ /**
13
+ * Blur filter class
14
+ * @example
15
+ * const filter = new Blur({
16
+ * blur: 0.5
17
+ * });
18
+ * object.filters.push(filter);
19
+ * object.applyFilters();
20
+ * canvas.renderAll();
21
+ */
22
+ export class Blur extends BaseFilter {
23
+ /**
24
+ * blur value, in percentage of image dimensions.
25
+ * specific to keep the image blur constant at different resolutions
26
+ * range between 0 and 1.
27
+ * @type Number
28
+ * @default
29
+ */
30
+ declare blur: number;
31
+
32
+ declare horizontal: boolean;
33
+ declare aspectRatio: number;
34
+
35
+ applyTo(options: TWebGLPipelineState | T2DPipelineState) {
36
+ if (isWebGLPipelineState(options)) {
37
+ // this aspectRatio is used to give the same blur to vertical and horizontal
38
+ this.aspectRatio = options.sourceWidth / options.sourceHeight;
39
+ options.passes++;
40
+ this._setupFrameBuffer(options);
41
+ this.horizontal = true;
42
+ this.applyToWebGL(options);
43
+ this._swapTextures(options);
44
+ this._setupFrameBuffer(options);
45
+ this.horizontal = false;
46
+ this.applyToWebGL(options);
47
+ this._swapTextures(options);
48
+ } else {
49
+ this.applyTo2d(options);
50
+ }
51
+ }
52
+
53
+ applyTo2d(options: T2DPipelineState) {
54
+ options.imageData = this.simpleBlur(options);
55
+ }
56
+
57
+ simpleBlur({
58
+ ctx,
59
+ imageData,
60
+ filterBackend: { resources },
61
+ }: T2DPipelineState) {
62
+ const { width, height } = imageData;
63
+ if (!resources.blurLayer1) {
64
+ resources.blurLayer1 = createCanvasElement();
65
+ resources.blurLayer2 = createCanvasElement();
66
+ }
67
+ const canvas1 = resources.blurLayer1!;
68
+ const canvas2 = resources.blurLayer2!;
69
+ if (canvas1.width !== width || canvas1.height !== height) {
70
+ canvas2.width = canvas1.width = width;
71
+ canvas2.height = canvas1.height = height;
72
+ }
73
+ const ctx1 = canvas1.getContext('2d')!,
74
+ ctx2 = canvas2.getContext('2d')!,
75
+ nSamples = 15,
76
+ blur = this.blur * 0.06 * 0.5;
77
+ let random, percent, j, i;
78
+
79
+ // load first canvas
80
+ ctx1.putImageData(imageData, 0, 0);
81
+ ctx2.clearRect(0, 0, width, height);
82
+
83
+ for (i = -nSamples; i <= nSamples; i++) {
84
+ random = (Math.random() - 0.5) / 4;
85
+ percent = i / nSamples;
86
+ j = blur * percent * width + random;
87
+ ctx2.globalAlpha = 1 - Math.abs(percent);
88
+ ctx2.drawImage(canvas1, j, random);
89
+ ctx1.drawImage(canvas2, 0, 0);
90
+ ctx2.globalAlpha = 1;
91
+ ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
92
+ }
93
+ for (i = -nSamples; i <= nSamples; i++) {
94
+ random = (Math.random() - 0.5) / 4;
95
+ percent = i / nSamples;
96
+ j = blur * percent * height + random;
97
+ ctx2.globalAlpha = 1 - Math.abs(percent);
98
+ ctx2.drawImage(canvas1, random, j);
99
+ ctx1.drawImage(canvas2, 0, 0);
100
+ ctx2.globalAlpha = 1;
101
+ ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
102
+ }
103
+ ctx.drawImage(canvas1, 0, 0);
104
+ const newImageData = ctx.getImageData(0, 0, canvas1.width, canvas1.height);
105
+ ctx1.globalAlpha = 1;
106
+ ctx1.clearRect(0, 0, canvas1.width, canvas1.height);
107
+ return newImageData;
108
+ }
109
+
110
+ /**
111
+ * Return WebGL uniform locations for this filter's shader.
112
+ *
113
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
114
+ * @param {WebGLShaderProgram} program This filter's compiled shader program.
115
+ */
116
+ getUniformLocations(
117
+ gl: WebGLRenderingContext,
118
+ program: WebGLProgram
119
+ ): TWebGLUniformLocationMap {
120
+ return {
121
+ delta: gl.getUniformLocation(program, 'uDelta'),
122
+ };
123
+ }
124
+
125
+ /**
126
+ * Send data from this filter to its shader program's uniforms.
127
+ *
128
+ * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
129
+ * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
130
+ */
131
+ sendUniformData(
132
+ gl: WebGLRenderingContext,
133
+ uniformLocations: TWebGLUniformLocationMap
134
+ ) {
135
+ const delta = this.chooseRightDelta();
136
+ gl.uniform2fv(uniformLocations.delta, delta);
137
+ }
138
+
139
+ /**
140
+ * choose right value of image percentage to blur with
141
+ * @returns {Array} a numeric array with delta values
142
+ */
143
+ chooseRightDelta() {
144
+ let blurScale = 1;
145
+ const delta = [0, 0];
146
+ if (this.horizontal) {
147
+ if (this.aspectRatio > 1) {
148
+ // image is wide, i want to shrink radius horizontal
149
+ blurScale = 1 / this.aspectRatio;
150
+ }
151
+ } else {
152
+ if (this.aspectRatio < 1) {
153
+ // image is tall, i want to shrink radius vertical
154
+ blurScale = this.aspectRatio;
155
+ }
156
+ }
157
+ const blur = blurScale * this.blur * 0.12;
158
+ if (this.horizontal) {
159
+ delta[0] = blur;
160
+ } else {
161
+ delta[1] = blur;
162
+ }
163
+ return delta;
164
+ }
165
+
166
+ static async fromObject(object: any) {
167
+ return new Blur(object);
168
+ }
169
+ }
170
+
171
+ export const blurDefaultValues: Partial<TClassProperties<Blur>> = {
172
+ type: 'Blur',
173
+ fragmentSource: `
174
+ precision highp float;
175
+ uniform sampler2D uTexture;
176
+ uniform vec2 uDelta;
177
+ varying vec2 vTexCoord;
178
+ const float nSamples = 15.0;
179
+ vec3 v3offset = vec3(12.9898, 78.233, 151.7182);
180
+ float random(vec3 scale) {
181
+ /* use the fragment position for a different seed per-pixel */
182
+ return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);
183
+ }
184
+ void main() {
185
+ vec4 color = vec4(0.0);
186
+ float total = 0.0;
187
+ float offset = random(v3offset);
188
+ for (float t = -nSamples; t <= nSamples; t++) {
189
+ float percent = (t + offset - 0.5) / nSamples;
190
+ float weight = 1.0 - abs(percent);
191
+ color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;
192
+ total += weight;
193
+ }
194
+ gl_FragColor = color / total;
195
+ }
196
+ `,
197
+ blur: 0,
198
+ mainParameter: 'blur',
199
+ };
200
+
201
+ Object.assign(Blur.prototype, blurDefaultValues);
202
+ classRegistry.setClass(Blur);