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.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintrc.js +43 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.prettierignore +16 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +491 -189
- package/CONTRIBUTING.md +226 -58
- package/README.md +188 -239
- package/bower.json +1 -3
- package/dist/fabric.d.ts +1021 -0
- package/dist/index.cjs +28027 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +27964 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +28092 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +15 -0
- package/dist/index.node.mjs +28035 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/Collection.d.ts +126 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +226 -0
- package/dist/src/Intersection.d.ts +100 -0
- package/dist/src/Observable.d.ts +54 -0
- package/dist/src/Pattern.d.ts +104 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +87 -0
- package/dist/src/brushes/BaseBrush.d.ts +105 -0
- package/dist/src/brushes/CircleBrush.d.ts +49 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +79 -0
- package/dist/src/cache.d.ts +46 -0
- package/dist/src/canvas/Canvas.d.ts +567 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
- package/dist/src/canvas/StaticCanvas.d.ts +751 -0
- package/dist/src/canvas/TextEditingManager.d.ts +17 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +174 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +22 -0
- package/dist/src/color/util.d.ts +12 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +14 -0
- package/dist/src/controls/Control.d.ts +228 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/controls.render.d.ts +29 -0
- package/dist/src/controls/default_controls.d.ts +50 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +7 -0
- package/dist/src/env/node.d.ts +3 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +156 -0
- package/dist/src/filters/BlendColor.d.ts +80 -0
- package/dist/src/filters/BlendImage.d.ts +90 -0
- package/dist/src/filters/Blur.d.ts +50 -0
- package/dist/src/filters/Boilerplate.d.ts +46 -0
- package/dist/src/filters/Brightness.d.ts +46 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +62 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
- package/dist/src/filters/Composed.d.ts +47 -0
- package/dist/src/filters/Contrast.d.ts +44 -0
- package/dist/src/filters/Convolute.d.ts +82 -0
- package/dist/src/filters/FilterBackend.d.ts +14 -0
- package/dist/src/filters/Gamma.d.ts +53 -0
- package/dist/src/filters/Grayscale.d.ts +45 -0
- package/dist/src/filters/HueRotation.d.ts +24 -0
- package/dist/src/filters/Invert.d.ts +54 -0
- package/dist/src/filters/Noise.d.ts +53 -0
- package/dist/src/filters/Pixelate.d.ts +43 -0
- package/dist/src/filters/RemoveColor.d.ts +62 -0
- package/dist/src/filters/Resize.d.ts +134 -0
- package/dist/src/filters/Saturation.d.ts +47 -0
- package/dist/src/filters/Vibrance.d.ts +47 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
- package/dist/src/filters/WebGLProbe.d.ts +28 -0
- package/dist/src/filters/typedefs.d.ts +49 -0
- package/dist/src/gradient/Gradient.d.ts +149 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/mixins/stateful.mixin.d.ts +18 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +54 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/loadSVGFromString.d.ts +12 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseElements.d.ts +11 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +15 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/rotateMatrix.d.ts +2 -0
- package/dist/src/parser/scaleMatrix.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/skewMatrix.d.ts +2 -0
- package/dist/src/parser/translateMatrix.d.ts +2 -0
- package/dist/src/shapes/ActiveSelection.d.ts +66 -0
- package/dist/src/shapes/Circle.d.ts +80 -0
- package/dist/src/shapes/Ellipse.d.ts +74 -0
- package/dist/src/shapes/Group.d.ts +381 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +322 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +283 -0
- package/dist/src/shapes/Line.d.ts +117 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
- package/dist/src/shapes/Object/Object.d.ts +906 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
- package/dist/src/shapes/Path.d.ts +123 -0
- package/dist/src/shapes/Polygon.d.ts +7 -0
- package/dist/src/shapes/Polyline.d.ts +130 -0
- package/dist/src/shapes/Rect.d.ts +62 -0
- package/dist/src/shapes/Text/StyledText.d.ts +118 -0
- package/dist/src/shapes/Text/Text.d.ts +656 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Textbox.d.ts +170 -0
- package/dist/src/shapes/Triangle.d.ts +17 -0
- package/dist/src/typedefs.d.ts +93 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/class_registry.d.ts +14 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +40 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/fireEvent.d.ts +3 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_class.d.ts +12 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +29 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +92 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +56 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +8 -0
- package/dist/src/util/misc/planeChange.d.ts +84 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +53 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +57 -0
- package/dist/src/util/path.d.ts +108 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/types.d.ts +19 -0
- package/fabric.ts +427 -0
- package/index.node.ts +43 -0
- package/index.ts +1 -0
- package/package.json +90 -39
- package/publish.js +0 -26
- package/rollup.config.mjs +79 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/index.mjs +679 -0
- package/scripts/transform_files.mjs +504 -0
- package/src/Collection.ts +311 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +294 -0
- package/src/Intersection.ts +273 -0
- package/src/Observable.ts +175 -0
- package/src/Pattern.ts +211 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +215 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
- package/src/brushes/CircleBrush.ts +145 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +219 -0
- package/src/cache.ts +89 -0
- package/src/canvas/Canvas.ts +1672 -0
- package/src/canvas/SelectableCanvas.ts +1636 -0
- package/src/canvas/StaticCanvas.ts +1709 -0
- package/src/canvas/TextEditingManager.ts +48 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +404 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +26 -0
- package/src/color/util.ts +32 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +19 -0
- package/src/controls/Control.ts +377 -0
- package/src/controls/changeWidth.ts +52 -0
- package/src/controls/controls.render.ts +138 -0
- package/src/controls/default_controls.ts +132 -0
- package/src/controls/drag.ts +31 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +242 -0
- package/src/controls/util.ts +154 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +28 -0
- package/src/env/index.ts +19 -0
- package/src/env/node.ts +52 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
- package/src/filters/BlendColor.ts +258 -0
- package/src/filters/BlendImage.ts +254 -0
- package/src/filters/Blur.ts +202 -0
- package/src/filters/Boilerplate.ts +91 -0
- package/src/filters/Brightness.ts +93 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +156 -0
- package/src/filters/ColorMatrixFilters.ts +106 -0
- package/src/filters/Composed.ts +85 -0
- package/src/filters/Contrast.ts +94 -0
- package/src/filters/Convolute.ts +341 -0
- package/src/filters/FilterBackend.ts +32 -0
- package/src/filters/Gamma.ts +127 -0
- package/src/filters/Grayscale.ts +137 -0
- package/src/filters/HueRotation.ts +66 -0
- package/src/filters/Invert.ts +117 -0
- package/src/filters/Noise.ts +109 -0
- package/src/filters/Pixelate.ts +114 -0
- package/src/filters/RemoveColor.ts +148 -0
- package/src/filters/Resize.ts +540 -0
- package/src/filters/Saturation.ts +100 -0
- package/src/filters/Vibrance.ts +103 -0
- package/src/filters/WebGLFilterBackend.ts +430 -0
- package/src/filters/WebGLProbe.ts +62 -0
- package/src/filters/typedefs.ts +65 -0
- package/src/gradient/Gradient.ts +401 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +55 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/mixins/stateful.mixin.ts +104 -0
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +162 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +118 -0
- package/src/parser/doesSomeParentMatch.ts +19 -0
- package/src/parser/elementById.ts +23 -0
- package/src/parser/elementMatchesRule.ts +19 -0
- package/src/parser/elements_parser.ts +191 -0
- package/src/parser/getCSSRules.ts +62 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +32 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +5 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/loadSVGFromString.ts +26 -0
- package/src/parser/loadSVGFromURL.ts +40 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +63 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseElements.ts +28 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +36 -0
- package/src/parser/parseSVGDocument.ts +106 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +155 -0
- package/src/parser/parseUseDirectives.ts +79 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/rotateMatrix.ts +21 -0
- package/src/parser/scaleMatrix.ts +9 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/skewMatrix.ts +6 -0
- package/src/parser/translateMatrix.ts +8 -0
- package/src/shapes/ActiveSelection.ts +157 -0
- package/src/shapes/Circle.ts +205 -0
- package/src/shapes/Ellipse.ts +154 -0
- package/src/shapes/Group.ts +1053 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
- package/src/shapes/IText/IText.ts +666 -0
- package/src/shapes/IText/ITextBehavior.ts +1055 -0
- package/src/shapes/IText/ITextClickBehavior.ts +321 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
- package/src/shapes/IText/constants.ts +47 -0
- package/src/shapes/Image.ts +789 -0
- package/src/shapes/Line.ts +329 -0
- package/src/shapes/Object/AnimatableObject.ts +106 -0
- package/src/shapes/Object/FabricObject.ts +19 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
- package/src/shapes/Object/InteractiveObject.ts +645 -0
- package/src/shapes/Object/Object.ts +1896 -0
- package/src/shapes/Object/ObjectGeometry.ts +830 -0
- package/src/shapes/Object/ObjectOrigin.ts +354 -0
- package/src/shapes/Object/StackedObject.ts +191 -0
- package/src/shapes/Object/defaultValues.ts +112 -0
- package/src/shapes/Path.ts +395 -0
- package/src/shapes/Polygon.ts +19 -0
- package/src/shapes/Polyline.ts +333 -0
- package/src/shapes/Rect.ts +199 -0
- package/src/shapes/Text/StyledText.ts +319 -0
- package/src/shapes/Text/Text.ts +1948 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
- package/src/shapes/Textbox.ts +471 -0
- package/src/shapes/Triangle.ts +45 -0
- package/src/typedefs.ts +119 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +28 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/class_registry.ts +54 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +138 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/fireEvent.ts +15 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_class.ts +90 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +37 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +50 -0
- package/src/util/misc/findScaleTo.ts +44 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +51 -0
- package/src/util/misc/matrix.ts +207 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +189 -0
- package/src/util/misc/objectTransforms.ts +129 -0
- package/src/util/misc/pick.ts +17 -0
- package/src/util/misc/planeChange.ts +136 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
- package/src/util/misc/projectStroke/index.ts +53 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +181 -0
- package/src/util/misc/textStyles.ts +133 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +82 -0
- package/src/util/path.ts +941 -0
- package/src/util/transform_matrix_removal.ts +60 -0
- package/src/util/types.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { Point } from './Point';
|
|
2
|
+
|
|
3
|
+
/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */
|
|
4
|
+
|
|
5
|
+
export type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* **Assuming `T`, `A`, `B` are points on the same line**,
|
|
9
|
+
* check if `T` is contained in `[A, B]` by comparing the direction of the vectors from `T` to `A` and `B`
|
|
10
|
+
* @param T
|
|
11
|
+
* @param A
|
|
12
|
+
* @param B
|
|
13
|
+
* @returns true if `T` is contained
|
|
14
|
+
*/
|
|
15
|
+
const isContainedInInterval = (T: Point, A: Point, B: Point) => {
|
|
16
|
+
const TA = new Point(T).subtract(A);
|
|
17
|
+
const TB = new Point(T).subtract(B);
|
|
18
|
+
return (
|
|
19
|
+
Math.sign(TA.x) !== Math.sign(TB.x) || Math.sign(TA.y) !== Math.sign(TB.y)
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export class Intersection {
|
|
24
|
+
declare points: Point[];
|
|
25
|
+
|
|
26
|
+
declare status?: IntersectionType;
|
|
27
|
+
|
|
28
|
+
constructor(status?: IntersectionType) {
|
|
29
|
+
this.status = status;
|
|
30
|
+
this.points = [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Used to verify if a point is alredy in the collection
|
|
35
|
+
* @param {Point} point
|
|
36
|
+
* @returns {boolean}
|
|
37
|
+
*/
|
|
38
|
+
private includes(point: Point): boolean {
|
|
39
|
+
return this.points.some((p) => p.eq(point));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Appends points of intersection
|
|
44
|
+
* @param {...Point[]} points
|
|
45
|
+
* @return {Intersection} thisArg
|
|
46
|
+
* @chainable
|
|
47
|
+
*/
|
|
48
|
+
private append(...points: Point[]): Intersection {
|
|
49
|
+
this.points = this.points.concat(
|
|
50
|
+
points.filter((point) => {
|
|
51
|
+
return !this.includes(point);
|
|
52
|
+
})
|
|
53
|
+
);
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Checks if a line intersects another
|
|
59
|
+
* @static
|
|
60
|
+
* @param {Point} a1
|
|
61
|
+
* @param {Point} a2
|
|
62
|
+
* @param {Point} b1
|
|
63
|
+
* @param {Point} b2
|
|
64
|
+
* @param {boolean} [aInfinite=true] check segment intersection by passing `false`
|
|
65
|
+
* @param {boolean} [bInfinite=true] check segment intersection by passing `false`
|
|
66
|
+
* @return {Intersection}
|
|
67
|
+
*/
|
|
68
|
+
static intersectLineLine(
|
|
69
|
+
a1: Point,
|
|
70
|
+
a2: Point,
|
|
71
|
+
b1: Point,
|
|
72
|
+
b2: Point,
|
|
73
|
+
aInfinite = true,
|
|
74
|
+
bInfinite = true
|
|
75
|
+
): Intersection {
|
|
76
|
+
const b2xb1x = b2.x - b1.x,
|
|
77
|
+
a1yb1y = a1.y - b1.y,
|
|
78
|
+
b2yb1y = b2.y - b1.y,
|
|
79
|
+
a1xb1x = a1.x - b1.x,
|
|
80
|
+
a2ya1y = a2.y - a1.y,
|
|
81
|
+
a2xa1x = a2.x - a1.x,
|
|
82
|
+
uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,
|
|
83
|
+
ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,
|
|
84
|
+
uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;
|
|
85
|
+
if (uB !== 0) {
|
|
86
|
+
const ua = uaT / uB,
|
|
87
|
+
ub = ubT / uB;
|
|
88
|
+
if (
|
|
89
|
+
(aInfinite || (0 <= ua && ua <= 1)) &&
|
|
90
|
+
(bInfinite || (0 <= ub && ub <= 1))
|
|
91
|
+
) {
|
|
92
|
+
return new Intersection('Intersection').append(
|
|
93
|
+
new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y)
|
|
94
|
+
);
|
|
95
|
+
} else {
|
|
96
|
+
return new Intersection();
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
if (uaT === 0 || ubT === 0) {
|
|
100
|
+
const segmentsCoincide =
|
|
101
|
+
aInfinite ||
|
|
102
|
+
bInfinite ||
|
|
103
|
+
isContainedInInterval(a1, b1, b2) ||
|
|
104
|
+
isContainedInInterval(a2, b1, b2) ||
|
|
105
|
+
isContainedInInterval(b1, a1, a2) ||
|
|
106
|
+
isContainedInInterval(b2, a1, a2);
|
|
107
|
+
return new Intersection(segmentsCoincide ? 'Coincident' : undefined);
|
|
108
|
+
} else {
|
|
109
|
+
return new Intersection('Parallel');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Checks if a segment intersects a line
|
|
116
|
+
* @see {@link intersectLineLine} for line intersection
|
|
117
|
+
* @static
|
|
118
|
+
* @param {Point} s1 boundary point of segment
|
|
119
|
+
* @param {Point} s2 other boundary point of segment
|
|
120
|
+
* @param {Point} l1 point on line
|
|
121
|
+
* @param {Point} l2 other point on line
|
|
122
|
+
* @return {Intersection}
|
|
123
|
+
*/
|
|
124
|
+
static intersectSegmentLine(
|
|
125
|
+
s1: Point,
|
|
126
|
+
s2: Point,
|
|
127
|
+
l1: Point,
|
|
128
|
+
l2: Point
|
|
129
|
+
): Intersection {
|
|
130
|
+
return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Checks if a segment intersects another
|
|
135
|
+
* @see {@link intersectLineLine} for line intersection
|
|
136
|
+
* @static
|
|
137
|
+
* @param {Point} a1 boundary point of segment
|
|
138
|
+
* @param {Point} a2 other boundary point of segment
|
|
139
|
+
* @param {Point} b1 boundary point of segment
|
|
140
|
+
* @param {Point} b2 other boundary point of segment
|
|
141
|
+
* @return {Intersection}
|
|
142
|
+
*/
|
|
143
|
+
static intersectSegmentSegment(
|
|
144
|
+
a1: Point,
|
|
145
|
+
a2: Point,
|
|
146
|
+
b1: Point,
|
|
147
|
+
b2: Point
|
|
148
|
+
): Intersection {
|
|
149
|
+
return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Checks if line intersects polygon
|
|
154
|
+
*
|
|
155
|
+
* @todo account for stroke
|
|
156
|
+
*
|
|
157
|
+
* @static
|
|
158
|
+
* @see {@link intersectSegmentPolygon} for segment intersection
|
|
159
|
+
* @param {Point} a1 point on line
|
|
160
|
+
* @param {Point} a2 other point on line
|
|
161
|
+
* @param {Point[]} points polygon points
|
|
162
|
+
* @param {boolean} [infinite=true] check segment intersection by passing `false`
|
|
163
|
+
* @return {Intersection}
|
|
164
|
+
*/
|
|
165
|
+
static intersectLinePolygon(
|
|
166
|
+
a1: Point,
|
|
167
|
+
a2: Point,
|
|
168
|
+
points: Point[],
|
|
169
|
+
infinite = true
|
|
170
|
+
): Intersection {
|
|
171
|
+
const result = new Intersection();
|
|
172
|
+
const length = points.length;
|
|
173
|
+
|
|
174
|
+
for (let i = 0, b1, b2, inter; i < length; i++) {
|
|
175
|
+
b1 = points[i];
|
|
176
|
+
b2 = points[(i + 1) % length];
|
|
177
|
+
inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);
|
|
178
|
+
if (inter.status === 'Coincident') {
|
|
179
|
+
return inter;
|
|
180
|
+
}
|
|
181
|
+
result.append(...inter.points);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (result.points.length > 0) {
|
|
185
|
+
result.status = 'Intersection';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Checks if segment intersects polygon
|
|
193
|
+
* @static
|
|
194
|
+
* @see {@link intersectLinePolygon} for line intersection
|
|
195
|
+
* @param {Point} a1 boundary point of segment
|
|
196
|
+
* @param {Point} a2 other boundary point of segment
|
|
197
|
+
* @param {Point[]} points polygon points
|
|
198
|
+
* @return {Intersection}
|
|
199
|
+
*/
|
|
200
|
+
static intersectSegmentPolygon(
|
|
201
|
+
a1: Point,
|
|
202
|
+
a2: Point,
|
|
203
|
+
points: Point[]
|
|
204
|
+
): Intersection {
|
|
205
|
+
return Intersection.intersectLinePolygon(a1, a2, points, false);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Checks if polygon intersects another polygon
|
|
210
|
+
*
|
|
211
|
+
* @todo account for stroke
|
|
212
|
+
*
|
|
213
|
+
* @static
|
|
214
|
+
* @param {Point[]} points1
|
|
215
|
+
* @param {Point[]} points2
|
|
216
|
+
* @return {Intersection}
|
|
217
|
+
*/
|
|
218
|
+
static intersectPolygonPolygon(
|
|
219
|
+
points1: Point[],
|
|
220
|
+
points2: Point[]
|
|
221
|
+
): Intersection {
|
|
222
|
+
const result = new Intersection(),
|
|
223
|
+
length = points1.length;
|
|
224
|
+
const coincidences = [];
|
|
225
|
+
|
|
226
|
+
for (let i = 0; i < length; i++) {
|
|
227
|
+
const a1 = points1[i],
|
|
228
|
+
a2 = points1[(i + 1) % length],
|
|
229
|
+
inter = Intersection.intersectSegmentPolygon(a1, a2, points2);
|
|
230
|
+
if (inter.status === 'Coincident') {
|
|
231
|
+
coincidences.push(inter);
|
|
232
|
+
result.append(a1, a2);
|
|
233
|
+
} else {
|
|
234
|
+
result.append(...inter.points);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (coincidences.length > 0 && coincidences.length === points1.length) {
|
|
239
|
+
return new Intersection('Coincident');
|
|
240
|
+
} else if (result.points.length > 0) {
|
|
241
|
+
result.status = 'Intersection';
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Checks if polygon intersects rectangle
|
|
249
|
+
* @static
|
|
250
|
+
* @see {@link intersectPolygonPolygon} for polygon intersection
|
|
251
|
+
* @param {Point[]} points polygon points
|
|
252
|
+
* @param {Point} r1 top left point of rect
|
|
253
|
+
* @param {Point} r2 bottom right point of rect
|
|
254
|
+
* @return {Intersection}
|
|
255
|
+
*/
|
|
256
|
+
static intersectPolygonRectangle(
|
|
257
|
+
points: Point[],
|
|
258
|
+
r1: Point,
|
|
259
|
+
r2: Point
|
|
260
|
+
): Intersection {
|
|
261
|
+
const min = r1.min(r2),
|
|
262
|
+
max = r1.max(r2),
|
|
263
|
+
topRight = new Point(max.x, min.y),
|
|
264
|
+
bottomLeft = new Point(min.x, max.y);
|
|
265
|
+
|
|
266
|
+
return Intersection.intersectPolygonPolygon(points, [
|
|
267
|
+
min,
|
|
268
|
+
topRight,
|
|
269
|
+
max,
|
|
270
|
+
bottomLeft,
|
|
271
|
+
]);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
export type TEventCallback<T = any> = (options: T) => any;
|
|
2
|
+
|
|
3
|
+
type EventRegistryObject<
|
|
4
|
+
K extends string | number | symbol = string,
|
|
5
|
+
E = any
|
|
6
|
+
> = Record<K, TEventCallback<E>>;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}
|
|
10
|
+
* @see {@link http://fabricjs.com/events|Events demo}
|
|
11
|
+
*/
|
|
12
|
+
export class Observable<EventSpec> {
|
|
13
|
+
private __eventListeners: Record<keyof EventSpec, TEventCallback[]> =
|
|
14
|
+
{} as Record<keyof EventSpec, TEventCallback[]>;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Observes specified event
|
|
18
|
+
* @alias on
|
|
19
|
+
* @param {string} eventName Event name (eg. 'after:render')
|
|
20
|
+
* @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
|
|
21
|
+
* @param {Function} handler Function that receives a notification when an event of the specified type occurs
|
|
22
|
+
* @return {Function} disposer
|
|
23
|
+
*/
|
|
24
|
+
on<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
25
|
+
eventName: K,
|
|
26
|
+
handler: TEventCallback<E>
|
|
27
|
+
): VoidFunction;
|
|
28
|
+
on<K extends string, E>(
|
|
29
|
+
eventName: K,
|
|
30
|
+
handler: TEventCallback<E>
|
|
31
|
+
): VoidFunction;
|
|
32
|
+
on<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
33
|
+
handlers: EventRegistryObject<K, E>
|
|
34
|
+
): VoidFunction;
|
|
35
|
+
on<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
36
|
+
arg0: K | EventRegistryObject<K, E>,
|
|
37
|
+
handler?: TEventCallback<E>
|
|
38
|
+
): VoidFunction {
|
|
39
|
+
if (!this.__eventListeners) {
|
|
40
|
+
this.__eventListeners = {} as Record<keyof EventSpec, TEventCallback[]>;
|
|
41
|
+
}
|
|
42
|
+
if (typeof arg0 === 'object') {
|
|
43
|
+
// one object with key/value pairs was passed
|
|
44
|
+
for (const eventName in arg0) {
|
|
45
|
+
this.on(eventName as K, arg0[eventName]);
|
|
46
|
+
}
|
|
47
|
+
return () => this.off(arg0);
|
|
48
|
+
} else if (handler) {
|
|
49
|
+
const eventName = arg0;
|
|
50
|
+
if (!this.__eventListeners[eventName]) {
|
|
51
|
+
this.__eventListeners[eventName] = [];
|
|
52
|
+
}
|
|
53
|
+
this.__eventListeners[eventName].push(handler);
|
|
54
|
+
return () => this.off(eventName, handler);
|
|
55
|
+
} else {
|
|
56
|
+
// noop
|
|
57
|
+
return () => false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Observes specified event **once**
|
|
63
|
+
* @alias once
|
|
64
|
+
* @param {string} eventName Event name (eg. 'after:render')
|
|
65
|
+
* @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
|
|
66
|
+
* @param {Function} handler Function that receives a notification when an event of the specified type occurs
|
|
67
|
+
* @return {Function} disposer
|
|
68
|
+
*/
|
|
69
|
+
once<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
70
|
+
eventName: K,
|
|
71
|
+
handler: TEventCallback<E>
|
|
72
|
+
): VoidFunction;
|
|
73
|
+
once<K extends string, E>(
|
|
74
|
+
eventName: K,
|
|
75
|
+
handler: TEventCallback<E>
|
|
76
|
+
): VoidFunction;
|
|
77
|
+
once<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
78
|
+
handlers: EventRegistryObject<K, E>
|
|
79
|
+
): VoidFunction;
|
|
80
|
+
once<K extends keyof EventSpec, E extends EventSpec[K]>(
|
|
81
|
+
arg0: K | EventRegistryObject<K, E>,
|
|
82
|
+
handler?: TEventCallback<E>
|
|
83
|
+
): VoidFunction {
|
|
84
|
+
if (typeof arg0 === 'object') {
|
|
85
|
+
// one object with key/value pairs was passed
|
|
86
|
+
const disposers: VoidFunction[] = [];
|
|
87
|
+
for (const eventName in arg0) {
|
|
88
|
+
disposers.push(this.once(eventName as K, arg0[eventName]));
|
|
89
|
+
}
|
|
90
|
+
return () => disposers.forEach((d) => d());
|
|
91
|
+
} else if (handler) {
|
|
92
|
+
const disposer = this.on<K, E>(arg0, (...args) => {
|
|
93
|
+
handler(...args);
|
|
94
|
+
disposer();
|
|
95
|
+
});
|
|
96
|
+
return disposer;
|
|
97
|
+
} else {
|
|
98
|
+
// noop
|
|
99
|
+
return () => false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @private
|
|
105
|
+
* @param {string} eventName
|
|
106
|
+
* @param {Function} [handler]
|
|
107
|
+
*/
|
|
108
|
+
private _removeEventListener<K extends keyof EventSpec>(
|
|
109
|
+
eventName: K,
|
|
110
|
+
handler?: TEventCallback
|
|
111
|
+
) {
|
|
112
|
+
if (!this.__eventListeners[eventName]) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (handler) {
|
|
117
|
+
const eventListener = this.__eventListeners[eventName];
|
|
118
|
+
const index = eventListener.indexOf(handler);
|
|
119
|
+
index > -1 && eventListener.splice(index, 1);
|
|
120
|
+
} else {
|
|
121
|
+
this.__eventListeners[eventName] = [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Stops event observing for a particular event handler. Calling this method
|
|
127
|
+
* without arguments removes all handlers for all events
|
|
128
|
+
* @param {string} eventName Event name (eg. 'after:render')
|
|
129
|
+
* @param {EventRegistryObject} handlers key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
|
|
130
|
+
* @param {Function} handler Function to be deleted from EventListeners
|
|
131
|
+
*/
|
|
132
|
+
off<K extends keyof EventSpec>(eventName: K, handler: TEventCallback): void;
|
|
133
|
+
off(handlers: EventRegistryObject): void;
|
|
134
|
+
off<K extends keyof EventSpec>(
|
|
135
|
+
arg0?: K | EventRegistryObject,
|
|
136
|
+
handler?: TEventCallback
|
|
137
|
+
) {
|
|
138
|
+
if (!this.__eventListeners) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// remove all key/value pairs (event name -> event handler)
|
|
143
|
+
if (typeof arg0 === 'undefined') {
|
|
144
|
+
for (const eventName in this.__eventListeners) {
|
|
145
|
+
this._removeEventListener(eventName);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// one object with key/value pairs was passed
|
|
149
|
+
else if (typeof arg0 === 'object') {
|
|
150
|
+
for (const eventName in arg0) {
|
|
151
|
+
this._removeEventListener(eventName as K, arg0[eventName]);
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
this._removeEventListener(arg0, handler);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Fires event with an optional options object
|
|
160
|
+
* @param {String} eventName Event name to fire
|
|
161
|
+
* @param {Object} [options] Options object
|
|
162
|
+
*/
|
|
163
|
+
fire<K extends keyof EventSpec>(eventName: K, options?: EventSpec[K]) {
|
|
164
|
+
if (!this.__eventListeners) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const listenersForEvent = this.__eventListeners[eventName]?.concat();
|
|
169
|
+
if (listenersForEvent) {
|
|
170
|
+
for (let i = 0; i < listenersForEvent.length; i++) {
|
|
171
|
+
listenersForEvent[i].call(this, options || {});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
package/src/Pattern.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { config } from './config';
|
|
2
|
+
import { TCrossOrigin, TMat2D, TSize } from './typedefs';
|
|
3
|
+
import { ifNaN } from './util/internals';
|
|
4
|
+
import { uid } from './util/internals/uid';
|
|
5
|
+
import { loadImage } from './util/misc/objectEnlive';
|
|
6
|
+
import { pick } from './util/misc/pick';
|
|
7
|
+
import { toFixed } from './util/misc/toFixed';
|
|
8
|
+
import { classRegistry } from './util/class_registry';
|
|
9
|
+
|
|
10
|
+
export type TPatternRepeat = 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat';
|
|
11
|
+
|
|
12
|
+
type TExportedKeys =
|
|
13
|
+
| 'crossOrigin'
|
|
14
|
+
| 'offsetX'
|
|
15
|
+
| 'offsetY'
|
|
16
|
+
| 'patternTransform'
|
|
17
|
+
| 'repeat'
|
|
18
|
+
| 'source';
|
|
19
|
+
|
|
20
|
+
export type TPatternOptions = Partial<Pick<Pattern, TExportedKeys>>;
|
|
21
|
+
|
|
22
|
+
export type TPatternSerialized = TPatternOptions & {
|
|
23
|
+
source: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type TPatternHydrationOptions = {
|
|
27
|
+
/**
|
|
28
|
+
* handle aborting
|
|
29
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
30
|
+
*/
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type TImageSource = { source: HTMLImageElement };
|
|
35
|
+
type TCanvasSource = { source: HTMLCanvasElement };
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @see {@link http://fabricjs.com/patterns demo}
|
|
39
|
+
* @see {@link http://fabricjs.com/dynamic-patterns demo}
|
|
40
|
+
*/
|
|
41
|
+
export class Pattern {
|
|
42
|
+
type = 'pattern';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @type TPatternRepeat
|
|
46
|
+
* @defaults
|
|
47
|
+
*/
|
|
48
|
+
repeat: TPatternRepeat = 'repeat';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Pattern horizontal offset from object's left/top corner
|
|
52
|
+
* @type Number
|
|
53
|
+
* @default
|
|
54
|
+
*/
|
|
55
|
+
offsetX = 0;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Pattern vertical offset from object's left/top corner
|
|
59
|
+
* @type Number
|
|
60
|
+
* @default
|
|
61
|
+
*/
|
|
62
|
+
offsetY = 0;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @type TCrossOrigin
|
|
66
|
+
* @default
|
|
67
|
+
*/
|
|
68
|
+
crossOrigin: TCrossOrigin = '';
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* transform matrix to change the pattern, imported from svgs.
|
|
72
|
+
* @todo verify if using the identity matrix as default makes the rest of the code more easy
|
|
73
|
+
* @type Array
|
|
74
|
+
* @default
|
|
75
|
+
*/
|
|
76
|
+
patternTransform: TMat2D | null = null;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The actual pixel source of the pattern
|
|
80
|
+
*/
|
|
81
|
+
declare source: CanvasImageSource;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* If true, this object will not be exported during the serialization of a canvas
|
|
85
|
+
* @type boolean
|
|
86
|
+
*/
|
|
87
|
+
declare excludeFromExport?: boolean;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* ID used for SVG export functionalities
|
|
91
|
+
* @type number
|
|
92
|
+
*/
|
|
93
|
+
declare readonly id: number;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Constructor
|
|
97
|
+
* @param {Object} [options] Options object
|
|
98
|
+
* @param {option.source} [source] the pattern source, eventually empty or a drawable
|
|
99
|
+
*/
|
|
100
|
+
constructor(options: TPatternOptions = {}) {
|
|
101
|
+
this.id = uid();
|
|
102
|
+
Object.assign(this, options);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @returns true if {@link source} is an <img> element
|
|
107
|
+
*/
|
|
108
|
+
isImageSource(): this is TImageSource {
|
|
109
|
+
return (
|
|
110
|
+
!!this.source && typeof (this.source as HTMLImageElement).src === 'string'
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @returns true if {@link source} is a <canvas> element
|
|
116
|
+
*/
|
|
117
|
+
isCanvasSource(): this is TCanvasSource {
|
|
118
|
+
return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
sourceToString(): string {
|
|
122
|
+
return this.isImageSource()
|
|
123
|
+
? this.source.src
|
|
124
|
+
: this.isCanvasSource()
|
|
125
|
+
? this.source.toDataURL()
|
|
126
|
+
: '';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Returns an instance of CanvasPattern
|
|
131
|
+
* @param {CanvasRenderingContext2D} ctx Context to create pattern
|
|
132
|
+
* @return {CanvasPattern}
|
|
133
|
+
*/
|
|
134
|
+
toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {
|
|
135
|
+
if (
|
|
136
|
+
// if the image failed to load, return, and allow rest to continue loading
|
|
137
|
+
!this.source ||
|
|
138
|
+
// if an image
|
|
139
|
+
(this.isImageSource() &&
|
|
140
|
+
(!this.source.complete ||
|
|
141
|
+
this.source.naturalWidth === 0 ||
|
|
142
|
+
this.source.naturalHeight === 0))
|
|
143
|
+
) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return ctx.createPattern(this.source, this.repeat)!;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Returns object representation of a pattern
|
|
152
|
+
* @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
|
|
153
|
+
* @return {object} Object representation of a pattern instance
|
|
154
|
+
*/
|
|
155
|
+
toObject(propertiesToInclude: string[] = []): Record<string, any> {
|
|
156
|
+
const { repeat, crossOrigin } = this;
|
|
157
|
+
return {
|
|
158
|
+
...pick(this, propertiesToInclude as (keyof this)[]),
|
|
159
|
+
type: 'pattern',
|
|
160
|
+
source: this.sourceToString(),
|
|
161
|
+
repeat,
|
|
162
|
+
crossOrigin,
|
|
163
|
+
offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),
|
|
164
|
+
offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),
|
|
165
|
+
patternTransform: this.patternTransform
|
|
166
|
+
? [...this.patternTransform]
|
|
167
|
+
: null,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* _TO_SVG_START_ */
|
|
172
|
+
/**
|
|
173
|
+
* Returns SVG representation of a pattern
|
|
174
|
+
*/
|
|
175
|
+
toSVG({ width, height }: TSize): string {
|
|
176
|
+
const { source: patternSource, repeat, id } = this,
|
|
177
|
+
patternOffsetX = ifNaN(this.offsetX / width, 0),
|
|
178
|
+
patternOffsetY = ifNaN(this.offsetY / height, 0),
|
|
179
|
+
patternWidth =
|
|
180
|
+
repeat === 'repeat-y' || repeat === 'no-repeat'
|
|
181
|
+
? 1 + Math.abs(patternOffsetX || 0)
|
|
182
|
+
: ifNaN((patternSource.width as number) / width, 0),
|
|
183
|
+
patternHeight =
|
|
184
|
+
repeat === 'repeat-x' || repeat === 'no-repeat'
|
|
185
|
+
? 1 + Math.abs(patternOffsetY || 0)
|
|
186
|
+
: ifNaN((patternSource.height as number) / height, 0);
|
|
187
|
+
|
|
188
|
+
return [
|
|
189
|
+
`<pattern id="SVGID_${id}" x="${patternOffsetX}" y="${patternOffsetY}" width="${patternWidth}" height="${patternHeight}">`,
|
|
190
|
+
`<image x="0" y="0" width="${patternSource.width}" height="${
|
|
191
|
+
patternSource.height
|
|
192
|
+
}" xlink:href="${this.sourceToString()}"></image>`,
|
|
193
|
+
`</pattern>`,
|
|
194
|
+
'',
|
|
195
|
+
].join('\n');
|
|
196
|
+
}
|
|
197
|
+
/* _TO_SVG_END_ */
|
|
198
|
+
|
|
199
|
+
static async fromObject(
|
|
200
|
+
{ source, ...serialized }: TPatternSerialized,
|
|
201
|
+
options: TPatternHydrationOptions
|
|
202
|
+
): Promise<Pattern> {
|
|
203
|
+
const img = await loadImage(source, {
|
|
204
|
+
...options,
|
|
205
|
+
crossOrigin: serialized.crossOrigin,
|
|
206
|
+
});
|
|
207
|
+
return new this({ ...serialized, source: img });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
classRegistry.setClass(Pattern, 'pattern');
|