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,645 @@
|
|
|
1
|
+
import { Point } from '../../Point';
|
|
2
|
+
import type { AssertKeys, TCornerPoint, TDegree, TMat2D } from '../../typedefs';
|
|
3
|
+
import { FabricObject } from './Object';
|
|
4
|
+
import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
|
|
5
|
+
import {
|
|
6
|
+
calcRotateMatrix,
|
|
7
|
+
multiplyTransformMatrices,
|
|
8
|
+
qrDecompose,
|
|
9
|
+
TQrDecomposeOut,
|
|
10
|
+
} from '../../util/misc/matrix';
|
|
11
|
+
import type { Control } from '../../controls/Control';
|
|
12
|
+
import { sizeAfterTransform } from '../../util/misc/objectTransforms';
|
|
13
|
+
import { ObjectEvents, TPointerEvent } from '../../EventTypeDefs';
|
|
14
|
+
import type { Canvas } from '../../canvas/Canvas';
|
|
15
|
+
import type { ControlRenderingStyleOverride } from '../../controls/controls.render';
|
|
16
|
+
|
|
17
|
+
type TOCoord = Point & {
|
|
18
|
+
corner: TCornerPoint;
|
|
19
|
+
touchCorner: TCornerPoint;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type TControlSet = Record<string, Control>;
|
|
23
|
+
|
|
24
|
+
type TBorderRenderingStyleOverride = Partial<
|
|
25
|
+
Pick<FabricObject, 'borderColor' | 'borderDashArray'>
|
|
26
|
+
>;
|
|
27
|
+
|
|
28
|
+
type TStyleOverride = ControlRenderingStyleOverride &
|
|
29
|
+
TBorderRenderingStyleOverride &
|
|
30
|
+
Partial<
|
|
31
|
+
Pick<FabricObject, 'hasBorders' | 'hasControls'> & {
|
|
32
|
+
forActiveSelection: boolean;
|
|
33
|
+
}
|
|
34
|
+
>;
|
|
35
|
+
|
|
36
|
+
export interface DragMethods {
|
|
37
|
+
shouldStartDragging(): boolean;
|
|
38
|
+
onDragStart(e: DragEvent): boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type FabricObjectWithDragSupport = InteractiveFabricObject & DragMethods;
|
|
42
|
+
|
|
43
|
+
export class InteractiveFabricObject<
|
|
44
|
+
EventSpec extends ObjectEvents = ObjectEvents
|
|
45
|
+
> extends FabricObject<EventSpec> {
|
|
46
|
+
/**
|
|
47
|
+
* Describe object's corner position in canvas element coordinates.
|
|
48
|
+
* properties are depending on control keys and padding the main controls.
|
|
49
|
+
* each property is an object with x, y and corner.
|
|
50
|
+
* The `corner` property contains in a similar manner the 4 points of the
|
|
51
|
+
* interactive area of the corner.
|
|
52
|
+
* The coordinates depends from the controls positionHandler and are used
|
|
53
|
+
* to draw and locate controls
|
|
54
|
+
*/
|
|
55
|
+
declare oCoords: Record<string, TOCoord>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* When `true`, cache does not get updated during scaling. The picture will get blocky if scaled
|
|
59
|
+
* too much and will be redrawn with correct details at the end of scaling.
|
|
60
|
+
* this setting is performance and application dependant.
|
|
61
|
+
* default to true
|
|
62
|
+
* since 1.7.0
|
|
63
|
+
* @type Boolean
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
declare noScaleCache: boolean;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* keeps the value of the last hovered corner during mouse move.
|
|
70
|
+
* 0 is no corner, or 'mt', 'ml', 'mtr' etc..
|
|
71
|
+
* It should be private, but there is no harm in using it as
|
|
72
|
+
* a read-only property.
|
|
73
|
+
* this isn't cleaned automatically. Non selected objects may have wrong values
|
|
74
|
+
* @type [string]
|
|
75
|
+
*/
|
|
76
|
+
declare __corner?: string;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* a map of control visibility for this object.
|
|
80
|
+
* this was left when controls were introduced to not break the api too much
|
|
81
|
+
* this takes priority over the generic control visibility
|
|
82
|
+
*/
|
|
83
|
+
declare _controlsVisibility: Record<string, boolean>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The angle that an object will lock to while rotating.
|
|
87
|
+
* @type [TDegree]
|
|
88
|
+
*/
|
|
89
|
+
declare snapAngle?: TDegree;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The angle difference from the current snapped angle in which snapping should occur.
|
|
93
|
+
* When undefined, the snapThreshold will default to the snapAngle.
|
|
94
|
+
* @type [TDegree]
|
|
95
|
+
*/
|
|
96
|
+
declare snapThreshold?: TDegree;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* holds the controls for the object.
|
|
100
|
+
* controls are added by default_controls.js
|
|
101
|
+
*/
|
|
102
|
+
declare controls: TControlSet;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* internal boolean to signal the code that the object is
|
|
106
|
+
* part of the move action.
|
|
107
|
+
*/
|
|
108
|
+
declare isMoving?: boolean;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* A boolean used from the gesture module to keep tracking of a scaling
|
|
112
|
+
* action when there is no scaling transform in place.
|
|
113
|
+
* This is an edge case and is used twice in all codebase.
|
|
114
|
+
* Probably added to keep track of some performance issues
|
|
115
|
+
* @TODO use git blame to investigate why it was added
|
|
116
|
+
* DON'T USE IT. WE WILL TRY TO REMOVE IT
|
|
117
|
+
*/
|
|
118
|
+
declare _scaling?: boolean;
|
|
119
|
+
|
|
120
|
+
declare canvas?: Canvas;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Constructor
|
|
124
|
+
* @param {Object} [options] Options object
|
|
125
|
+
*/
|
|
126
|
+
constructor(options?: Record<string, unknown>) {
|
|
127
|
+
super(options);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Update width and height of the canvas for cache
|
|
132
|
+
* returns true or false if canvas needed resize.
|
|
133
|
+
* @private
|
|
134
|
+
* @return {Boolean} true if the canvas has been resized
|
|
135
|
+
*/
|
|
136
|
+
_updateCacheCanvas() {
|
|
137
|
+
const targetCanvas = this.canvas;
|
|
138
|
+
if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {
|
|
139
|
+
const target = targetCanvas._currentTransform.target,
|
|
140
|
+
action = targetCanvas._currentTransform.action;
|
|
141
|
+
if (
|
|
142
|
+
this === (target as InteractiveFabricObject) &&
|
|
143
|
+
action.startsWith('scale')
|
|
144
|
+
) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return super._updateCacheCanvas();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Determines which corner has been clicked
|
|
153
|
+
* @private
|
|
154
|
+
* @param {Object} pointer The pointer indicating the mouse position
|
|
155
|
+
* @param {boolean} forTouch indicates if we are looking for interaction area with a touch action
|
|
156
|
+
* @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found
|
|
157
|
+
*/
|
|
158
|
+
_findTargetCorner(pointer: Point, forTouch = false): 0 | string {
|
|
159
|
+
if (
|
|
160
|
+
!this.hasControls ||
|
|
161
|
+
!this.canvas ||
|
|
162
|
+
(this.canvas._activeObject as InteractiveFabricObject) !== this
|
|
163
|
+
) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
this.__corner = undefined;
|
|
168
|
+
// had to keep the reverse loop because was breaking tests
|
|
169
|
+
const cornerEntries = Object.entries(this.oCoords);
|
|
170
|
+
for (let i = cornerEntries.length - 1; i >= 0; i--) {
|
|
171
|
+
const [cornerKey, corner] = cornerEntries[i];
|
|
172
|
+
if (!this.isControlVisible(cornerKey)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const lines = this._getImageLines(
|
|
176
|
+
forTouch ? corner.touchCorner : corner.corner
|
|
177
|
+
);
|
|
178
|
+
const xPoints = this._findCrossPoints(pointer, lines);
|
|
179
|
+
if (xPoints !== 0 && xPoints % 2 === 1) {
|
|
180
|
+
this.__corner = cornerKey;
|
|
181
|
+
return cornerKey;
|
|
182
|
+
}
|
|
183
|
+
// // debugging
|
|
184
|
+
//
|
|
185
|
+
// this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
|
|
186
|
+
// this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
|
|
187
|
+
//
|
|
188
|
+
// this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
|
|
189
|
+
// this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
|
|
190
|
+
//
|
|
191
|
+
// this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
|
|
192
|
+
// this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
|
|
193
|
+
//
|
|
194
|
+
// this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
|
|
195
|
+
// this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
|
|
196
|
+
}
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Calculates the coordinates of the center of each control plus the corners of the control itself
|
|
202
|
+
* This basically just delegates to each control positionHandler
|
|
203
|
+
* WARNING: changing what is passed to positionHandler is a breaking change, since position handler
|
|
204
|
+
* is a public api and should be done just if extremely necessary
|
|
205
|
+
* @return {Record<string, TOCoord>}
|
|
206
|
+
*/
|
|
207
|
+
calcOCoords(): Record<string, TOCoord> {
|
|
208
|
+
const vpt = this.getViewportTransform(),
|
|
209
|
+
center = this.getCenterPoint(),
|
|
210
|
+
tMatrix = [1, 0, 0, 1, center.x, center.y] as TMat2D,
|
|
211
|
+
rMatrix = calcRotateMatrix({
|
|
212
|
+
angle: this.getTotalAngle() - (!!this.group && this.flipX ? 180 : 0),
|
|
213
|
+
}),
|
|
214
|
+
positionMatrix = multiplyTransformMatrices(tMatrix, rMatrix),
|
|
215
|
+
startMatrix = multiplyTransformMatrices(vpt, positionMatrix),
|
|
216
|
+
finalMatrix = multiplyTransformMatrices(startMatrix, [
|
|
217
|
+
1 / vpt[0],
|
|
218
|
+
0,
|
|
219
|
+
0,
|
|
220
|
+
1 / vpt[3],
|
|
221
|
+
0,
|
|
222
|
+
0,
|
|
223
|
+
]),
|
|
224
|
+
transformOptions = this.group
|
|
225
|
+
? qrDecompose(this.calcTransformMatrix())
|
|
226
|
+
: undefined,
|
|
227
|
+
dim = this._calculateCurrentDimensions(transformOptions),
|
|
228
|
+
coords: Record<string, TOCoord> = {};
|
|
229
|
+
|
|
230
|
+
this.forEachControl((control, key) => {
|
|
231
|
+
const position = control.positionHandler(dim, finalMatrix, this, control);
|
|
232
|
+
// coords[key] are sometimes used as points. Those are points to which we add
|
|
233
|
+
// the property corner and touchCorner from `_calcCornerCoords`.
|
|
234
|
+
// don't remove this assign for an object spread.
|
|
235
|
+
coords[key] = Object.assign(
|
|
236
|
+
position,
|
|
237
|
+
this._calcCornerCoords(control, position)
|
|
238
|
+
);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// debug code
|
|
242
|
+
/*
|
|
243
|
+
const canvas = this.canvas;
|
|
244
|
+
setTimeout(function () {
|
|
245
|
+
if (!canvas) return;
|
|
246
|
+
canvas.contextTop.clearRect(0, 0, 700, 700);
|
|
247
|
+
canvas.contextTop.fillStyle = 'green';
|
|
248
|
+
Object.keys(coords).forEach(function(key) {
|
|
249
|
+
const control = coords[key];
|
|
250
|
+
canvas.contextTop.fillRect(control.x, control.y, 3, 3);
|
|
251
|
+
});
|
|
252
|
+
} 50);
|
|
253
|
+
*/
|
|
254
|
+
return coords;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Sets the coordinates that determine the interaction area of each control
|
|
259
|
+
* note: if we would switch to ROUND corner area, all of this would disappear.
|
|
260
|
+
* everything would resolve to a single point and a pythagorean theorem for the distance
|
|
261
|
+
* @todo evaluate simplification of code switching to circle interaction area at runtime
|
|
262
|
+
* @private
|
|
263
|
+
*/
|
|
264
|
+
private _calcCornerCoords(control: Control, position: Point) {
|
|
265
|
+
const corner = control.calcCornerCoords(
|
|
266
|
+
this.angle,
|
|
267
|
+
this.cornerSize,
|
|
268
|
+
position.x,
|
|
269
|
+
position.y,
|
|
270
|
+
false
|
|
271
|
+
);
|
|
272
|
+
const touchCorner = control.calcCornerCoords(
|
|
273
|
+
this.angle,
|
|
274
|
+
this.touchCornerSize,
|
|
275
|
+
position.x,
|
|
276
|
+
position.y,
|
|
277
|
+
true
|
|
278
|
+
);
|
|
279
|
+
return { corner, touchCorner };
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Sets corner and controls position coordinates based on current angle, width and height, left and top.
|
|
284
|
+
* oCoords are used to find the corners
|
|
285
|
+
* aCoords are used to quickly find an object on the canvas
|
|
286
|
+
* lineCoords are used to quickly find object during pointer events.
|
|
287
|
+
* See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
|
|
288
|
+
* @return {void}
|
|
289
|
+
*/
|
|
290
|
+
setCoords(): void {
|
|
291
|
+
super.setCoords();
|
|
292
|
+
// set coordinates of the draggable boxes in the corners used to scale/rotate the image
|
|
293
|
+
this.oCoords = this.calcOCoords();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Calls a function for each control. The function gets called,
|
|
298
|
+
* with the control, the control's key and the object that is calling the iterator
|
|
299
|
+
* @param {Function} fn function to iterate over the controls over
|
|
300
|
+
*/
|
|
301
|
+
forEachControl(
|
|
302
|
+
fn: (
|
|
303
|
+
control: Control,
|
|
304
|
+
key: string,
|
|
305
|
+
fabricObject: InteractiveFabricObject
|
|
306
|
+
) => any
|
|
307
|
+
) {
|
|
308
|
+
for (const i in this.controls) {
|
|
309
|
+
fn(this.controls[i], i, this);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Draws a colored layer behind the object, inside its selection borders.
|
|
315
|
+
* Requires public options: padding, selectionBackgroundColor
|
|
316
|
+
* this function is called when the context is transformed
|
|
317
|
+
* has checks to be skipped when the object is on a staticCanvas
|
|
318
|
+
* @todo evaluate if make this disappear in favor of a pre-render hook for objects
|
|
319
|
+
* this was added by Andrea Bogazzi to make possible some feature for work reasons
|
|
320
|
+
* it seemed a good option, now is an edge case
|
|
321
|
+
* @param {CanvasRenderingContext2D} ctx Context to draw on
|
|
322
|
+
*/
|
|
323
|
+
drawSelectionBackground(ctx: CanvasRenderingContext2D): void {
|
|
324
|
+
if (
|
|
325
|
+
!this.selectionBackgroundColor ||
|
|
326
|
+
(this.canvas && !this.canvas.interactive) ||
|
|
327
|
+
(this.canvas &&
|
|
328
|
+
(this.canvas._activeObject as InteractiveFabricObject) !== this)
|
|
329
|
+
) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
ctx.save();
|
|
333
|
+
const center = this.getRelativeCenterPoint(),
|
|
334
|
+
wh = this._calculateCurrentDimensions(),
|
|
335
|
+
vpt = this.getViewportTransform();
|
|
336
|
+
ctx.translate(center.x, center.y);
|
|
337
|
+
ctx.scale(1 / vpt[0], 1 / vpt[3]);
|
|
338
|
+
ctx.rotate(degreesToRadians(this.angle));
|
|
339
|
+
ctx.fillStyle = this.selectionBackgroundColor;
|
|
340
|
+
ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);
|
|
341
|
+
ctx.restore();
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* @public override this function in order to customize the drawing of the control box, e.g. rounded corners, different border style.
|
|
346
|
+
* @param {CanvasRenderingContext2D} ctx ctx is rotated and translated so that (0,0) is at object's center
|
|
347
|
+
* @param {Point} size the control box size used
|
|
348
|
+
*/
|
|
349
|
+
strokeBorders(ctx: CanvasRenderingContext2D, size: Point): void {
|
|
350
|
+
ctx.strokeRect(-size.x / 2, -size.y / 2, size.x, size.y);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* @private
|
|
355
|
+
* @param {CanvasRenderingContext2D} ctx Context to draw on
|
|
356
|
+
* @param {Point} size
|
|
357
|
+
* @param {TStyleOverride} styleOverride object to override the object style
|
|
358
|
+
*/
|
|
359
|
+
_drawBorders(
|
|
360
|
+
ctx: CanvasRenderingContext2D,
|
|
361
|
+
size: Point,
|
|
362
|
+
styleOverride: TStyleOverride = {}
|
|
363
|
+
): void {
|
|
364
|
+
const options = {
|
|
365
|
+
hasControls: this.hasControls,
|
|
366
|
+
borderColor: this.borderColor,
|
|
367
|
+
borderDashArray: this.borderDashArray,
|
|
368
|
+
...styleOverride,
|
|
369
|
+
};
|
|
370
|
+
ctx.save();
|
|
371
|
+
ctx.strokeStyle = options.borderColor;
|
|
372
|
+
this._setLineDash(ctx, options.borderDashArray);
|
|
373
|
+
this.strokeBorders(ctx, size);
|
|
374
|
+
options.hasControls && this.drawControlsConnectingLines(ctx, size);
|
|
375
|
+
ctx.restore();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Renders controls and borders for the object
|
|
380
|
+
* the context here is not transformed
|
|
381
|
+
* @todo move to interactivity
|
|
382
|
+
* @param {CanvasRenderingContext2D} ctx Context to render on
|
|
383
|
+
* @param {TStyleOverride} [styleOverride] properties to override the object style
|
|
384
|
+
*/
|
|
385
|
+
_renderControls(
|
|
386
|
+
ctx: CanvasRenderingContext2D,
|
|
387
|
+
styleOverride: TStyleOverride = {}
|
|
388
|
+
) {
|
|
389
|
+
const { hasBorders, hasControls } = this;
|
|
390
|
+
const styleOptions = {
|
|
391
|
+
hasBorders,
|
|
392
|
+
hasControls,
|
|
393
|
+
...styleOverride,
|
|
394
|
+
};
|
|
395
|
+
const vpt = this.getViewportTransform(),
|
|
396
|
+
shouldDrawBorders = styleOptions.hasBorders,
|
|
397
|
+
shouldDrawControls = styleOptions.hasControls;
|
|
398
|
+
const matrix = multiplyTransformMatrices(vpt, this.calcTransformMatrix());
|
|
399
|
+
const options = qrDecompose(matrix);
|
|
400
|
+
ctx.save();
|
|
401
|
+
ctx.translate(options.translateX, options.translateY);
|
|
402
|
+
ctx.lineWidth = 1 * this.borderScaleFactor;
|
|
403
|
+
if (!this.group) {
|
|
404
|
+
ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;
|
|
405
|
+
}
|
|
406
|
+
if (this.flipX) {
|
|
407
|
+
options.angle -= 180;
|
|
408
|
+
}
|
|
409
|
+
ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));
|
|
410
|
+
shouldDrawBorders && this.drawBorders(ctx, options, styleOverride);
|
|
411
|
+
shouldDrawControls && this.drawControls(ctx, styleOverride);
|
|
412
|
+
ctx.restore();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Draws borders of an object's bounding box.
|
|
417
|
+
* Requires public properties: width, height
|
|
418
|
+
* Requires public options: padding, borderColor
|
|
419
|
+
* @param {CanvasRenderingContext2D} ctx Context to draw on
|
|
420
|
+
* @param {object} options object representing current object parameters
|
|
421
|
+
* @param {TStyleOverride} [styleOverride] object to override the object style
|
|
422
|
+
*/
|
|
423
|
+
drawBorders(
|
|
424
|
+
ctx: CanvasRenderingContext2D,
|
|
425
|
+
options: TQrDecomposeOut,
|
|
426
|
+
styleOverride: TStyleOverride
|
|
427
|
+
): void {
|
|
428
|
+
let size;
|
|
429
|
+
if ((styleOverride && styleOverride.forActiveSelection) || this.group) {
|
|
430
|
+
const bbox = sizeAfterTransform(this.width, this.height, options),
|
|
431
|
+
stroke = (
|
|
432
|
+
this.strokeUniform
|
|
433
|
+
? new Point().scalarAdd(this.canvas ? this.canvas.getZoom() : 1)
|
|
434
|
+
: // this is extremely confusing. options comes from the upper function
|
|
435
|
+
// and is the qrDecompose of a matrix that takes in account zoom too
|
|
436
|
+
new Point(options.scaleX, options.scaleY)
|
|
437
|
+
).scalarMultiply(this.strokeWidth);
|
|
438
|
+
size = bbox.add(stroke).scalarAdd(this.borderScaleFactor);
|
|
439
|
+
} else {
|
|
440
|
+
size = this._calculateCurrentDimensions().scalarAdd(
|
|
441
|
+
this.borderScaleFactor
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
this._drawBorders(ctx, size, styleOverride);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Draws lines from a borders of an object's bounding box to controls that have `withConnection` property set.
|
|
449
|
+
* Requires public properties: width, height
|
|
450
|
+
* Requires public options: padding, borderColor
|
|
451
|
+
* @param {CanvasRenderingContext2D} ctx Context to draw on
|
|
452
|
+
* @param {Point} size object size x = width, y = height
|
|
453
|
+
*/
|
|
454
|
+
drawControlsConnectingLines(
|
|
455
|
+
ctx: CanvasRenderingContext2D,
|
|
456
|
+
size: Point
|
|
457
|
+
): void {
|
|
458
|
+
let shouldStroke = false;
|
|
459
|
+
|
|
460
|
+
ctx.beginPath();
|
|
461
|
+
this.forEachControl((control, key) => {
|
|
462
|
+
// in this moment, the ctx is centered on the object.
|
|
463
|
+
// width and height of the above function are the size of the bbox.
|
|
464
|
+
if (control.withConnection && control.getVisibility(this, key)) {
|
|
465
|
+
// reset movement for each control
|
|
466
|
+
shouldStroke = true;
|
|
467
|
+
ctx.moveTo(control.x * size.x, control.y * size.y);
|
|
468
|
+
ctx.lineTo(
|
|
469
|
+
control.x * size.x + control.offsetX,
|
|
470
|
+
control.y * size.y + control.offsetY
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
shouldStroke && ctx.stroke();
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Draws corners of an object's bounding box.
|
|
479
|
+
* Requires public properties: width, height
|
|
480
|
+
* Requires public options: cornerSize, padding
|
|
481
|
+
* @param {CanvasRenderingContext2D} ctx Context to draw on
|
|
482
|
+
* @param {ControlRenderingStyleOverride} styleOverride object to override the object style
|
|
483
|
+
*/
|
|
484
|
+
drawControls(
|
|
485
|
+
ctx: CanvasRenderingContext2D,
|
|
486
|
+
styleOverride: ControlRenderingStyleOverride = {}
|
|
487
|
+
) {
|
|
488
|
+
ctx.save();
|
|
489
|
+
const retinaScaling = this.getCanvasRetinaScaling();
|
|
490
|
+
const { cornerStrokeColor, cornerDashArray, cornerColor } = this;
|
|
491
|
+
const options = {
|
|
492
|
+
cornerStrokeColor,
|
|
493
|
+
cornerDashArray,
|
|
494
|
+
cornerColor,
|
|
495
|
+
...styleOverride,
|
|
496
|
+
};
|
|
497
|
+
ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);
|
|
498
|
+
ctx.strokeStyle = ctx.fillStyle = options.cornerColor;
|
|
499
|
+
if (!this.transparentCorners) {
|
|
500
|
+
ctx.strokeStyle = options.cornerStrokeColor;
|
|
501
|
+
}
|
|
502
|
+
this._setLineDash(ctx, options.cornerDashArray);
|
|
503
|
+
this.setCoords();
|
|
504
|
+
this.forEachControl((control, key) => {
|
|
505
|
+
if (control.getVisibility(this, key)) {
|
|
506
|
+
const p = this.oCoords[key];
|
|
507
|
+
control.render(ctx, p.x, p.y, options, this);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
ctx.restore();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Returns true if the specified control is visible, false otherwise.
|
|
515
|
+
* @param {string} controlKey The key of the control. Possible values are usually 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr',
|
|
516
|
+
* but since the control api allow for any control name, can be any string.
|
|
517
|
+
* @returns {boolean} true if the specified control is visible, false otherwise
|
|
518
|
+
*/
|
|
519
|
+
isControlVisible(controlKey: string): boolean {
|
|
520
|
+
return (
|
|
521
|
+
this.controls[controlKey] &&
|
|
522
|
+
this.controls[controlKey].getVisibility(this, controlKey)
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Sets the visibility of the specified control.
|
|
528
|
+
* please do not use.
|
|
529
|
+
* @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.
|
|
530
|
+
* but since the control api allow for any control name, can be any string.
|
|
531
|
+
* @param {Boolean} visible true to set the specified control visible, false otherwise
|
|
532
|
+
* @todo discuss this overlap of priority here with the team. Andrea Bogazzi for details
|
|
533
|
+
*/
|
|
534
|
+
setControlVisible(controlKey: string, visible: boolean) {
|
|
535
|
+
if (!this._controlsVisibility) {
|
|
536
|
+
this._controlsVisibility = {};
|
|
537
|
+
}
|
|
538
|
+
this._controlsVisibility[controlKey] = visible;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Sets the visibility state of object controls, this is just a bulk option for setControlVisible;
|
|
543
|
+
* @param {Record<string, boolean>} [options] with an optional key per control
|
|
544
|
+
* example: {Boolean} [options.bl] true to enable the bottom-left control, false to disable it
|
|
545
|
+
*/
|
|
546
|
+
setControlsVisibility(options: Record<string, boolean> = {}) {
|
|
547
|
+
Object.entries(options).forEach(([controlKey, visibility]) =>
|
|
548
|
+
this.setControlVisible(controlKey, visibility)
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Clears the canvas.contextTop in a specific area that corresponds to the object's bounding box
|
|
554
|
+
* that is in the canvas.contextContainer.
|
|
555
|
+
* This function is used to clear pieces of contextTop where we render ephemeral effects on top of the object.
|
|
556
|
+
* Example: blinking cursor text selection, drag effects.
|
|
557
|
+
* @todo discuss swapping restoreManually with a renderCallback, but think of async issues
|
|
558
|
+
* @param {Boolean} [restoreManually] When true won't restore the context after clear, in order to draw something else.
|
|
559
|
+
* @return {CanvasRenderingContext2D|undefined} canvas.contextTop that is either still transformed
|
|
560
|
+
* with the object transformMatrix, or restored to neutral transform
|
|
561
|
+
*/
|
|
562
|
+
clearContextTop(
|
|
563
|
+
restoreManually?: boolean
|
|
564
|
+
): CanvasRenderingContext2D | undefined {
|
|
565
|
+
if (!this.canvas) {
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
const ctx = this.canvas.contextTop;
|
|
569
|
+
if (!ctx) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
const v = this.canvas.viewportTransform;
|
|
573
|
+
ctx.save();
|
|
574
|
+
ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);
|
|
575
|
+
this.transform(ctx);
|
|
576
|
+
// we add 4 pixel, to be sure to do not leave any pixel out
|
|
577
|
+
const width = this.width + 4,
|
|
578
|
+
height = this.height + 4;
|
|
579
|
+
ctx.clearRect(-width / 2, -height / 2, width, height);
|
|
580
|
+
|
|
581
|
+
restoreManually || ctx.restore();
|
|
582
|
+
return ctx;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* This callback function is called every time _discardActiveObject or _setActiveObject
|
|
587
|
+
* try to to deselect this object. If the function returns true, the process is cancelled
|
|
588
|
+
* @param {Object} [options] options sent from the upper functions
|
|
589
|
+
* @param {TPointerEvent} [options.e] event if the process is generated by an event
|
|
590
|
+
* @param {FabricObject} [options.object] next object we are setting as active, and reason why
|
|
591
|
+
* this is being deselected
|
|
592
|
+
|
|
593
|
+
*/
|
|
594
|
+
onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }): boolean {
|
|
595
|
+
// implemented by sub-classes, as needed.
|
|
596
|
+
return false;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* This callback function is called every time _discardActiveObject or _setActiveObject
|
|
601
|
+
* try to to select this object. If the function returns true, the process is cancelled
|
|
602
|
+
* @param {Object} [options] options sent from the upper functions
|
|
603
|
+
* @param {Event} [options.e] event if the process is generated by an event
|
|
604
|
+
*/
|
|
605
|
+
onSelect(options?: { e?: TPointerEvent }): boolean {
|
|
606
|
+
// implemented by sub-classes, as needed.
|
|
607
|
+
return false;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Override to customize drag and drop behavior
|
|
612
|
+
* return true if the object currently dragged can be dropped on the target
|
|
613
|
+
* @public
|
|
614
|
+
* @param {DragEvent} e
|
|
615
|
+
* @returns {boolean}
|
|
616
|
+
*/
|
|
617
|
+
canDrop(e: DragEvent): boolean {
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Override to customize drag and drop behavior
|
|
623
|
+
* render a specific effect when an object is the source of a drag event
|
|
624
|
+
* example: render the selection status for the part of text that is being dragged from a text object
|
|
625
|
+
* @public
|
|
626
|
+
* @param {DragEvent} e
|
|
627
|
+
* @returns {boolean}
|
|
628
|
+
*/
|
|
629
|
+
renderDragSourceEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
|
|
630
|
+
// for subclasses
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* Override to customize drag and drop behavior
|
|
635
|
+
* render a specific effect when an object is the target of a drag event
|
|
636
|
+
* used to show that the underly object can receive a drop, or to show how the
|
|
637
|
+
* object will change when dropping. example: show the cursor where the text is about to be dropped
|
|
638
|
+
* @public
|
|
639
|
+
* @param {DragEvent} e
|
|
640
|
+
* @returns {boolean}
|
|
641
|
+
*/
|
|
642
|
+
renderDropTargetEffect(this: AssertKeys<this, 'canvas'>, e: DragEvent) {
|
|
643
|
+
// for subclasses
|
|
644
|
+
}
|
|
645
|
+
}
|