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,40 @@
|
|
|
1
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
2
|
+
import { sendObjectToPlane } from './planeChange';
|
|
3
|
+
import { Group } from '../../shapes/Group';
|
|
4
|
+
/**
|
|
5
|
+
* Merges 2 clip paths into one visually equal clip path
|
|
6
|
+
*
|
|
7
|
+
* **IMPORTANT**:\
|
|
8
|
+
* Does **NOT** clone the arguments, clone them proir if necessary.
|
|
9
|
+
*
|
|
10
|
+
* Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.
|
|
11
|
+
* Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.
|
|
12
|
+
*
|
|
13
|
+
* In order to handle the `inverted` property we follow logic described in the following cases:\
|
|
14
|
+
* **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\
|
|
15
|
+
* **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\
|
|
16
|
+
* **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.
|
|
17
|
+
*
|
|
18
|
+
* @memberOf fabric.util
|
|
19
|
+
* @param {fabric.Object} c1
|
|
20
|
+
* @param {fabric.Object} c2
|
|
21
|
+
* @returns {fabric.Object} merged clip path
|
|
22
|
+
*/
|
|
23
|
+
export const mergeClipPaths = (c1: FabricObject, c2: FabricObject) => {
|
|
24
|
+
let a = c1,
|
|
25
|
+
b = c2;
|
|
26
|
+
if (a.inverted && !b.inverted) {
|
|
27
|
+
// case (2)
|
|
28
|
+
a = c2;
|
|
29
|
+
b = c1;
|
|
30
|
+
}
|
|
31
|
+
// `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane
|
|
32
|
+
sendObjectToPlane(b, b.group?.calcTransformMatrix(), a.calcTransformMatrix());
|
|
33
|
+
// assign the `inverted` prop to the wrapping group
|
|
34
|
+
const inverted = a.inverted && b.inverted;
|
|
35
|
+
if (inverted) {
|
|
36
|
+
// case (1)
|
|
37
|
+
a.inverted = b.inverted = false;
|
|
38
|
+
}
|
|
39
|
+
return new Group([a], { clipPath: b, inverted });
|
|
40
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { noop } from '../../constants';
|
|
2
|
+
import type { Gradient } from '../../gradient/Gradient';
|
|
3
|
+
import type { Pattern } from '../../Pattern';
|
|
4
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
5
|
+
import type { TCrossOrigin, TFiller } from '../../typedefs';
|
|
6
|
+
import { createImage } from './dom';
|
|
7
|
+
import { classRegistry } from '../../ClassRegistry';
|
|
8
|
+
|
|
9
|
+
export type LoadImageOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
12
|
+
*/
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
/**
|
|
15
|
+
* cors value for the image loading, default to anonymous
|
|
16
|
+
*/
|
|
17
|
+
crossOrigin?: TCrossOrigin;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Loads image element from given url and resolve it, or catch.
|
|
22
|
+
* @param {String} url URL representing an image
|
|
23
|
+
* @param {LoadImageOptions} [options] image loading options
|
|
24
|
+
* @returns {Promise<HTMLImageElement>} the loaded image.
|
|
25
|
+
*/
|
|
26
|
+
export const loadImage = (
|
|
27
|
+
url: string,
|
|
28
|
+
{ signal, crossOrigin = null }: LoadImageOptions = {}
|
|
29
|
+
) =>
|
|
30
|
+
new Promise<HTMLImageElement>(function (resolve, reject) {
|
|
31
|
+
if (signal && signal.aborted) {
|
|
32
|
+
return reject(new Error('`options.signal` is in `aborted` state'));
|
|
33
|
+
}
|
|
34
|
+
const img = createImage();
|
|
35
|
+
let abort: EventListenerOrEventListenerObject;
|
|
36
|
+
if (signal) {
|
|
37
|
+
abort = function (err: Event) {
|
|
38
|
+
img.src = '';
|
|
39
|
+
reject(err);
|
|
40
|
+
};
|
|
41
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
42
|
+
}
|
|
43
|
+
const done = function () {
|
|
44
|
+
img.onload = img.onerror = null;
|
|
45
|
+
abort && signal?.removeEventListener('abort', abort);
|
|
46
|
+
resolve(img);
|
|
47
|
+
};
|
|
48
|
+
if (!url) {
|
|
49
|
+
done();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
img.onload = done;
|
|
53
|
+
img.onerror = function () {
|
|
54
|
+
abort && signal?.removeEventListener('abort', abort);
|
|
55
|
+
reject(new Error('Error loading ' + img.src));
|
|
56
|
+
};
|
|
57
|
+
crossOrigin && (img.crossOrigin = crossOrigin);
|
|
58
|
+
img.src = url;
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export type EnlivenObjectOptions = {
|
|
62
|
+
/**
|
|
63
|
+
* handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
64
|
+
*/
|
|
65
|
+
signal?: AbortSignal;
|
|
66
|
+
/**
|
|
67
|
+
* Method for further parsing of object elements,
|
|
68
|
+
* called after each fabric object created.
|
|
69
|
+
*/
|
|
70
|
+
reviver?: (
|
|
71
|
+
serializedObj: Record<string, any>,
|
|
72
|
+
instance: FabricObject
|
|
73
|
+
) => void;
|
|
74
|
+
/**
|
|
75
|
+
* Namespace to get klass "Class" object from
|
|
76
|
+
*/
|
|
77
|
+
namespace?: any;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates corresponding fabric instances from their object representations
|
|
82
|
+
* @param {Object[]} objects Objects to enliven
|
|
83
|
+
* @param {EnlivenObjectOptions} [options]
|
|
84
|
+
* @param {object} [options.namespace] Namespace to get klass "Class" object from
|
|
85
|
+
* @param {(serializedObj: object, instance: FabricObject) => any} [options.reviver] Method for further parsing of object elements,
|
|
86
|
+
* called after each fabric object created.
|
|
87
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
88
|
+
* @returns {Promise<FabricObject[]>}
|
|
89
|
+
*/
|
|
90
|
+
export const enlivenObjects = (
|
|
91
|
+
objects: any[],
|
|
92
|
+
{ signal, reviver = noop }: EnlivenObjectOptions = {}
|
|
93
|
+
) =>
|
|
94
|
+
new Promise<FabricObject[]>((resolve, reject) => {
|
|
95
|
+
const instances: FabricObject[] = [];
|
|
96
|
+
signal && signal.addEventListener('abort', reject, { once: true });
|
|
97
|
+
Promise.all(
|
|
98
|
+
objects.map((obj) =>
|
|
99
|
+
classRegistry
|
|
100
|
+
.getClass(obj.type)
|
|
101
|
+
// @ts-ignore
|
|
102
|
+
.fromObject(obj, {
|
|
103
|
+
signal,
|
|
104
|
+
reviver,
|
|
105
|
+
})
|
|
106
|
+
.then((fabricInstance: FabricObject) => {
|
|
107
|
+
reviver(obj, fabricInstance);
|
|
108
|
+
instances.push(fabricInstance);
|
|
109
|
+
return fabricInstance;
|
|
110
|
+
})
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
.then(resolve)
|
|
114
|
+
.catch((error) => {
|
|
115
|
+
// cleanup
|
|
116
|
+
instances.forEach(function (instance) {
|
|
117
|
+
instance.dispose && instance.dispose();
|
|
118
|
+
});
|
|
119
|
+
reject(error);
|
|
120
|
+
})
|
|
121
|
+
.finally(() => {
|
|
122
|
+
signal && signal.removeEventListener('abort', reject);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Creates corresponding fabric instances residing in an object, e.g. `clipPath`
|
|
128
|
+
* @param {Object} object with properties to enlive ( fill, stroke, clipPath, path )
|
|
129
|
+
* @param {object} [options]
|
|
130
|
+
* @param {AbortSignal} [options.signal] handle aborting, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
|
|
131
|
+
* @returns {Promise<Record<string, FabricObject | TFiller | null>>} the input object with enlived values
|
|
132
|
+
*/
|
|
133
|
+
export const enlivenObjectEnlivables = <
|
|
134
|
+
R = Record<string, FabricObject | TFiller | null>
|
|
135
|
+
>(
|
|
136
|
+
serializedObject: any,
|
|
137
|
+
{ signal }: { signal?: AbortSignal } = {}
|
|
138
|
+
) =>
|
|
139
|
+
new Promise<R>((resolve, reject) => {
|
|
140
|
+
const instances: (FabricObject | TFiller)[] = [];
|
|
141
|
+
signal && signal.addEventListener('abort', reject, { once: true });
|
|
142
|
+
// enlive every possible property
|
|
143
|
+
const promises = Object.values(serializedObject).map((value: any) => {
|
|
144
|
+
if (!value) {
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
// gradient
|
|
148
|
+
if (value.colorStops) {
|
|
149
|
+
return new (classRegistry.getClass('gradient'))(value);
|
|
150
|
+
}
|
|
151
|
+
// clipPath
|
|
152
|
+
if (value.type) {
|
|
153
|
+
return enlivenObjects([value], { signal }).then(([enlived]) => {
|
|
154
|
+
instances.push(enlived);
|
|
155
|
+
return enlived;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// pattern
|
|
159
|
+
if (value.source) {
|
|
160
|
+
return classRegistry
|
|
161
|
+
.getClass('pattern')
|
|
162
|
+
.fromObject(value, { signal })
|
|
163
|
+
.then((pattern: Pattern) => {
|
|
164
|
+
instances.push(pattern);
|
|
165
|
+
return pattern;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return value;
|
|
169
|
+
});
|
|
170
|
+
const keys = Object.keys(serializedObject);
|
|
171
|
+
Promise.all(promises)
|
|
172
|
+
.then((enlived) => {
|
|
173
|
+
return enlived.reduce((acc, instance, index) => {
|
|
174
|
+
acc[keys[index]] = instance;
|
|
175
|
+
return acc;
|
|
176
|
+
}, {});
|
|
177
|
+
})
|
|
178
|
+
.then(resolve)
|
|
179
|
+
.catch((error) => {
|
|
180
|
+
// cleanup
|
|
181
|
+
instances.forEach((instance: any) => {
|
|
182
|
+
instance.dispose && instance.dispose();
|
|
183
|
+
});
|
|
184
|
+
reject(error);
|
|
185
|
+
})
|
|
186
|
+
.finally(() => {
|
|
187
|
+
signal && signal.removeEventListener('abort', reject);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Point } from '../../Point';
|
|
2
|
+
import type { FabricObject } from '../../shapes/Object/Object';
|
|
3
|
+
import { TMat2D } from '../../typedefs';
|
|
4
|
+
import { makeBoundingBoxFromPoints } from './boundingBoxFromPoints';
|
|
5
|
+
import type { TScaleMatrixArgs } from './matrix';
|
|
6
|
+
import {
|
|
7
|
+
calcDimensionsMatrix,
|
|
8
|
+
invertTransform,
|
|
9
|
+
multiplyTransformMatrices,
|
|
10
|
+
qrDecompose,
|
|
11
|
+
} from './matrix';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* given an object and a transform, apply the inverse transform to the object,
|
|
15
|
+
* this is equivalent to remove from that object that transformation, so that
|
|
16
|
+
* added in a space with the removed transform, the object will be the same as before.
|
|
17
|
+
* Removing from an object a transform that scale by 2 is like scaling it by 1/2.
|
|
18
|
+
* Removing from an object a transform that rotate by 30deg is like rotating by 30deg
|
|
19
|
+
* in the opposite direction.
|
|
20
|
+
* This util is used to add objects inside transformed groups or nested groups.
|
|
21
|
+
* @param {FabricObject} object the object you want to transform
|
|
22
|
+
* @param {TMat2D} transform the destination transform
|
|
23
|
+
*/
|
|
24
|
+
export const removeTransformFromObject = (
|
|
25
|
+
object: FabricObject,
|
|
26
|
+
transform: TMat2D
|
|
27
|
+
) => {
|
|
28
|
+
const inverted = invertTransform(transform),
|
|
29
|
+
finalTransform = multiplyTransformMatrices(
|
|
30
|
+
inverted,
|
|
31
|
+
object.calcOwnMatrix()
|
|
32
|
+
);
|
|
33
|
+
applyTransformToObject(object, finalTransform);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* given an object and a transform, apply the transform to the object.
|
|
38
|
+
* this is equivalent to change the space where the object is drawn.
|
|
39
|
+
* Adding to an object a transform that scale by 2 is like scaling it by 2.
|
|
40
|
+
* This is used when removing an object from an active selection for example.
|
|
41
|
+
* @param {FabricObject} object the object you want to transform
|
|
42
|
+
* @param {Array} transform the destination transform
|
|
43
|
+
*/
|
|
44
|
+
export const addTransformToObject = (object: FabricObject, transform: TMat2D) =>
|
|
45
|
+
applyTransformToObject(
|
|
46
|
+
object,
|
|
47
|
+
multiplyTransformMatrices(transform, object.calcOwnMatrix())
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* discard an object transform state and apply the one from the matrix.
|
|
52
|
+
* @param {FabricObject} object the object you want to transform
|
|
53
|
+
* @param {Array} transform the destination transform
|
|
54
|
+
*/
|
|
55
|
+
export const applyTransformToObject = (
|
|
56
|
+
object: FabricObject,
|
|
57
|
+
transform: TMat2D
|
|
58
|
+
) => {
|
|
59
|
+
const { translateX, translateY, scaleX, scaleY, ...otherOptions } =
|
|
60
|
+
qrDecompose(transform),
|
|
61
|
+
center = new Point(translateX, translateY);
|
|
62
|
+
object.flipX = false;
|
|
63
|
+
object.flipY = false;
|
|
64
|
+
Object.assign(object, otherOptions);
|
|
65
|
+
object.set({ scaleX, scaleY });
|
|
66
|
+
object.setPositionByOrigin(center, 'center', 'center');
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* reset an object transform state to neutral. Top and left are not accounted for
|
|
70
|
+
* @param {FabricObject} target object to transform
|
|
71
|
+
*/
|
|
72
|
+
export const resetObjectTransform = (target: FabricObject) => {
|
|
73
|
+
target.scaleX = 1;
|
|
74
|
+
target.scaleY = 1;
|
|
75
|
+
target.skewX = 0;
|
|
76
|
+
target.skewY = 0;
|
|
77
|
+
target.flipX = false;
|
|
78
|
+
target.flipY = false;
|
|
79
|
+
target.rotate(0);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Extract Object transform values
|
|
84
|
+
* @param {FabricObject} target object to read from
|
|
85
|
+
* @return {Object} Components of transform
|
|
86
|
+
*/
|
|
87
|
+
export const saveObjectTransform = (target: FabricObject) => ({
|
|
88
|
+
scaleX: target.scaleX,
|
|
89
|
+
scaleY: target.scaleY,
|
|
90
|
+
skewX: target.skewX,
|
|
91
|
+
skewY: target.skewY,
|
|
92
|
+
angle: target.angle,
|
|
93
|
+
left: target.left,
|
|
94
|
+
flipX: target.flipX,
|
|
95
|
+
flipY: target.flipY,
|
|
96
|
+
top: target.top,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* given a width and height, return the size of the bounding box
|
|
101
|
+
* that can contains the box with width/height with applied transform
|
|
102
|
+
* described in options.
|
|
103
|
+
* Use to calculate the boxes around objects for controls.
|
|
104
|
+
* @param {Number} width
|
|
105
|
+
* @param {Number} height
|
|
106
|
+
* @param {Object} options
|
|
107
|
+
* @param {Number} options.scaleX
|
|
108
|
+
* @param {Number} options.scaleY
|
|
109
|
+
* @param {Number} options.skewX
|
|
110
|
+
* @param {Number} options.skewY
|
|
111
|
+
* @returns {Point} size
|
|
112
|
+
*/
|
|
113
|
+
export const sizeAfterTransform = (
|
|
114
|
+
width: number,
|
|
115
|
+
height: number,
|
|
116
|
+
options: TScaleMatrixArgs
|
|
117
|
+
) => {
|
|
118
|
+
const dimX = width / 2,
|
|
119
|
+
dimY = height / 2,
|
|
120
|
+
transformMatrix = calcDimensionsMatrix(options),
|
|
121
|
+
points = [
|
|
122
|
+
new Point(-dimX, -dimY),
|
|
123
|
+
new Point(dimX, -dimY),
|
|
124
|
+
new Point(-dimX, dimY),
|
|
125
|
+
new Point(dimX, dimY),
|
|
126
|
+
].map((p) => p.transform(transformMatrix)),
|
|
127
|
+
bbox = makeBoundingBoxFromPoints(points);
|
|
128
|
+
return new Point(bbox.width, bbox.height);
|
|
129
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Populates an object with properties of another object
|
|
3
|
+
* @param {Object} source Source object
|
|
4
|
+
* @param {string[]} properties Properties names to include
|
|
5
|
+
* @returns object populated with the picked keys
|
|
6
|
+
*/
|
|
7
|
+
export const pick = <T extends Record<string, any>>(
|
|
8
|
+
source: T,
|
|
9
|
+
keys: (keyof T)[] = []
|
|
10
|
+
) => {
|
|
11
|
+
return keys.reduce((o, key) => {
|
|
12
|
+
if (key in source) {
|
|
13
|
+
o[key] = source[key];
|
|
14
|
+
}
|
|
15
|
+
return o;
|
|
16
|
+
}, {} as Partial<T>);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const pickBy = <T extends Record<string, any>>(
|
|
20
|
+
source: T,
|
|
21
|
+
predicate: <K extends keyof T>(value: T[K], key: K, collection: T) => boolean
|
|
22
|
+
) => {
|
|
23
|
+
return (Object.keys(source) as (keyof T)[]).reduce((o, key) => {
|
|
24
|
+
if (predicate(source[key], key, source)) {
|
|
25
|
+
o[key] = source[key];
|
|
26
|
+
}
|
|
27
|
+
return o;
|
|
28
|
+
}, {} as Partial<T>);
|
|
29
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { iMatrix } from '../../constants';
|
|
2
|
+
import type { Point } from '../../Point';
|
|
3
|
+
import type { FabricObject } from '../../shapes/Object/Object';
|
|
4
|
+
import type { TMat2D } from '../../typedefs';
|
|
5
|
+
import type { StaticCanvas } from '../../canvas/StaticCanvas';
|
|
6
|
+
import { invertTransform, multiplyTransformMatrices } from './matrix';
|
|
7
|
+
import { applyTransformToObject } from './objectTransforms';
|
|
8
|
+
|
|
9
|
+
export const enum ObjectRelation {
|
|
10
|
+
sibling = 'sibling',
|
|
11
|
+
child = 'child',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* We are actually looking for the transformation from the destination plane to the source plane (change of basis matrix)\
|
|
16
|
+
* The object will exist on the destination plane and we want it to seem unchanged by it so we invert the destination matrix (`to`) and then apply the source matrix (`from`)
|
|
17
|
+
* @param [from]
|
|
18
|
+
* @param [to]
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export const calcPlaneChangeMatrix = (
|
|
22
|
+
from: TMat2D = iMatrix,
|
|
23
|
+
to: TMat2D = iMatrix
|
|
24
|
+
) => multiplyTransformMatrices(invertTransform(to), from);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Sends a point from the source coordinate plane to the destination coordinate plane.\
|
|
28
|
+
* From the canvas/viewer's perspective the point remains unchanged.
|
|
29
|
+
*
|
|
30
|
+
* @example <caption>Send point from canvas plane to group plane</caption>
|
|
31
|
+
* var obj = new Rect({ left: 20, top: 20, width: 60, height: 60, strokeWidth: 0 });
|
|
32
|
+
* var group = new Group([obj], { strokeWidth: 0 });
|
|
33
|
+
* var sentPoint1 = sendPointToPlane(new Point(50, 50), undefined, group.calcTransformMatrix());
|
|
34
|
+
* var sentPoint2 = sendPointToPlane(new Point(50, 50), iMatrix, group.calcTransformMatrix());
|
|
35
|
+
* console.log(sentPoint1, sentPoint2) // both points print (0,0) which is the center of group
|
|
36
|
+
*
|
|
37
|
+
* @see {transformPointRelativeToCanvas} for transforming relative to canvas
|
|
38
|
+
* @param {Point} point
|
|
39
|
+
* @param {TMat2D} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `point` exists in the canvas coordinate plane.
|
|
40
|
+
* @param {TMat2D} [to] destination plane matrix to contain object. Passing `undefined` means `point` should be sent to the canvas coordinate plane.
|
|
41
|
+
* @returns {Point} transformed point
|
|
42
|
+
*/
|
|
43
|
+
export const sendPointToPlane = (
|
|
44
|
+
point: Point,
|
|
45
|
+
from: TMat2D = iMatrix,
|
|
46
|
+
to: TMat2D = iMatrix
|
|
47
|
+
): Point =>
|
|
48
|
+
// we are actually looking for the transformation from the destination plane to the source plane (which is a linear mapping)
|
|
49
|
+
// the object will exist on the destination plane and we want it to seem unchanged by it so we reverse the destination matrix (to) and then apply the source matrix (from)
|
|
50
|
+
point.transform(calcPlaneChangeMatrix(from, to));
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Transform point relative to canvas.
|
|
54
|
+
* From the viewport/viewer's perspective the point remains unchanged.
|
|
55
|
+
*
|
|
56
|
+
* `child` relation means `point` exists in the coordinate plane created by `canvas`.
|
|
57
|
+
* In other words point is measured according to canvas' top left corner
|
|
58
|
+
* meaning that if `point` is equal to (0,0) it is positioned at canvas' top left corner.
|
|
59
|
+
*
|
|
60
|
+
* `sibling` relation means `point` exists in the same coordinate plane as canvas.
|
|
61
|
+
* In other words they both relate to the same (0,0) and agree on every point, which is how an event relates to canvas.
|
|
62
|
+
*
|
|
63
|
+
* @param {Point} point
|
|
64
|
+
* @param {StaticCanvas} canvas
|
|
65
|
+
* @param {'sibling'|'child'} relationBefore current relation of point to canvas
|
|
66
|
+
* @param {'sibling'|'child'} relationAfter desired relation of point to canvas
|
|
67
|
+
* @returns {Point} transformed point
|
|
68
|
+
*/
|
|
69
|
+
export const transformPointRelativeToCanvas = (
|
|
70
|
+
point: Point,
|
|
71
|
+
canvas: StaticCanvas,
|
|
72
|
+
relationBefore: ObjectRelation,
|
|
73
|
+
relationAfter: ObjectRelation
|
|
74
|
+
): Point => {
|
|
75
|
+
// is this still needed with TS?
|
|
76
|
+
if (
|
|
77
|
+
relationBefore !== ObjectRelation.child &&
|
|
78
|
+
relationBefore !== ObjectRelation.sibling
|
|
79
|
+
) {
|
|
80
|
+
throw new Error(`fabric.js: received bad argument ${relationBefore}`);
|
|
81
|
+
}
|
|
82
|
+
if (
|
|
83
|
+
relationAfter !== ObjectRelation.child &&
|
|
84
|
+
relationAfter !== ObjectRelation.sibling
|
|
85
|
+
) {
|
|
86
|
+
throw new Error(`fabric.js: received bad argument ${relationAfter}`);
|
|
87
|
+
}
|
|
88
|
+
if (relationBefore === relationAfter) {
|
|
89
|
+
return point;
|
|
90
|
+
}
|
|
91
|
+
const t = canvas.viewportTransform;
|
|
92
|
+
return point.transform(relationAfter === 'child' ? invertTransform(t) : t);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
* A util that abstracts applying transform to objects.\
|
|
98
|
+
* Sends `object` to the destination coordinate plane by applying the relevant transformations.\
|
|
99
|
+
* Changes the space/plane where `object` is drawn.\
|
|
100
|
+
* From the canvas/viewer's perspective `object` remains unchanged.
|
|
101
|
+
*
|
|
102
|
+
* @example <caption>Move clip path from one object to another while preserving it's appearance as viewed by canvas/viewer</caption>
|
|
103
|
+
* let obj, obj2;
|
|
104
|
+
* let clipPath = new Circle({ radius: 50 });
|
|
105
|
+
* obj.clipPath = clipPath;
|
|
106
|
+
* // render
|
|
107
|
+
* sendObjectToPlane(clipPath, obj.calcTransformMatrix(), obj2.calcTransformMatrix());
|
|
108
|
+
* obj.clipPath = undefined;
|
|
109
|
+
* obj2.clipPath = clipPath;
|
|
110
|
+
* // render, clipPath now clips obj2 but seems unchanged from the eyes of the viewer
|
|
111
|
+
*
|
|
112
|
+
* @example <caption>Clip an object's clip path with an existing object</caption>
|
|
113
|
+
* let obj, existingObj;
|
|
114
|
+
* let clipPath = new Circle({ radius: 50 });
|
|
115
|
+
* obj.clipPath = clipPath;
|
|
116
|
+
* let transformTo = multiplyTransformMatrices(obj.calcTransformMatrix(), clipPath.calcTransformMatrix());
|
|
117
|
+
* sendObjectToPlane(existingObj, existingObj.group?.calcTransformMatrix(), transformTo);
|
|
118
|
+
* clipPath.clipPath = existingObj;
|
|
119
|
+
*
|
|
120
|
+
* @param {FabricObject} object
|
|
121
|
+
* @param {Matrix} [from] plane matrix containing object. Passing `undefined` is equivalent to passing the identity matrix, which means `object` is a direct child of canvas.
|
|
122
|
+
* @param {Matrix} [to] destination plane matrix to contain object. Passing `undefined` means `object` should be sent to the canvas coordinate plane.
|
|
123
|
+
* @returns {Matrix} the transform matrix that was applied to `object`
|
|
124
|
+
*/
|
|
125
|
+
export const sendObjectToPlane = (
|
|
126
|
+
object: FabricObject,
|
|
127
|
+
from?: TMat2D,
|
|
128
|
+
to?: TMat2D
|
|
129
|
+
): TMat2D => {
|
|
130
|
+
const t = calcPlaneChangeMatrix(from, to);
|
|
131
|
+
applyTransformToObject(
|
|
132
|
+
object,
|
|
133
|
+
multiplyTransformMatrices(t, object.calcOwnMatrix())
|
|
134
|
+
);
|
|
135
|
+
return t;
|
|
136
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { XY, Point } from '../../../Point';
|
|
2
|
+
import { createVector, getOrthonormalVector, getUnitVector } from '../vectors';
|
|
3
|
+
import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
|
|
4
|
+
import { StrokeProjectionsBase } from './StrokeProjectionsBase';
|
|
5
|
+
import { TProjection, TProjectStrokeOnPointsOptions } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* class in charge of finding projections for each type of line cap for start/end of an open path
|
|
9
|
+
* @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}
|
|
10
|
+
*
|
|
11
|
+
* Reference:
|
|
12
|
+
* - MDN:
|
|
13
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap
|
|
14
|
+
* - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap
|
|
15
|
+
* - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev
|
|
16
|
+
* - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
|
|
17
|
+
* - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js
|
|
18
|
+
*/
|
|
19
|
+
export class StrokeLineCapProjections extends StrokeProjectionsBase {
|
|
20
|
+
/**
|
|
21
|
+
* edge point
|
|
22
|
+
*/
|
|
23
|
+
declare A: Point;
|
|
24
|
+
/**
|
|
25
|
+
* point next to edge point
|
|
26
|
+
*/
|
|
27
|
+
declare T: Point;
|
|
28
|
+
|
|
29
|
+
constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {
|
|
30
|
+
super(options);
|
|
31
|
+
this.A = new Point(A);
|
|
32
|
+
this.T = new Point(T);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
calcOrthogonalProjection(
|
|
36
|
+
from: Point,
|
|
37
|
+
to: Point,
|
|
38
|
+
magnitude: number = this.strokeProjectionMagnitude
|
|
39
|
+
) {
|
|
40
|
+
const vector = this.createSideVector(from, to);
|
|
41
|
+
return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* OPEN PATH START/END - Line cap: Butt
|
|
46
|
+
* Calculation: to find the projections, just find the points orthogonal to the stroke
|
|
47
|
+
*
|
|
48
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt
|
|
49
|
+
*/
|
|
50
|
+
projectButt() {
|
|
51
|
+
return [
|
|
52
|
+
this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),
|
|
53
|
+
this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* OPEN PATH START/END - Line cap: Round
|
|
59
|
+
* Calculation: same as stroke line join `round`
|
|
60
|
+
*
|
|
61
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round
|
|
62
|
+
*/
|
|
63
|
+
projectRound() {
|
|
64
|
+
return new StrokeLineJoinProjections(
|
|
65
|
+
this.A,
|
|
66
|
+
this.T,
|
|
67
|
+
this.T,
|
|
68
|
+
this.options
|
|
69
|
+
).projectRound();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* OPEN PATH START/END - Line cap: Square
|
|
74
|
+
* Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`
|
|
75
|
+
*
|
|
76
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square
|
|
77
|
+
*/
|
|
78
|
+
projectSquare() {
|
|
79
|
+
const orthogonalProjection = this.calcOrthogonalProjection(
|
|
80
|
+
this.A,
|
|
81
|
+
this.T,
|
|
82
|
+
this.strokeProjectionMagnitude
|
|
83
|
+
);
|
|
84
|
+
const strokePointingOut = this.scaleUnitVector(
|
|
85
|
+
getUnitVector(createVector(this.A, this.T)),
|
|
86
|
+
-this.strokeProjectionMagnitude
|
|
87
|
+
);
|
|
88
|
+
const projectedA = this.A.add(strokePointingOut);
|
|
89
|
+
return [
|
|
90
|
+
projectedA.add(orthogonalProjection),
|
|
91
|
+
projectedA.subtract(orthogonalProjection),
|
|
92
|
+
].map((p) => this.applySkew(p));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected projectPoints() {
|
|
96
|
+
switch (this.options.strokeLineCap) {
|
|
97
|
+
case 'round':
|
|
98
|
+
return this.projectRound();
|
|
99
|
+
case 'square':
|
|
100
|
+
return this.projectSquare();
|
|
101
|
+
default:
|
|
102
|
+
return this.projectButt();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public project(): TProjection[] {
|
|
107
|
+
return this.projectPoints().map((point) => ({
|
|
108
|
+
originPoint: this.A,
|
|
109
|
+
projectedPoint: point,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
}
|