fabric 5.3.0-browser → 6.0.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintrc.js +43 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.prettierignore +16 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +491 -189
- package/CONTRIBUTING.md +226 -58
- package/README.md +188 -239
- package/bower.json +1 -3
- package/dist/fabric.d.ts +1021 -0
- package/dist/index.cjs +28027 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +27964 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +28092 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +15 -0
- package/dist/index.node.mjs +28035 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/Collection.d.ts +126 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +226 -0
- package/dist/src/Intersection.d.ts +100 -0
- package/dist/src/Observable.d.ts +54 -0
- package/dist/src/Pattern.d.ts +104 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +87 -0
- package/dist/src/brushes/BaseBrush.d.ts +105 -0
- package/dist/src/brushes/CircleBrush.d.ts +49 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +79 -0
- package/dist/src/cache.d.ts +46 -0
- package/dist/src/canvas/Canvas.d.ts +567 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
- package/dist/src/canvas/StaticCanvas.d.ts +751 -0
- package/dist/src/canvas/TextEditingManager.d.ts +17 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +174 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +22 -0
- package/dist/src/color/util.d.ts +12 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +14 -0
- package/dist/src/controls/Control.d.ts +228 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/controls.render.d.ts +29 -0
- package/dist/src/controls/default_controls.d.ts +50 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +7 -0
- package/dist/src/env/node.d.ts +3 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +156 -0
- package/dist/src/filters/BlendColor.d.ts +80 -0
- package/dist/src/filters/BlendImage.d.ts +90 -0
- package/dist/src/filters/Blur.d.ts +50 -0
- package/dist/src/filters/Boilerplate.d.ts +46 -0
- package/dist/src/filters/Brightness.d.ts +46 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +62 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
- package/dist/src/filters/Composed.d.ts +47 -0
- package/dist/src/filters/Contrast.d.ts +44 -0
- package/dist/src/filters/Convolute.d.ts +82 -0
- package/dist/src/filters/FilterBackend.d.ts +14 -0
- package/dist/src/filters/Gamma.d.ts +53 -0
- package/dist/src/filters/Grayscale.d.ts +45 -0
- package/dist/src/filters/HueRotation.d.ts +24 -0
- package/dist/src/filters/Invert.d.ts +54 -0
- package/dist/src/filters/Noise.d.ts +53 -0
- package/dist/src/filters/Pixelate.d.ts +43 -0
- package/dist/src/filters/RemoveColor.d.ts +62 -0
- package/dist/src/filters/Resize.d.ts +134 -0
- package/dist/src/filters/Saturation.d.ts +47 -0
- package/dist/src/filters/Vibrance.d.ts +47 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
- package/dist/src/filters/WebGLProbe.d.ts +28 -0
- package/dist/src/filters/typedefs.d.ts +49 -0
- package/dist/src/gradient/Gradient.d.ts +149 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/mixins/stateful.mixin.d.ts +18 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +54 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/loadSVGFromString.d.ts +12 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseElements.d.ts +11 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +15 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/rotateMatrix.d.ts +2 -0
- package/dist/src/parser/scaleMatrix.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/skewMatrix.d.ts +2 -0
- package/dist/src/parser/translateMatrix.d.ts +2 -0
- package/dist/src/shapes/ActiveSelection.d.ts +66 -0
- package/dist/src/shapes/Circle.d.ts +80 -0
- package/dist/src/shapes/Ellipse.d.ts +74 -0
- package/dist/src/shapes/Group.d.ts +381 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +322 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +283 -0
- package/dist/src/shapes/Line.d.ts +117 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
- package/dist/src/shapes/Object/Object.d.ts +906 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
- package/dist/src/shapes/Path.d.ts +123 -0
- package/dist/src/shapes/Polygon.d.ts +7 -0
- package/dist/src/shapes/Polyline.d.ts +130 -0
- package/dist/src/shapes/Rect.d.ts +62 -0
- package/dist/src/shapes/Text/StyledText.d.ts +118 -0
- package/dist/src/shapes/Text/Text.d.ts +656 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Textbox.d.ts +170 -0
- package/dist/src/shapes/Triangle.d.ts +17 -0
- package/dist/src/typedefs.d.ts +93 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/class_registry.d.ts +14 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +40 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/fireEvent.d.ts +3 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_class.d.ts +12 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +29 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +92 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +56 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +8 -0
- package/dist/src/util/misc/planeChange.d.ts +84 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +53 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +57 -0
- package/dist/src/util/path.d.ts +108 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/types.d.ts +19 -0
- package/fabric.ts +427 -0
- package/index.node.ts +43 -0
- package/index.ts +1 -0
- package/package.json +142 -88
- package/publish.js +0 -26
- package/rollup.config.mjs +79 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/index.mjs +679 -0
- package/scripts/transform_files.mjs +504 -0
- package/src/Collection.ts +311 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +294 -0
- package/src/Intersection.ts +273 -0
- package/src/Observable.ts +175 -0
- package/src/Pattern.ts +211 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +215 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
- package/src/brushes/CircleBrush.ts +145 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +219 -0
- package/src/cache.ts +89 -0
- package/src/canvas/Canvas.ts +1672 -0
- package/src/canvas/SelectableCanvas.ts +1636 -0
- package/src/canvas/StaticCanvas.ts +1709 -0
- package/src/canvas/TextEditingManager.ts +48 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +404 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +26 -0
- package/src/color/util.ts +32 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +19 -0
- package/src/controls/Control.ts +377 -0
- package/src/controls/changeWidth.ts +52 -0
- package/src/controls/controls.render.ts +138 -0
- package/src/controls/default_controls.ts +132 -0
- package/src/controls/drag.ts +31 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +242 -0
- package/src/controls/util.ts +154 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +28 -0
- package/src/env/index.ts +19 -0
- package/src/env/node.ts +52 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
- package/src/filters/BlendColor.ts +258 -0
- package/src/filters/BlendImage.ts +254 -0
- package/src/filters/Blur.ts +202 -0
- package/src/filters/Boilerplate.ts +91 -0
- package/src/filters/Brightness.ts +93 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +156 -0
- package/src/filters/ColorMatrixFilters.ts +106 -0
- package/src/filters/Composed.ts +85 -0
- package/src/filters/Contrast.ts +94 -0
- package/src/filters/Convolute.ts +341 -0
- package/src/filters/FilterBackend.ts +32 -0
- package/src/filters/Gamma.ts +127 -0
- package/src/filters/Grayscale.ts +137 -0
- package/src/filters/HueRotation.ts +66 -0
- package/src/filters/Invert.ts +117 -0
- package/src/filters/Noise.ts +109 -0
- package/src/filters/Pixelate.ts +114 -0
- package/src/filters/RemoveColor.ts +148 -0
- package/src/filters/Resize.ts +540 -0
- package/src/filters/Saturation.ts +100 -0
- package/src/filters/Vibrance.ts +103 -0
- package/src/filters/WebGLFilterBackend.ts +430 -0
- package/src/filters/WebGLProbe.ts +62 -0
- package/src/filters/typedefs.ts +65 -0
- package/src/gradient/Gradient.ts +401 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +55 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/mixins/stateful.mixin.ts +104 -0
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +162 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +118 -0
- package/src/parser/doesSomeParentMatch.ts +19 -0
- package/src/parser/elementById.ts +23 -0
- package/src/parser/elementMatchesRule.ts +19 -0
- package/src/parser/elements_parser.ts +191 -0
- package/src/parser/getCSSRules.ts +62 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +32 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +5 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/loadSVGFromString.ts +26 -0
- package/src/parser/loadSVGFromURL.ts +40 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +63 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseElements.ts +28 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +36 -0
- package/src/parser/parseSVGDocument.ts +106 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +155 -0
- package/src/parser/parseUseDirectives.ts +79 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/rotateMatrix.ts +21 -0
- package/src/parser/scaleMatrix.ts +9 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/skewMatrix.ts +6 -0
- package/src/parser/translateMatrix.ts +8 -0
- package/src/shapes/ActiveSelection.ts +157 -0
- package/src/shapes/Circle.ts +205 -0
- package/src/shapes/Ellipse.ts +154 -0
- package/src/shapes/Group.ts +1053 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
- package/src/shapes/IText/IText.ts +666 -0
- package/src/shapes/IText/ITextBehavior.ts +1055 -0
- package/src/shapes/IText/ITextClickBehavior.ts +321 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
- package/src/shapes/IText/constants.ts +47 -0
- package/src/shapes/Image.ts +789 -0
- package/src/shapes/Line.ts +329 -0
- package/src/shapes/Object/AnimatableObject.ts +106 -0
- package/src/shapes/Object/FabricObject.ts +19 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
- package/src/shapes/Object/InteractiveObject.ts +645 -0
- package/src/shapes/Object/Object.ts +1896 -0
- package/src/shapes/Object/ObjectGeometry.ts +830 -0
- package/src/shapes/Object/ObjectOrigin.ts +354 -0
- package/src/shapes/Object/StackedObject.ts +191 -0
- package/src/shapes/Object/defaultValues.ts +112 -0
- package/src/shapes/Path.ts +395 -0
- package/src/shapes/Polygon.ts +19 -0
- package/src/shapes/Polyline.ts +333 -0
- package/src/shapes/Rect.ts +199 -0
- package/src/shapes/Text/StyledText.ts +319 -0
- package/src/shapes/Text/Text.ts +1948 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
- package/src/shapes/Textbox.ts +471 -0
- package/src/shapes/Triangle.ts +45 -0
- package/src/typedefs.ts +119 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +28 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/class_registry.ts +54 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +138 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/fireEvent.ts +15 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_class.ts +90 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +37 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +50 -0
- package/src/util/misc/findScaleTo.ts +44 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +51 -0
- package/src/util/misc/matrix.ts +207 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +189 -0
- package/src/util/misc/objectTransforms.ts +129 -0
- package/src/util/misc/pick.ts +17 -0
- package/src/util/misc/planeChange.ts +136 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
- package/src/util/misc/projectStroke/index.ts +53 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +181 -0
- package/src/util/misc/textStyles.ts +133 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +82 -0
- package/src/util/path.ts +941 -0
- package/src/util/transform_matrix_removal.ts +60 -0
- package/src/util/types.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { iMatrix } from '../../constants';
|
|
2
|
+
import type { Point } from '../../Point';
|
|
3
|
+
import type { FabricObject } from '../../shapes/Object/FabricObject';
|
|
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 { IPoint, 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: IPoint, T: IPoint, 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
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { IPoint, Point } from '../../../Point';
|
|
2
|
+
import { degreesToRadians } from '../radiansDegreesConversion';
|
|
3
|
+
import { getBisector, getOrthonormalVector, magnitude } from '../vectors';
|
|
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 join
|
|
9
|
+
* @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}
|
|
10
|
+
*
|
|
11
|
+
* - MDN:
|
|
12
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
|
|
13
|
+
* - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin
|
|
14
|
+
* - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty
|
|
15
|
+
* - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
|
|
16
|
+
* - 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
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export class StrokeLineJoinProjections extends StrokeProjectionsBase {
|
|
20
|
+
/**
|
|
21
|
+
* The point being projected (the angle ∠BAC)
|
|
22
|
+
*/
|
|
23
|
+
declare A: Point;
|
|
24
|
+
/**
|
|
25
|
+
* The point before A
|
|
26
|
+
*/
|
|
27
|
+
declare B: Point;
|
|
28
|
+
/**
|
|
29
|
+
* The point after A
|
|
30
|
+
*/
|
|
31
|
+
declare C: Point;
|
|
32
|
+
/**
|
|
33
|
+
* The bisector of A (∠BAC)
|
|
34
|
+
*/
|
|
35
|
+
declare bisector: ReturnType<typeof getBisector>;
|
|
36
|
+
|
|
37
|
+
constructor(
|
|
38
|
+
A: IPoint,
|
|
39
|
+
B: IPoint,
|
|
40
|
+
C: IPoint,
|
|
41
|
+
options: TProjectStrokeOnPointsOptions
|
|
42
|
+
) {
|
|
43
|
+
super(options);
|
|
44
|
+
this.A = new Point(A);
|
|
45
|
+
this.B = new Point(B);
|
|
46
|
+
this.C = new Point(C);
|
|
47
|
+
// First we calculate the bisector between the points. Used in `round` and `miter` cases
|
|
48
|
+
// When the stroke is uniform, scaling changes the arrangement of the points, so we have to take it into account
|
|
49
|
+
this.bisector = this.options.strokeUniform
|
|
50
|
+
? getBisector(
|
|
51
|
+
this.A.multiply(this.scale),
|
|
52
|
+
this.B.multiply(this.scale),
|
|
53
|
+
this.C.multiply(this.scale)
|
|
54
|
+
)
|
|
55
|
+
: getBisector(this.A, this.B, this.C);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get bisectorVector() {
|
|
59
|
+
return this.bisector.vector;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get bisectorAngle() {
|
|
63
|
+
return this.bisector.angle;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
calcOrthogonalProjection(
|
|
67
|
+
from: Point,
|
|
68
|
+
to: Point,
|
|
69
|
+
magnitude: number = this.strokeProjectionMagnitude
|
|
70
|
+
) {
|
|
71
|
+
const vector = this.createSideVector(from, to);
|
|
72
|
+
const orthogonalProjection = getOrthonormalVector(vector);
|
|
73
|
+
const correctSide = StrokeProjectionsBase.getAcuteAngleFactor(
|
|
74
|
+
orthogonalProjection,
|
|
75
|
+
this.bisectorVector
|
|
76
|
+
);
|
|
77
|
+
return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* BEVEL
|
|
82
|
+
* Calculation: the projection points are formed by the vector orthogonal to the vertex.
|
|
83
|
+
*
|
|
84
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel
|
|
85
|
+
*/
|
|
86
|
+
projectBevel() {
|
|
87
|
+
return [this.B, this.C].map((to) => this.projectOrthogonally(this.A, to));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* MITER
|
|
92
|
+
* Calculation: the corner is formed by extending the outer edges of the stroke
|
|
93
|
+
* at the tangents of the path segments until they intersect.
|
|
94
|
+
*
|
|
95
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter
|
|
96
|
+
*/
|
|
97
|
+
projectMiter() {
|
|
98
|
+
const alpha = Math.abs(this.bisectorAngle),
|
|
99
|
+
hypotUnitScalar = 1 / Math.sin(alpha / 2),
|
|
100
|
+
miterVector = this.scaleUnitVector(
|
|
101
|
+
this.bisectorVector,
|
|
102
|
+
-this.strokeProjectionMagnitude * hypotUnitScalar
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// When two line segments meet at a sharp angle, it is possible for the join to extend,
|
|
106
|
+
// far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes
|
|
107
|
+
// a limit on the extent of the line join.
|
|
108
|
+
// MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
|
|
109
|
+
// When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit
|
|
110
|
+
const strokeMiterLimit = this.options.strokeUniform
|
|
111
|
+
? hypotUnitScalar
|
|
112
|
+
: this.options.strokeMiterLimit;
|
|
113
|
+
|
|
114
|
+
if (
|
|
115
|
+
magnitude(miterVector) / this.strokeProjectionMagnitude <=
|
|
116
|
+
strokeMiterLimit
|
|
117
|
+
) {
|
|
118
|
+
return [this.applySkew(this.A.add(miterVector))];
|
|
119
|
+
} else {
|
|
120
|
+
// when the miter-limit is reached, the stroke line join becomes of type bevel
|
|
121
|
+
return this.projectBevel();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* ROUND (without skew)
|
|
127
|
+
* Calculation: the projections are the two vectors parallel to X and Y axes
|
|
128
|
+
*
|
|
129
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew
|
|
130
|
+
*/
|
|
131
|
+
private projectRoundNoSkew() {
|
|
132
|
+
// correctSide is used to only consider projecting for the outer side
|
|
133
|
+
const correctSide = new Point(
|
|
134
|
+
StrokeProjectionsBase.getAcuteAngleFactor(this.bisectorVector),
|
|
135
|
+
StrokeProjectionsBase.getAcuteAngleFactor(
|
|
136
|
+
new Point(this.bisectorVector.y, this.bisectorVector.x)
|
|
137
|
+
)
|
|
138
|
+
),
|
|
139
|
+
radiusOnAxisX = new Point(1, 0)
|
|
140
|
+
.scalarMultiply(this.strokeProjectionMagnitude)
|
|
141
|
+
.multiply(this.strokeUniformScalar)
|
|
142
|
+
.multiply(correctSide),
|
|
143
|
+
radiusOnAxisY = new Point(0, 1)
|
|
144
|
+
.scalarMultiply(this.strokeProjectionMagnitude)
|
|
145
|
+
.multiply(this.strokeUniformScalar)
|
|
146
|
+
.multiply(correctSide);
|
|
147
|
+
|
|
148
|
+
return [this.A.add(radiusOnAxisX), this.A.add(radiusOnAxisY)];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* ROUND (with skew)
|
|
153
|
+
* Calculation: the projections are the points furthest from the vertex in
|
|
154
|
+
* the direction of the X and Y axes after distortion.
|
|
155
|
+
*
|
|
156
|
+
* @todo TODO:
|
|
157
|
+
* - Consider only projections that are inside the beginning and end of the circle segment
|
|
158
|
+
*
|
|
159
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew
|
|
160
|
+
*/
|
|
161
|
+
private projectRoundWithSkew() {
|
|
162
|
+
const projections: Point[] = [];
|
|
163
|
+
|
|
164
|
+
// The start and end points of the circle segment
|
|
165
|
+
[this.B, this.C].forEach((to) =>
|
|
166
|
+
projections.push(this.projectOrthogonally(this.A, to))
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
const { skewX, skewY } = this.options;
|
|
170
|
+
// The points furthest from the vertex in the direction of the X and Y axes after distortion
|
|
171
|
+
const circleRadius = new Point()
|
|
172
|
+
.scalarAdd(this.strokeProjectionMagnitude)
|
|
173
|
+
.multiply(this.strokeUniformScalar),
|
|
174
|
+
newY =
|
|
175
|
+
circleRadius.y / Math.sqrt(1 + Math.tan(degreesToRadians(skewY)) ** 2),
|
|
176
|
+
furthestY = new Point(
|
|
177
|
+
Math.sqrt(
|
|
178
|
+
circleRadius.x ** 2 - ((newY * circleRadius.x) / circleRadius.y) ** 2
|
|
179
|
+
),
|
|
180
|
+
newY
|
|
181
|
+
),
|
|
182
|
+
newX =
|
|
183
|
+
circleRadius.x / Math.sqrt(1 + Math.tan(degreesToRadians(skewX)) ** 2),
|
|
184
|
+
furthestX = new Point(
|
|
185
|
+
newX,
|
|
186
|
+
Math.sqrt(newY ** 2 - ((newX * newY) / circleRadius.x) ** 2)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
[furthestX, furthestY].forEach((vector) => {
|
|
190
|
+
projections.push(
|
|
191
|
+
this.applySkew(this.A.add(vector)),
|
|
192
|
+
this.applySkew(this.A.subtract(vector))
|
|
193
|
+
);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
return projections;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
projectRound() {
|
|
200
|
+
if (!this.isSkewed()) {
|
|
201
|
+
return this.projectRoundNoSkew();
|
|
202
|
+
} else {
|
|
203
|
+
return this.projectRoundWithSkew();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Project stroke width on points returning projections for each point as follows:
|
|
209
|
+
* - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)
|
|
210
|
+
* - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.
|
|
211
|
+
* - `round`: same as `bevel` when it has no skew, with skew are 4 points.
|
|
212
|
+
*/
|
|
213
|
+
protected projectPoints() {
|
|
214
|
+
switch (this.options.strokeLineJoin) {
|
|
215
|
+
case 'miter':
|
|
216
|
+
return this.projectMiter();
|
|
217
|
+
case 'round':
|
|
218
|
+
return this.projectRound();
|
|
219
|
+
default:
|
|
220
|
+
return this.projectBevel();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public project(): TProjection[] {
|
|
225
|
+
return this.projectPoints().map((point) => ({
|
|
226
|
+
originPoint: this.A,
|
|
227
|
+
projectedPoint: point,
|
|
228
|
+
bisector: this.bisector,
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { halfPI } from '../../../constants';
|
|
2
|
+
import { IPoint, Point } from '../../../Point';
|
|
3
|
+
import { degreesToRadians } from '../radiansDegreesConversion';
|
|
4
|
+
import {
|
|
5
|
+
calcAngleBetweenVectors,
|
|
6
|
+
calcVectorRotation,
|
|
7
|
+
createVector,
|
|
8
|
+
} from '../vectors';
|
|
9
|
+
import { TProjectStrokeOnPointsOptions, TProjection } from './types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344
|
|
13
|
+
*/
|
|
14
|
+
export abstract class StrokeProjectionsBase {
|
|
15
|
+
declare options: TProjectStrokeOnPointsOptions;
|
|
16
|
+
declare scale: Point;
|
|
17
|
+
declare strokeUniformScalar: Point;
|
|
18
|
+
declare strokeProjectionMagnitude: number;
|
|
19
|
+
|
|
20
|
+
static getAcuteAngleFactor(vector1: Point, vector2?: Point) {
|
|
21
|
+
const angle = vector2
|
|
22
|
+
? calcAngleBetweenVectors(vector1, vector2)
|
|
23
|
+
: calcVectorRotation(vector1);
|
|
24
|
+
return Math.abs(angle) < halfPI ? -1 : 1;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
constructor(options: TProjectStrokeOnPointsOptions) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.strokeProjectionMagnitude = this.options.strokeWidth / 2;
|
|
30
|
+
this.scale = new Point(this.options.scaleX, this.options.scaleY);
|
|
31
|
+
this.strokeUniformScalar = this.options.strokeUniform
|
|
32
|
+
? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)
|
|
33
|
+
: new Point(1, 1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.
|
|
38
|
+
*/
|
|
39
|
+
protected createSideVector(from: IPoint, to: IPoint) {
|
|
40
|
+
const v = createVector(from, to);
|
|
41
|
+
return this.options.strokeUniform ? v.multiply(this.scale) : v;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected abstract calcOrthogonalProjection(
|
|
45
|
+
from: Point,
|
|
46
|
+
to: Point,
|
|
47
|
+
magnitude?: number
|
|
48
|
+
): Point;
|
|
49
|
+
|
|
50
|
+
protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {
|
|
51
|
+
return this.applySkew(
|
|
52
|
+
from.add(this.calcOrthogonalProjection(from, to, magnitude))
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected isSkewed() {
|
|
57
|
+
return this.options.skewX !== 0 || this.options.skewY !== 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected applySkew(point: Point) {
|
|
61
|
+
const p = new Point(point);
|
|
62
|
+
// skewY must be applied before skewX as this distortion affects skewX calculation
|
|
63
|
+
p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));
|
|
64
|
+
p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));
|
|
65
|
+
return p;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected scaleUnitVector(unitVector: Point, scalar: number) {
|
|
69
|
+
return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected abstract projectPoints(): Point[];
|
|
73
|
+
|
|
74
|
+
public abstract project(): TProjection[];
|
|
75
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { IPoint } from '../../../Point';
|
|
2
|
+
import { StrokeLineCapProjections } from './StrokeLineCapProjections';
|
|
3
|
+
import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
|
|
4
|
+
import { TProjection, TProjectStrokeOnPointsOptions } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* Used to calculate object's bounding box
|
|
9
|
+
*
|
|
10
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export const projectStrokeOnPoints = (
|
|
14
|
+
points: IPoint[],
|
|
15
|
+
options: TProjectStrokeOnPointsOptions,
|
|
16
|
+
openPath = false
|
|
17
|
+
): TProjection[] => {
|
|
18
|
+
const projections: TProjection[] = [];
|
|
19
|
+
|
|
20
|
+
if (points.length <= 1) {
|
|
21
|
+
return projections;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
points.forEach((A, index) => {
|
|
25
|
+
let B: IPoint, C: IPoint;
|
|
26
|
+
if (index === 0) {
|
|
27
|
+
C = points[1];
|
|
28
|
+
B = openPath ? A : points[points.length - 1];
|
|
29
|
+
} else if (index === points.length - 1) {
|
|
30
|
+
B = points[index - 1];
|
|
31
|
+
C = openPath ? A : points[0];
|
|
32
|
+
} else {
|
|
33
|
+
B = points[index - 1];
|
|
34
|
+
C = points[index + 1];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (openPath && (index === 0 || index === points.length - 1)) {
|
|
38
|
+
projections.push(
|
|
39
|
+
...new StrokeLineCapProjections(
|
|
40
|
+
A,
|
|
41
|
+
index === 0 ? C : B,
|
|
42
|
+
options
|
|
43
|
+
).project()
|
|
44
|
+
);
|
|
45
|
+
} else {
|
|
46
|
+
projections.push(
|
|
47
|
+
...new StrokeLineJoinProjections(A, B, C, options).project()
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return projections;
|
|
53
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Point } from '../../../Point';
|
|
2
|
+
import { TDegree } from '../../../typedefs';
|
|
3
|
+
import { getBisector } from '../vectors';
|
|
4
|
+
|
|
5
|
+
export type TProjectStrokeOnPointsOptions = {
|
|
6
|
+
strokeWidth: number;
|
|
7
|
+
strokeLineCap: CanvasLineCap;
|
|
8
|
+
strokeLineJoin: CanvasLineJoin;
|
|
9
|
+
/**
|
|
10
|
+
* https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
|
|
11
|
+
*/
|
|
12
|
+
strokeMiterLimit: number;
|
|
13
|
+
strokeUniform: boolean;
|
|
14
|
+
scaleX: number;
|
|
15
|
+
scaleY: number;
|
|
16
|
+
skewX: TDegree;
|
|
17
|
+
skewY: TDegree;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type TProjection = {
|
|
21
|
+
projectedPoint: Point;
|
|
22
|
+
originPoint: Point;
|
|
23
|
+
bisector?: ReturnType<typeof getBisector>;
|
|
24
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TRadian, TDegree } from '../../typedefs';
|
|
2
|
+
import { PiBy180 } from '../../constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Transforms degrees to radians.
|
|
6
|
+
* @param {TDegree} degrees value in degrees
|
|
7
|
+
* @return {TRadian} value in radians
|
|
8
|
+
*/
|
|
9
|
+
export const degreesToRadians = (degrees: TDegree): TRadian =>
|
|
10
|
+
(degrees * PiBy180) as TRadian;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Transforms radians to degrees.
|
|
14
|
+
* @param {TRadian} radians value in radians
|
|
15
|
+
* @return {TDegree} value in degrees
|
|
16
|
+
*/
|
|
17
|
+
export const radiansToDegrees = (radians: TRadian): TDegree =>
|
|
18
|
+
(radians / PiBy180) as TDegree;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TOriginX, TOriginY } from '../../typedefs';
|
|
2
|
+
|
|
3
|
+
const originOffset = {
|
|
4
|
+
left: -0.5,
|
|
5
|
+
top: -0.5,
|
|
6
|
+
center: 0,
|
|
7
|
+
bottom: 0.5,
|
|
8
|
+
right: 0.5,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Resolves origin value relative to center
|
|
12
|
+
* @private
|
|
13
|
+
* @param {TOriginX | TOriginY} originValue originX / originY
|
|
14
|
+
* @returns number
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const resolveOrigin = (
|
|
18
|
+
originValue: TOriginX | TOriginY | number
|
|
19
|
+
): number =>
|
|
20
|
+
typeof originValue === 'string'
|
|
21
|
+
? originOffset[originValue]
|
|
22
|
+
: originValue - 0.5;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Point } from '../../Point';
|
|
2
|
+
import type { TRadian } from '../../typedefs';
|
|
3
|
+
/**
|
|
4
|
+
* Rotates `point` around `origin` with `radians`
|
|
5
|
+
* @deprecated use the Point.rotate
|
|
6
|
+
* @param {Point} origin The origin of the rotation
|
|
7
|
+
* @param {Point} origin The origin of the rotation
|
|
8
|
+
* @param {TRadian} radians The radians of the angle for the rotation
|
|
9
|
+
* @return {Point} The new rotated point
|
|
10
|
+
*/
|
|
11
|
+
export const rotatePoint = (
|
|
12
|
+
point: Point,
|
|
13
|
+
origin: Point,
|
|
14
|
+
radians: TRadian
|
|
15
|
+
): Point => point.rotate(radians, origin);
|