fabric 5.3.0 → 6.0.0-beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +43 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.gitpod.yml +17 -1
- package/.prettierignore +19 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +532 -189
- package/CONTRIBUTING.md +224 -59
- package/README.md +200 -235
- package/bower.json +1 -3
- package/dist/fabric.d.ts +42 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +27582 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +27519 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +27663 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +14 -0
- package/dist/index.node.mjs +27606 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/ClassRegistry.d.ts +13 -0
- package/dist/src/Collection.d.ts +136 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +227 -0
- package/dist/src/Intersection.d.ts +112 -0
- package/dist/src/Observable.d.ts +60 -0
- package/dist/src/Pattern.d.ts +113 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +97 -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 +47 -0
- package/dist/src/canvas/Canvas.d.ts +548 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
- package/dist/src/canvas/StaticCanvas.d.ts +778 -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/commonControls.d.ts +28 -0
- package/dist/src/controls/controlRendering.d.ts +29 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/index.d.ts +13 -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 +15 -0
- package/dist/src/env/node.d.ts +5 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +153 -0
- package/dist/src/filters/BlendColor.d.ts +80 -0
- package/dist/src/filters/BlendImage.d.ts +92 -0
- package/dist/src/filters/Blur.d.ts +51 -0
- package/dist/src/filters/Boilerplate.d.ts +48 -0
- package/dist/src/filters/Brightness.d.ts +47 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +63 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
- package/dist/src/filters/Composed.d.ts +45 -0
- package/dist/src/filters/Contrast.d.ts +45 -0
- package/dist/src/filters/Convolute.d.ts +82 -0
- package/dist/src/filters/FilterBackend.d.ts +14 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist/src/filters/Gamma.d.ts +54 -0
- package/dist/src/filters/Grayscale.d.ts +46 -0
- package/dist/src/filters/HueRotation.d.ts +24 -0
- package/dist/src/filters/Invert.d.ts +55 -0
- package/dist/src/filters/Noise.d.ts +54 -0
- package/dist/src/filters/Pixelate.d.ts +44 -0
- package/dist/src/filters/RemoveColor.d.ts +63 -0
- package/dist/src/filters/Resize.d.ts +136 -0
- package/dist/src/filters/Saturation.d.ts +48 -0
- package/dist/src/filters/Vibrance.d.ts +48 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
- package/dist/src/filters/filters.d.ts +21 -0
- package/dist/src/filters/index.d.ts +5 -0
- package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist/src/filters/shaders/blendImage.d.ts +3 -0
- package/dist/src/filters/shaders/blur.d.ts +2 -0
- package/dist/src/filters/shaders/brightness.d.ts +2 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist/src/filters/shaders/constrast.d.ts +2 -0
- package/dist/src/filters/shaders/convolute.d.ts +11 -0
- package/dist/src/filters/shaders/gamma.d.ts +2 -0
- package/dist/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist/src/filters/shaders/invert.d.ts +2 -0
- package/dist/src/filters/shaders/noise.d.ts +2 -0
- package/dist/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist/src/filters/shaders/saturation.d.ts +2 -0
- package/dist/src/filters/shaders/vibrance.d.ts +2 -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 +3 -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/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 +53 -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/index.d.ts +10 -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 +82 -0
- package/dist/src/shapes/Circle.d.ts +99 -0
- package/dist/src/shapes/Ellipse.d.ts +84 -0
- package/dist/src/shapes/Group.d.ts +408 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +335 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +311 -0
- package/dist/src/shapes/Line.d.ts +126 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
- package/dist/src/shapes/Object/Object.d.ts +594 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist/src/shapes/Object/types/index.d.ts +6 -0
- package/dist/src/shapes/Path.d.ts +130 -0
- package/dist/src/shapes/Polygon.d.ts +9 -0
- package/dist/src/shapes/Polyline.d.ts +140 -0
- package/dist/src/shapes/Rect.d.ts +76 -0
- package/dist/src/shapes/Text/StyledText.d.ts +119 -0
- package/dist/src/shapes/Text/Text.d.ts +673 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Text/constants.d.ts +7 -0
- package/dist/src/shapes/Textbox.d.ts +185 -0
- package/dist/src/shapes/Triangle.d.ts +25 -0
- package/dist/src/typedefs.d.ts +90 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -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/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +39 -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/index.d.ts +35 -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_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 +9 -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/index.d.ts +96 -0
- package/dist/src/util/path/regex.d.ts +3 -0
- package/dist/src/util/path/typechecks.d.ts +24 -0
- package/dist/src/util/path/typedefs.d.ts +220 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/types.d.ts +19 -0
- package/fabric.ts +51 -0
- package/index.node.ts +37 -0
- package/index.ts +1 -0
- package/package.json +100 -40
- package/publish.js +0 -26
- package/rollup.config.mjs +91 -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/git.mjs +36 -0
- package/scripts/index.mjs +564 -0
- package/scripts/sandbox.mjs +149 -0
- package/src/ClassRegistry.ts +56 -0
- package/src/Collection.ts +346 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +296 -0
- package/src/Intersection.ts +302 -0
- package/src/Observable.ts +181 -0
- package/src/Pattern.ts +227 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +214 -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 +90 -0
- package/src/canvas/Canvas.ts +1607 -0
- package/src/canvas/SelectableCanvas.ts +1608 -0
- package/src/canvas/StaticCanvas.ts +1734 -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 +20 -0
- package/src/controls/Control.ts +380 -0
- package/src/controls/changeWidth.ts +52 -0
- package/src/controls/commonControls.ts +105 -0
- package/src/controls/controlRendering.ts +138 -0
- package/src/controls/drag.ts +31 -0
- package/src/controls/index.ts +22 -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 +32 -0
- package/src/env/index.ts +24 -0
- package/src/env/node.ts +56 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
- package/src/filters/BlendColor.ts +217 -0
- package/src/filters/BlendImage.ts +228 -0
- package/src/filters/Blur.ts +179 -0
- package/src/filters/Boilerplate.ts +94 -0
- package/src/filters/Brightness.ts +83 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +145 -0
- package/src/filters/ColorMatrixFilters.ts +77 -0
- package/src/filters/Composed.ts +76 -0
- package/src/filters/Contrast.ts +82 -0
- package/src/filters/Convolute.ts +184 -0
- package/src/filters/FilterBackend.ts +34 -0
- package/src/filters/GLProbes/GLProbe.ts +11 -0
- package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
- package/src/filters/GLProbes/WebGLProbe.ts +46 -0
- package/src/filters/Gamma.ts +110 -0
- package/src/filters/Grayscale.ts +102 -0
- package/src/filters/HueRotation.ts +62 -0
- package/src/filters/Invert.ts +99 -0
- package/src/filters/Noise.ts +94 -0
- package/src/filters/Pixelate.ts +96 -0
- package/src/filters/RemoveColor.ts +135 -0
- package/src/filters/Resize.ts +538 -0
- package/src/filters/Saturation.ts +87 -0
- package/src/filters/Vibrance.ts +88 -0
- package/src/filters/WebGLFilterBackend.ts +430 -0
- package/src/filters/filters.ts +28 -0
- package/src/filters/index.ts +5 -0
- package/src/filters/shaders/baseFilter.ts +19 -0
- package/src/filters/shaders/blendColor.ts +33 -0
- package/src/filters/shaders/blendImage.ts +32 -0
- package/src/filters/shaders/blur.ts +24 -0
- package/src/filters/shaders/brightness.ts +11 -0
- package/src/filters/shaders/colorMatrix.ts +12 -0
- package/src/filters/shaders/constrast.ts +11 -0
- package/src/filters/shaders/convolute.ts +154 -0
- package/src/filters/shaders/gamma.ts +15 -0
- package/src/filters/shaders/grayscale.ts +36 -0
- package/src/filters/shaders/invert.ts +19 -0
- package/src/filters/shaders/noise.ts +16 -0
- package/src/filters/shaders/pixelate.ts +19 -0
- package/src/filters/shaders/removeColor.ts +13 -0
- package/src/filters/shaders/saturation.ts +15 -0
- package/src/filters/shaders/vibrance.ts +16 -0
- package/src/filters/typedefs.ts +65 -0
- package/src/gradient/Gradient.ts +406 -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 +56 -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/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +157 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +115 -0
- package/src/parser/doesSomeParentMatch.ts +19 -0
- package/src/parser/elementById.ts +21 -0
- package/src/parser/elementMatchesRule.ts +16 -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 +31 -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/index.ts +9 -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 +34 -0
- package/src/parser/parseSVGDocument.ts +93 -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 +78 -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 +189 -0
- package/src/shapes/Circle.ts +242 -0
- package/src/shapes/Ellipse.ts +179 -0
- package/src/shapes/Group.ts +1100 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
- package/src/shapes/IText/IText.ts +693 -0
- package/src/shapes/IText/ITextBehavior.ts +1064 -0
- package/src/shapes/IText/ITextClickBehavior.ts +325 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
- package/src/shapes/IText/constants.ts +47 -0
- package/src/shapes/Image.ts +841 -0
- package/src/shapes/Line.ts +346 -0
- package/src/shapes/Object/AnimatableObject.ts +106 -0
- package/src/shapes/Object/FabricObject.ts +29 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
- package/src/shapes/Object/InteractiveObject.ts +672 -0
- package/src/shapes/Object/Object.ts +1561 -0
- package/src/shapes/Object/ObjectGeometry.ts +813 -0
- package/src/shapes/Object/ObjectOrigin.ts +276 -0
- package/src/shapes/Object/StackedObject.ts +206 -0
- package/src/shapes/Object/defaultValues.ts +108 -0
- package/src/shapes/Object/types/BaseProps.ts +96 -0
- package/src/shapes/Object/types/BorderProps.ts +40 -0
- package/src/shapes/Object/types/ControlProps.ts +69 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
- package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
- package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
- package/src/shapes/Object/types/ObjectProps.ts +46 -0
- package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
- package/src/shapes/Object/types/index.ts +8 -0
- package/src/shapes/Path.ts +416 -0
- package/src/shapes/Polygon.ts +20 -0
- package/src/shapes/Polyline.ts +359 -0
- package/src/shapes/Rect.ts +233 -0
- package/src/shapes/Text/StyledText.ts +329 -0
- package/src/shapes/Text/Text.ts +1884 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
- package/src/shapes/Text/constants.ts +91 -0
- package/src/shapes/Textbox.ts +477 -0
- package/src/shapes/Triangle.ts +60 -0
- package/src/typedefs.ts +115 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +9 -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/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +121 -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/index.ts +102 -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_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 +28 -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 +29 -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 +226 -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 +134 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +82 -0
- package/src/util/path/index.ts +1038 -0
- package/src/util/path/regex.ts +41 -0
- package/src/util/path/typechecks.ts +145 -0
- package/src/util/path/typedefs.ts +305 -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,22 @@
|
|
|
1
|
+
export { changeWidth } from './changeWidth';
|
|
2
|
+
export { renderCircleControl, renderSquareControl } from './controlRendering';
|
|
3
|
+
export * from './commonControls';
|
|
4
|
+
export { dragHandler } from './drag';
|
|
5
|
+
export { createPolyControls } from './polyControl';
|
|
6
|
+
export { rotationStyleHandler, rotationWithSnapping } from './rotate';
|
|
7
|
+
export {
|
|
8
|
+
scaleCursorStyleHandler,
|
|
9
|
+
scalingEqually,
|
|
10
|
+
scalingX,
|
|
11
|
+
scalingY,
|
|
12
|
+
} from './scale';
|
|
13
|
+
export {
|
|
14
|
+
scaleOrSkewActionName,
|
|
15
|
+
scaleSkewCursorStyleHandler,
|
|
16
|
+
scalingXOrSkewingY,
|
|
17
|
+
scalingYOrSkewingX,
|
|
18
|
+
} from './scaleSkew';
|
|
19
|
+
export { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';
|
|
20
|
+
export { getLocalPoint } from './util';
|
|
21
|
+
export { wrapWithFireEvent } from './wrapWithFireEvent';
|
|
22
|
+
export { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Point } from '../Point';
|
|
2
|
+
import { Control } from './Control';
|
|
3
|
+
import { TMat2D } from '../typedefs';
|
|
4
|
+
import { iMatrix } from '../constants';
|
|
5
|
+
import type { Polyline } from '../shapes/Polyline';
|
|
6
|
+
import { multiplyTransformMatrices } from '../util/misc/matrix';
|
|
7
|
+
import {
|
|
8
|
+
TPointerEvent,
|
|
9
|
+
Transform,
|
|
10
|
+
TransformActionHandler,
|
|
11
|
+
} from '../EventTypeDefs';
|
|
12
|
+
import { getLocalPoint } from './util';
|
|
13
|
+
|
|
14
|
+
type TTransformAnchor = Transform & { pointIndex: number };
|
|
15
|
+
|
|
16
|
+
const getSize = (poly: Polyline) => {
|
|
17
|
+
return new Point(poly.width, poly.height);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* This function locates the controls.
|
|
22
|
+
* It'll be used both for drawing and for interaction.
|
|
23
|
+
*/
|
|
24
|
+
const factoryPolyPositionHandler = (pointIndex: number) => {
|
|
25
|
+
return function (dim: Point, finalMatrix: TMat2D, polyObject: Polyline) {
|
|
26
|
+
const x = polyObject.points[pointIndex].x - polyObject.pathOffset.x,
|
|
27
|
+
y = polyObject.points[pointIndex].y - polyObject.pathOffset.y;
|
|
28
|
+
return new Point(x, y).transform(
|
|
29
|
+
multiplyTransformMatrices(
|
|
30
|
+
polyObject.canvas?.viewportTransform ?? iMatrix,
|
|
31
|
+
polyObject.calcTransformMatrix()
|
|
32
|
+
)
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* This function defines what the control does.
|
|
39
|
+
* It'll be called on every mouse move after a control has been clicked and is being dragged.
|
|
40
|
+
* The function receives as argument the mouse event, the current transform object
|
|
41
|
+
* and the current position in canvas coordinate `transform.target` is a reference to the
|
|
42
|
+
* current object being transformed.
|
|
43
|
+
*/
|
|
44
|
+
const polyActionHandler = (
|
|
45
|
+
eventData: TPointerEvent,
|
|
46
|
+
transform: TTransformAnchor,
|
|
47
|
+
x: number,
|
|
48
|
+
y: number
|
|
49
|
+
) => {
|
|
50
|
+
const poly = transform.target as Polyline,
|
|
51
|
+
pointIndex = transform.pointIndex,
|
|
52
|
+
mouseLocalPosition = getLocalPoint(transform, 'center', 'center', x, y),
|
|
53
|
+
polygonBaseSize = getSize(poly),
|
|
54
|
+
size = poly._getTransformedDimensions(),
|
|
55
|
+
sizeFactor = polygonBaseSize.divide(size),
|
|
56
|
+
adjustFlip = new Point(poly.flipX ? -1 : 1, poly.flipY ? -1 : 1);
|
|
57
|
+
|
|
58
|
+
const finalPointPosition = mouseLocalPosition
|
|
59
|
+
.multiply(adjustFlip)
|
|
60
|
+
.multiply(sizeFactor)
|
|
61
|
+
.add(poly.pathOffset);
|
|
62
|
+
|
|
63
|
+
poly.points[pointIndex] = finalPointPosition;
|
|
64
|
+
poly.setDimensions();
|
|
65
|
+
|
|
66
|
+
return true;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Keep the polygon in the same position when we change its `width`/`height`/`top`/`left`.
|
|
71
|
+
*/
|
|
72
|
+
const anchorWrapper = (
|
|
73
|
+
pointIndex: number,
|
|
74
|
+
fn: TransformActionHandler<TTransformAnchor>
|
|
75
|
+
) => {
|
|
76
|
+
return function (
|
|
77
|
+
eventData: TPointerEvent,
|
|
78
|
+
transform: Transform,
|
|
79
|
+
x: number,
|
|
80
|
+
y: number
|
|
81
|
+
) {
|
|
82
|
+
const poly = transform.target as Polyline,
|
|
83
|
+
anchorIndex = (pointIndex > 0 ? pointIndex : poly.points.length) - 1,
|
|
84
|
+
pointInParentPlane = new Point(
|
|
85
|
+
poly.points[anchorIndex].x - poly.pathOffset.x,
|
|
86
|
+
poly.points[anchorIndex].y - poly.pathOffset.y
|
|
87
|
+
).transform(poly.calcOwnMatrix()),
|
|
88
|
+
actionPerformed = fn(eventData, { ...transform, pointIndex }, x, y),
|
|
89
|
+
polygonBaseSize = getSize(poly),
|
|
90
|
+
adjustFlip = new Point(poly.flipX ? -1 : 1, poly.flipY ? -1 : 1);
|
|
91
|
+
|
|
92
|
+
const newPosition = new Point(
|
|
93
|
+
poly.points[anchorIndex].x,
|
|
94
|
+
poly.points[anchorIndex].y
|
|
95
|
+
)
|
|
96
|
+
.subtract(poly.pathOffset)
|
|
97
|
+
.divide(polygonBaseSize)
|
|
98
|
+
.multiply(adjustFlip);
|
|
99
|
+
|
|
100
|
+
poly.setPositionByOrigin(
|
|
101
|
+
pointInParentPlane,
|
|
102
|
+
newPosition.x + 0.5,
|
|
103
|
+
newPosition.y + 0.5
|
|
104
|
+
);
|
|
105
|
+
return actionPerformed;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export function createPolyControls(
|
|
110
|
+
poly: Polyline,
|
|
111
|
+
options?: Partial<Control>
|
|
112
|
+
): Record<string, Control>;
|
|
113
|
+
export function createPolyControls(
|
|
114
|
+
numOfControls: number,
|
|
115
|
+
options?: Partial<Control>
|
|
116
|
+
): Record<string, Control>;
|
|
117
|
+
export function createPolyControls(
|
|
118
|
+
arg0: number | Polyline,
|
|
119
|
+
options: Partial<Control> = {}
|
|
120
|
+
) {
|
|
121
|
+
const controls = {} as Record<string, Control>;
|
|
122
|
+
for (
|
|
123
|
+
let idx = 0;
|
|
124
|
+
idx < (typeof arg0 === 'number' ? arg0 : arg0.points.length);
|
|
125
|
+
idx++
|
|
126
|
+
) {
|
|
127
|
+
controls[`p${idx}`] = new Control({
|
|
128
|
+
actionName: 'modifyPoly',
|
|
129
|
+
positionHandler: factoryPolyPositionHandler(idx),
|
|
130
|
+
actionHandler: anchorWrapper(idx, polyActionHandler),
|
|
131
|
+
...options,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return controls;
|
|
135
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ControlCursorCallback,
|
|
3
|
+
TransformActionHandler,
|
|
4
|
+
} from '../EventTypeDefs';
|
|
5
|
+
import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';
|
|
6
|
+
import { isLocked, NOT_ALLOWED_CURSOR } from './util';
|
|
7
|
+
import { wrapWithFireEvent } from './wrapWithFireEvent';
|
|
8
|
+
import { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Find the correct style for the control that is used for rotation.
|
|
12
|
+
* this function is very simple and it just take care of not-allowed or standard cursor
|
|
13
|
+
* @param {Event} eventData the javascript event that is causing the scale
|
|
14
|
+
* @param {Control} control the control that is interested in the action
|
|
15
|
+
* @param {FabricObject} fabricObject the fabric object that is interested in the action
|
|
16
|
+
* @return {String} a valid css string for the cursor
|
|
17
|
+
*/
|
|
18
|
+
export const rotationStyleHandler: ControlCursorCallback = (
|
|
19
|
+
eventData,
|
|
20
|
+
control,
|
|
21
|
+
fabricObject
|
|
22
|
+
) => {
|
|
23
|
+
if (fabricObject.lockRotation) {
|
|
24
|
+
return NOT_ALLOWED_CURSOR;
|
|
25
|
+
}
|
|
26
|
+
return control.cursorStyle;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Action handler for rotation and snapping, without anchor point.
|
|
31
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
32
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
33
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
34
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
35
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
36
|
+
* @return {Boolean} true if some change happened
|
|
37
|
+
* @private
|
|
38
|
+
*/
|
|
39
|
+
const rotateObjectWithSnapping: TransformActionHandler = (
|
|
40
|
+
eventData,
|
|
41
|
+
{ target, ex, ey, theta, originX, originY },
|
|
42
|
+
x,
|
|
43
|
+
y
|
|
44
|
+
) => {
|
|
45
|
+
const pivotPoint = target.translateToOriginPoint(
|
|
46
|
+
target.getRelativeCenterPoint(),
|
|
47
|
+
originX,
|
|
48
|
+
originY
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
if (isLocked(target, 'lockRotation')) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const lastAngle = Math.atan2(ey - pivotPoint.y, ex - pivotPoint.x),
|
|
56
|
+
curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x);
|
|
57
|
+
let angle = radiansToDegrees(curAngle - lastAngle + theta);
|
|
58
|
+
|
|
59
|
+
if (target.snapAngle && target.snapAngle > 0) {
|
|
60
|
+
const snapAngle = target.snapAngle,
|
|
61
|
+
snapThreshold = target.snapThreshold || snapAngle,
|
|
62
|
+
rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,
|
|
63
|
+
leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;
|
|
64
|
+
|
|
65
|
+
if (Math.abs(angle - leftAngleLocked) < snapThreshold) {
|
|
66
|
+
angle = leftAngleLocked;
|
|
67
|
+
} else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {
|
|
68
|
+
angle = rightAngleLocked;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// normalize angle to positive value
|
|
73
|
+
if (angle < 0) {
|
|
74
|
+
angle = 360 + angle;
|
|
75
|
+
}
|
|
76
|
+
angle %= 360;
|
|
77
|
+
|
|
78
|
+
const hasRotated = target.angle !== angle;
|
|
79
|
+
// TODO: why aren't we using set?
|
|
80
|
+
target.angle = angle;
|
|
81
|
+
return hasRotated;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const rotationWithSnapping = wrapWithFireEvent(
|
|
85
|
+
'rotating',
|
|
86
|
+
wrapWithFixedAnchor(rotateObjectWithSnapping)
|
|
87
|
+
);
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ControlCursorCallback,
|
|
3
|
+
TPointerEvent,
|
|
4
|
+
Transform,
|
|
5
|
+
TransformActionHandler,
|
|
6
|
+
} from '../EventTypeDefs';
|
|
7
|
+
import type { FabricObject } from '../shapes/Object/FabricObject';
|
|
8
|
+
import { TAxis } from '../typedefs';
|
|
9
|
+
import type { Canvas } from '../canvas/Canvas';
|
|
10
|
+
import {
|
|
11
|
+
findCornerQuadrant,
|
|
12
|
+
getLocalPoint,
|
|
13
|
+
invertOrigin,
|
|
14
|
+
isLocked,
|
|
15
|
+
isTransformCentered,
|
|
16
|
+
NOT_ALLOWED_CURSOR,
|
|
17
|
+
} from './util';
|
|
18
|
+
import { wrapWithFireEvent } from './wrapWithFireEvent';
|
|
19
|
+
import { wrapWithFixedAnchor } from './wrapWithFixedAnchor';
|
|
20
|
+
|
|
21
|
+
type ScaleTransform = Transform & {
|
|
22
|
+
gestureScale?: number;
|
|
23
|
+
signX?: number;
|
|
24
|
+
signY?: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type ScaleBy = TAxis | 'equally' | '' | undefined;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Inspect event and fabricObject properties to understand if the scaling action
|
|
31
|
+
* @param {Event} eventData from the user action
|
|
32
|
+
* @param {FabricObject} fabricObject the fabric object about to scale
|
|
33
|
+
* @return {Boolean} true if scale is proportional
|
|
34
|
+
*/
|
|
35
|
+
export function scaleIsProportional(
|
|
36
|
+
eventData: TPointerEvent,
|
|
37
|
+
fabricObject: FabricObject
|
|
38
|
+
): boolean {
|
|
39
|
+
const canvas = fabricObject.canvas as Canvas,
|
|
40
|
+
uniformIsToggled = eventData[canvas.uniScaleKey!];
|
|
41
|
+
return (
|
|
42
|
+
(canvas.uniformScaling && !uniformIsToggled) ||
|
|
43
|
+
(!canvas.uniformScaling && uniformIsToggled)
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Inspect fabricObject to understand if the current scaling action is allowed
|
|
49
|
+
* @param {FabricObject} fabricObject the fabric object about to scale
|
|
50
|
+
* @param {String} by 'x' or 'y' or ''
|
|
51
|
+
* @param {Boolean} scaleProportionally true if we are trying to scale proportionally
|
|
52
|
+
* @return {Boolean} true if scaling is not allowed at current conditions
|
|
53
|
+
*/
|
|
54
|
+
export function scalingIsForbidden(
|
|
55
|
+
fabricObject: FabricObject,
|
|
56
|
+
by: ScaleBy,
|
|
57
|
+
scaleProportionally: boolean
|
|
58
|
+
) {
|
|
59
|
+
const lockX = isLocked(fabricObject, 'lockScalingX'),
|
|
60
|
+
lockY = isLocked(fabricObject, 'lockScalingY');
|
|
61
|
+
if (lockX && lockY) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (!by && (lockX || lockY) && scaleProportionally) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (lockX && by === 'x') {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (lockY && by === 'y') {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* return the correct cursor style for the scale action
|
|
80
|
+
* @param {Event} eventData the javascript event that is causing the scale
|
|
81
|
+
* @param {Control} control the control that is interested in the action
|
|
82
|
+
* @param {FabricObject} fabricObject the fabric object that is interested in the action
|
|
83
|
+
* @return {String} a valid css string for the cursor
|
|
84
|
+
*/
|
|
85
|
+
export const scaleCursorStyleHandler: ControlCursorCallback = (
|
|
86
|
+
eventData,
|
|
87
|
+
control,
|
|
88
|
+
fabricObject
|
|
89
|
+
) => {
|
|
90
|
+
const scaleProportionally = scaleIsProportional(eventData, fabricObject),
|
|
91
|
+
by =
|
|
92
|
+
control.x !== 0 && control.y === 0
|
|
93
|
+
? 'x'
|
|
94
|
+
: control.x === 0 && control.y !== 0
|
|
95
|
+
? 'y'
|
|
96
|
+
: '';
|
|
97
|
+
if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {
|
|
98
|
+
return NOT_ALLOWED_CURSOR;
|
|
99
|
+
}
|
|
100
|
+
const n = findCornerQuadrant(fabricObject, control);
|
|
101
|
+
return `${scaleMap[n]}-resize`;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.
|
|
106
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
107
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
108
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
109
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
110
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
111
|
+
* @param {Object} options additional information for scaling
|
|
112
|
+
* @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling
|
|
113
|
+
* @return {Boolean} true if some change happened
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
function scaleObject(
|
|
117
|
+
eventData: TPointerEvent,
|
|
118
|
+
transform: ScaleTransform,
|
|
119
|
+
x: number,
|
|
120
|
+
y: number,
|
|
121
|
+
options: { by?: ScaleBy } = {}
|
|
122
|
+
) {
|
|
123
|
+
const target = transform.target,
|
|
124
|
+
by = options.by,
|
|
125
|
+
scaleProportionally = scaleIsProportional(eventData, target),
|
|
126
|
+
forbidScaling = scalingIsForbidden(target, by, scaleProportionally);
|
|
127
|
+
let newPoint, scaleX, scaleY, dim, signX, signY;
|
|
128
|
+
|
|
129
|
+
if (forbidScaling) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (transform.gestureScale) {
|
|
133
|
+
scaleX = transform.scaleX * transform.gestureScale;
|
|
134
|
+
scaleY = transform.scaleY * transform.gestureScale;
|
|
135
|
+
} else {
|
|
136
|
+
newPoint = getLocalPoint(
|
|
137
|
+
transform,
|
|
138
|
+
transform.originX,
|
|
139
|
+
transform.originY,
|
|
140
|
+
x,
|
|
141
|
+
y
|
|
142
|
+
);
|
|
143
|
+
// use of sign: We use sign to detect change of direction of an action. sign usually change when
|
|
144
|
+
// we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling
|
|
145
|
+
// by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily
|
|
146
|
+
// cross many time the origin point and flip the object. so we need a way to filter out the noise.
|
|
147
|
+
// This ternary here should be ok to filter out X scaling when we want Y only and vice versa.
|
|
148
|
+
signX = by !== 'y' ? Math.sign(newPoint.x || transform.signX || 1) : 1;
|
|
149
|
+
signY = by !== 'x' ? Math.sign(newPoint.y || transform.signY || 1) : 1;
|
|
150
|
+
if (!transform.signX) {
|
|
151
|
+
transform.signX = signX;
|
|
152
|
+
}
|
|
153
|
+
if (!transform.signY) {
|
|
154
|
+
transform.signY = signY;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (
|
|
158
|
+
isLocked(target, 'lockScalingFlip') &&
|
|
159
|
+
(transform.signX !== signX || transform.signY !== signY)
|
|
160
|
+
) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
dim = target._getTransformedDimensions();
|
|
165
|
+
// missing detection of flip and logic to switch the origin
|
|
166
|
+
if (scaleProportionally && !by) {
|
|
167
|
+
// uniform scaling
|
|
168
|
+
const distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),
|
|
169
|
+
{ original } = transform,
|
|
170
|
+
originalDistance =
|
|
171
|
+
Math.abs((dim.x * original.scaleX) / target.scaleX) +
|
|
172
|
+
Math.abs((dim.y * original.scaleY) / target.scaleY),
|
|
173
|
+
scale = distance / originalDistance;
|
|
174
|
+
scaleX = original.scaleX * scale;
|
|
175
|
+
scaleY = original.scaleY * scale;
|
|
176
|
+
} else {
|
|
177
|
+
scaleX = Math.abs((newPoint.x * target.scaleX) / dim.x);
|
|
178
|
+
scaleY = Math.abs((newPoint.y * target.scaleY) / dim.y);
|
|
179
|
+
}
|
|
180
|
+
// if we are scaling by center, we need to double the scale
|
|
181
|
+
if (isTransformCentered(transform)) {
|
|
182
|
+
scaleX *= 2;
|
|
183
|
+
scaleY *= 2;
|
|
184
|
+
}
|
|
185
|
+
if (transform.signX !== signX && by !== 'y') {
|
|
186
|
+
transform.originX = invertOrigin(transform.originX);
|
|
187
|
+
scaleX *= -1;
|
|
188
|
+
transform.signX = signX;
|
|
189
|
+
}
|
|
190
|
+
if (transform.signY !== signY && by !== 'x') {
|
|
191
|
+
transform.originY = invertOrigin(transform.originY);
|
|
192
|
+
scaleY *= -1;
|
|
193
|
+
transform.signY = signY;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// minScale is taken are in the setter.
|
|
197
|
+
const oldScaleX = target.scaleX,
|
|
198
|
+
oldScaleY = target.scaleY;
|
|
199
|
+
if (!by) {
|
|
200
|
+
!isLocked(target, 'lockScalingX') && target.set('scaleX', scaleX);
|
|
201
|
+
!isLocked(target, 'lockScalingY') && target.set('scaleY', scaleY);
|
|
202
|
+
} else {
|
|
203
|
+
// forbidden cases already handled on top here.
|
|
204
|
+
by === 'x' && target.set('scaleX', scaleX);
|
|
205
|
+
by === 'y' && target.set('scaleY', scaleY);
|
|
206
|
+
}
|
|
207
|
+
return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Generic scaling logic, to scale from corners either equally or freely.
|
|
212
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
213
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
214
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
215
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
216
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
217
|
+
* @return {Boolean} true if some change happened
|
|
218
|
+
*/
|
|
219
|
+
export const scaleObjectFromCorner: TransformActionHandler<ScaleTransform> = (
|
|
220
|
+
eventData,
|
|
221
|
+
transform,
|
|
222
|
+
x,
|
|
223
|
+
y
|
|
224
|
+
) => {
|
|
225
|
+
return scaleObject(eventData, transform, x, y);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Scaling logic for the X axis.
|
|
230
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
231
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
232
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
233
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
234
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
235
|
+
* @return {Boolean} true if some change happened
|
|
236
|
+
*/
|
|
237
|
+
const scaleObjectX: TransformActionHandler<ScaleTransform> = (
|
|
238
|
+
eventData,
|
|
239
|
+
transform,
|
|
240
|
+
x,
|
|
241
|
+
y
|
|
242
|
+
) => {
|
|
243
|
+
return scaleObject(eventData, transform, x, y, { by: 'x' });
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Scaling logic for the Y axis.
|
|
248
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
249
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
250
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
251
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
252
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
253
|
+
* @return {Boolean} true if some change happened
|
|
254
|
+
*/
|
|
255
|
+
const scaleObjectY: TransformActionHandler<ScaleTransform> = (
|
|
256
|
+
eventData,
|
|
257
|
+
transform,
|
|
258
|
+
x,
|
|
259
|
+
y
|
|
260
|
+
) => {
|
|
261
|
+
return scaleObject(eventData, transform, x, y, { by: 'y' });
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export const scalingEqually = wrapWithFireEvent(
|
|
265
|
+
'scaling',
|
|
266
|
+
wrapWithFixedAnchor(scaleObjectFromCorner)
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
export const scalingX = wrapWithFireEvent(
|
|
270
|
+
'scaling',
|
|
271
|
+
wrapWithFixedAnchor(scaleObjectX)
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
export const scalingY = wrapWithFireEvent(
|
|
275
|
+
'scaling',
|
|
276
|
+
wrapWithFixedAnchor(scaleObjectY)
|
|
277
|
+
);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ControlCallback,
|
|
3
|
+
ControlCursorCallback,
|
|
4
|
+
TPointerEvent,
|
|
5
|
+
TransformActionHandler,
|
|
6
|
+
} from '../EventTypeDefs';
|
|
7
|
+
import type { FabricObject } from '../shapes/Object/FabricObject';
|
|
8
|
+
import { TAxisKey } from '../typedefs';
|
|
9
|
+
import { scaleCursorStyleHandler, scalingX, scalingY } from './scale';
|
|
10
|
+
import { skewCursorStyleHandler, skewHandlerX, skewHandlerY } from './skew';
|
|
11
|
+
|
|
12
|
+
function isAltAction(eventData: TPointerEvent, target: FabricObject) {
|
|
13
|
+
return eventData[target.canvas!.altActionKey!];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Inspect event, control and fabricObject to return the correct action name
|
|
18
|
+
* @param {Event} eventData the javascript event that is causing the scale
|
|
19
|
+
* @param {Control} control the control that is interested in the action
|
|
20
|
+
* @param {FabricObject} fabricObject the fabric object that is interested in the action
|
|
21
|
+
* @return {String} an action name
|
|
22
|
+
*/
|
|
23
|
+
export const scaleOrSkewActionName: ControlCallback<
|
|
24
|
+
TAxisKey<'skew' | 'scale'> | ''
|
|
25
|
+
> = (eventData, control, fabricObject) => {
|
|
26
|
+
const isAlternative = isAltAction(eventData, fabricObject);
|
|
27
|
+
if (control.x === 0) {
|
|
28
|
+
// then is scaleY or skewX
|
|
29
|
+
return isAlternative ? 'skewX' : 'scaleY';
|
|
30
|
+
}
|
|
31
|
+
if (control.y === 0) {
|
|
32
|
+
// then is scaleY or skewX
|
|
33
|
+
return isAlternative ? 'skewY' : 'scaleX';
|
|
34
|
+
}
|
|
35
|
+
return '';
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Combine skew and scale style handlers to cover fabric standard use case
|
|
40
|
+
* @param {Event} eventData the javascript event that is causing the scale
|
|
41
|
+
* @param {Control} control the control that is interested in the action
|
|
42
|
+
* @param {FabricObject} fabricObject the fabric object that is interested in the action
|
|
43
|
+
* @return {String} a valid css string for the cursor
|
|
44
|
+
*/
|
|
45
|
+
export const scaleSkewCursorStyleHandler: ControlCursorCallback = (
|
|
46
|
+
eventData,
|
|
47
|
+
control,
|
|
48
|
+
fabricObject
|
|
49
|
+
) => {
|
|
50
|
+
return isAltAction(eventData, fabricObject)
|
|
51
|
+
? skewCursorStyleHandler(eventData, control, fabricObject)
|
|
52
|
+
: scaleCursorStyleHandler(eventData, control, fabricObject);
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Composed action handler to either scale X or skew Y
|
|
56
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
57
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
58
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
59
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
60
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
61
|
+
* @return {Boolean} true if some change happened
|
|
62
|
+
*/
|
|
63
|
+
export const scalingXOrSkewingY: TransformActionHandler = (
|
|
64
|
+
eventData,
|
|
65
|
+
transform,
|
|
66
|
+
x,
|
|
67
|
+
y
|
|
68
|
+
) => {
|
|
69
|
+
return isAltAction(eventData, transform.target)
|
|
70
|
+
? skewHandlerY(eventData, transform, x, y)
|
|
71
|
+
: scalingX(eventData, transform, x, y);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Composed action handler to either scale Y or skew X
|
|
76
|
+
* Needs to be wrapped with `wrapWithFixedAnchor` to be effective
|
|
77
|
+
* @param {Event} eventData javascript event that is doing the transform
|
|
78
|
+
* @param {Object} transform javascript object containing a series of information around the current transform
|
|
79
|
+
* @param {number} x current mouse x position, canvas normalized
|
|
80
|
+
* @param {number} y current mouse y position, canvas normalized
|
|
81
|
+
* @return {Boolean} true if some change happened
|
|
82
|
+
*/
|
|
83
|
+
export const scalingYOrSkewingX: TransformActionHandler = (
|
|
84
|
+
eventData,
|
|
85
|
+
transform,
|
|
86
|
+
x,
|
|
87
|
+
y
|
|
88
|
+
) => {
|
|
89
|
+
return isAltAction(eventData, transform.target)
|
|
90
|
+
? skewHandlerX(eventData, transform, x, y)
|
|
91
|
+
: scalingY(eventData, transform, x, y);
|
|
92
|
+
};
|