fabric 6.2.0 → 6.3.0
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/.prettierignore +1 -0
- package/CHANGELOG.md +12 -4
- package/README.md +1 -1
- package/dist/extensions/aligning_guidelines/constant.d.ts +3 -0
- package/dist/extensions/aligning_guidelines/constant.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/index.d.ts +5 -0
- package/dist/extensions/aligning_guidelines/index.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts +33 -0
- package/dist/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts +4 -0
- package/dist/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
- package/dist/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
- package/dist/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts +6 -0
- package/dist/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
- package/dist/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +2 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/index.js +140 -108
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +140 -108
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +140 -108
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +140 -108
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/ClassRegistry.min.mjs.map +1 -1
- package/dist/src/ClassRegistry.mjs.map +1 -1
- package/dist/src/Collection.min.mjs.map +1 -1
- package/dist/src/Collection.mjs.map +1 -1
- package/dist/src/Intersection.min.mjs.map +1 -1
- package/dist/src/Intersection.mjs.map +1 -1
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.min.mjs.map +1 -1
- package/dist/src/LayoutManager/ActiveSelectionLayoutManager.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.d.ts +1 -1
- package/dist/src/LayoutManager/LayoutManager.d.ts.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.mjs +1 -1
- package/dist/src/LayoutManager/LayoutManager.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/FixedLayout.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/utils.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/utils.mjs.map +1 -1
- package/dist/src/LayoutManager/types.d.ts.map +1 -1
- package/dist/src/Observable.min.mjs.map +1 -1
- package/dist/src/Observable.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.d.ts +2 -2
- package/dist/src/Pattern/Pattern.d.ts.map +1 -1
- package/dist/src/Pattern/Pattern.min.mjs +1 -1
- package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.mjs +14 -12
- package/dist/src/Pattern/Pattern.mjs.map +1 -1
- package/dist/src/Point.min.mjs.map +1 -1
- package/dist/src/Point.mjs.map +1 -1
- package/dist/src/Shadow.min.mjs.map +1 -1
- package/dist/src/Shadow.mjs.map +1 -1
- package/dist/src/brushes/CircleBrush.min.mjs.map +1 -1
- package/dist/src/brushes/CircleBrush.mjs.map +1 -1
- package/dist/src/brushes/PatternBrush.min.mjs.map +1 -1
- package/dist/src/brushes/PatternBrush.mjs.map +1 -1
- package/dist/src/brushes/PencilBrush.min.mjs.map +1 -1
- package/dist/src/brushes/PencilBrush.mjs.map +1 -1
- package/dist/src/brushes/SprayBrush.min.mjs.map +1 -1
- package/dist/src/brushes/SprayBrush.mjs.map +1 -1
- package/dist/src/canvas/Canvas.d.ts +1 -1
- package/dist/src/canvas/Canvas.d.ts.map +1 -1
- package/dist/src/canvas/Canvas.min.mjs.map +1 -1
- package/dist/src/canvas/Canvas.mjs +2 -1
- package/dist/src/canvas/Canvas.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/CanvasDOMManager.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/StaticCanvasDOMManager.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/util.min.mjs.map +1 -1
- package/dist/src/canvas/DOMManagers/util.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.mjs +1 -1
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvasOptions.mjs.map +1 -1
- package/dist/src/canvas/TextEditingManager.min.mjs.map +1 -1
- package/dist/src/canvas/TextEditingManager.mjs.map +1 -1
- package/dist/src/color/Color.d.ts.map +1 -1
- package/dist/src/color/Color.min.mjs.map +1 -1
- package/dist/src/color/Color.mjs +1 -0
- package/dist/src/color/Color.mjs.map +1 -1
- package/dist/src/color/util.min.mjs.map +1 -1
- package/dist/src/color/util.mjs.map +1 -1
- package/dist/src/config.min.mjs.map +1 -1
- package/dist/src/config.mjs.map +1 -1
- package/dist/src/controls/Control.min.mjs.map +1 -1
- package/dist/src/controls/Control.mjs.map +1 -1
- package/dist/src/controls/changeWidth.min.mjs.map +1 -1
- package/dist/src/controls/changeWidth.mjs.map +1 -1
- package/dist/src/controls/controlRendering.min.mjs.map +1 -1
- package/dist/src/controls/controlRendering.mjs.map +1 -1
- package/dist/src/controls/drag.min.mjs.map +1 -1
- package/dist/src/controls/drag.mjs.map +1 -1
- package/dist/src/controls/fireEvent.min.mjs.map +1 -1
- package/dist/src/controls/fireEvent.mjs.map +1 -1
- package/dist/src/controls/pathControl.min.mjs.map +1 -1
- package/dist/src/controls/pathControl.mjs.map +1 -1
- package/dist/src/controls/polyControl.min.mjs.map +1 -1
- package/dist/src/controls/polyControl.mjs.map +1 -1
- package/dist/src/controls/rotate.min.mjs.map +1 -1
- package/dist/src/controls/rotate.mjs.map +1 -1
- package/dist/src/controls/scale.min.mjs.map +1 -1
- package/dist/src/controls/scale.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.min.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.mjs.map +1 -1
- package/dist/src/controls/skew.min.mjs.map +1 -1
- package/dist/src/controls/skew.mjs.map +1 -1
- package/dist/src/controls/util.min.mjs.map +1 -1
- package/dist/src/controls/util.mjs.map +1 -1
- package/dist/src/controls/wrapWithFireEvent.min.mjs.map +1 -1
- package/dist/src/controls/wrapWithFireEvent.mjs.map +1 -1
- package/dist/src/controls/wrapWithFixedAnchor.min.mjs.map +1 -1
- package/dist/src/controls/wrapWithFixedAnchor.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.d.ts +5 -5
- package/dist/src/filters/BaseFilter.d.ts.map +1 -1
- package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.mjs +5 -5
- package/dist/src/filters/BaseFilter.mjs.map +1 -1
- package/dist/src/filters/BlendColor.min.mjs.map +1 -1
- package/dist/src/filters/BlendColor.mjs.map +1 -1
- package/dist/src/filters/BlendImage.min.mjs.map +1 -1
- package/dist/src/filters/BlendImage.mjs.map +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Brightness.min.mjs.map +1 -1
- package/dist/src/filters/Brightness.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
- package/dist/src/filters/Composed.min.mjs.map +1 -1
- package/dist/src/filters/Composed.mjs.map +1 -1
- package/dist/src/filters/Contrast.min.mjs.map +1 -1
- package/dist/src/filters/Contrast.mjs.map +1 -1
- package/dist/src/filters/Convolute.min.mjs.map +1 -1
- package/dist/src/filters/Convolute.mjs.map +1 -1
- package/dist/src/filters/GLProbes/WebGLProbe.min.mjs.map +1 -1
- package/dist/src/filters/GLProbes/WebGLProbe.mjs.map +1 -1
- package/dist/src/filters/Gamma.min.mjs.map +1 -1
- package/dist/src/filters/Gamma.mjs.map +1 -1
- package/dist/src/filters/Grayscale.min.mjs.map +1 -1
- package/dist/src/filters/Grayscale.mjs.map +1 -1
- package/dist/src/filters/Invert.min.mjs.map +1 -1
- package/dist/src/filters/Invert.mjs.map +1 -1
- package/dist/src/filters/Noise.min.mjs.map +1 -1
- package/dist/src/filters/Noise.mjs.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.mjs.map +1 -1
- package/dist/src/filters/Resize.min.mjs.map +1 -1
- package/dist/src/filters/Resize.mjs.map +1 -1
- package/dist/src/filters/Saturation.min.mjs.map +1 -1
- package/dist/src/filters/Saturation.mjs.map +1 -1
- package/dist/src/filters/Vibrance.min.mjs.map +1 -1
- package/dist/src/filters/Vibrance.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
- package/dist/src/filters/typedefs.d.ts +0 -1
- package/dist/src/filters/typedefs.d.ts.map +1 -1
- package/dist/src/filters/utils.min.mjs.map +1 -1
- package/dist/src/filters/utils.mjs.map +1 -1
- package/dist/src/gradient/Gradient.d.ts +7 -3
- package/dist/src/gradient/Gradient.d.ts.map +1 -1
- package/dist/src/gradient/Gradient.min.mjs +1 -1
- package/dist/src/gradient/Gradient.min.mjs.map +1 -1
- package/dist/src/gradient/Gradient.mjs +36 -24
- package/dist/src/gradient/Gradient.mjs.map +1 -1
- package/dist/src/gradient/parser/parseColorStops.min.mjs.map +1 -1
- package/dist/src/gradient/parser/parseColorStops.mjs.map +1 -1
- package/dist/src/gradient/parser/parseCoords.d.ts.map +1 -1
- package/dist/src/gradient/parser/parseCoords.min.mjs.map +1 -1
- package/dist/src/gradient/parser/parseCoords.mjs.map +1 -1
- package/dist/src/parser/applyViewboxTransform.min.mjs.map +1 -1
- package/dist/src/parser/applyViewboxTransform.mjs.map +1 -1
- package/dist/src/parser/constants.min.mjs.map +1 -1
- package/dist/src/parser/constants.mjs.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/parser/getCSSRules.min.mjs.map +1 -1
- package/dist/src/parser/getCSSRules.mjs.map +1 -1
- package/dist/src/parser/getGlobalStylesForElement.min.mjs.map +1 -1
- package/dist/src/parser/getGlobalStylesForElement.mjs.map +1 -1
- package/dist/src/parser/getGradientDefs.min.mjs.map +1 -1
- package/dist/src/parser/getGradientDefs.mjs.map +1 -1
- package/dist/src/parser/getMultipleNodes.min.mjs.map +1 -1
- package/dist/src/parser/getMultipleNodes.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromString.min.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromString.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromURL.min.mjs.map +1 -1
- package/dist/src/parser/loadSVGFromURL.mjs.map +1 -1
- package/dist/src/parser/normalizeAttr.min.mjs.map +1 -1
- package/dist/src/parser/normalizeAttr.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.min.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.mjs.map +1 -1
- package/dist/src/parser/parseAttributes.min.mjs.map +1 -1
- package/dist/src/parser/parseAttributes.mjs.map +1 -1
- package/dist/src/parser/parseFontDeclaration.min.mjs.map +1 -1
- package/dist/src/parser/parseFontDeclaration.mjs.map +1 -1
- package/dist/src/parser/parseSVGDocument.min.mjs.map +1 -1
- package/dist/src/parser/parseSVGDocument.mjs.map +1 -1
- package/dist/src/parser/parseStyleObject.min.mjs.map +1 -1
- package/dist/src/parser/parseStyleObject.mjs.map +1 -1
- package/dist/src/parser/parseStyleString.min.mjs.map +1 -1
- package/dist/src/parser/parseStyleString.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.min.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.mjs.map +1 -1
- package/dist/src/parser/parseUseDirectives.min.mjs.map +1 -1
- package/dist/src/parser/parseUseDirectives.mjs.map +1 -1
- package/dist/src/parser/percent.min.mjs.map +1 -1
- package/dist/src/parser/percent.mjs.map +1 -1
- package/dist/src/parser/recursivelyParseGradientsXlink.min.mjs.map +1 -1
- package/dist/src/parser/recursivelyParseGradientsXlink.mjs.map +1 -1
- package/dist/src/parser/setStrokeFillOpacity.min.mjs.map +1 -1
- package/dist/src/parser/setStrokeFillOpacity.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
- package/dist/src/shapes/Circle.min.mjs.map +1 -1
- package/dist/src/shapes/Circle.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts +2 -2
- package/dist/src/shapes/Group.d.ts.map +1 -1
- package/dist/src/shapes/Group.min.mjs.map +1 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs +2 -2
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextClickBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs.map +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Line.min.mjs.map +1 -1
- package/dist/src/shapes/Line.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObject.mjs +2 -1
- package/dist/src/shapes/Object/FabricObject.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts +13 -13
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +13 -13
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +4 -4
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +10 -14
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectOrigin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectOrigin.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
- package/dist/src/shapes/Path.min.mjs.map +1 -1
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Polyline.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.min.mjs +1 -1
- package/dist/src/shapes/Polyline.min.mjs.map +1 -1
- package/dist/src/shapes/Polyline.mjs +10 -2
- package/dist/src/shapes/Polyline.mjs.map +1 -1
- package/dist/src/shapes/Rect.min.mjs.map +1 -1
- package/dist/src/shapes/Rect.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.min.mjs.map +1 -1
- package/dist/src/shapes/Text/StyledText.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs +1 -1
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Textbox.min.mjs.map +1 -1
- package/dist/src/shapes/Textbox.mjs.map +1 -1
- package/dist/src/shapes/Triangle.min.mjs.map +1 -1
- package/dist/src/shapes/Triangle.mjs.map +1 -1
- package/dist/src/util/animation/AnimationBase.min.mjs.map +1 -1
- package/dist/src/util/animation/AnimationBase.mjs.map +1 -1
- package/dist/src/util/animation/AnimationRegistry.min.mjs.map +1 -1
- package/dist/src/util/animation/AnimationRegistry.mjs.map +1 -1
- package/dist/src/util/animation/ArrayAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ArrayAnimation.mjs.map +1 -1
- package/dist/src/util/animation/ColorAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ColorAnimation.mjs.map +1 -1
- package/dist/src/util/animation/ValueAnimation.min.mjs.map +1 -1
- package/dist/src/util/animation/ValueAnimation.mjs.map +1 -1
- package/dist/src/util/animation/animate.d.ts.map +1 -1
- package/dist/src/util/animation/animate.min.mjs.map +1 -1
- package/dist/src/util/animation/animate.mjs.map +1 -1
- package/dist/src/util/animation/easing.min.mjs.map +1 -1
- package/dist/src/util/animation/easing.mjs.map +1 -1
- package/dist/src/util/animation/types.d.ts.map +1 -1
- package/dist/src/util/applyMixins.min.mjs.map +1 -1
- package/dist/src/util/applyMixins.mjs.map +1 -1
- package/dist/src/util/dom_style.min.mjs.map +1 -1
- package/dist/src/util/dom_style.mjs.map +1 -1
- package/dist/src/util/internals/cloneDeep.d.ts +6 -0
- package/dist/src/util/internals/cloneDeep.d.ts.map +1 -1
- package/dist/src/util/internals/cloneStyles.d.ts +3 -0
- package/dist/src/util/internals/cloneStyles.d.ts.map +1 -0
- package/dist/src/util/internals/cloneStyles.min.mjs +2 -0
- package/dist/src/util/internals/cloneStyles.min.mjs.map +1 -0
- package/dist/src/util/internals/cloneStyles.mjs +15 -0
- package/dist/src/util/internals/cloneStyles.mjs.map +1 -0
- package/dist/src/util/internals/findRight.min.mjs.map +1 -1
- package/dist/src/util/internals/findRight.mjs.map +1 -1
- package/dist/src/util/misc/boundingBoxFromPoints.min.mjs.map +1 -1
- package/dist/src/util/misc/boundingBoxFromPoints.mjs.map +1 -1
- package/dist/src/util/misc/dom.min.mjs.map +1 -1
- package/dist/src/util/misc/dom.mjs.map +1 -1
- package/dist/src/util/misc/findScaleTo.min.mjs.map +1 -1
- package/dist/src/util/misc/findScaleTo.mjs.map +1 -1
- package/dist/src/util/misc/groupSVGElements.min.mjs.map +1 -1
- package/dist/src/util/misc/groupSVGElements.mjs.map +1 -1
- package/dist/src/util/misc/isTransparent.min.mjs.map +1 -1
- package/dist/src/util/misc/isTransparent.mjs.map +1 -1
- package/dist/src/util/misc/matrix.min.mjs.map +1 -1
- package/dist/src/util/misc/matrix.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/dist/src/util/misc/objectTransforms.min.mjs.map +1 -1
- package/dist/src/util/misc/objectTransforms.mjs.map +1 -1
- package/dist/src/util/misc/pick.min.mjs.map +1 -1
- package/dist/src/util/misc/pick.mjs.map +1 -1
- package/dist/src/util/misc/planeChange.min.mjs.map +1 -1
- package/dist/src/util/misc/planeChange.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/index.min.mjs.map +1 -1
- package/dist/src/util/misc/projectStroke/index.mjs.map +1 -1
- package/dist/src/util/misc/resolveOrigin.min.mjs.map +1 -1
- package/dist/src/util/misc/resolveOrigin.mjs.map +1 -1
- package/dist/src/util/misc/rotatePoint.min.mjs.map +1 -1
- package/dist/src/util/misc/rotatePoint.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.mjs.map +1 -1
- package/dist/src/util/misc/textStyles.min.mjs +1 -1
- package/dist/src/util/misc/textStyles.min.mjs.map +1 -1
- package/dist/src/util/misc/textStyles.mjs +3 -3
- package/dist/src/util/misc/textStyles.mjs.map +1 -1
- package/dist/src/util/misc/vectors.min.mjs.map +1 -1
- package/dist/src/util/misc/vectors.mjs.map +1 -1
- package/dist/src/util/path/index.min.mjs.map +1 -1
- package/dist/src/util/path/index.mjs.map +1 -1
- package/dist/src/util/path/typedefs.d.ts.map +1 -1
- package/dist/src/util/transform_matrix_removal.min.mjs.map +1 -1
- package/dist/src/util/transform_matrix_removal.mjs.map +1 -1
- package/dist/src/util/typeAssertions.min.mjs.map +1 -1
- package/dist/src/util/typeAssertions.mjs.map +1 -1
- package/dist-extensions/aligning_guidelines/constant.mjs +11 -0
- package/dist-extensions/aligning_guidelines/constant.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/index.mjs +130 -0
- package/dist-extensions/aligning_guidelines/index.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs +11 -0
- package/dist-extensions/aligning_guidelines/util/basic.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs +193 -0
- package/dist-extensions/aligning_guidelines/util/collect-line.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs +102 -0
- package/dist-extensions/aligning_guidelines/util/collect-point.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs +75 -0
- package/dist-extensions/aligning_guidelines/util/draw.mjs.map +1 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs +42 -0
- package/dist-extensions/aligning_guidelines/util/get-objects-by-target.mjs.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts +3 -0
- package/dist-extensions/extensions/aligning_guidelines/constant.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts +5 -0
- package/dist-extensions/extensions/aligning_guidelines/index.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts +33 -0
- package/dist-extensions/extensions/aligning_guidelines/typedefs.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts +4 -0
- package/dist-extensions/extensions/aligning_guidelines/util/basic.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts +13 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-line.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts +20 -0
- package/dist-extensions/extensions/aligning_guidelines/util/collect-point.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts +6 -0
- package/dist-extensions/extensions/aligning_guidelines/util/draw.d.ts.map +1 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts +3 -0
- package/dist-extensions/extensions/aligning_guidelines/util/get-objects-by-target.d.ts.map +1 -0
- package/dist-extensions/extensions/index.d.ts +2 -0
- package/dist-extensions/extensions/index.d.ts.map +1 -0
- package/dist-extensions/fabric-extensions.min.js +2 -0
- package/dist-extensions/fabric-extensions.min.js.map +1 -0
- package/dist-extensions/fabric.d.ts +119 -0
- package/dist-extensions/fabric.d.ts.map +1 -0
- package/dist-extensions/index.d.ts +2 -0
- package/dist-extensions/index.d.ts.map +1 -0
- package/dist-extensions/index.mjs +2 -0
- package/dist-extensions/index.mjs.map +1 -0
- package/dist-extensions/src/ClassRegistry.d.ts +14 -0
- package/dist-extensions/src/ClassRegistry.d.ts.map +1 -0
- package/dist-extensions/src/Collection.d.ts +141 -0
- package/dist-extensions/src/Collection.d.ts.map +1 -0
- package/dist-extensions/src/CommonMethods.d.ts +32 -0
- package/dist-extensions/src/CommonMethods.d.ts.map +1 -0
- package/dist-extensions/src/EventTypeDefs.d.ts +286 -0
- package/dist-extensions/src/EventTypeDefs.d.ts.map +1 -0
- package/dist-extensions/src/Intersection.d.ts +120 -0
- package/dist-extensions/src/Intersection.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts +22 -0
- package/dist-extensions/src/LayoutManager/ActiveSelectionLayoutManager.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts +56 -0
- package/dist-extensions/src/LayoutManager/LayoutManager.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts +13 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/ClipPathLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts +14 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FitContentLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts +14 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/FixedLayout.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +30 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts +10 -0
- package/dist-extensions/src/LayoutManager/LayoutStrategies/utils.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts +7 -0
- package/dist-extensions/src/LayoutManager/constants.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/index.d.ts +7 -0
- package/dist-extensions/src/LayoutManager/index.d.ts.map +1 -0
- package/dist-extensions/src/LayoutManager/types.d.ts +106 -0
- package/dist-extensions/src/LayoutManager/types.d.ts.map +1 -0
- package/dist-extensions/src/Observable.d.ts +68 -0
- package/dist-extensions/src/Observable.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts +99 -0
- package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/index.d.ts +3 -0
- package/dist-extensions/src/Pattern/index.d.ts.map +1 -0
- package/dist-extensions/src/Pattern/types.d.ts +12 -0
- package/dist-extensions/src/Pattern/types.d.ts.map +1 -0
- package/dist-extensions/src/Point.d.ts +233 -0
- package/dist-extensions/src/Point.d.ts.map +1 -0
- package/dist-extensions/src/Shadow.d.ts +95 -0
- package/dist-extensions/src/Shadow.d.ts.map +1 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts +101 -0
- package/dist-extensions/src/brushes/BaseBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts +44 -0
- package/dist-extensions/src/brushes/CircleBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts +23 -0
- package/dist-extensions/src/brushes/PatternBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts +92 -0
- package/dist-extensions/src/brushes/PencilBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts +74 -0
- package/dist-extensions/src/brushes/SprayBrush.d.ts.map +1 -0
- package/dist-extensions/src/brushes/typedefs.d.ts +18 -0
- package/dist-extensions/src/brushes/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/cache.d.ts +47 -0
- package/dist-extensions/src/cache.d.ts.map +1 -0
- package/dist-extensions/src/canvas/Canvas.d.ts +339 -0
- package/dist-extensions/src/canvas/Canvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts +229 -0
- package/dist-extensions/src/canvas/CanvasOptions.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts +29 -0
- package/dist-extensions/src/canvas/DOMManagers/CanvasDOMManager.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts +29 -0
- package/dist-extensions/src/canvas/DOMManagers/StaticCanvasDOMManager.d.ts.map +1 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts +24 -0
- package/dist-extensions/src/canvas/DOMManagers/util.d.ts.map +1 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts +534 -0
- package/dist-extensions/src/canvas/SelectableCanvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts +639 -0
- package/dist-extensions/src/canvas/StaticCanvas.d.ts.map +1 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts +153 -0
- package/dist-extensions/src/canvas/StaticCanvasOptions.d.ts.map +1 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts +21 -0
- package/dist-extensions/src/canvas/TextEditingManager.d.ts.map +1 -0
- package/dist-extensions/src/color/Color.d.ts +162 -0
- package/dist-extensions/src/color/Color.d.ts.map +1 -0
- package/dist-extensions/src/color/color_map.d.ts +155 -0
- package/dist-extensions/src/color/color_map.d.ts.map +1 -0
- package/dist-extensions/src/color/constants.d.ts +111 -0
- package/dist-extensions/src/color/constants.d.ts.map +1 -0
- package/dist-extensions/src/color/typedefs.d.ts +16 -0
- package/dist-extensions/src/color/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/color/util.d.ts +27 -0
- package/dist-extensions/src/color/util.d.ts.map +1 -0
- package/dist-extensions/src/config.d.ts +115 -0
- package/dist-extensions/src/config.d.ts.map +1 -0
- package/dist-extensions/src/constants.d.ts +35 -0
- package/dist-extensions/src/constants.d.ts.map +1 -0
- package/dist-extensions/src/controls/Control.d.ts +229 -0
- package/dist-extensions/src/controls/Control.d.ts.map +1 -0
- package/dist-extensions/src/controls/changeWidth.d.ts +13 -0
- package/dist-extensions/src/controls/changeWidth.d.ts.map +1 -0
- package/dist-extensions/src/controls/commonControls.d.ts +28 -0
- package/dist-extensions/src/controls/commonControls.d.ts.map +1 -0
- package/dist-extensions/src/controls/controlRendering.d.ts +29 -0
- package/dist-extensions/src/controls/controlRendering.d.ts.map +1 -0
- package/dist-extensions/src/controls/drag.d.ts +12 -0
- package/dist-extensions/src/controls/drag.d.ts.map +1 -0
- package/dist-extensions/src/controls/fireEvent.d.ts +3 -0
- package/dist-extensions/src/controls/fireEvent.d.ts.map +1 -0
- package/dist-extensions/src/controls/index.d.ts +14 -0
- package/dist-extensions/src/controls/index.d.ts.map +1 -0
- package/dist-extensions/src/controls/pathControl.d.ts +12 -0
- package/dist-extensions/src/controls/pathControl.d.ts.map +1 -0
- package/dist-extensions/src/controls/polyControl.d.ts +30 -0
- package/dist-extensions/src/controls/polyControl.d.ts.map +1 -0
- package/dist-extensions/src/controls/rotate.d.ts +12 -0
- package/dist-extensions/src/controls/rotate.d.ts.map +1 -0
- package/dist-extensions/src/controls/scale.d.ts +47 -0
- package/dist-extensions/src/controls/scale.d.ts.map +1 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts +39 -0
- package/dist-extensions/src/controls/scaleSkew.d.ts.map +1 -0
- package/dist-extensions/src/controls/skew.d.ts +33 -0
- package/dist-extensions/src/controls/skew.d.ts.map +1 -0
- package/dist-extensions/src/controls/util.d.ts +41 -0
- package/dist-extensions/src/controls/util.d.ts.map +1 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts +10 -0
- package/dist-extensions/src/controls/wrapWithFireEvent.d.ts.map +1 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist-extensions/src/controls/wrapWithFixedAnchor.d.ts.map +1 -0
- package/dist-extensions/src/env/browser.d.ts +3 -0
- package/dist-extensions/src/env/browser.d.ts.map +1 -0
- package/dist-extensions/src/env/index.d.ts +34 -0
- package/dist-extensions/src/env/index.d.ts.map +1 -0
- package/dist-extensions/src/env/types.d.ts +16 -0
- package/dist-extensions/src/env/types.d.ts.map +1 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts +153 -0
- package/dist-extensions/src/filters/BaseFilter.d.ts.map +1 -0
- package/dist-extensions/src/filters/BlendColor.d.ts +68 -0
- package/dist-extensions/src/filters/BlendColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/BlendImage.d.ts +99 -0
- package/dist-extensions/src/filters/BlendImage.d.ts.map +1 -0
- package/dist-extensions/src/filters/Blur.d.ts +50 -0
- package/dist-extensions/src/filters/Blur.d.ts.map +1 -0
- package/dist-extensions/src/filters/Brightness.d.ts +46 -0
- package/dist-extensions/src/filters/Brightness.d.ts.map +1 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist-extensions/src/filters/Canvas2dFilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts +66 -0
- package/dist-extensions/src/filters/ColorMatrix.d.ts.map +1 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts +15 -0
- package/dist-extensions/src/filters/ColorMatrixFilters.d.ts.map +1 -0
- package/dist-extensions/src/filters/Composed.d.ts +47 -0
- package/dist-extensions/src/filters/Composed.d.ts.map +1 -0
- package/dist-extensions/src/filters/Contrast.d.ts +44 -0
- package/dist-extensions/src/filters/Contrast.d.ts.map +1 -0
- package/dist-extensions/src/filters/Convolute.d.ts +81 -0
- package/dist-extensions/src/filters/Convolute.d.ts.map +1 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts +15 -0
- package/dist-extensions/src/filters/FilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts +7 -0
- package/dist-extensions/src/filters/GLProbes/GLProbe.d.ts.map +1 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist-extensions/src/filters/GLProbes/WebGLProbe.d.ts.map +1 -0
- package/dist-extensions/src/filters/Gamma.d.ts +58 -0
- package/dist-extensions/src/filters/Gamma.d.ts.map +1 -0
- package/dist-extensions/src/filters/Grayscale.d.ts +44 -0
- package/dist-extensions/src/filters/Grayscale.d.ts.map +1 -0
- package/dist-extensions/src/filters/HueRotation.d.ts +31 -0
- package/dist-extensions/src/filters/HueRotation.d.ts.map +1 -0
- package/dist-extensions/src/filters/Invert.d.ts +53 -0
- package/dist-extensions/src/filters/Invert.d.ts.map +1 -0
- package/dist-extensions/src/filters/Noise.d.ts +44 -0
- package/dist-extensions/src/filters/Noise.d.ts.map +1 -0
- package/dist-extensions/src/filters/Pixelate.d.ts +41 -0
- package/dist-extensions/src/filters/Pixelate.d.ts.map +1 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts +53 -0
- package/dist-extensions/src/filters/RemoveColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/Resize.d.ts +137 -0
- package/dist-extensions/src/filters/Resize.d.ts.map +1 -0
- package/dist-extensions/src/filters/Saturation.d.ts +46 -0
- package/dist-extensions/src/filters/Saturation.d.ts.map +1 -0
- package/dist-extensions/src/filters/Vibrance.d.ts +46 -0
- package/dist-extensions/src/filters/Vibrance.d.ts.map +1 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts +131 -0
- package/dist-extensions/src/filters/WebGLFilterBackend.d.ts.map +1 -0
- package/dist-extensions/src/filters/filters.d.ts +23 -0
- package/dist-extensions/src/filters/filters.d.ts.map +1 -0
- package/dist-extensions/src/filters/index.d.ts +7 -0
- package/dist-extensions/src/filters/index.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist-extensions/src/filters/shaders/baseFilter.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist-extensions/src/filters/shaders/blendColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts +4 -0
- package/dist-extensions/src/filters/shaders/blendImage.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/blur.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/brightness.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/colorMatrix.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/constrast.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts +11 -0
- package/dist-extensions/src/filters/shaders/convolute.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/gamma.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist-extensions/src/filters/shaders/grayscale.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/invert.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/noise.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/pixelate.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/removeColor.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/saturation.d.ts.map +1 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts +2 -0
- package/dist-extensions/src/filters/shaders/vibrance.d.ts.map +1 -0
- package/dist-extensions/src/filters/typedefs.d.ts +70 -0
- package/dist-extensions/src/filters/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/filters/utils.d.ts +10 -0
- package/dist-extensions/src/filters/utils.d.ts.map +1 -0
- package/dist-extensions/src/gradient/Gradient.d.ts +156 -0
- package/dist-extensions/src/gradient/Gradient.d.ts.map +1 -0
- package/dist-extensions/src/gradient/constants.d.ts +15 -0
- package/dist-extensions/src/gradient/constants.d.ts.map +1 -0
- package/dist-extensions/src/gradient/index.d.ts +3 -0
- package/dist-extensions/src/gradient/index.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts +4 -0
- package/dist-extensions/src/gradient/parser/misc.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts +3 -0
- package/dist-extensions/src/gradient/parser/parseColorStops.d.ts.map +1 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist-extensions/src/gradient/parser/parseCoords.d.ts.map +1 -0
- package/dist-extensions/src/gradient/typedefs.d.ts +93 -0
- package/dist-extensions/src/gradient/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts +13 -0
- package/dist-extensions/src/parser/applyViewboxTransform.d.ts.map +1 -0
- package/dist-extensions/src/parser/attributes.d.ts +6 -0
- package/dist-extensions/src/parser/attributes.d.ts.map +1 -0
- package/dist-extensions/src/parser/constants.d.ts +41 -0
- package/dist-extensions/src/parser/constants.d.ts.map +1 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist-extensions/src/parser/doesSomeParentMatch.d.ts.map +1 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist-extensions/src/parser/elementMatchesRule.d.ts.map +1 -0
- package/dist-extensions/src/parser/elements_parser.d.ts +33 -0
- package/dist-extensions/src/parser/elements_parser.d.ts.map +1 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts +8 -0
- package/dist-extensions/src/parser/getCSSRules.d.ts.map +1 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts +6 -0
- package/dist-extensions/src/parser/getGlobalStylesForElement.d.ts.map +1 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts +7 -0
- package/dist-extensions/src/parser/getGradientDefs.d.ts.map +1 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist-extensions/src/parser/getMultipleNodes.d.ts.map +1 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts +2 -0
- package/dist-extensions/src/parser/getSvgRegex.d.ts.map +1 -0
- package/dist-extensions/src/parser/getTagName.d.ts +2 -0
- package/dist-extensions/src/parser/getTagName.d.ts.map +1 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts +2 -0
- package/dist-extensions/src/parser/hasInvalidAncestor.d.ts.map +1 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts +18 -0
- package/dist-extensions/src/parser/loadSVGFromString.d.ts.map +1 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts +19 -0
- package/dist-extensions/src/parser/loadSVGFromURL.d.ts.map +1 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts +3 -0
- package/dist-extensions/src/parser/normalizeAttr.d.ts.map +1 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts +2 -0
- package/dist-extensions/src/parser/normalizeValue.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts +10 -0
- package/dist-extensions/src/parser/parseAttributes.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist-extensions/src/parser/parseFontDeclaration.d.ts.map +1 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts +10 -0
- package/dist-extensions/src/parser/parsePointsAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts +22 -0
- package/dist-extensions/src/parser/parseSVGDocument.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist-extensions/src/parser/parseStyleAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts +8 -0
- package/dist-extensions/src/parser/parseStyleObject.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts +8 -0
- package/dist-extensions/src/parser/parseStyleString.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts +11 -0
- package/dist-extensions/src/parser/parseTransformAttribute.d.ts.map +1 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist-extensions/src/parser/parseUseDirectives.d.ts.map +1 -0
- package/dist-extensions/src/parser/percent.d.ts +9 -0
- package/dist-extensions/src/parser/percent.d.ts.map +1 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist-extensions/src/parser/recursivelyParseGradientsXlink.d.ts.map +1 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts +2 -0
- package/dist-extensions/src/parser/selectorMatches.d.ts.map +1 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist-extensions/src/parser/setStrokeFillOpacity.d.ts.map +1 -0
- package/dist-extensions/src/parser/typedefs.d.ts +10 -0
- package/dist-extensions/src/parser/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts +109 -0
- package/dist-extensions/src/shapes/ActiveSelection.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Circle.d.ts +111 -0
- package/dist-extensions/src/shapes/Circle.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts +88 -0
- package/dist-extensions/src/shapes/Ellipse.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Group.d.ts +303 -0
- package/dist-extensions/src/shapes/Group.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist-extensions/src/shapes/IText/DraggableTextDelegate.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts +314 -0
- package/dist-extensions/src/shapes/IText/IText.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts +299 -0
- package/dist-extensions/src/shapes/IText/ITextBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
- package/dist-extensions/src/shapes/IText/ITextClickBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts +198 -0
- package/dist-extensions/src/shapes/IText/ITextKeyBehavior.d.ts.map +1 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts +13 -0
- package/dist-extensions/src/shapes/IText/constants.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Image.d.ts +312 -0
- package/dist-extensions/src/shapes/Image.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Line.d.ts +122 -0
- package/dist-extensions/src/shapes/Line.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist-extensions/src/shapes/Object/AnimatableObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist-extensions/src/shapes/Object/FabricObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +72 -0
- package/dist-extensions/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts +317 -0
- package/dist-extensions/src/shapes/Object/InteractiveObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts +614 -0
- package/dist-extensions/src/shapes/Object/Object.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts +237 -0
- package/dist-extensions/src/shapes/Object/ObjectGeometry.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts +96 -0
- package/dist-extensions/src/shapes/Object/ObjectOrigin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/StackedObject.d.ts +60 -0
- package/dist-extensions/src/shapes/Object/StackedObject.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts +8 -0
- package/dist-extensions/src/shapes/Object/defaultValues.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts +88 -0
- package/dist-extensions/src/shapes/Object/types/BaseProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist-extensions/src/shapes/Object/types/BorderProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts +63 -0
- package/dist-extensions/src/shapes/Object/types/ControlProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts +66 -0
- package/dist-extensions/src/shapes/Object/types/FabricObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist-extensions/src/shapes/Object/types/FillStrokeProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist-extensions/src/shapes/Object/types/LockInteractionProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts +43 -0
- package/dist-extensions/src/shapes/Object/types/ObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts +34 -0
- package/dist-extensions/src/shapes/Object/types/ObjectTransformProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist-extensions/src/shapes/Object/types/SerializedObjectProps.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts +6 -0
- package/dist-extensions/src/shapes/Object/types/index.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Path.d.ts +215 -0
- package/dist-extensions/src/shapes/Path.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Polygon.d.ts +7 -0
- package/dist-extensions/src/shapes/Polygon.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Polyline.d.ts +156 -0
- package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Rect.d.ts +83 -0
- package/dist-extensions/src/shapes/Rect.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts +128 -0
- package/dist-extensions/src/shapes/Text/StyledText.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts +697 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts +47 -0
- package/dist-extensions/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts +13 -0
- package/dist-extensions/src/shapes/Text/constants.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Textbox.d.ts +226 -0
- package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Triangle.d.ts +27 -0
- package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -0
- package/dist-extensions/src/typedefs.d.ts +97 -0
- package/dist-extensions/src/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist-extensions/src/util/animation/AnimationBase.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts +3 -0
- package/dist-extensions/src/util/animation/AnimationFrameProvider.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist-extensions/src/util/animation/AnimationRegistry.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist-extensions/src/util/animation/ArrayAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist-extensions/src/util/animation/ColorAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist-extensions/src/util/animation/ValueAnimation.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/animate.d.ts +37 -0
- package/dist-extensions/src/util/animation/animate.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/easing.d.ts +130 -0
- package/dist-extensions/src/util/animation/easing.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/index.d.ts +3 -0
- package/dist-extensions/src/util/animation/index.d.ts.map +1 -0
- package/dist-extensions/src/util/animation/types.d.ts +87 -0
- package/dist-extensions/src/util/animation/types.d.ts.map +1 -0
- package/dist-extensions/src/util/applyMixins.d.ts +8 -0
- package/dist-extensions/src/util/applyMixins.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_event.d.ts +6 -0
- package/dist-extensions/src/util/dom_event.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_misc.d.ts +12 -0
- package/dist-extensions/src/util/dom_misc.d.ts.map +1 -0
- package/dist-extensions/src/util/dom_style.d.ts +7 -0
- package/dist-extensions/src/util/dom_style.d.ts.map +1 -0
- package/dist-extensions/src/util/index.d.ts +37 -0
- package/dist-extensions/src/util/index.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts +2 -0
- package/dist-extensions/src/util/internals/cleanupSvgAttribute.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts +3 -0
- package/dist-extensions/src/util/internals/cloneStyles.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/console.d.ts +8 -0
- package/dist-extensions/src/util/internals/console.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/dom_request.d.ts +16 -0
- package/dist-extensions/src/util/internals/dom_request.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/findRight.d.ts +2 -0
- package/dist-extensions/src/util/internals/findRight.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist-extensions/src/util/internals/getRandomInt.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts +8 -0
- package/dist-extensions/src/util/internals/ifNaN.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist-extensions/src/util/internals/removeFromArray.d.ts.map +1 -0
- package/dist-extensions/src/util/internals/uid.d.ts +2 -0
- package/dist-extensions/src/util/internals/uid.d.ts.map +1 -0
- package/dist-extensions/src/util/lang_string.d.ts +22 -0
- package/dist-extensions/src/util/lang_string.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist-extensions/src/util/misc/boundingBoxFromPoints.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/capValue.d.ts +2 -0
- package/dist-extensions/src/util/misc/capValue.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/cos.d.ts +10 -0
- package/dist-extensions/src/util/misc/cos.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/dom.d.ts +28 -0
- package/dist-extensions/src/util/misc/dom.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts +20 -0
- package/dist-extensions/src/util/misc/findScaleTo.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts +11 -0
- package/dist-extensions/src/util/misc/groupSVGElements.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts +11 -0
- package/dist-extensions/src/util/misc/isTransparent.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/matrix.d.ts +170 -0
- package/dist-extensions/src/util/misc/matrix.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist-extensions/src/util/misc/mergeClipPaths.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts +45 -0
- package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts +62 -0
- package/dist-extensions/src/util/misc/objectTransforms.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/pick.d.ts +9 -0
- package/dist-extensions/src/util/misc/pick.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts +64 -0
- package/dist-extensions/src/util/misc/planeChange.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +52 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +90 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +27 -0
- package/dist-extensions/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts +12 -0
- package/dist-extensions/src/util/misc/projectStroke/index.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist-extensions/src/util/misc/projectStroke/types.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist-extensions/src/util/misc/radiansDegreesConversion.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist-extensions/src/util/misc/resolveOrigin.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist-extensions/src/util/misc/rotatePoint.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/sin.d.ts +10 -0
- package/dist-extensions/src/util/misc/sin.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts +46 -0
- package/dist-extensions/src/util/misc/svgParsing.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts +32 -0
- package/dist-extensions/src/util/misc/textStyles.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts +8 -0
- package/dist-extensions/src/util/misc/toFixed.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/vectors.d.ts +72 -0
- package/dist-extensions/src/util/misc/vectors.d.ts.map +1 -0
- package/dist-extensions/src/util/path/index.d.ts +95 -0
- package/dist-extensions/src/util/path/index.d.ts.map +1 -0
- package/dist-extensions/src/util/path/regex.d.ts +2 -0
- package/dist-extensions/src/util/path/regex.d.ts.map +1 -0
- package/dist-extensions/src/util/path/typedefs.d.ts +221 -0
- package/dist-extensions/src/util/path/typedefs.d.ts.map +1 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist-extensions/src/util/transform_matrix_removal.d.ts.map +1 -0
- package/dist-extensions/src/util/typeAssertions.d.ts +13 -0
- package/dist-extensions/src/util/typeAssertions.d.ts.map +1 -0
- package/eslint.config.mjs +108 -0
- package/extensions/README.MD +27 -0
- package/extensions/aligning_guidelines/README.MD +22 -0
- package/extensions/aligning_guidelines/constant.ts +10 -0
- package/extensions/aligning_guidelines/index.ts +166 -0
- package/extensions/aligning_guidelines/typedefs.ts +36 -0
- package/extensions/aligning_guidelines/util/basic.spec.ts +31 -0
- package/extensions/aligning_guidelines/util/basic.ts +20 -0
- package/extensions/aligning_guidelines/util/collect-line.ts +172 -0
- package/extensions/aligning_guidelines/util/collect-point.ts +83 -0
- package/extensions/aligning_guidelines/util/draw.ts +74 -0
- package/extensions/aligning_guidelines/util/get-objects-by-target.ts +45 -0
- package/extensions/index.ts +4 -0
- package/jest.config.js +1 -1
- package/jest.extend.ts +14 -15
- package/package.json +17 -12
- package/playwright.setup.ts +5 -5
- package/rollup.config.mjs +46 -4
- package/scripts/build.mjs +1 -1
- package/scripts/buildLock.mjs +5 -5
- package/scripts/buildStats.mjs +2 -2
- package/scripts/git.mjs +1 -1
- package/scripts/index.mjs +34 -32
- package/scripts/sandbox.mjs +15 -15
- package/src/ClassRegistry.spec.ts +1 -1
- package/src/ClassRegistry.ts +1 -1
- package/src/Collection.ts +9 -9
- package/src/EventTypeDefs.ts +2 -2
- package/src/Intersection.spec.ts +2 -2
- package/src/Intersection.ts +11 -11
- package/src/LayoutManager/ActiveSelectionLayoutManager.spec.ts +3 -3
- package/src/LayoutManager/ActiveSelectionLayoutManager.ts +2 -2
- package/src/LayoutManager/LayoutManager.spec.ts +17 -17
- package/src/LayoutManager/LayoutManager.ts +15 -15
- package/src/LayoutManager/LayoutStrategies/ClipPathLayout.ts +3 -3
- package/src/LayoutManager/LayoutStrategies/FixedLayout.ts +1 -1
- package/src/LayoutManager/LayoutStrategies/LayoutStrategy.ts +4 -4
- package/src/LayoutManager/LayoutStrategies/utils.ts +4 -4
- package/src/LayoutManager/types.ts +12 -13
- package/src/Observable.ts +7 -7
- package/src/Pattern/Pattern.ts +20 -10
- package/src/Point.ts +3 -3
- package/src/Shadow.ts +7 -7
- package/src/brushes/CircleBrush.ts +1 -1
- package/src/brushes/PatternBrush.ts +1 -1
- package/src/brushes/PencilBrush.ts +1 -1
- package/src/brushes/SprayBrush.ts +3 -3
- package/src/canvas/Canvas.ts +38 -35
- package/src/canvas/DOMManagers/CanvasDOMManager.ts +2 -2
- package/src/canvas/DOMManagers/StaticCanvasDOMManager.ts +1 -1
- package/src/canvas/DOMManagers/util.ts +2 -2
- package/src/canvas/SelectableCanvas.spec.ts +8 -8
- package/src/canvas/SelectableCanvas.ts +20 -20
- package/src/canvas/StaticCanvas.ts +44 -43
- package/src/canvas/StaticCanvasOptions.ts +0 -1
- package/src/canvas/TextEditingManager.ts +1 -1
- package/src/canvas/__tests__/eventData.test.ts +17 -17
- package/src/color/Color.ts +3 -2
- package/src/color/color.test.ts +2 -2
- package/src/color/typedefs.ts +1 -1
- package/src/color/util.ts +1 -1
- package/src/config.ts +1 -1
- package/src/controls/Control.spec.ts +8 -8
- package/src/controls/Control.ts +14 -14
- package/src/controls/changeWidth.test.ts +2 -2
- package/src/controls/changeWidth.ts +4 -4
- package/src/controls/controlRendering.ts +4 -4
- package/src/controls/drag.ts +1 -1
- package/src/controls/fireEvent.ts +1 -1
- package/src/controls/pathControl.spec.ts +9 -9
- package/src/controls/pathControl.ts +20 -20
- package/src/controls/polyControl.spec.ts +6 -6
- package/src/controls/polyControl.ts +11 -11
- package/src/controls/rotate.ts +4 -4
- package/src/controls/scale.test.ts +9 -9
- package/src/controls/scale.ts +13 -13
- package/src/controls/scaleSkew.ts +3 -3
- package/src/controls/skew.ts +8 -8
- package/src/controls/util.ts +6 -6
- package/src/controls/wrapWithFireEvent.ts +2 -2
- package/src/controls/wrapWithFixedAnchor.spec.ts +5 -5
- package/src/controls/wrapWithFixedAnchor.ts +2 -2
- package/src/env/node.ts +2 -2
- package/src/filters/BaseFilter.ts +27 -25
- package/src/filters/BlendColor.ts +1 -1
- package/src/filters/BlendImage.ts +4 -4
- package/src/filters/Blur.ts +1 -1
- package/src/filters/Boilerplate.ts +1 -1
- package/src/filters/Brightness.ts +1 -1
- package/src/filters/Canvas2dFilterBackend.ts +1 -1
- package/src/filters/ColorMatrix.ts +2 -2
- package/src/filters/ColorMatrixFilters.ts +7 -7
- package/src/filters/Composed.ts +5 -5
- package/src/filters/Contrast.ts +1 -1
- package/src/filters/Convolute.ts +1 -1
- package/src/filters/GLProbes/WebGLProbe.ts +2 -2
- package/src/filters/Gamma.ts +1 -1
- package/src/filters/Grayscale.ts +1 -1
- package/src/filters/Invert.ts +1 -1
- package/src/filters/Noise.ts +1 -1
- package/src/filters/Pixelate.ts +1 -1
- package/src/filters/RemoveColor.ts +1 -1
- package/src/filters/Resize.ts +9 -9
- package/src/filters/Saturation.ts +1 -1
- package/src/filters/Vibrance.ts +1 -1
- package/src/filters/WebGLFilterBackend.ts +10 -10
- package/src/filters/typedefs.ts +1 -3
- package/src/filters/utils.ts +3 -3
- package/src/gradient/Gradient.spec.ts +19 -19
- package/src/gradient/Gradient.ts +51 -50
- package/src/gradient/parser/parseColorStops.ts +3 -3
- package/src/gradient/parser/parseCoords.ts +28 -25
- package/src/mixins/eraser_brush.mixin.ts +21 -21
- package/src/parkinglot/straighten.ts +1 -1
- package/src/parser/applyViewboxTransform.ts +2 -2
- package/src/parser/constants.ts +2 -2
- package/src/parser/elements_parser.ts +13 -13
- package/src/parser/getCSSRules.ts +1 -1
- package/src/parser/getGlobalStylesForElement.ts +1 -1
- package/src/parser/getGradientDefs.ts +1 -1
- package/src/parser/getMultipleNodes.ts +2 -2
- package/src/parser/loadSVGFromString.test.ts +1 -4
- package/src/parser/loadSVGFromString.ts +1 -1
- package/src/parser/loadSVGFromURL.ts +1 -1
- package/src/parser/normalizeAttr.ts +1 -1
- package/src/parser/normalizeValue.ts +2 -2
- package/src/parser/parseAttributes.ts +3 -3
- package/src/parser/parseFontDeclaration.ts +1 -1
- package/src/parser/parseSVGDocument.ts +3 -3
- package/src/parser/parseStyleObject.ts +1 -1
- package/src/parser/parseStyleString.ts +1 -1
- package/src/parser/parseTransformAttribute.ts +1 -1
- package/src/parser/parseUseDirectives.ts +1 -1
- package/src/parser/percent.ts +4 -4
- package/src/parser/recursivelyParseGradientsXlink.ts +1 -1
- package/src/parser/setStrokeFillOpacity.ts +1 -1
- package/src/parser/typedefs.ts +1 -1
- package/src/shapes/ActiveSelection.spec.ts +1 -1
- package/src/shapes/ActiveSelection.ts +4 -4
- package/src/shapes/Circle.ts +5 -5
- package/src/shapes/Ellipse.ts +4 -4
- package/src/shapes/Group.spec.ts +5 -5
- package/src/shapes/Group.ts +19 -17
- package/src/shapes/IText/DraggableTextDelegate.ts +9 -10
- package/src/shapes/IText/IText.test.ts +1 -1
- package/src/shapes/IText/IText.ts +12 -12
- package/src/shapes/IText/ITextBehavior.test.ts +2 -2
- package/src/shapes/IText/ITextBehavior.ts +21 -21
- package/src/shapes/IText/ITextClickBehavior.ts +2 -2
- package/src/shapes/IText/ITextKeyBehavior.test.ts +2 -2
- package/src/shapes/IText/ITextKeyBehavior.ts +13 -13
- package/src/shapes/Image.ts +16 -16
- package/src/shapes/Line.ts +4 -4
- package/src/shapes/Object/AnimatableObject.ts +13 -10
- package/src/shapes/Object/FabricObject.ts +7 -3
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +9 -9
- package/src/shapes/Object/InteractiveObject.spec.ts +3 -3
- package/src/shapes/Object/InteractiveObject.ts +32 -32
- package/src/shapes/Object/Object.ts +33 -31
- package/src/shapes/Object/ObjectGeometry.ts +9 -9
- package/src/shapes/Object/ObjectOrigin.ts +11 -11
- package/src/shapes/Object/StackedObject.ts +3 -4
- package/src/shapes/Path.ts +14 -14
- package/src/shapes/Polyline.spec.ts +1 -1
- package/src/shapes/Polyline.ts +15 -16
- package/src/shapes/Rect.ts +6 -6
- package/src/shapes/Text/StyledText.spec.ts +2 -2
- package/src/shapes/Text/StyledText.ts +7 -7
- package/src/shapes/Text/Text.spec.ts +1 -1
- package/src/shapes/Text/Text.ts +33 -33
- package/src/shapes/Text/TextSVGExportMixin.spec.ts +1 -1
- package/src/shapes/Text/TextSVGExportMixin.ts +23 -23
- package/src/shapes/Textbox.ts +7 -7
- package/src/shapes/Triangle.ts +1 -1
- package/src/typedefs.ts +3 -3
- package/src/util/animation/AnimationBase.ts +2 -2
- package/src/util/animation/AnimationRegistry.ts +1 -1
- package/src/util/animation/ArrayAnimation.ts +2 -2
- package/src/util/animation/ColorAnimation.ts +5 -5
- package/src/util/animation/ValueAnimation.ts +1 -1
- package/src/util/animation/animate.ts +6 -6
- package/src/util/animation/animations.spec.ts +7 -7
- package/src/util/animation/easing.ts +1 -1
- package/src/util/animation/types.ts +5 -6
- package/src/util/applyMixins.ts +2 -2
- package/src/util/dom_style.ts +2 -2
- package/src/util/internals/cloneDeep.ts +6 -0
- package/src/util/internals/cloneStyles.spec.ts +46 -0
- package/src/util/internals/cloneStyles.ts +12 -0
- package/src/util/internals/findRight.ts +1 -1
- package/src/util/internals/getRandomInt.test.ts +1 -1
- package/src/util/misc/boundingBoxFromPoints.ts +1 -1
- package/src/util/misc/dom.ts +3 -3
- package/src/util/misc/findScaleTo.ts +2 -2
- package/src/util/misc/groupSVGElements.ts +1 -1
- package/src/util/misc/isTransparent.ts +1 -1
- package/src/util/misc/matrix.ts +6 -6
- package/src/util/misc/objectEnlive.ts +9 -9
- package/src/util/misc/objectTransforms.ts +5 -5
- package/src/util/misc/pick.ts +2 -2
- package/src/util/misc/planeChange.spec.ts +9 -9
- package/src/util/misc/planeChange.ts +5 -5
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +7 -7
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +16 -16
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +2 -2
- package/src/util/misc/projectStroke/index.ts +7 -7
- package/src/util/misc/resolveOrigin.ts +1 -1
- package/src/util/misc/rotatePoint.ts +1 -1
- package/src/util/misc/svgParsing.ts +5 -5
- package/src/util/misc/textStyles.ts +6 -6
- package/src/util/misc/vectors.ts +1 -1
- package/src/util/path/index.spec.ts +3 -3
- package/src/util/path/index.ts +30 -30
- package/src/util/path/typechecks.ts +22 -22
- package/src/util/path/typedefs.ts +14 -17
- package/src/util/transform_matrix_removal.ts +3 -3
- package/src/util/typeAssertions.ts +4 -4
- package/tsconfig-extensions.json +108 -0
- package/tsconfig.json +4 -3
- package/.eslintignore +0 -3
- package/.eslintrc.js +0 -60
- package/.eslintrc.json +0 -143
- package/.eslintrc_tests +0 -58
- package/dist/src/util/internals/cloneDeep.min.mjs +0 -2
- package/dist/src/util/internals/cloneDeep.min.mjs.map +0 -1
- package/dist/src/util/internals/cloneDeep.mjs +0 -4
- package/dist/src/util/internals/cloneDeep.mjs.map +0 -1
- package/dist/src/util/internals/index.d.ts +0 -5
- package/dist/src/util/internals/index.d.ts.map +0 -1
- package/src/benchmarks/README.md +0 -7
- package/src/benchmarks/calcCornerCoords.mjs +0 -117
- package/src/benchmarks/calcTransformMatrix.mjs +0 -104
- package/src/benchmarks/pathCloning.mjs +0 -111
- package/src/benchmarks/pathData.mjs +0 -5
- package/src/benchmarks/raycasting.mjs +0 -152
- package/src/benchmarks/transformMatrixKey.mjs +0 -97
- package/src/util/internals/index.ts +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeLineCapProjections.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineCapProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude
|
|
1
|
+
{"version":3,"file":"StrokeLineCapProjections.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineCapProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n"],"names":["StrokeLineCapProjections","StrokeProjectionsBase","constructor","A","T","options","super","this","Point","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","createSideVector","scaleUnitVector","getOrthonormalVector","projectButt","projectOrthogonally","projectRound","projections","isSkewed","eq","projection","scalarMultiply","multiply","strokeUniformScalar","push","applySkew","add","subtract","StrokeLineJoinProjections","projectSquare","orthogonalProjection","strokePointingOut","getUnitVector","projectedA","map","p","projectPoints","strokeLineCap","project","point","originPoint","projectedPoint"],"mappings":"oRAmBO,MAAMA,UAAiCC,EAU5CC,WAAAA,CAAYC,EAAOC,EAAOC,GACxBC,MAAMD,GACNE,KAAKJ,EAAI,IAAIK,EAAML,GACnBI,KAAKH,EAAI,IAAII,EAAMJ,EACrB,CAEAK,wBAAAA,CACEC,EACAC,GAEA,IADAC,EAAiBC,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAG,GAAAN,KAAKS,0BAEzB,MAAMC,EAASV,KAAKW,iBAAiBR,EAAMC,GAC3C,OAAOJ,KAAKY,gBAAgBC,EAAqBH,GAASL,EAC5D,CAQAS,WAAAA,GACE,MAAO,CACLd,KAAKe,oBAAoBf,KAAKJ,EAAGI,KAAKH,EAAGG,KAAKS,2BAC9CT,KAAKe,oBAAoBf,KAAKJ,EAAGI,KAAKH,GAAIG,KAAKS,2BAEnD,CAQAO,YAAAA,GACE,MAAMC,EAAuB,GAE7B,IAAKjB,KAAKkB,YAAclB,KAAKJ,EAAEuB,GAAGnB,KAAKH,GAAI,CAKzC,MAAMuB,EAAa,IAAInB,EAAM,EAAG,GAC7BoB,eAAerB,KAAKS,2BACpBa,SAAStB,KAAKuB,qBACjBN,EAAYO,KACVxB,KAAKyB,UAAUzB,KAAKJ,EAAE8B,IAAIN,IAC1BpB,KAAKyB,UAAUzB,KAAKJ,EAAE+B,SAASP,IAEnC,MACEH,EAAYO,QACP,IAAII,EACL5B,KAAKJ,EACLI,KAAKH,EACLG,KAAKH,EACLG,KAAKF,SACLkB,gBAIN,OAAOC,CACT,CAQAY,aAAAA,GACE,MAAMZ,EAAuB,GAE7B,GAAIjB,KAAKJ,EAAEuB,GAAGnB,KAAKH,GAAI,CAKrB,MAAMuB,EAAa,IAAInB,EAAM,EAAG,GAC7BoB,eAAerB,KAAKS,2BACpBa,SAAStB,KAAKuB,qBACjBN,EAAYO,KAAKxB,KAAKJ,EAAE8B,IAAIN,GAAapB,KAAKJ,EAAE+B,SAASP,GAC3D,KAAO,CACL,MAAMU,EAAuB9B,KAAKE,yBAChCF,KAAKJ,EACLI,KAAKH,EACLG,KAAKS,2BAEDsB,EAAoB/B,KAAKY,gBAC7BoB,EAAchC,KAAKW,iBAAiBX,KAAKJ,EAAGI,KAAKH,KAChDG,KAAKS,2BAEFwB,EAAajC,KAAKJ,EAAE8B,IAAIK,GAC9Bd,EAAYO,KACVS,EAAWP,IAAII,GACfG,EAAWN,SAASG,GAExB,CAEA,OAAOb,EAAYiB,KAAKC,GAAMnC,KAAKyB,UAAUU,IAC/C,CAEUC,aAAAA,GACR,OAAQpC,KAAKF,QAAQuC,eACnB,IAAK,QACH,OAAOrC,KAAKgB,eACd,IAAK,SACH,OAAOhB,KAAK6B,gBACd,QACE,OAAO7B,KAAKc,cAElB,CAEOwB,OAAAA,GACL,OAAOtC,KAAKoC,gBAAgBF,KAAKK,IAAW,CAC1CC,YAAaxC,KAAKJ,EAClB6C,eAAgBF,KAEpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeLineCapProjections.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineCapProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude
|
|
1
|
+
{"version":3,"file":"StrokeLineCapProjections.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineCapProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { getOrthonormalVector, getUnitVector } from '../vectors';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\n/**\n * class in charge of finding projections for each type of line cap for start/end of an open path\n * @see {@link [Open path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#1-open-path)}\n *\n * Reference:\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap\n * - Spec: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-linecap-dev\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n */\nexport class StrokeLineCapProjections extends StrokeProjectionsBase {\n /**\n * edge point\n */\n declare A: Point;\n /**\n * point next to edge point\n */\n declare T: Point;\n\n constructor(A: XY, T: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.T = new Point(T);\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n return this.scaleUnitVector(getOrthonormalVector(vector), magnitude);\n }\n\n /**\n * OPEN PATH START/END - Line cap: Butt\n * Calculation: to find the projections, just find the points orthogonal to the stroke\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-1-butt\n */\n projectButt() {\n return [\n this.projectOrthogonally(this.A, this.T, this.strokeProjectionMagnitude),\n this.projectOrthogonally(this.A, this.T, -this.strokeProjectionMagnitude),\n ];\n }\n\n /**\n * OPEN PATH START/END - Line cap: Round\n * Calculation: same as stroke line join `round`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-2-round\n */\n projectRound() {\n const projections: Point[] = [];\n\n if (!this.isSkewed() && this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(\n this.applySkew(this.A.add(projection)),\n this.applySkew(this.A.subtract(projection)),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(\n this.A,\n this.T,\n this.T,\n this.options,\n ).projectRound(),\n );\n }\n\n return projections;\n }\n\n /**\n * OPEN PATH START/END - Line cap: Square\n * Calculation: project a rectangle of points on the stroke in the opposite direction of the vector `AT`\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#1-3-square\n */\n projectSquare() {\n const projections: Point[] = [];\n\n if (this.A.eq(this.T)) {\n /* 1 point case without `skew`\n When `strokeUniform` is true, scaling has no effect.\n So we divide by scale, to remove its effect.\n */\n const projection = new Point(1, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar);\n projections.push(this.A.add(projection), this.A.subtract(projection));\n } else {\n const orthogonalProjection = this.calcOrthogonalProjection(\n this.A,\n this.T,\n this.strokeProjectionMagnitude,\n );\n const strokePointingOut = this.scaleUnitVector(\n getUnitVector(this.createSideVector(this.A, this.T)),\n -this.strokeProjectionMagnitude,\n );\n const projectedA = this.A.add(strokePointingOut);\n projections.push(\n projectedA.add(orthogonalProjection),\n projectedA.subtract(orthogonalProjection),\n );\n }\n\n return projections.map((p) => this.applySkew(p));\n }\n\n protected projectPoints() {\n switch (this.options.strokeLineCap) {\n case 'round':\n return this.projectRound();\n case 'square':\n return this.projectSquare();\n default:\n return this.projectButt();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n }));\n }\n}\n"],"names":["StrokeLineCapProjections","StrokeProjectionsBase","constructor","A","T","options","Point","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","createSideVector","scaleUnitVector","getOrthonormalVector","projectButt","projectOrthogonally","projectRound","projections","isSkewed","eq","projection","scalarMultiply","multiply","strokeUniformScalar","push","applySkew","add","subtract","StrokeLineJoinProjections","projectSquare","orthogonalProjection","strokePointingOut","getUnitVector","projectedA","map","p","projectPoints","strokeLineCap","project","point","originPoint","projectedPoint"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeLineJoinProjections.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineJoinProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2)\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude)\n );\n }\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit)\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x)\n )\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY))\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0))\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector\n )\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n"],"names":["zeroVector","Point","StrokeLineJoinProjections","StrokeProjectionsBase","getOrthogonalRotationFactor","vector1","vector2","angle","calcAngleBetweenVectors","calcVectorRotation","Math","abs","halfPI","constructor","A","B","C","options","super","_defineProperty","this","AB","createSideVector","AC","alpha","bisector","getUnitVector","rotateVector","eq","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","orthogonalProjection","getOrthonormalVector","correctSide","scaleUnitVector","projectBevel","projections","twoMathPi","forEach","push","projectOrthogonally","projectMiter","hypotUnitScalar","sin","miterVector","strokeMiterLimit","strokeUniform","applySkew","add","projectRoundNoSkew","startCircle","endCircle","y","x","scalarMultiply","multiply","strokeUniformScalar","isBetweenVectors","projectRoundWithSkew","skewX","skewY","scaleX","scaleY","shearing","tan","degreesToRadians","circleRadius","newY","sqrt","furthestY","max","newX","furthestX","map","projectRound","isStraightLine","newOrigin","proj0","subtract","proj1","comparisonVector","isProj0Start","crossProduct","isSkewed","projectPoints","strokeLineJoin","project","point","originPoint","projectedPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StrokeLineJoinProjections.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineJoinProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n"],"names":["zeroVector","Point","StrokeLineJoinProjections","StrokeProjectionsBase","getOrthogonalRotationFactor","vector1","vector2","angle","calcAngleBetweenVectors","calcVectorRotation","Math","abs","halfPI","constructor","A","B","C","options","super","_defineProperty","this","AB","createSideVector","AC","alpha","bisector","getUnitVector","rotateVector","eq","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","orthogonalProjection","getOrthonormalVector","correctSide","scaleUnitVector","projectBevel","projections","twoMathPi","forEach","push","projectOrthogonally","projectMiter","hypotUnitScalar","sin","miterVector","strokeMiterLimit","strokeUniform","applySkew","add","projectRoundNoSkew","startCircle","endCircle","y","x","scalarMultiply","multiply","strokeUniformScalar","isBetweenVectors","projectRoundWithSkew","skewX","skewY","scaleX","scaleY","shearing","tan","degreesToRadians","circleRadius","newY","sqrt","furthestY","max","newX","furthestX","map","projectRound","isStraightLine","newOrigin","proj0","subtract","proj1","comparisonVector","isProj0Start","crossProduct","isSkewed","projectPoints","strokeLineJoin","project","point","originPoint","projectedPoint"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeLineJoinProjections.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineJoinProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2)\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude)\n );\n }\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit)\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x)\n )\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY))\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0))\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector\n )\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n"],"names":["zeroVector","Point","StrokeLineJoinProjections","StrokeProjectionsBase","getOrthogonalRotationFactor","vector1","vector2","angle","calcAngleBetweenVectors","calcVectorRotation","Math","abs","halfPI","constructor","A","B","C","options","_defineProperty","AB","createSideVector","AC","alpha","bisector","getUnitVector","rotateVector","eq","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","orthogonalProjection","getOrthonormalVector","correctSide","scaleUnitVector","projectBevel","projections","twoMathPi","forEach","push","projectOrthogonally","projectMiter","hypotUnitScalar","sin","miterVector","strokeMiterLimit","strokeUniform","applySkew","add","projectRoundNoSkew","startCircle","endCircle","y","x","radiusOnAxisX","scalarMultiply","multiply","strokeUniformScalar","radiusOnAxisY","isBetweenVectors","projectRoundWithSkew","skewX","skewY","scaleX","scaleY","shearing","tan","degreesToRadians","circleRadius","newY","sqrt","furthestY","max","newX","furthestX","map","projectRound","isStraightLine","newOrigin","proj0","subtract","proj1","comparisonVector","isProj0Start","crossProduct","isSkewed","projectPoints","strokeLineJoin","project","point","originPoint","projectedPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StrokeLineJoinProjections.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeLineJoinProjections.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { halfPI, twoMathPi } from '../../../constants';\nimport type { TRadian } from '../../../typedefs';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport {\n calcAngleBetweenVectors,\n calcVectorRotation,\n crossProduct,\n getOrthonormalVector,\n getUnitVector,\n isBetweenVectors,\n magnitude,\n rotateVector,\n} from '../vectors';\nimport { StrokeProjectionsBase } from './StrokeProjectionsBase';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nconst zeroVector = new Point();\n\n/**\n * class in charge of finding projections for each type of line join\n * @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}\n *\n * - MDN:\n * - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin\n * - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin\n * - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty\n * - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html\n * - 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\n *\n */\nexport class StrokeLineJoinProjections extends StrokeProjectionsBase {\n /**\n * The point being projected (the angle ∠BAC)\n */\n declare A: Point;\n /**\n * The point before A\n */\n declare B: Point;\n /**\n * The point after A\n */\n declare C: Point;\n /**\n * The AB vector\n */\n AB: Point;\n /**\n * The AC vector\n */\n AC: Point;\n /**\n * The angle of A (∠BAC)\n */\n alpha: TRadian;\n /**\n * The bisector of A (∠BAC)\n */\n bisector: Point;\n\n static getOrthogonalRotationFactor(vector1: Point, vector2?: Point) {\n const angle = vector2\n ? calcAngleBetweenVectors(vector1, vector2)\n : calcVectorRotation(vector1);\n return Math.abs(angle) < halfPI ? -1 : 1;\n }\n\n constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {\n super(options);\n this.A = new Point(A);\n this.B = new Point(B);\n this.C = new Point(C);\n this.AB = this.createSideVector(this.A, this.B);\n this.AC = this.createSideVector(this.A, this.C);\n this.alpha = calcAngleBetweenVectors(this.AB, this.AC);\n this.bisector = getUnitVector(\n // if AC is also the zero vector nothing will be projected\n // in that case the next point will handle the projection\n rotateVector(this.AB.eq(zeroVector) ? this.AC : this.AB, this.alpha / 2),\n );\n }\n\n calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude: number = this.strokeProjectionMagnitude,\n ) {\n const vector = this.createSideVector(from, to);\n const orthogonalProjection = getOrthonormalVector(vector);\n const correctSide = StrokeLineJoinProjections.getOrthogonalRotationFactor(\n orthogonalProjection,\n this.bisector,\n );\n return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);\n }\n\n /**\n * BEVEL\n * Calculation: the projection points are formed by the vector orthogonal to the vertex.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel\n */\n projectBevel() {\n const projections: Point[] = [];\n // if `alpha` equals 0 or 2*PI, the projections are the same for `B` and `C`\n (this.alpha % twoMathPi === 0 ? [this.B] : [this.B, this.C]).forEach(\n (to) => {\n projections.push(this.projectOrthogonally(this.A, to));\n projections.push(\n this.projectOrthogonally(this.A, to, -this.strokeProjectionMagnitude),\n );\n },\n );\n return projections;\n }\n\n /**\n * MITER\n * Calculation: the corner is formed by extending the outer edges of the stroke\n * at the tangents of the path segments until they intersect.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter\n */\n projectMiter() {\n const projections: Point[] = [],\n alpha = Math.abs(this.alpha),\n hypotUnitScalar = 1 / Math.sin(alpha / 2),\n miterVector = this.scaleUnitVector(\n this.bisector,\n -this.strokeProjectionMagnitude * hypotUnitScalar,\n );\n\n // When two line segments meet at a sharp angle, it is possible for the join to extend,\n // far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes\n // a limit on the extent of the line join.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n // When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit\n const strokeMiterLimit = this.options.strokeUniform\n ? magnitude(\n this.scaleUnitVector(this.bisector, this.options.strokeMiterLimit),\n )\n : this.options.strokeMiterLimit;\n\n if (\n magnitude(miterVector) / this.strokeProjectionMagnitude <=\n strokeMiterLimit\n ) {\n projections.push(this.applySkew(this.A.add(miterVector)));\n }\n /* when the miter-limit is reached, the stroke line join becomes of type bevel.\n We always need two orthogonal projections which are basically bevel-type projections,\n so regardless of whether the miter-limit was reached or not, we include these projections.\n */\n projections.push(...this.projectBevel());\n\n return projections;\n }\n\n /**\n * ROUND (without skew)\n * Calculation: the projections are the two vectors parallel to X and Y axes\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew\n */\n private projectRoundNoSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [],\n // correctSide is used to only consider projecting for the outer side\n correctSide = new Point(\n StrokeLineJoinProjections.getOrthogonalRotationFactor(this.bisector),\n StrokeLineJoinProjections.getOrthogonalRotationFactor(\n new Point(this.bisector.y, this.bisector.x),\n ),\n ),\n radiusOnAxisX = new Point(1, 0)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide),\n radiusOnAxisY = new Point(0, 1)\n .scalarMultiply(this.strokeProjectionMagnitude)\n .multiply(this.strokeUniformScalar)\n .multiply(correctSide);\n\n [radiusOnAxisX, radiusOnAxisY].forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.A.add(vector));\n }\n });\n return projections;\n }\n\n /**\n * ROUND (with skew)\n * Calculation: the projections are the points furthest from the vertex in\n * the direction of the X and Y axes after distortion.\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew\n */\n private projectRoundWithSkew(startCircle: Point, endCircle: Point) {\n const projections: Point[] = [];\n\n const { skewX, skewY, scaleX, scaleY, strokeUniform } = this.options,\n shearing = new Point(\n Math.tan(degreesToRadians(skewX)),\n Math.tan(degreesToRadians(skewY)),\n );\n // The points furthest from the vertex in the direction of the X and Y axes after distortion\n const circleRadius = this.strokeProjectionMagnitude,\n newY = strokeUniform\n ? circleRadius /\n scaleY /\n Math.sqrt(1 / scaleY ** 2 + (1 / scaleX ** 2) * shearing.y ** 2)\n : circleRadius / Math.sqrt(1 + shearing.y ** 2),\n furthestY = new Point(\n // Safe guard due to floating point precision. In some situations the square root\n // was returning NaN because of a negative number close to zero.\n Math.sqrt(Math.max(circleRadius ** 2 - newY ** 2, 0)),\n newY,\n ),\n newX = strokeUniform\n ? circleRadius /\n Math.sqrt(\n 1 +\n (shearing.x ** 2 * (1 / scaleY) ** 2) /\n (1 / scaleX + (1 / scaleX) * shearing.x * shearing.y) ** 2,\n )\n : circleRadius /\n Math.sqrt(1 + shearing.x ** 2 / (1 + shearing.x * shearing.y) ** 2),\n furthestX = new Point(\n newX,\n Math.sqrt(Math.max(circleRadius ** 2 - newX ** 2, 0)),\n );\n\n [\n furthestX,\n furthestX.scalarMultiply(-1),\n furthestY,\n furthestY.scalarMultiply(-1),\n ]\n // We need to skew the vector here as this information is used to check if\n // it is between the start and end of the circle segment\n .map((vector) =>\n this.applySkew(\n strokeUniform ? vector.multiply(this.strokeUniformScalar) : vector,\n ),\n )\n .forEach((vector) => {\n if (isBetweenVectors(vector, startCircle, endCircle)) {\n projections.push(this.applySkew(this.A).add(vector));\n }\n });\n\n return projections;\n }\n\n projectRound() {\n const projections: Point[] = [];\n /* Include the start and end points of the circle segment, so that only\n the projections contained within it are included */\n // add the orthogonal projections (start and end points of circle segment)\n projections.push(...this.projectBevel());\n // let's determines which one of the orthogonal projection is the beginning and end of the circle segment.\n // when `alpha` equals 0 or 2*PI, we have a straight line, so the way to find the start/end is different.\n const isStraightLine = this.alpha % twoMathPi === 0,\n // change the origin of the projections to point A\n // so that the cross product calculation is correct\n newOrigin = this.applySkew(this.A),\n proj0 = projections[isStraightLine ? 0 : 2].subtract(newOrigin),\n proj1 = projections[isStraightLine ? 1 : 0].subtract(newOrigin),\n // when `isStraightLine` === true, we compare with the vector opposite AB, otherwise we compare with the bisector.\n comparisonVector = isStraightLine\n ? this.applySkew(this.AB.scalarMultiply(-1))\n : this.applySkew(\n this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1),\n ),\n // the beginning of the circle segment is always to the right of the comparison vector (cross product > 0)\n isProj0Start = crossProduct(proj0, comparisonVector) > 0,\n startCircle = isProj0Start ? proj0 : proj1,\n endCircle = isProj0Start ? proj1 : proj0;\n if (!this.isSkewed()) {\n projections.push(...this.projectRoundNoSkew(startCircle, endCircle));\n } else {\n projections.push(...this.projectRoundWithSkew(startCircle, endCircle));\n }\n return projections;\n }\n\n /**\n * Project stroke width on points returning projections for each point as follows:\n * - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)\n * - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.\n * - `round`: same as `bevel` when it has no skew, with skew are 4 points.\n */\n protected projectPoints() {\n switch (this.options.strokeLineJoin) {\n case 'miter':\n return this.projectMiter();\n case 'round':\n return this.projectRound();\n default:\n return this.projectBevel();\n }\n }\n\n public project(): TProjection[] {\n return this.projectPoints().map((point) => ({\n originPoint: this.A,\n projectedPoint: point,\n angle: this.alpha,\n bisector: this.bisector,\n }));\n }\n}\n"],"names":["zeroVector","Point","StrokeLineJoinProjections","StrokeProjectionsBase","getOrthogonalRotationFactor","vector1","vector2","angle","calcAngleBetweenVectors","calcVectorRotation","Math","abs","halfPI","constructor","A","B","C","options","_defineProperty","AB","createSideVector","AC","alpha","bisector","getUnitVector","rotateVector","eq","calcOrthogonalProjection","from","to","magnitude","arguments","length","undefined","strokeProjectionMagnitude","vector","orthogonalProjection","getOrthonormalVector","correctSide","scaleUnitVector","projectBevel","projections","twoMathPi","forEach","push","projectOrthogonally","projectMiter","hypotUnitScalar","sin","miterVector","strokeMiterLimit","strokeUniform","applySkew","add","projectRoundNoSkew","startCircle","endCircle","y","x","radiusOnAxisX","scalarMultiply","multiply","strokeUniformScalar","radiusOnAxisY","isBetweenVectors","projectRoundWithSkew","skewX","skewY","scaleX","scaleY","shearing","tan","degreesToRadians","circleRadius","newY","sqrt","furthestY","max","newX","furthestX","map","projectRound","isStraightLine","newOrigin","proj0","subtract","proj1","comparisonVector","isProj0Start","crossProduct","isSkewed","projectPoints","strokeLineJoin","project","point","originPoint","projectedPoint"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeProjectionsBase.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeProjectionsBase.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number
|
|
1
|
+
{"version":3,"file":"StrokeProjectionsBase.min.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeProjectionsBase.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n"],"names":["StrokeProjectionsBase","constructor","options","this","strokeProjectionMagnitude","strokeWidth","scale","Point","scaleX","scaleY","strokeUniformScalar","strokeUniform","createSideVector","from","to","v","createVector","multiply","projectOrthogonally","magnitude","applySkew","add","calcOrthogonalProjection","isSkewed","skewX","skewY","point","p","y","x","Math","tan","degreesToRadians","scaleUnitVector","unitVector","scalar","scalarMultiply"],"mappings":"wKAWO,MAAeA,EAMpBC,WAAAA,CAAYC,GACVC,KAAKD,QAAUA,EACfC,KAAKC,0BAA4BD,KAAKD,QAAQG,YAAc,EAC5DF,KAAKG,MAAQ,IAAIC,EAAMJ,KAAKD,QAAQM,OAAQL,KAAKD,QAAQO,QACzDN,KAAKO,oBAAsBP,KAAKD,QAAQS,cACpC,IAAIJ,EAAM,EAAIJ,KAAKD,QAAQM,OAAQ,EAAIL,KAAKD,QAAQO,QACpD,IAAIF,EAAM,EAAG,EACnB,CAKUK,gBAAAA,CAAiBC,EAAUC,GACnC,MAAMC,EAAIC,EAAaH,EAAMC,GAC7B,OAAOX,KAAKD,QAAQS,cAAgBI,EAAEE,SAASd,KAAKG,OAASS,CAC/D,CAQUG,mBAAAA,CAAoBL,EAAaC,EAAWK,GACpD,OAAOhB,KAAKiB,UACVP,EAAKQ,IAAIlB,KAAKmB,yBAAyBT,EAAMC,EAAIK,IAErD,CAEUI,QAAAA,GACR,OAA8B,IAAvBpB,KAAKD,QAAQsB,OAAsC,IAAvBrB,KAAKD,QAAQuB,KAClD,CAEUL,SAAAA,CAAUM,GAClB,MAAMC,EAAI,IAAIpB,EAAMmB,GAIpB,OAFAC,EAAEC,GAAKD,EAAEE,EAAIC,KAAKC,IAAIC,EAAiB7B,KAAKD,QAAQuB,QACpDE,EAAEE,GAAKF,EAAEC,EAAIE,KAAKC,IAAIC,EAAiB7B,KAAKD,QAAQsB,QAC7CG,CACT,CAEUM,eAAAA,CAAgBC,EAAmBC,GAC3C,OAAOD,EAAWjB,SAASd,KAAKO,qBAAqB0B,eAAeD,EACtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StrokeProjectionsBase.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeProjectionsBase.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number
|
|
1
|
+
{"version":3,"file":"StrokeProjectionsBase.mjs","sources":["../../../../../src/util/misc/projectStroke/StrokeProjectionsBase.ts"],"sourcesContent":["import type { XY } from '../../../Point';\nimport { Point } from '../../../Point';\nimport { degreesToRadians } from '../radiansDegreesConversion';\nimport { createVector } from '../vectors';\nimport type { TProjectStrokeOnPointsOptions, TProjection } from './types';\n\n/**\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n * @todo consider removing skewing from points before calculating stroke projection,\n * see https://github.com/fabricjs/fabric.js/commit/494a10ee2f8c2278ae9a55b20bf50cf6ee25b064#commitcomment-94751537\n */\nexport abstract class StrokeProjectionsBase {\n declare options: TProjectStrokeOnPointsOptions;\n declare scale: Point;\n declare strokeUniformScalar: Point;\n declare strokeProjectionMagnitude: number;\n\n constructor(options: TProjectStrokeOnPointsOptions) {\n this.options = options;\n this.strokeProjectionMagnitude = this.options.strokeWidth / 2;\n this.scale = new Point(this.options.scaleX, this.options.scaleY);\n this.strokeUniformScalar = this.options.strokeUniform\n ? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)\n : new Point(1, 1);\n }\n\n /**\n * When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.\n */\n protected createSideVector(from: XY, to: XY) {\n const v = createVector(from, to);\n return this.options.strokeUniform ? v.multiply(this.scale) : v;\n }\n\n protected abstract calcOrthogonalProjection(\n from: Point,\n to: Point,\n magnitude?: number,\n ): Point;\n\n protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {\n return this.applySkew(\n from.add(this.calcOrthogonalProjection(from, to, magnitude)),\n );\n }\n\n protected isSkewed() {\n return this.options.skewX !== 0 || this.options.skewY !== 0;\n }\n\n protected applySkew(point: Point) {\n const p = new Point(point);\n // skewY must be applied before skewX as this distortion affects skewX calculation\n p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));\n p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));\n return p;\n }\n\n protected scaleUnitVector(unitVector: Point, scalar: number) {\n return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);\n }\n\n protected abstract projectPoints(): Point[];\n\n public abstract project(): TProjection[];\n}\n"],"names":["StrokeProjectionsBase","constructor","options","strokeProjectionMagnitude","strokeWidth","scale","Point","scaleX","scaleY","strokeUniformScalar","strokeUniform","createSideVector","from","to","v","createVector","multiply","projectOrthogonally","magnitude","applySkew","add","calcOrthogonalProjection","isSkewed","skewX","skewY","point","p","y","x","Math","tan","degreesToRadians","scaleUnitVector","unitVector","scalar","scalarMultiply"],"mappings":";;;;AAMA;AACA;AACA;AACA;AACA;AACO,MAAeA,qBAAqB,CAAC;EAM1CC,WAAWA,CAACC,OAAsC,EAAE;IAClD,IAAI,CAACA,OAAO,GAAGA,OAAO,CAAA;IACtB,IAAI,CAACC,yBAAyB,GAAG,IAAI,CAACD,OAAO,CAACE,WAAW,GAAG,CAAC,CAAA;AAC7D,IAAA,IAAI,CAACC,KAAK,GAAG,IAAIC,KAAK,CAAC,IAAI,CAACJ,OAAO,CAACK,MAAM,EAAE,IAAI,CAACL,OAAO,CAACM,MAAM,CAAC,CAAA;AAChE,IAAA,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACP,OAAO,CAACQ,aAAa,GACjD,IAAIJ,KAAK,CAAC,CAAC,GAAG,IAAI,CAACJ,OAAO,CAACK,MAAM,EAAE,CAAC,GAAG,IAAI,CAACL,OAAO,CAACM,MAAM,CAAC,GAC3D,IAAIF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACrB,GAAA;;AAEA;AACF;AACA;AACYK,EAAAA,gBAAgBA,CAACC,IAAQ,EAAEC,EAAM,EAAE;AAC3C,IAAA,MAAMC,CAAC,GAAGC,YAAY,CAACH,IAAI,EAAEC,EAAE,CAAC,CAAA;AAChC,IAAA,OAAO,IAAI,CAACX,OAAO,CAACQ,aAAa,GAAGI,CAAC,CAACE,QAAQ,CAAC,IAAI,CAACX,KAAK,CAAC,GAAGS,CAAC,CAAA;AAChE,GAAA;AAQUG,EAAAA,mBAAmBA,CAACL,IAAW,EAAEC,EAAS,EAAEK,SAAkB,EAAE;AACxE,IAAA,OAAO,IAAI,CAACC,SAAS,CACnBP,IAAI,CAACQ,GAAG,CAAC,IAAI,CAACC,wBAAwB,CAACT,IAAI,EAAEC,EAAE,EAAEK,SAAS,CAAC,CAC7D,CAAC,CAAA;AACH,GAAA;AAEUI,EAAAA,QAAQA,GAAG;AACnB,IAAA,OAAO,IAAI,CAACpB,OAAO,CAACqB,KAAK,KAAK,CAAC,IAAI,IAAI,CAACrB,OAAO,CAACsB,KAAK,KAAK,CAAC,CAAA;AAC7D,GAAA;EAEUL,SAASA,CAACM,KAAY,EAAE;AAChC,IAAA,MAAMC,CAAC,GAAG,IAAIpB,KAAK,CAACmB,KAAK,CAAC,CAAA;AAC1B;AACAC,IAAAA,CAAC,CAACC,CAAC,IAAID,CAAC,CAACE,CAAC,GAAGC,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC7B,OAAO,CAACsB,KAAK,CAAC,CAAC,CAAA;AAC3DE,IAAAA,CAAC,CAACE,CAAC,IAAIF,CAAC,CAACC,CAAC,GAAGE,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC7B,OAAO,CAACqB,KAAK,CAAC,CAAC,CAAA;AAC3D,IAAA,OAAOG,CAAC,CAAA;AACV,GAAA;AAEUM,EAAAA,eAAeA,CAACC,UAAiB,EAAEC,MAAc,EAAE;AAC3D,IAAA,OAAOD,UAAU,CAACjB,QAAQ,CAAC,IAAI,CAACP,mBAAmB,CAAC,CAAC0B,cAAc,CAACD,MAAM,CAAC,CAAA;AAC7E,GAAA;AAKF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.mjs","sources":["../../../../../src/util/misc/projectStroke/index.ts"],"sourcesContent":["import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false
|
|
1
|
+
{"version":3,"file":"index.min.mjs","sources":["../../../../../src/util/misc/projectStroke/index.ts"],"sourcesContent":["import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n"],"names":["projectStrokeOnPoints","points","options","openPath","arguments","length","undefined","projections","reduced","reduce","point","eq","push","Point","start","index","findIndexRight","splice","forEach","A","B","C","StrokeLineCapProjections","project","StrokeLineJoinProjections"],"mappings":"gRAeO,MAAMA,EAAwB,SACnCC,EACAC,GAEkB,IADlBC,EAAQC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAER,MAAMG,EAA6B,GAEnC,GAAsB,IAAlBN,EAAOI,OACT,OAAOE,EAIT,MAAMC,EAAUP,EAAOQ,QACrB,CAACD,EAASE,KACHF,EAAQA,EAAQH,OAAS,GAAGM,GAAGD,IAClCF,EAAQI,KAAK,IAAIC,EAAMH,IAElBF,IAET,CAAC,IAAIK,EAAMZ,EAAO,MAGpB,GAAuB,IAAnBO,EAAQH,OACVF,GAAW,OACN,IAAKA,EAAU,CAGpB,MAAMW,EAAQN,EAAQ,GAChBO,EAAQC,EAAeR,GAAUE,IAAWA,EAAMC,GAAGG,KAC3DN,EAAQS,OAAOF,EAAQ,EACzB,CAkCA,OAhCAP,EAAQU,SAAQ,CAACC,EAAGJ,EAAOd,KACzB,IAAImB,EAAOC,EACG,IAAVN,GACFM,EAAIpB,EAAO,GACXmB,EAAIjB,EAAWgB,EAAIlB,EAAOA,EAAOI,OAAS,IACjCU,IAAUd,EAAOI,OAAS,GACnCe,EAAInB,EAAOc,EAAQ,GACnBM,EAAIlB,EAAWgB,EAAIlB,EAAO,KAE1BmB,EAAInB,EAAOc,EAAQ,GACnBM,EAAIpB,EAAOc,EAAQ,IAGjBZ,GAA8B,IAAlBF,EAAOI,OACrBE,EAAYK,QACP,IAAIU,EAAyBH,EAAGA,EAAGjB,GAASqB,YAExCpB,GAAuB,IAAVY,GAAeA,IAAUd,EAAOI,OAAS,EAS/DE,EAAYK,QACP,IAAIY,EAA0BL,EAAGC,EAAGC,EAAGnB,GAASqB,WATrDhB,EAAYK,QACP,IAAIU,EACLH,EACU,IAAVJ,EAAcM,EAAID,EAClBlB,GACAqB,UAMN,IAGKhB,CACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../src/util/misc/projectStroke/index.ts"],"sourcesContent":["import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../src/util/misc/projectStroke/index.ts"],"sourcesContent":["import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n points: XY[],\n options: TProjectStrokeOnPointsOptions,\n openPath = false,\n): TProjection[] => {\n const projections: TProjection[] = [];\n\n if (points.length === 0) {\n return projections;\n }\n\n // first we remove duplicate neighboring points\n const reduced = points.reduce(\n (reduced, point) => {\n if (!reduced[reduced.length - 1].eq(point)) {\n reduced.push(new Point(point));\n }\n return reduced;\n },\n [new Point(points[0])],\n );\n\n if (reduced.length === 1) {\n openPath = true;\n } else if (!openPath) {\n // remove points from end in case they equal the first point\n // in order to correctly project the first point\n const start = reduced[0];\n const index = findIndexRight(reduced, (point) => !point.eq(start));\n reduced.splice(index + 1);\n }\n\n reduced.forEach((A, index, points) => {\n let B: XY, C: XY;\n if (index === 0) {\n C = points[1];\n B = openPath ? A : points[points.length - 1];\n } else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? A : points[0];\n } else {\n B = points[index - 1];\n C = points[index + 1];\n }\n\n if (openPath && points.length === 1) {\n projections.push(\n ...new StrokeLineCapProjections(A, A, options).project(),\n );\n } else if (openPath && (index === 0 || index === points.length - 1)) {\n projections.push(\n ...new StrokeLineCapProjections(\n A,\n index === 0 ? C : B,\n options,\n ).project(),\n );\n } else {\n projections.push(\n ...new StrokeLineJoinProjections(A, B, C, options).project(),\n );\n }\n });\n\n return projections;\n};\n"],"names":["projectStrokeOnPoints","points","options","openPath","arguments","length","undefined","projections","reduced","reduce","point","eq","push","Point","start","index","findIndexRight","splice","forEach","A","B","C","StrokeLineCapProjections","project","StrokeLineJoinProjections"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveOrigin.min.mjs","sources":["../../../../src/util/misc/resolveOrigin.ts"],"sourcesContent":["import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number
|
|
1
|
+
{"version":3,"file":"resolveOrigin.min.mjs","sources":["../../../../src/util/misc/resolveOrigin.ts"],"sourcesContent":["import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n"],"names":["originOffset","left","top","center","bottom","right","resolveOrigin","originValue"],"mappings":"AAEA,MAAMA,EAAe,CACnBC,MAAO,GACPC,KAAM,GACNC,OAAQ,EACRC,OAAQ,GACRC,MAAO,IASIC,EACXC,GAEuB,iBAAhBA,EACHP,EAAaO,GACbA,EAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveOrigin.mjs","sources":["../../../../src/util/misc/resolveOrigin.ts"],"sourcesContent":["import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number
|
|
1
|
+
{"version":3,"file":"resolveOrigin.mjs","sources":["../../../../src/util/misc/resolveOrigin.ts"],"sourcesContent":["import type { TOriginX, TOriginY } from '../../typedefs';\n\nconst originOffset = {\n left: -0.5,\n top: -0.5,\n center: 0,\n bottom: 0.5,\n right: 0.5,\n};\n/**\n * Resolves origin value relative to center\n * @private\n * @param {TOriginX | TOriginY} originValue originX / originY\n * @returns number\n */\n\nexport const resolveOrigin = (\n originValue: TOriginX | TOriginY | number,\n): number =>\n typeof originValue === 'string'\n ? originOffset[originValue]\n : originValue - 0.5;\n"],"names":["originOffset","left","top","center","bottom","right","resolveOrigin","originValue"],"mappings":"AAEA,MAAMA,YAAY,GAAG;EACnBC,IAAI,EAAE,CAAC,GAAG;EACVC,GAAG,EAAE,CAAC,GAAG;AACTC,EAAAA,MAAM,EAAE,CAAC;AACTC,EAAAA,MAAM,EAAE,GAAG;AACXC,EAAAA,KAAK,EAAE,GAAA;AACT,CAAC,CAAA;AACD;AACA;AACA;AACA;AACA;AACA;;MAEaC,aAAa,GACxBC,WAAyC,IAEzC,OAAOA,WAAW,KAAK,QAAQ,GAC3BP,YAAY,CAACO,WAAW,CAAC,GACzBA,WAAW,GAAG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rotatePoint.min.mjs","sources":["../../../../src/util/misc/rotatePoint.ts"],"sourcesContent":["import type { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n/**\n * Rotates `point` around `origin` with `radians`\n * @deprecated use the Point.rotate\n * @param {Point} origin The origin of the rotation\n * @param {Point} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotatePoint = (\n point: Point,\n origin: Point,\n radians: TRadian
|
|
1
|
+
{"version":3,"file":"rotatePoint.min.mjs","sources":["../../../../src/util/misc/rotatePoint.ts"],"sourcesContent":["import type { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n/**\n * Rotates `point` around `origin` with `radians`\n * @deprecated use the Point.rotate\n * @param {Point} origin The origin of the rotation\n * @param {Point} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotatePoint = (\n point: Point,\n origin: Point,\n radians: TRadian,\n): Point => point.rotate(radians, origin);\n"],"names":["rotatePoint","point","origin","radians","rotate"],"mappings":"MAUaA,EAAcA,CACzBC,EACAC,EACAC,IACUF,EAAMG,OAAOD,EAASD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rotatePoint.mjs","sources":["../../../../src/util/misc/rotatePoint.ts"],"sourcesContent":["import type { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n/**\n * Rotates `point` around `origin` with `radians`\n * @deprecated use the Point.rotate\n * @param {Point} origin The origin of the rotation\n * @param {Point} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotatePoint = (\n point: Point,\n origin: Point,\n radians: TRadian
|
|
1
|
+
{"version":3,"file":"rotatePoint.mjs","sources":["../../../../src/util/misc/rotatePoint.ts"],"sourcesContent":["import type { Point } from '../../Point';\nimport type { TRadian } from '../../typedefs';\n/**\n * Rotates `point` around `origin` with `radians`\n * @deprecated use the Point.rotate\n * @param {Point} origin The origin of the rotation\n * @param {Point} origin The origin of the rotation\n * @param {TRadian} radians The radians of the angle for the rotation\n * @return {Point} The new rotated point\n */\nexport const rotatePoint = (\n point: Point,\n origin: Point,\n radians: TRadian,\n): Point => point.rotate(radians, origin);\n"],"names":["rotatePoint","point","origin","radians","rotate"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACaA,WAAW,GAAGA,CACzBC,KAAY,EACZC,MAAa,EACbC,OAAgB,KACNF,KAAK,CAACG,MAAM,CAACD,OAAO,EAAED,MAAM;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svgParsing.min.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type {\n TBBox,\n TMat2D,\n SVGElementName,\n SupportedSVGUnit,\n} from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string
|
|
1
|
+
{"version":3,"file":"svgParsing.min.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type {\n TBBox,\n TMat2D,\n SVGElementName,\n SupportedSVGUnit,\n} from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","align","NONE","slice","meetOrSlice","matrixToSVG","transform","map","toFixed","NUM_FRACTION_DIGITS","join","colorPropToSVG","prop","colorValue","opacityValue","inlineStyle","toLive","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","svgColor","FILL","x","y","w","h"],"mappings":"gOAgBaA,MAAAA,EAAoBC,IAC/B,MAAMC,EAAmB,CAAC,sBAAuB,QAAS,KAAM,SAChE,OAAQD,GACN,IAAK,iBACH,OAAOC,EAAiBC,OAAO,CAC7B,KACA,KACA,KACA,KACA,gBACA,sBAEJ,IAAK,iBACH,OAAOD,EAAiBC,OAAO,CAC7B,gBACA,oBACA,KACA,KACA,IACA,KACA,KACA,OAEJ,IAAK,OACH,OAAOD,EAAiBC,OAAO,CAAC,SAAU,aAAc,iBAE5D,OAAOD,CAAgB,EAUZE,EAAY,SAACC,GAAoD,IAArCC,EAAQC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,EAClD,MAAMC,EAAO,WAAWC,KAAKP,GAC3BQ,EAASC,WAAWT,GAChBU,EAAMC,EAAOC,IACnB,OAAQN,eAAAA,EAAO,IACb,IAAK,KACH,OAAQE,EAASE,EAAO,KAE1B,IAAK,KACH,OAAQF,EAASE,EAAO,KAE1B,IAAK,KACH,OAAOF,EAASE,EAElB,IAAK,KACH,OAAQF,EAASE,EAAO,GAE1B,IAAK,KACH,OAASF,EAASE,EAAO,GAAM,GAEjC,IAAK,KACH,OAAOF,EAASP,EAElB,QACE,OAAOO,EAEb,EA6BaK,EACXC,IAEA,MAAOC,EAAWC,GAAcF,EAAUG,OAAOC,MAAM,MAIhDC,EAAQC,IAvBGC,EAuBkBN,IArBvBM,IAAUC,EACd,CAACD,EAAME,MAAM,EAAG,GAAiBF,EAAME,MAAM,EAAG,IAC9CF,IAAUC,EACZ,CAACD,EAAOA,GAEV,CAAC,MAAO,OAPGA,MAwBlB,MAAO,CACLG,YAAaR,GAAc,OAC3BG,SACAC,SACD,EAQUK,EAAeC,GAC1B,UACAA,EACGC,KAAK3B,GAAU4B,EAAQ5B,EAAOW,EAAOkB,uBACrCC,KAAK,KACR,IAUWC,EAAiB,SAC5BC,EACAhC,GAEG,IACCiC,EACAC,EAHJC,IAAWjC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAIX,GAAKF,EAEE,GAAIA,EAAMoC,OACfH,gBAAUnC,OAAiBE,EAAMqC,GAAK,SACjC,CACL,MAAMC,EAAQ,IAAIC,EAAMvC,GACtBwC,EAAUF,EAAMG,WAElBR,EAAaK,EAAMI,QACH,IAAZF,IACFN,EAAeM,EAAQG,WAE3B,MAXEV,EAAa,OAYf,OAAIE,EACFrC,GAAAA,OAAUkC,EAAI,MAAAlC,OAAKmC,QAAUnC,OAC3BoC,EAAYpC,GAAAA,OAAMkC,EAAI,cAAAlC,OAAaoC,QAAmB,IAGxDpC,GAAAA,OAAUkC,EAAI,MAAAlC,OAAKmC,QAAUnC,OAC3BoC,EAAYpC,GAAAA,OAAMkC,EAAI,cAAAlC,OAAaoC,QAAmB,GAG5D,EAEaU,EAAgB,SAC3BN,EAAaO,GAGV,IAFHC,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKC,OAAEA,GAAeJ,EACnCK,EAAShD,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAGS,GAAAA,EAAOkB,oBAEnB,MAAMsB,EAAWpB,EAAeqB,EAAMd,GAAO,IACtCe,EAAGC,EAAGC,EAAGC,GAAK,CAACV,EAAMC,EAAKC,EAAOC,GAAQtB,KAAK3B,GACnD4B,EAAQ5B,EAAOkD,KAEjB,MAAA,SAAApD,OAAgBqD,UAAQrD,OAAOuD,EAACvD,SAAAA,OAAQwD,eAACxD,OAAYyD,EAACzD,cAAAA,OAAa0D,EAAC,YACtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svgParsing.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type {\n TBBox,\n TMat2D,\n SVGElementName,\n SupportedSVGUnit,\n} from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision)\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parseAlign","align","NONE","slice","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","meetOrSlice","matrixToSVG","transform","map","toFixed","NUM_FRACTION_DIGITS","join","colorPropToSVG","prop","inlineStyle","colorValue","opacityValue","toLive","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","svgColor","FILL","x","y","w","h"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"svgParsing.mjs","sources":["../../../../src/util/misc/svgParsing.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport { config } from '../../config';\nimport { DEFAULT_SVG_FONT_SIZE, FILL, NONE } from '../../constants';\nimport type {\n TBBox,\n TMat2D,\n SVGElementName,\n SupportedSVGUnit,\n} from '../../typedefs';\nimport { toFixed } from './toFixed';\n\n/**\n * Returns array of attributes for given svg that fabric parses\n * @param {SVGElementName} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\nexport const getSvgAttributes = (type: SVGElementName) => {\n const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];\n switch (type) {\n case 'linearGradient':\n return commonAttributes.concat([\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'gradientUnits',\n 'gradientTransform',\n ]);\n case 'radialGradient':\n return commonAttributes.concat([\n 'gradientUnits',\n 'gradientTransform',\n 'cx',\n 'cy',\n 'r',\n 'fx',\n 'fy',\n 'fr',\n ]);\n case 'stop':\n return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);\n }\n return commonAttributes;\n};\n\n/**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {string} value number to operate on\n * @param {number} fontSize\n * @return {number}\n */\nexport const parseUnit = (value: string, fontSize = DEFAULT_SVG_FONT_SIZE) => {\n const unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n const dpi = config.DPI;\n switch (unit?.[0] as SupportedSVGUnit) {\n case 'mm':\n return (number * dpi) / 25.4;\n\n case 'cm':\n return (number * dpi) / 2.54;\n\n case 'in':\n return number * dpi;\n\n case 'pt':\n return (number * dpi) / 72; // or * 4 / 3\n\n case 'pc':\n return ((number * dpi) / 72) * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n};\n\nexport type MeetOrSlice = 'meet' | 'slice';\n\nexport type MinMidMax = 'Min' | 'Mid' | 'Max' | 'none';\n\nexport type TPreserveArParsed = {\n meetOrSlice: MeetOrSlice;\n alignX: MinMidMax;\n alignY: MinMidMax;\n};\n\n// align can be either none or undefined or a combination of mid/max\nconst parseAlign = (align: string): MinMidMax[] => {\n //divide align in alignX and alignY\n if (align && align !== NONE) {\n return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];\n } else if (align === NONE) {\n return [align, align];\n }\n return ['Mid', 'Mid'];\n};\n\n/**\n * Parse preserveAspectRatio attribute from element\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\nexport const parsePreserveAspectRatioAttribute = (\n attribute: string,\n): TPreserveArParsed => {\n const [firstPart, secondPart] = attribute.trim().split(' ') as [\n MinMidMax,\n MeetOrSlice | undefined,\n ];\n const [alignX, alignY] = parseAlign(firstPart);\n return {\n meetOrSlice: secondPart || 'meet',\n alignX,\n alignY,\n };\n};\n\n/**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @param {TMat2D} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n */\nexport const matrixToSVG = (transform: TMat2D) =>\n 'matrix(' +\n transform\n .map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))\n .join(' ') +\n ')';\n\n/**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n * @param prop\n * @param value\n * @param {boolean} inlineStyle The default is inline style, the separator used is \":\", The other is \"=\"\n * @returns\n */\nexport const colorPropToSVG = (\n prop: string,\n value?: any,\n inlineStyle = true,\n) => {\n let colorValue;\n let opacityValue;\n if (!value) {\n colorValue = 'none';\n } else if (value.toLive) {\n colorValue = `url(#SVGID_${value.id})`;\n } else {\n const color = new Color(value),\n opacity = color.getAlpha();\n\n colorValue = color.toRgb();\n if (opacity !== 1) {\n opacityValue = opacity.toString();\n }\n }\n if (inlineStyle) {\n return `${prop}: ${colorValue}; ${\n opacityValue ? `${prop}-opacity: ${opacityValue}; ` : ''\n }`;\n } else {\n return `${prop}=\"${colorValue}\" ${\n opacityValue ? `${prop}-opacity=\"${opacityValue}\" ` : ''\n }`;\n }\n};\n\nexport const createSVGRect = (\n color: string,\n { left, top, width, height }: TBBox,\n precision = config.NUM_FRACTION_DIGITS,\n) => {\n const svgColor = colorPropToSVG(FILL, color, false);\n const [x, y, w, h] = [left, top, width, height].map((value) =>\n toFixed(value, precision),\n );\n return `<rect ${svgColor} x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\"></rect>`;\n};\n"],"names":["getSvgAttributes","type","commonAttributes","concat","parseUnit","value","fontSize","arguments","length","undefined","DEFAULT_SVG_FONT_SIZE","unit","exec","number","parseFloat","dpi","config","DPI","parseAlign","align","NONE","slice","parsePreserveAspectRatioAttribute","attribute","firstPart","secondPart","trim","split","alignX","alignY","meetOrSlice","matrixToSVG","transform","map","toFixed","NUM_FRACTION_DIGITS","join","colorPropToSVG","prop","inlineStyle","colorValue","opacityValue","toLive","id","color","Color","opacity","getAlpha","toRgb","toString","createSVGRect","_ref","left","top","width","height","precision","svgColor","FILL","x","y","w","h"],"mappings":";;;;;AAWA;AACA;AACA;AACA;AACA;AACaA,MAAAA,gBAAgB,GAAIC,IAAoB,IAAK;EACxD,MAAMC,gBAAgB,GAAG,CAAC,qBAAqB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACxE,EAAA,QAAQD,IAAI;AACV,IAAA,KAAK,gBAAgB;AACnB,MAAA,OAAOC,gBAAgB,CAACC,MAAM,CAAC,CAC7B,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,eAAe,EACf,mBAAmB,CACpB,CAAC,CAAA;AACJ,IAAA,KAAK,gBAAgB;MACnB,OAAOD,gBAAgB,CAACC,MAAM,CAAC,CAC7B,eAAe,EACf,mBAAmB,EACnB,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC,CAAA;AACJ,IAAA,KAAK,MAAM;MACT,OAAOD,gBAAgB,CAACC,MAAM,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAA;AAC5E,GAAA;AACA,EAAA,OAAOD,gBAAgB,CAAA;AACzB,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;MACaE,SAAS,GAAG,UAACC,KAAa,EAAuC;AAAA,EAAA,IAArCC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAGG,qBAAqB,CAAA;AACvE,EAAA,MAAMC,IAAI,GAAG,UAAU,CAACC,IAAI,CAACP,KAAK,CAAC;AACjCQ,IAAAA,MAAM,GAAGC,UAAU,CAACT,KAAK,CAAC,CAAA;AAC5B,EAAA,MAAMU,GAAG,GAAGC,MAAM,CAACC,GAAG,CAAA;AACtB,EAAA,QAAQN,IAAI,KAAJA,IAAAA,IAAAA,IAAI,uBAAJA,IAAI,CAAG,CAAC,CAAC;AACf,IAAA,KAAK,IAAI;AACP,MAAA,OAAQE,MAAM,GAAGE,GAAG,GAAI,IAAI,CAAA;AAE9B,IAAA,KAAK,IAAI;AACP,MAAA,OAAQF,MAAM,GAAGE,GAAG,GAAI,IAAI,CAAA;AAE9B,IAAA,KAAK,IAAI;MACP,OAAOF,MAAM,GAAGE,GAAG,CAAA;AAErB,IAAA,KAAK,IAAI;AACP,MAAA,OAAQF,MAAM,GAAGE,GAAG,GAAI,EAAE,CAAA;AAAE;;AAE9B,IAAA,KAAK,IAAI;AACP,MAAA,OAASF,MAAM,GAAGE,GAAG,GAAI,EAAE,GAAI,EAAE,CAAA;AAAE;;AAErC,IAAA,KAAK,IAAI;MACP,OAAOF,MAAM,GAAGP,QAAQ,CAAA;AAE1B,IAAA;AACE,MAAA,OAAOO,MAAM,CAAA;AACjB,GAAA;AACF,EAAC;AAYD;AACA,MAAMK,UAAU,GAAIC,KAAa,IAAkB;AACjD;AACA,EAAA,IAAIA,KAAK,IAAIA,KAAK,KAAKC,IAAI,EAAE;AAC3B,IAAA,OAAO,CAACD,KAAK,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAeF,KAAK,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAc,CAAA;AACzE,GAAC,MAAM,IAAIF,KAAK,KAAKC,IAAI,EAAE;AACzB,IAAA,OAAO,CAACD,KAAK,EAAEA,KAAK,CAAC,CAAA;AACvB,GAAA;AACA,EAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACvB,CAAC,CAAA;;AAED;AACA;AACA;AACA;AACA;AACA;AACaG,MAAAA,iCAAiC,GAC5CC,SAAiB,IACK;AACtB,EAAA,MAAM,CAACC,SAAS,EAAEC,UAAU,CAAC,GAAGF,SAAS,CAACG,IAAI,EAAE,CAACC,KAAK,CAAC,GAAG,CAGzD,CAAA;EACD,MAAM,CAACC,MAAM,EAAEC,MAAM,CAAC,GAAGX,UAAU,CAACM,SAAS,CAAC,CAAA;EAC9C,OAAO;IACLM,WAAW,EAAEL,UAAU,IAAI,MAAM;IACjCG,MAAM;AACNC,IAAAA,MAAAA;GACD,CAAA;AACH,EAAC;;AAED;AACA;AACA;AACA;AACA;AACaE,MAAAA,WAAW,GAAIC,SAAiB,IAC3C,SAAS,GACTA,SAAS,CACNC,GAAG,CAAE5B,KAAK,IAAK6B,OAAO,CAAC7B,KAAK,EAAEW,MAAM,CAACmB,mBAAmB,CAAC,CAAC,CAC1DC,IAAI,CAAC,GAAG,CAAC,GACZ,IAAG;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAG,UAC5BC,IAAY,EACZjC,KAAW,EAER;AAAA,EAAA,IADHkC,WAAW,GAAAhC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAA;AAElB,EAAA,IAAIiC,UAAU,CAAA;AACd,EAAA,IAAIC,YAAY,CAAA;EAChB,IAAI,CAACpC,KAAK,EAAE;AACVmC,IAAAA,UAAU,GAAG,MAAM,CAAA;AACrB,GAAC,MAAM,IAAInC,KAAK,CAACqC,MAAM,EAAE;AACvBF,IAAAA,UAAU,iBAAArC,MAAA,CAAiBE,KAAK,CAACsC,EAAE,EAAG,GAAA,CAAA,CAAA;AACxC,GAAC,MAAM;AACL,IAAA,MAAMC,KAAK,GAAG,IAAIC,KAAK,CAACxC,KAAK,CAAC;AAC5ByC,MAAAA,OAAO,GAAGF,KAAK,CAACG,QAAQ,EAAE,CAAA;AAE5BP,IAAAA,UAAU,GAAGI,KAAK,CAACI,KAAK,EAAE,CAAA;IAC1B,IAAIF,OAAO,KAAK,CAAC,EAAE;AACjBL,MAAAA,YAAY,GAAGK,OAAO,CAACG,QAAQ,EAAE,CAAA;AACnC,KAAA;AACF,GAAA;AACA,EAAA,IAAIV,WAAW,EAAE;IACf,OAAApC,EAAAA,CAAAA,MAAA,CAAUmC,IAAI,EAAA,IAAA,CAAA,CAAAnC,MAAA,CAAKqC,UAAU,QAAArC,MAAA,CAC3BsC,YAAY,GAAAtC,EAAAA,CAAAA,MAAA,CAAMmC,IAAI,EAAA,YAAA,CAAA,CAAAnC,MAAA,CAAasC,YAAY,UAAO,EAAE,CAAA,CAAA;AAE5D,GAAC,MAAM;IACL,OAAAtC,EAAAA,CAAAA,MAAA,CAAUmC,IAAI,EAAA,KAAA,CAAA,CAAAnC,MAAA,CAAKqC,UAAU,SAAArC,MAAA,CAC3BsC,YAAY,GAAAtC,EAAAA,CAAAA,MAAA,CAAMmC,IAAI,EAAA,aAAA,CAAA,CAAAnC,MAAA,CAAasC,YAAY,WAAO,EAAE,CAAA,CAAA;AAE5D,GAAA;AACF,EAAC;AAEM,MAAMS,aAAa,GAAG,UAC3BN,KAAa,EAAAO,IAAA,EAGV;EAAA,IAFH;IAAEC,IAAI;IAAEC,GAAG;IAAEC,KAAK;AAAEC,IAAAA,MAAAA;AAAc,GAAC,GAAAJ,IAAA,CAAA;AAAA,EAAA,IACnCK,SAAS,GAAAjD,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAE,CAAAA,CAAAA,KAAAA,SAAA,GAAAF,SAAA,CAAGS,CAAAA,CAAAA,GAAAA,MAAM,CAACmB,mBAAmB,CAAA;EAEtC,MAAMsB,QAAQ,GAAGpB,cAAc,CAACqB,IAAI,EAAEd,KAAK,EAAE,KAAK,CAAC,CAAA;AACnD,EAAA,MAAM,CAACe,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAEC,CAAC,CAAC,GAAG,CAACV,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC,CAACtB,GAAG,CAAE5B,KAAK,IACxD6B,OAAO,CAAC7B,KAAK,EAAEmD,SAAS,CAC1B,CAAC,CAAA;AACD,EAAA,OAAA,QAAA,CAAArD,MAAA,CAAgBsD,QAAQ,WAAAtD,MAAA,CAAOwD,CAAC,EAAAxD,SAAAA,CAAAA,CAAAA,MAAA,CAAQyD,CAAC,iBAAAzD,MAAA,CAAY0D,CAAC,EAAA1D,cAAAA,CAAAA,CAAAA,MAAA,CAAa2D,CAAC,EAAA,YAAA,CAAA,CAAA;AACtE;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as t}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{reNewline as e}from"../../constants.min.mjs";import{
|
|
1
|
+
import{objectSpread2 as t}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{reNewline as e}from"../../constants.min.mjs";import{cloneStyles as n}from"../internals/cloneStyles.min.mjs";import{graphemeSplit as l}from"../lang_string.min.mjs";const o=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||n&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough)},r=(t,e)=>{const r=e.split("\n"),i=[];let s=-1,f={};t=n(t);for(let e=0;e<r.length;e++){const n=l(r[e]);if(t[e])for(let l=0;l<n.length;l++){s++;const n=t[e][l];n&&Object.keys(n).length>0&&(o(f,n,!0)?i.push({start:s,end:s+1,style:n}):i[i.length-1].end++),f=n||{}}else s+=n.length,f={}}return i},i=(o,r)=>{if(!Array.isArray(o))return n(o);const i=r.split(e),s={};let f=-1,m=0;for(let e=0;e<i.length;e++){const n=l(i[e]);for(let l=0;l<n.length;l++)f++,o[m]&&o[m].start<=f&&f<o[m].end&&(s[e]=s[e]||{},s[e][l]=t({},o[m].style),f===o[m].end-1&&m++)}return s};export{o as hasStyleChanged,i as stylesFromArray,r as stylesToArray};
|
|
2
2
|
//# sourceMappingURL=textStyles.min.mjs.map
|