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
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { Point } from '../Point';
|
|
3
|
+
import { uid } from '../util/internals/uid';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
fabric.Object.ENLIVEN_PROPS.push('eraser');
|
|
5
|
+
(function (global) {
|
|
6
|
+
/** ERASER_START */
|
|
8
7
|
|
|
9
|
-
var
|
|
8
|
+
var fabric = global.fabric,
|
|
9
|
+
__drawClipPath = fabric.Object.prototype._drawClipPath;
|
|
10
10
|
var _needsItsOwnCache = fabric.Object.prototype.needsItsOwnCache;
|
|
11
11
|
var _toObject = fabric.Object.prototype.toObject;
|
|
12
12
|
var _getSvgCommons = fabric.Object.prototype.getSvgCommons;
|
|
13
|
-
var __createBaseClipPathSVGMarkup =
|
|
13
|
+
var __createBaseClipPathSVGMarkup =
|
|
14
|
+
fabric.Object.prototype._createBaseClipPathSVGMarkup;
|
|
14
15
|
var __createBaseSVGMarkup = fabric.Object.prototype._createBaseSVGMarkup;
|
|
15
16
|
|
|
16
17
|
fabric.Object.prototype.cacheProperties.push('eraser');
|
|
@@ -58,10 +59,11 @@
|
|
|
58
59
|
if (this.eraser) {
|
|
59
60
|
// update eraser size to match instance
|
|
60
61
|
var size = this._getNonTransformedDimensions();
|
|
61
|
-
this.eraser.isType('eraser') &&
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
this.eraser.isType('eraser') &&
|
|
63
|
+
this.eraser.set({
|
|
64
|
+
width: size.x,
|
|
65
|
+
height: size.y,
|
|
66
|
+
});
|
|
65
67
|
__drawClipPath.call(this, ctx, this.eraser);
|
|
66
68
|
}
|
|
67
69
|
},
|
|
@@ -72,7 +74,10 @@
|
|
|
72
74
|
* @return {Object} Object representation of an instance
|
|
73
75
|
*/
|
|
74
76
|
toObject: function (propertiesToInclude) {
|
|
75
|
-
var object = _toObject.call(
|
|
77
|
+
var object = _toObject.call(
|
|
78
|
+
this,
|
|
79
|
+
['erasable'].concat(propertiesToInclude)
|
|
80
|
+
);
|
|
76
81
|
if (this.eraser && !this.eraser.excludeFromExport) {
|
|
77
82
|
object.eraser = this.eraser.toObject(propertiesToInclude);
|
|
78
83
|
}
|
|
@@ -86,7 +91,10 @@
|
|
|
86
91
|
* @return {String}
|
|
87
92
|
*/
|
|
88
93
|
getSvgCommons: function () {
|
|
89
|
-
return
|
|
94
|
+
return (
|
|
95
|
+
_getSvgCommons.call(this) +
|
|
96
|
+
(this.eraser ? 'mask="url(#' + this.eraser.clipPathId + ')" ' : '')
|
|
97
|
+
);
|
|
90
98
|
},
|
|
91
99
|
|
|
92
100
|
/**
|
|
@@ -98,11 +106,14 @@
|
|
|
98
106
|
*/
|
|
99
107
|
_createEraserSVGMarkup: function (reviver) {
|
|
100
108
|
if (this.eraser) {
|
|
101
|
-
this.eraser.clipPathId = 'MASK_' +
|
|
109
|
+
this.eraser.clipPathId = 'MASK_' + uid();
|
|
102
110
|
return [
|
|
103
|
-
'<mask id="',
|
|
111
|
+
'<mask id="',
|
|
112
|
+
this.eraser.clipPathId,
|
|
113
|
+
'" >',
|
|
104
114
|
this.eraser.toSVG(reviver),
|
|
105
|
-
'</mask>',
|
|
115
|
+
'</mask>',
|
|
116
|
+
'\n',
|
|
106
117
|
].join('');
|
|
107
118
|
}
|
|
108
119
|
return '';
|
|
@@ -114,7 +125,7 @@
|
|
|
114
125
|
_createBaseClipPathSVGMarkup: function (objectMarkup, options) {
|
|
115
126
|
return [
|
|
116
127
|
this._createEraserSVGMarkup(options && options.reviver),
|
|
117
|
-
__createBaseClipPathSVGMarkup.call(this, objectMarkup, options)
|
|
128
|
+
__createBaseClipPathSVGMarkup.call(this, objectMarkup, options),
|
|
118
129
|
].join('');
|
|
119
130
|
},
|
|
120
131
|
|
|
@@ -124,74 +135,73 @@
|
|
|
124
135
|
_createBaseSVGMarkup: function (objectMarkup, options) {
|
|
125
136
|
return [
|
|
126
137
|
this._createEraserSVGMarkup(options && options.reviver),
|
|
127
|
-
__createBaseSVGMarkup.call(this, objectMarkup, options)
|
|
138
|
+
__createBaseSVGMarkup.call(this, objectMarkup, options),
|
|
128
139
|
].join('');
|
|
129
|
-
}
|
|
140
|
+
},
|
|
130
141
|
/* _TO_SVG_END_ */
|
|
131
142
|
});
|
|
132
143
|
|
|
133
|
-
var __restoreObjectsState = fabric.Group.prototype._restoreObjectsState;
|
|
134
144
|
fabric.util.object.extend(fabric.Group.prototype, {
|
|
135
145
|
/**
|
|
136
146
|
* @private
|
|
137
147
|
* @param {fabric.Path} path
|
|
148
|
+
* @returns {Promise<fabric.Path[]>}
|
|
138
149
|
*/
|
|
139
150
|
_addEraserPathToObjects: function (path) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
fabric.EraserBrush.prototype
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
151
|
+
return Promise.all(
|
|
152
|
+
this._objects.map(function (object) {
|
|
153
|
+
return fabric.EraserBrush.prototype._addPathToObjectEraser.call(
|
|
154
|
+
fabric.EraserBrush.prototype,
|
|
155
|
+
object,
|
|
156
|
+
path
|
|
157
|
+
);
|
|
158
|
+
})
|
|
159
|
+
);
|
|
147
160
|
},
|
|
148
161
|
|
|
149
162
|
/**
|
|
150
163
|
* Applies the group's eraser to its objects
|
|
151
164
|
* @tutorial {@link http://fabricjs.com/erasing#erasable_property}
|
|
165
|
+
* @returns {Promise<fabric.Path[]|fabric.Path[][]|void>}
|
|
152
166
|
*/
|
|
153
167
|
applyEraserToObjects: function () {
|
|
154
|
-
var _this = this,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
var
|
|
160
|
-
eraser.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
transform
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
168
|
+
var _this = this,
|
|
169
|
+
eraser = this.eraser;
|
|
170
|
+
return Promise.resolve().then(function () {
|
|
171
|
+
if (eraser) {
|
|
172
|
+
delete _this.eraser;
|
|
173
|
+
var transform = _this.calcTransformMatrix();
|
|
174
|
+
return eraser.clone().then(function (eraser) {
|
|
175
|
+
var clipPath = _this.clipPath;
|
|
176
|
+
return Promise.all(
|
|
177
|
+
eraser.getObjects('path').map(function (path) {
|
|
178
|
+
// first we transform the path from the group's coordinate system to the canvas'
|
|
179
|
+
var originalTransform = fabric.util.multiplyTransformMatrices(
|
|
180
|
+
transform,
|
|
181
|
+
path.calcTransformMatrix()
|
|
182
|
+
);
|
|
183
|
+
fabric.util.applyTransformToObject(path, originalTransform);
|
|
184
|
+
return clipPath
|
|
185
|
+
? clipPath.clone().then(
|
|
186
|
+
function (_clipPath) {
|
|
187
|
+
var eraserPath =
|
|
188
|
+
fabric.EraserBrush.prototype.applyClipPathToPath.call(
|
|
189
|
+
fabric.EraserBrush.prototype,
|
|
190
|
+
path,
|
|
191
|
+
_clipPath,
|
|
192
|
+
transform
|
|
193
|
+
);
|
|
194
|
+
return _this._addEraserPathToObjects(eraserPath);
|
|
195
|
+
},
|
|
196
|
+
['absolutePositioned', 'inverted']
|
|
197
|
+
)
|
|
198
|
+
: _this._addEraserPathToObjects(path);
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
});
|
|
185
204
|
},
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Propagate the group's eraser to its objects, crucial for proper functionality of the eraser within the group and nested objects.
|
|
189
|
-
* @private
|
|
190
|
-
*/
|
|
191
|
-
_restoreObjectsState: function () {
|
|
192
|
-
this.erasable === true && this.applyEraserToObjects();
|
|
193
|
-
return __restoreObjectsState.call(this);
|
|
194
|
-
}
|
|
195
205
|
});
|
|
196
206
|
|
|
197
207
|
/**
|
|
@@ -218,14 +228,6 @@
|
|
|
218
228
|
*/
|
|
219
229
|
originY: 'center',
|
|
220
230
|
|
|
221
|
-
drawObject: function (ctx) {
|
|
222
|
-
ctx.save();
|
|
223
|
-
ctx.fillStyle = 'black';
|
|
224
|
-
ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
|
|
225
|
-
ctx.restore();
|
|
226
|
-
this.callSuper('drawObject', ctx);
|
|
227
|
-
},
|
|
228
|
-
|
|
229
231
|
/**
|
|
230
232
|
* eraser should retain size
|
|
231
233
|
* dimensions should not change when paths are added or removed
|
|
@@ -233,8 +235,14 @@
|
|
|
233
235
|
* @override
|
|
234
236
|
* @private
|
|
235
237
|
*/
|
|
236
|
-
|
|
237
|
-
|
|
238
|
+
layout: 'fixed',
|
|
239
|
+
|
|
240
|
+
drawObject: function (ctx) {
|
|
241
|
+
ctx.save();
|
|
242
|
+
ctx.fillStyle = 'black';
|
|
243
|
+
ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
|
|
244
|
+
ctx.restore();
|
|
245
|
+
this.callSuper('drawObject', ctx);
|
|
238
246
|
},
|
|
239
247
|
|
|
240
248
|
/* _TO_SVG_START_ */
|
|
@@ -248,12 +256,20 @@
|
|
|
248
256
|
*/
|
|
249
257
|
_toSVG: function (reviver) {
|
|
250
258
|
var svgString = ['<g ', 'COMMON_PARTS', ' >\n'];
|
|
251
|
-
var x = -this.width / 2,
|
|
259
|
+
var x = -this.width / 2,
|
|
260
|
+
y = -this.height / 2;
|
|
252
261
|
var rectSvg = [
|
|
253
|
-
'<rect ',
|
|
254
|
-
'
|
|
255
|
-
'
|
|
256
|
-
|
|
262
|
+
'<rect ',
|
|
263
|
+
'fill="white" ',
|
|
264
|
+
'x="',
|
|
265
|
+
x,
|
|
266
|
+
'" y="',
|
|
267
|
+
y,
|
|
268
|
+
'" width="',
|
|
269
|
+
this.width,
|
|
270
|
+
'" height="',
|
|
271
|
+
this.height,
|
|
272
|
+
'" />\n',
|
|
257
273
|
].join('');
|
|
258
274
|
svgString.push('\t\t', rectSvg);
|
|
259
275
|
for (var i = 0, len = this._objects.length; i < len; i++) {
|
|
@@ -266,20 +282,25 @@
|
|
|
266
282
|
});
|
|
267
283
|
|
|
268
284
|
/**
|
|
269
|
-
* Returns
|
|
285
|
+
* Returns instance from an object representation
|
|
270
286
|
* @static
|
|
271
287
|
* @memberOf fabric.Eraser
|
|
272
288
|
* @param {Object} object Object to create an Eraser from
|
|
273
|
-
* @
|
|
289
|
+
* @returns {Promise<fabric.Eraser>}
|
|
274
290
|
*/
|
|
275
|
-
fabric.Eraser.fromObject = function (object
|
|
276
|
-
var objects = object.objects
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
fabric.util.
|
|
281
|
-
|
|
282
|
-
|
|
291
|
+
fabric.Eraser.fromObject = function (object) {
|
|
292
|
+
var objects = object.objects || [],
|
|
293
|
+
options = fabric.util.object.clone(object, true);
|
|
294
|
+
delete options.objects;
|
|
295
|
+
return Promise.all([
|
|
296
|
+
fabric.util.enlivenObjects(objects),
|
|
297
|
+
fabric.util.enlivenObjectEnlivables(options),
|
|
298
|
+
]).then(function (enlivedProps) {
|
|
299
|
+
return new fabric.Eraser(
|
|
300
|
+
enlivedProps[0],
|
|
301
|
+
Object.assign(options, enlivedProps[1]),
|
|
302
|
+
true
|
|
303
|
+
);
|
|
283
304
|
});
|
|
284
305
|
};
|
|
285
306
|
|
|
@@ -309,10 +330,8 @@
|
|
|
309
330
|
*/
|
|
310
331
|
_renderOverlay: function (ctx) {
|
|
311
332
|
__renderOverlay.call(this, ctx);
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
315
|
-
}
|
|
333
|
+
this.isErasing() && this.freeDrawingBrush._render();
|
|
334
|
+
},
|
|
316
335
|
});
|
|
317
336
|
|
|
318
337
|
/**
|
|
@@ -341,9 +360,17 @@
|
|
|
341
360
|
|
|
342
361
|
/**
|
|
343
362
|
* When set to `true` the brush will create a visual effect of undoing erasing
|
|
363
|
+
* @type boolean
|
|
344
364
|
*/
|
|
345
365
|
inverted: false,
|
|
346
366
|
|
|
367
|
+
/**
|
|
368
|
+
* Used to fix https://github.com/fabricjs/fabric.js/issues/7984
|
|
369
|
+
* Reduces the path width while clipping the main context, resulting in a better visual overlap of both contexts
|
|
370
|
+
* @type number
|
|
371
|
+
*/
|
|
372
|
+
erasingWidthAliasing: 4,
|
|
373
|
+
|
|
347
374
|
/**
|
|
348
375
|
* @private
|
|
349
376
|
*/
|
|
@@ -361,60 +388,73 @@
|
|
|
361
388
|
|
|
362
389
|
/**
|
|
363
390
|
* @private
|
|
364
|
-
* This is designed to support erasing a collection with both erasable and non-erasable objects
|
|
365
|
-
* Iterates over collections to allow nested selective erasing
|
|
366
|
-
* Prepares
|
|
367
|
-
* If brush is **NOT** inverted render all non-erasable objects
|
|
368
|
-
* If brush is inverted render all erasable objects
|
|
369
|
-
* This will render the erased parts as if they were not erased.
|
|
391
|
+
* This is designed to support erasing a collection with both erasable and non-erasable objects while maintaining object stacking.\
|
|
392
|
+
* Iterates over collections to allow nested selective erasing.\
|
|
393
|
+
* Prepares objects before rendering the pattern brush.\
|
|
394
|
+
* If brush is **NOT** inverted render all non-erasable objects.\
|
|
395
|
+
* If brush is inverted render all objects, erasable objects without their eraser.
|
|
396
|
+
* This will render the erased parts as if they were not erased in the first place, achieving an undo effect.
|
|
370
397
|
*
|
|
371
398
|
* @param {fabric.Collection} collection
|
|
399
|
+
* @param {fabric.Object[]} objects
|
|
372
400
|
* @param {CanvasRenderingContext2D} ctx
|
|
373
401
|
* @param {{ visibility: fabric.Object[], eraser: fabric.Object[], collection: fabric.Object[] }} restorationContext
|
|
374
402
|
*/
|
|
375
|
-
_prepareCollectionTraversal: function (
|
|
376
|
-
collection
|
|
403
|
+
_prepareCollectionTraversal: function (
|
|
404
|
+
collection,
|
|
405
|
+
objects,
|
|
406
|
+
ctx,
|
|
407
|
+
restorationContext
|
|
408
|
+
) {
|
|
409
|
+
objects.forEach(function (obj) {
|
|
410
|
+
var dirty = false;
|
|
377
411
|
if (obj.forEachObject && obj.erasable === 'deep') {
|
|
378
412
|
// traverse
|
|
379
|
-
this._prepareCollectionTraversal(
|
|
380
|
-
|
|
381
|
-
|
|
413
|
+
this._prepareCollectionTraversal(
|
|
414
|
+
obj,
|
|
415
|
+
obj._objects,
|
|
416
|
+
ctx,
|
|
417
|
+
restorationContext
|
|
418
|
+
);
|
|
419
|
+
} else if (!this.inverted && obj.erasable && obj.visible) {
|
|
382
420
|
// render only non-erasable objects
|
|
383
421
|
obj.visible = false;
|
|
384
|
-
collection.dirty = true;
|
|
385
422
|
restorationContext.visibility.push(obj);
|
|
386
|
-
|
|
423
|
+
dirty = true;
|
|
424
|
+
} else if (
|
|
425
|
+
this.inverted &&
|
|
426
|
+
obj.erasable &&
|
|
427
|
+
obj.eraser &&
|
|
428
|
+
obj.visible
|
|
429
|
+
) {
|
|
430
|
+
// render all objects without eraser
|
|
431
|
+
var eraser = obj.eraser;
|
|
432
|
+
obj.eraser = undefined;
|
|
433
|
+
obj.dirty = true;
|
|
434
|
+
restorationContext.eraser.push([obj, eraser]);
|
|
435
|
+
dirty = true;
|
|
387
436
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
obj.eraser.inverted = true;
|
|
392
|
-
obj.dirty = true;
|
|
393
|
-
collection.dirty = true;
|
|
394
|
-
restorationContext.eraser.push(obj);
|
|
395
|
-
restorationContext.collection.push(collection);
|
|
396
|
-
}
|
|
397
|
-
else {
|
|
398
|
-
obj.visible = false;
|
|
399
|
-
collection.dirty = true;
|
|
400
|
-
restorationContext.visibility.push(obj);
|
|
401
|
-
restorationContext.collection.push(collection);
|
|
402
|
-
}
|
|
437
|
+
if (dirty && collection instanceof fabric.Object) {
|
|
438
|
+
collection.dirty = true;
|
|
439
|
+
restorationContext.collection.push(collection);
|
|
403
440
|
}
|
|
404
441
|
}, this);
|
|
405
442
|
},
|
|
406
443
|
|
|
407
444
|
/**
|
|
408
445
|
* Prepare the pattern for the erasing brush
|
|
409
|
-
* This pattern will be drawn on the top context
|
|
410
|
-
*
|
|
446
|
+
* This pattern will be drawn on the top context after clipping the main context,
|
|
447
|
+
* achieving a visual effect of erasing only erasable objects
|
|
411
448
|
* @private
|
|
449
|
+
* @param {fabric.Object[]} [objects] override default behavior by passing objects to render on pattern
|
|
412
450
|
*/
|
|
413
|
-
preparePattern: function () {
|
|
451
|
+
preparePattern: function (objects) {
|
|
414
452
|
if (!this._patternCanvas) {
|
|
415
453
|
this._patternCanvas = fabric.util.createCanvasElement();
|
|
416
454
|
}
|
|
417
455
|
var canvas = this._patternCanvas;
|
|
456
|
+
objects =
|
|
457
|
+
objects || this.canvas._objectsToRender || this.canvas._objects;
|
|
418
458
|
canvas.width = this.canvas.width;
|
|
419
459
|
canvas.height = this.canvas.height;
|
|
420
460
|
var patternCtx = canvas.getContext('2d');
|
|
@@ -423,42 +463,77 @@
|
|
|
423
463
|
this.canvas.__initRetinaScaling(retinaScaling, canvas, patternCtx);
|
|
424
464
|
}
|
|
425
465
|
var backgroundImage = this.canvas.backgroundImage,
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
if (
|
|
430
|
-
|
|
466
|
+
bgErasable = backgroundImage && this._isErasable(backgroundImage),
|
|
467
|
+
overlayImage = this.canvas.overlayImage,
|
|
468
|
+
overlayErasable = overlayImage && this._isErasable(overlayImage);
|
|
469
|
+
if (
|
|
470
|
+
!this.inverted &&
|
|
471
|
+
((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)
|
|
472
|
+
) {
|
|
473
|
+
if (bgErasable) {
|
|
474
|
+
this.canvas.backgroundImage = undefined;
|
|
475
|
+
}
|
|
431
476
|
this.canvas._renderBackground(patternCtx);
|
|
432
|
-
if (bgErasable) {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
477
|
+
if (bgErasable) {
|
|
478
|
+
this.canvas.backgroundImage = backgroundImage;
|
|
479
|
+
}
|
|
480
|
+
} else if (this.inverted) {
|
|
481
|
+
var eraser = backgroundImage && backgroundImage.eraser;
|
|
482
|
+
if (eraser) {
|
|
483
|
+
backgroundImage.eraser = undefined;
|
|
484
|
+
backgroundImage.dirty = true;
|
|
485
|
+
}
|
|
437
486
|
this.canvas._renderBackground(patternCtx);
|
|
438
|
-
|
|
487
|
+
if (eraser) {
|
|
488
|
+
backgroundImage.eraser = eraser;
|
|
489
|
+
backgroundImage.dirty = true;
|
|
490
|
+
}
|
|
439
491
|
}
|
|
440
492
|
patternCtx.save();
|
|
441
493
|
patternCtx.transform.apply(patternCtx, this.canvas.viewportTransform);
|
|
442
494
|
var restorationContext = { visibility: [], eraser: [], collection: [] };
|
|
443
|
-
this._prepareCollectionTraversal(
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
495
|
+
this._prepareCollectionTraversal(
|
|
496
|
+
this.canvas,
|
|
497
|
+
objects,
|
|
498
|
+
patternCtx,
|
|
499
|
+
restorationContext
|
|
500
|
+
);
|
|
501
|
+
this.canvas._renderObjects(patternCtx, objects);
|
|
502
|
+
restorationContext.visibility.forEach(function (obj) {
|
|
503
|
+
obj.visible = true;
|
|
504
|
+
});
|
|
505
|
+
restorationContext.eraser.forEach(function (entry) {
|
|
506
|
+
var obj = entry[0],
|
|
507
|
+
eraser = entry[1];
|
|
508
|
+
obj.eraser = eraser;
|
|
509
|
+
obj.dirty = true;
|
|
510
|
+
});
|
|
511
|
+
restorationContext.collection.forEach(function (obj) {
|
|
448
512
|
obj.dirty = true;
|
|
449
513
|
});
|
|
450
|
-
restorationContext.collection.forEach(function (obj) { obj.dirty = true; });
|
|
451
514
|
patternCtx.restore();
|
|
452
|
-
if (
|
|
453
|
-
|
|
515
|
+
if (
|
|
516
|
+
!this.inverted &&
|
|
517
|
+
((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)
|
|
518
|
+
) {
|
|
519
|
+
if (overlayErasable) {
|
|
520
|
+
this.canvas.overlayImage = undefined;
|
|
521
|
+
}
|
|
454
522
|
__renderOverlay.call(this.canvas, patternCtx);
|
|
455
|
-
if (overlayErasable) {
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
523
|
+
if (overlayErasable) {
|
|
524
|
+
this.canvas.overlayImage = overlayImage;
|
|
525
|
+
}
|
|
526
|
+
} else if (this.inverted) {
|
|
527
|
+
var eraser = overlayImage && overlayImage.eraser;
|
|
528
|
+
if (eraser) {
|
|
529
|
+
overlayImage.eraser = undefined;
|
|
530
|
+
overlayImage.dirty = true;
|
|
531
|
+
}
|
|
460
532
|
__renderOverlay.call(this.canvas, patternCtx);
|
|
461
|
-
|
|
533
|
+
if (eraser) {
|
|
534
|
+
overlayImage.eraser = eraser;
|
|
535
|
+
overlayImage.dirty = true;
|
|
536
|
+
}
|
|
462
537
|
}
|
|
463
538
|
},
|
|
464
539
|
|
|
@@ -489,7 +564,10 @@
|
|
|
489
564
|
_saveAndTransform: function (ctx) {
|
|
490
565
|
this.callSuper('_saveAndTransform', ctx);
|
|
491
566
|
this._setBrushStyles(ctx);
|
|
492
|
-
ctx.globalCompositeOperation =
|
|
567
|
+
ctx.globalCompositeOperation =
|
|
568
|
+
ctx === this.canvas.getContext()
|
|
569
|
+
? 'destination-out'
|
|
570
|
+
: 'destination-in';
|
|
493
571
|
},
|
|
494
572
|
|
|
495
573
|
/**
|
|
@@ -502,7 +580,7 @@
|
|
|
502
580
|
|
|
503
581
|
/**
|
|
504
582
|
*
|
|
505
|
-
* @param {
|
|
583
|
+
* @param {Point} pointer
|
|
506
584
|
* @param {fabric.IEvent} options
|
|
507
585
|
* @returns
|
|
508
586
|
*/
|
|
@@ -527,24 +605,30 @@
|
|
|
527
605
|
* 1. Use brush to clip canvas by rendering it on top of canvas (unnecessary if `inverted === true`)
|
|
528
606
|
* 2. Render brush with canvas pattern on top context
|
|
529
607
|
*
|
|
608
|
+
* @todo provide a better solution to https://github.com/fabricjs/fabric.js/issues/7984
|
|
530
609
|
*/
|
|
531
610
|
_render: function () {
|
|
532
|
-
var ctx
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
611
|
+
var ctx,
|
|
612
|
+
lineWidth = this.width;
|
|
613
|
+
var t = this.canvas.getRetinaScaling(),
|
|
614
|
+
s = 1 / t;
|
|
615
|
+
// clip canvas
|
|
616
|
+
ctx = this.canvas.getContext();
|
|
617
|
+
// a hack that fixes https://github.com/fabricjs/fabric.js/issues/7984 by reducing path width
|
|
618
|
+
// the issue's cause is unknown at time of writing (@ShaMan123 06/2022)
|
|
619
|
+
if (lineWidth - this.erasingWidthAliasing > 0) {
|
|
620
|
+
this.width = lineWidth - this.erasingWidthAliasing;
|
|
536
621
|
this.callSuper('_render', ctx);
|
|
622
|
+
this.width = lineWidth;
|
|
537
623
|
}
|
|
538
|
-
// render brush and mask it with
|
|
624
|
+
// render brush and mask it with pattern
|
|
539
625
|
ctx = this.canvas.contextTop;
|
|
540
626
|
this.canvas.clearContext(ctx);
|
|
541
|
-
this.callSuper('_render', ctx);
|
|
542
627
|
ctx.save();
|
|
543
|
-
var t = this.canvas.getRetinaScaling(), s = 1 / t;
|
|
544
628
|
ctx.scale(s, s);
|
|
545
|
-
ctx.globalCompositeOperation = 'source-in';
|
|
546
629
|
ctx.drawImage(this._patternCanvas, 0, 0);
|
|
547
630
|
ctx.restore();
|
|
631
|
+
this.callSuper('_render', ctx);
|
|
548
632
|
},
|
|
549
633
|
|
|
550
634
|
/**
|
|
@@ -557,7 +641,9 @@
|
|
|
557
641
|
*/
|
|
558
642
|
createPath: function (pathData) {
|
|
559
643
|
var path = this.callSuper('createPath', pathData);
|
|
560
|
-
path.globalCompositeOperation = this.inverted
|
|
644
|
+
path.globalCompositeOperation = this.inverted
|
|
645
|
+
? 'source-over'
|
|
646
|
+
: 'destination-out';
|
|
561
647
|
path.stroke = this.inverted ? 'white' : 'black';
|
|
562
648
|
return path;
|
|
563
649
|
},
|
|
@@ -571,12 +657,18 @@
|
|
|
571
657
|
* @param {number[]} clipPathContainerTransformMatrix The transform matrix of the object that the clip path belongs to
|
|
572
658
|
* @returns {fabric.Path} path with clip path
|
|
573
659
|
*/
|
|
574
|
-
applyClipPathToPath: function (
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
660
|
+
applyClipPathToPath: function (
|
|
661
|
+
path,
|
|
662
|
+
clipPath,
|
|
663
|
+
clipPathContainerTransformMatrix
|
|
664
|
+
) {
|
|
665
|
+
var pathInvTransform = fabric.util.invertTransform(
|
|
666
|
+
path.calcTransformMatrix()
|
|
667
|
+
),
|
|
668
|
+
clipPathTransform = clipPath.calcTransformMatrix(),
|
|
669
|
+
transform = clipPath.absolutePositioned
|
|
670
|
+
? pathInvTransform
|
|
671
|
+
: fabric.util.multiplyTransformMatrices(
|
|
580
672
|
pathInvTransform,
|
|
581
673
|
clipPathContainerTransformMatrix
|
|
582
674
|
);
|
|
@@ -585,16 +677,15 @@
|
|
|
585
677
|
clipPath.absolutePositioned = false;
|
|
586
678
|
fabric.util.applyTransformToObject(
|
|
587
679
|
clipPath,
|
|
588
|
-
fabric.util.multiplyTransformMatrices(
|
|
589
|
-
transform,
|
|
590
|
-
clipPathTransform
|
|
591
|
-
)
|
|
680
|
+
fabric.util.multiplyTransformMatrices(transform, clipPathTransform)
|
|
592
681
|
);
|
|
593
682
|
// We need to clip `path` with both `clipPath` and it's own clip path if existing (`path.clipPath`)
|
|
594
683
|
// so in turn `path` erases an object only where it overlaps with all it's clip paths, regardless of how many there are.
|
|
595
684
|
// this is done because both clip paths may have nested clip paths of their own (this method walks down a collection => this may reccur),
|
|
596
685
|
// so we can't assign one to the other's clip path property.
|
|
597
|
-
path.clipPath = path.clipPath
|
|
686
|
+
path.clipPath = path.clipPath
|
|
687
|
+
? fabric.util.mergeClipPaths(clipPath, path.clipPath)
|
|
688
|
+
: clipPath;
|
|
598
689
|
return path;
|
|
599
690
|
},
|
|
600
691
|
|
|
@@ -604,27 +695,31 @@
|
|
|
604
695
|
* Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects.
|
|
605
696
|
* @param {fabric.Path} path The eraser path
|
|
606
697
|
* @param {fabric.Object} object The clipPath to apply to path belongs to object
|
|
607
|
-
* @
|
|
698
|
+
* @returns {Promise<fabric.Path>}
|
|
608
699
|
*/
|
|
609
|
-
clonePathWithClipPath: function (path, object
|
|
700
|
+
clonePathWithClipPath: function (path, object) {
|
|
610
701
|
var objTransform = object.calcTransformMatrix();
|
|
611
702
|
var clipPath = object.clipPath;
|
|
612
703
|
var _this = this;
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
704
|
+
return Promise.all([
|
|
705
|
+
path.clone(),
|
|
706
|
+
clipPath.clone(['absolutePositioned', 'inverted']),
|
|
707
|
+
]).then(function (clones) {
|
|
708
|
+
return _this.applyClipPathToPath(clones[0], clones[1], objTransform);
|
|
617
709
|
});
|
|
618
710
|
},
|
|
619
711
|
|
|
620
712
|
/**
|
|
621
713
|
* Adds path to object's eraser, walks down object's descendants if necessary
|
|
622
714
|
*
|
|
715
|
+
* @public
|
|
623
716
|
* @fires erasing:end on object
|
|
624
717
|
* @param {fabric.Object} obj
|
|
625
718
|
* @param {fabric.Path} path
|
|
719
|
+
* @param {Object} [context] context to assign erased objects to
|
|
720
|
+
* @returns {Promise<fabric.Path | fabric.Path[]>}
|
|
626
721
|
*/
|
|
627
|
-
_addPathToObjectEraser: function (obj, path) {
|
|
722
|
+
_addPathToObjectEraser: function (obj, path, context) {
|
|
628
723
|
var _this = this;
|
|
629
724
|
// object is collection, i.e group
|
|
630
725
|
if (obj.forEachObject && obj.erasable === 'deep') {
|
|
@@ -632,16 +727,19 @@
|
|
|
632
727
|
return _obj.erasable;
|
|
633
728
|
});
|
|
634
729
|
if (targets.length > 0 && obj.clipPath) {
|
|
635
|
-
this.clonePathWithClipPath(path, obj
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
else if (targets.length > 0) {
|
|
642
|
-
targets.forEach(function (_obj) {
|
|
643
|
-
_this._addPathToObjectEraser(_obj, path);
|
|
730
|
+
return this.clonePathWithClipPath(path, obj).then(function (_path) {
|
|
731
|
+
return Promise.all(
|
|
732
|
+
targets.map(function (_obj) {
|
|
733
|
+
return _this._addPathToObjectEraser(_obj, _path, context);
|
|
734
|
+
})
|
|
735
|
+
);
|
|
644
736
|
});
|
|
737
|
+
} else if (targets.length > 0) {
|
|
738
|
+
return Promise.all(
|
|
739
|
+
targets.map(function (_obj) {
|
|
740
|
+
return _this._addPathToObjectEraser(_obj, path, context);
|
|
741
|
+
})
|
|
742
|
+
);
|
|
645
743
|
}
|
|
646
744
|
return;
|
|
647
745
|
}
|
|
@@ -652,23 +750,23 @@
|
|
|
652
750
|
obj.eraser = eraser;
|
|
653
751
|
}
|
|
654
752
|
// clone and add path
|
|
655
|
-
path.clone(function (path) {
|
|
753
|
+
return path.clone().then(function (path) {
|
|
656
754
|
// http://fabricjs.com/using-transformations
|
|
657
755
|
var desiredTransform = fabric.util.multiplyTransformMatrices(
|
|
658
|
-
fabric.util.invertTransform(
|
|
659
|
-
obj.calcTransformMatrix()
|
|
660
|
-
),
|
|
756
|
+
fabric.util.invertTransform(obj.calcTransformMatrix()),
|
|
661
757
|
path.calcTransformMatrix()
|
|
662
758
|
);
|
|
663
759
|
fabric.util.applyTransformToObject(path, desiredTransform);
|
|
664
|
-
eraser.
|
|
760
|
+
eraser.add(path);
|
|
665
761
|
obj.set('dirty', true);
|
|
666
762
|
obj.fire('erasing:end', {
|
|
667
|
-
path: path
|
|
763
|
+
path: path,
|
|
668
764
|
});
|
|
669
|
-
if (
|
|
670
|
-
|
|
765
|
+
if (context) {
|
|
766
|
+
(obj.group ? context.subTargets : context.targets).push(obj);
|
|
767
|
+
//context.paths.set(obj, path);
|
|
671
768
|
}
|
|
769
|
+
return path;
|
|
672
770
|
});
|
|
673
771
|
},
|
|
674
772
|
|
|
@@ -677,22 +775,27 @@
|
|
|
677
775
|
*
|
|
678
776
|
* @param {fabric.Canvas} source
|
|
679
777
|
* @param {fabric.Canvas} path
|
|
680
|
-
* @
|
|
778
|
+
* @param {Object} [context] context to assign erased objects to
|
|
779
|
+
* @returns {Promise<fabric.Path[]|void>} eraser paths
|
|
681
780
|
*/
|
|
682
|
-
applyEraserToCanvas: function (path) {
|
|
781
|
+
applyEraserToCanvas: function (path, context) {
|
|
683
782
|
var canvas = this.canvas;
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
783
|
+
return Promise.all(
|
|
784
|
+
['backgroundImage', 'overlayImage'].map(function (prop) {
|
|
785
|
+
var drawable = canvas[prop];
|
|
786
|
+
return (
|
|
787
|
+
drawable &&
|
|
788
|
+
drawable.erasable &&
|
|
789
|
+
this._addPathToObjectEraser(drawable, path).then(function (path) {
|
|
790
|
+
if (context) {
|
|
791
|
+
context.drawables[prop] = drawable;
|
|
792
|
+
//context.paths.set(drawable, path);
|
|
793
|
+
}
|
|
794
|
+
return path;
|
|
795
|
+
})
|
|
796
|
+
);
|
|
797
|
+
}, this)
|
|
798
|
+
);
|
|
696
799
|
},
|
|
697
800
|
|
|
698
801
|
/**
|
|
@@ -701,7 +804,8 @@
|
|
|
701
804
|
* and add it to every intersected erasable object.
|
|
702
805
|
*/
|
|
703
806
|
_finalizeAndAddPath: function () {
|
|
704
|
-
var ctx = this.canvas.contextTop,
|
|
807
|
+
var ctx = this.canvas.contextTop,
|
|
808
|
+
canvas = this.canvas;
|
|
705
809
|
ctx.closePath();
|
|
706
810
|
if (this.decimate) {
|
|
707
811
|
this._points = this.decimatePoints(this._points, this.decimate);
|
|
@@ -711,9 +815,10 @@
|
|
|
711
815
|
canvas.clearContext(canvas.contextTop);
|
|
712
816
|
this._isErasing = false;
|
|
713
817
|
|
|
714
|
-
var pathData =
|
|
715
|
-
this.
|
|
716
|
-
|
|
818
|
+
var pathData =
|
|
819
|
+
this._points && this._points.length > 1
|
|
820
|
+
? this.convertPointsToSVGPath(this._points)
|
|
821
|
+
: null;
|
|
717
822
|
if (!pathData || this._isEmptySVGPath(pathData)) {
|
|
718
823
|
canvas.fire('erasing:end');
|
|
719
824
|
// do not create 0 width/height paths, as they are
|
|
@@ -731,33 +836,39 @@
|
|
|
731
836
|
canvas.fire('before:path:created', { path: path });
|
|
732
837
|
|
|
733
838
|
// finalize erasing
|
|
734
|
-
var drawables = this.applyEraserToCanvas(path);
|
|
735
839
|
var _this = this;
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
subTargets: this.__subTargets,
|
|
749
|
-
drawables: drawables
|
|
840
|
+
var context = {
|
|
841
|
+
targets: [],
|
|
842
|
+
subTargets: [],
|
|
843
|
+
//paths: new Map(),
|
|
844
|
+
drawables: {},
|
|
845
|
+
};
|
|
846
|
+
var tasks = canvas._objects.map(function (obj) {
|
|
847
|
+
return (
|
|
848
|
+
obj.erasable &&
|
|
849
|
+
obj.intersectsWithObject(path, true, true) &&
|
|
850
|
+
_this._addPathToObjectEraser(obj, path, context)
|
|
851
|
+
);
|
|
750
852
|
});
|
|
751
|
-
|
|
853
|
+
tasks.push(_this.applyEraserToCanvas(path, context));
|
|
854
|
+
return Promise.all(tasks).then(function () {
|
|
855
|
+
// fire erasing:end
|
|
856
|
+
canvas.fire(
|
|
857
|
+
'erasing:end',
|
|
858
|
+
Object.assign(context, {
|
|
859
|
+
path: path,
|
|
860
|
+
})
|
|
861
|
+
);
|
|
752
862
|
|
|
753
|
-
|
|
754
|
-
|
|
863
|
+
canvas.requestRenderAll();
|
|
864
|
+
_this._resetShadow();
|
|
755
865
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
866
|
+
// fire event 'path' created
|
|
867
|
+
canvas.fire('path:created', { path: path });
|
|
868
|
+
});
|
|
869
|
+
},
|
|
759
870
|
}
|
|
760
871
|
);
|
|
761
872
|
|
|
762
873
|
/** ERASER_END */
|
|
763
|
-
})();
|
|
874
|
+
})(typeof exports !== 'undefined' ? exports : window);
|