fabric 5.3.0 → 6.0.0-beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +43 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.gitpod.yml +17 -1
- package/.prettierignore +19 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +532 -189
- package/CONTRIBUTING.md +224 -59
- package/README.md +200 -235
- package/bower.json +1 -3
- package/dist/fabric.d.ts +42 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +27582 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +27519 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +27663 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +14 -0
- package/dist/index.node.mjs +27606 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/ClassRegistry.d.ts +13 -0
- package/dist/src/Collection.d.ts +136 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +227 -0
- package/dist/src/Intersection.d.ts +112 -0
- package/dist/src/Observable.d.ts +60 -0
- package/dist/src/Pattern.d.ts +113 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +97 -0
- package/dist/src/brushes/BaseBrush.d.ts +105 -0
- package/dist/src/brushes/CircleBrush.d.ts +49 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +79 -0
- package/dist/src/cache.d.ts +47 -0
- package/dist/src/canvas/Canvas.d.ts +548 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +754 -0
- package/dist/src/canvas/StaticCanvas.d.ts +778 -0
- package/dist/src/canvas/TextEditingManager.d.ts +17 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +174 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +22 -0
- package/dist/src/color/util.d.ts +12 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +14 -0
- package/dist/src/controls/Control.d.ts +228 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/commonControls.d.ts +28 -0
- package/dist/src/controls/controlRendering.d.ts +29 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/index.d.ts +13 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +15 -0
- package/dist/src/env/node.d.ts +5 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +153 -0
- package/dist/src/filters/BlendColor.d.ts +80 -0
- package/dist/src/filters/BlendImage.d.ts +92 -0
- package/dist/src/filters/Blur.d.ts +51 -0
- package/dist/src/filters/Boilerplate.d.ts +48 -0
- package/dist/src/filters/Brightness.d.ts +47 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +63 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +545 -0
- package/dist/src/filters/Composed.d.ts +45 -0
- package/dist/src/filters/Contrast.d.ts +45 -0
- package/dist/src/filters/Convolute.d.ts +82 -0
- package/dist/src/filters/FilterBackend.d.ts +14 -0
- package/dist/src/filters/GLProbes/GLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/NodeGLProbe.d.ts +11 -0
- package/dist/src/filters/GLProbes/WebGLProbe.d.ts +20 -0
- package/dist/src/filters/Gamma.d.ts +54 -0
- package/dist/src/filters/Grayscale.d.ts +46 -0
- package/dist/src/filters/HueRotation.d.ts +24 -0
- package/dist/src/filters/Invert.d.ts +55 -0
- package/dist/src/filters/Noise.d.ts +54 -0
- package/dist/src/filters/Pixelate.d.ts +44 -0
- package/dist/src/filters/RemoveColor.d.ts +63 -0
- package/dist/src/filters/Resize.d.ts +136 -0
- package/dist/src/filters/Saturation.d.ts +48 -0
- package/dist/src/filters/Vibrance.d.ts +48 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
- package/dist/src/filters/filters.d.ts +21 -0
- package/dist/src/filters/index.d.ts +5 -0
- package/dist/src/filters/shaders/baseFilter.d.ts +4 -0
- package/dist/src/filters/shaders/blendColor.d.ts +13 -0
- package/dist/src/filters/shaders/blendImage.d.ts +3 -0
- package/dist/src/filters/shaders/blur.d.ts +2 -0
- package/dist/src/filters/shaders/brightness.d.ts +2 -0
- package/dist/src/filters/shaders/colorMatrix.d.ts +2 -0
- package/dist/src/filters/shaders/constrast.d.ts +2 -0
- package/dist/src/filters/shaders/convolute.d.ts +11 -0
- package/dist/src/filters/shaders/gamma.d.ts +2 -0
- package/dist/src/filters/shaders/grayscale.d.ts +3 -0
- package/dist/src/filters/shaders/invert.d.ts +2 -0
- package/dist/src/filters/shaders/noise.d.ts +2 -0
- package/dist/src/filters/shaders/pixelate.d.ts +2 -0
- package/dist/src/filters/shaders/removeColor.d.ts +2 -0
- package/dist/src/filters/shaders/saturation.d.ts +2 -0
- package/dist/src/filters/shaders/vibrance.d.ts +2 -0
- package/dist/src/filters/typedefs.d.ts +49 -0
- package/dist/src/gradient/Gradient.d.ts +149 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +3 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +53 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/index.d.ts +10 -0
- package/dist/src/parser/loadSVGFromString.d.ts +12 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseElements.d.ts +11 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +15 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/rotateMatrix.d.ts +2 -0
- package/dist/src/parser/scaleMatrix.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/skewMatrix.d.ts +2 -0
- package/dist/src/parser/translateMatrix.d.ts +2 -0
- package/dist/src/shapes/ActiveSelection.d.ts +82 -0
- package/dist/src/shapes/Circle.d.ts +99 -0
- package/dist/src/shapes/Ellipse.d.ts +84 -0
- package/dist/src/shapes/Group.d.ts +408 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +335 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +287 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +83 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +195 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +311 -0
- package/dist/src/shapes/Line.d.ts +126 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +11 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +296 -0
- package/dist/src/shapes/Object/Object.d.ts +594 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +327 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +109 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +72 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +76 -0
- package/dist/src/shapes/Object/types/BaseProps.d.ts +84 -0
- package/dist/src/shapes/Object/types/BorderProps.d.ts +37 -0
- package/dist/src/shapes/Object/types/ControlProps.d.ts +62 -0
- package/dist/src/shapes/Object/types/FabricObjectProps.d.ts +96 -0
- package/dist/src/shapes/Object/types/FillStrokeProps.d.ts +80 -0
- package/dist/src/shapes/Object/types/LockInteractionProps.d.ts +51 -0
- package/dist/src/shapes/Object/types/ObjectProps.d.ts +42 -0
- package/dist/src/shapes/Object/types/SerializedObjectProps.d.ts +66 -0
- package/dist/src/shapes/Object/types/index.d.ts +6 -0
- package/dist/src/shapes/Path.d.ts +130 -0
- package/dist/src/shapes/Polygon.d.ts +9 -0
- package/dist/src/shapes/Polyline.d.ts +140 -0
- package/dist/src/shapes/Rect.d.ts +76 -0
- package/dist/src/shapes/Text/StyledText.d.ts +119 -0
- package/dist/src/shapes/Text/Text.d.ts +673 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Text/constants.d.ts +7 -0
- package/dist/src/shapes/Textbox.d.ts +185 -0
- package/dist/src/shapes/Triangle.d.ts +25 -0
- package/dist/src/typedefs.d.ts +90 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +3 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +39 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/fireEvent.d.ts +3 -0
- package/dist/src/util/index.d.ts +35 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +29 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +92 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +56 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +9 -0
- package/dist/src/util/misc/planeChange.d.ts +84 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +53 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +57 -0
- package/dist/src/util/path/index.d.ts +96 -0
- package/dist/src/util/path/regex.d.ts +3 -0
- package/dist/src/util/path/typechecks.d.ts +24 -0
- package/dist/src/util/path/typedefs.d.ts +220 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/types.d.ts +19 -0
- package/fabric.ts +51 -0
- package/index.node.ts +37 -0
- package/index.ts +1 -0
- package/package.json +100 -40
- package/publish.js +0 -26
- package/rollup.config.mjs +91 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/git.mjs +36 -0
- package/scripts/index.mjs +564 -0
- package/scripts/sandbox.mjs +149 -0
- package/src/ClassRegistry.ts +56 -0
- package/src/Collection.ts +346 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +296 -0
- package/src/Intersection.ts +302 -0
- package/src/Observable.ts +181 -0
- package/src/Pattern.ts +227 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +214 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
- package/src/brushes/CircleBrush.ts +145 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +219 -0
- package/src/cache.ts +90 -0
- package/src/canvas/Canvas.ts +1607 -0
- package/src/canvas/SelectableCanvas.ts +1608 -0
- package/src/canvas/StaticCanvas.ts +1734 -0
- package/src/canvas/TextEditingManager.ts +48 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +404 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +26 -0
- package/src/color/util.ts +32 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +20 -0
- package/src/controls/Control.ts +380 -0
- package/src/controls/changeWidth.ts +52 -0
- package/src/controls/commonControls.ts +105 -0
- package/src/controls/controlRendering.ts +138 -0
- package/src/controls/drag.ts +31 -0
- package/src/controls/index.ts +22 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +242 -0
- package/src/controls/util.ts +154 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +32 -0
- package/src/env/index.ts +24 -0
- package/src/env/node.ts +56 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +192 -151
- package/src/filters/BlendColor.ts +217 -0
- package/src/filters/BlendImage.ts +228 -0
- package/src/filters/Blur.ts +179 -0
- package/src/filters/Boilerplate.ts +94 -0
- package/src/filters/Brightness.ts +83 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +145 -0
- package/src/filters/ColorMatrixFilters.ts +77 -0
- package/src/filters/Composed.ts +76 -0
- package/src/filters/Contrast.ts +82 -0
- package/src/filters/Convolute.ts +184 -0
- package/src/filters/FilterBackend.ts +34 -0
- package/src/filters/GLProbes/GLProbe.ts +11 -0
- package/src/filters/GLProbes/NodeGLProbe.ts +15 -0
- package/src/filters/GLProbes/WebGLProbe.ts +46 -0
- package/src/filters/Gamma.ts +110 -0
- package/src/filters/Grayscale.ts +102 -0
- package/src/filters/HueRotation.ts +62 -0
- package/src/filters/Invert.ts +99 -0
- package/src/filters/Noise.ts +94 -0
- package/src/filters/Pixelate.ts +96 -0
- package/src/filters/RemoveColor.ts +135 -0
- package/src/filters/Resize.ts +538 -0
- package/src/filters/Saturation.ts +87 -0
- package/src/filters/Vibrance.ts +88 -0
- package/src/filters/WebGLFilterBackend.ts +430 -0
- package/src/filters/filters.ts +28 -0
- package/src/filters/index.ts +5 -0
- package/src/filters/shaders/baseFilter.ts +19 -0
- package/src/filters/shaders/blendColor.ts +33 -0
- package/src/filters/shaders/blendImage.ts +32 -0
- package/src/filters/shaders/blur.ts +24 -0
- package/src/filters/shaders/brightness.ts +11 -0
- package/src/filters/shaders/colorMatrix.ts +12 -0
- package/src/filters/shaders/constrast.ts +11 -0
- package/src/filters/shaders/convolute.ts +154 -0
- package/src/filters/shaders/gamma.ts +15 -0
- package/src/filters/shaders/grayscale.ts +36 -0
- package/src/filters/shaders/invert.ts +19 -0
- package/src/filters/shaders/noise.ts +16 -0
- package/src/filters/shaders/pixelate.ts +19 -0
- package/src/filters/shaders/removeColor.ts +13 -0
- package/src/filters/shaders/saturation.ts +15 -0
- package/src/filters/shaders/vibrance.ts +16 -0
- package/src/filters/typedefs.ts +65 -0
- package/src/gradient/Gradient.ts +406 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +56 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +157 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +115 -0
- package/src/parser/doesSomeParentMatch.ts +19 -0
- package/src/parser/elementById.ts +21 -0
- package/src/parser/elementMatchesRule.ts +16 -0
- package/src/parser/elements_parser.ts +191 -0
- package/src/parser/getCSSRules.ts +62 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +31 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +5 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/index.ts +9 -0
- package/src/parser/loadSVGFromString.ts +26 -0
- package/src/parser/loadSVGFromURL.ts +40 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +63 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseElements.ts +28 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +34 -0
- package/src/parser/parseSVGDocument.ts +93 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +155 -0
- package/src/parser/parseUseDirectives.ts +78 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/rotateMatrix.ts +21 -0
- package/src/parser/scaleMatrix.ts +9 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/skewMatrix.ts +6 -0
- package/src/parser/translateMatrix.ts +8 -0
- package/src/shapes/ActiveSelection.ts +189 -0
- package/src/shapes/Circle.ts +242 -0
- package/src/shapes/Ellipse.ts +179 -0
- package/src/shapes/Group.ts +1100 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +382 -0
- package/src/shapes/IText/IText.ts +693 -0
- package/src/shapes/IText/ITextBehavior.ts +1064 -0
- package/src/shapes/IText/ITextClickBehavior.ts +325 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +685 -0
- package/src/shapes/IText/constants.ts +47 -0
- package/src/shapes/Image.ts +841 -0
- package/src/shapes/Line.ts +346 -0
- package/src/shapes/Object/AnimatableObject.ts +106 -0
- package/src/shapes/Object/FabricObject.ts +29 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
- package/src/shapes/Object/InteractiveObject.ts +672 -0
- package/src/shapes/Object/Object.ts +1561 -0
- package/src/shapes/Object/ObjectGeometry.ts +813 -0
- package/src/shapes/Object/ObjectOrigin.ts +276 -0
- package/src/shapes/Object/StackedObject.ts +206 -0
- package/src/shapes/Object/defaultValues.ts +108 -0
- package/src/shapes/Object/types/BaseProps.ts +96 -0
- package/src/shapes/Object/types/BorderProps.ts +40 -0
- package/src/shapes/Object/types/ControlProps.ts +69 -0
- package/src/shapes/Object/types/FabricObjectProps.ts +111 -0
- package/src/shapes/Object/types/FillStrokeProps.ts +90 -0
- package/src/shapes/Object/types/LockInteractionProps.ts +57 -0
- package/src/shapes/Object/types/ObjectProps.ts +46 -0
- package/src/shapes/Object/types/SerializedObjectProps.ts +73 -0
- package/src/shapes/Object/types/index.ts +8 -0
- package/src/shapes/Path.ts +416 -0
- package/src/shapes/Polygon.ts +20 -0
- package/src/shapes/Polyline.ts +359 -0
- package/src/shapes/Rect.ts +233 -0
- package/src/shapes/Text/StyledText.ts +329 -0
- package/src/shapes/Text/Text.ts +1884 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
- package/src/shapes/Text/constants.ts +91 -0
- package/src/shapes/Textbox.ts +477 -0
- package/src/shapes/Triangle.ts +60 -0
- package/src/typedefs.ts +115 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +9 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +121 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/fireEvent.ts +15 -0
- package/src/util/index.ts +102 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +37 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +50 -0
- package/src/util/misc/findScaleTo.ts +44 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +28 -0
- package/src/util/misc/matrix.ts +207 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +189 -0
- package/src/util/misc/objectTransforms.ts +129 -0
- package/src/util/misc/pick.ts +29 -0
- package/src/util/misc/planeChange.ts +136 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +226 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
- package/src/util/misc/projectStroke/index.ts +53 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +181 -0
- package/src/util/misc/textStyles.ts +134 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +82 -0
- package/src/util/path/index.ts +1038 -0
- package/src/util/path/regex.ts +41 -0
- package/src/util/path/typechecks.ts +145 -0
- package/src/util/path/typedefs.ts +305 -0
- package/src/util/transform_matrix_removal.ts +60 -0
- package/src/util/types.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { XY, Point } from '../../../Point';
|
|
2
|
+
import { degreesToRadians } from '../radiansDegreesConversion';
|
|
3
|
+
import { getBisector, getOrthonormalVector, magnitude } from '../vectors';
|
|
4
|
+
import { StrokeProjectionsBase } from './StrokeProjectionsBase';
|
|
5
|
+
import { TProjection, TProjectStrokeOnPointsOptions } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* class in charge of finding projections for each type of line join
|
|
9
|
+
* @see {@link [Closed path projections at #8344](https://github.com/fabricjs/fabric.js/pull/8344#2-closed-path)}
|
|
10
|
+
*
|
|
11
|
+
* - MDN:
|
|
12
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
|
|
13
|
+
* - https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linejoin
|
|
14
|
+
* - Spec: https://svgwg.org/svg2-draft/painting.html#StrokeLinejoinProperty
|
|
15
|
+
* - Playground to understand how the line joins works: https://hypertolosana.github.io/efficient-webgl-stroking/index.html
|
|
16
|
+
* - View the calculated projections for each of the control points: https://codesandbox.io/s/project-stroke-points-with-context-to-trace-b8jc4j?file=/src/index.js
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export class StrokeLineJoinProjections extends StrokeProjectionsBase {
|
|
20
|
+
/**
|
|
21
|
+
* The point being projected (the angle ∠BAC)
|
|
22
|
+
*/
|
|
23
|
+
declare A: Point;
|
|
24
|
+
/**
|
|
25
|
+
* The point before A
|
|
26
|
+
*/
|
|
27
|
+
declare B: Point;
|
|
28
|
+
/**
|
|
29
|
+
* The point after A
|
|
30
|
+
*/
|
|
31
|
+
declare C: Point;
|
|
32
|
+
/**
|
|
33
|
+
* The bisector of A (∠BAC)
|
|
34
|
+
*/
|
|
35
|
+
declare bisector: ReturnType<typeof getBisector>;
|
|
36
|
+
|
|
37
|
+
constructor(A: XY, B: XY, C: XY, options: TProjectStrokeOnPointsOptions) {
|
|
38
|
+
super(options);
|
|
39
|
+
this.A = new Point(A);
|
|
40
|
+
this.B = new Point(B);
|
|
41
|
+
this.C = new Point(C);
|
|
42
|
+
// First we calculate the bisector between the points. Used in `round` and `miter` cases
|
|
43
|
+
// When the stroke is uniform, scaling changes the arrangement of the points, so we have to take it into account
|
|
44
|
+
this.bisector = this.options.strokeUniform
|
|
45
|
+
? getBisector(
|
|
46
|
+
this.A.multiply(this.scale),
|
|
47
|
+
this.B.multiply(this.scale),
|
|
48
|
+
this.C.multiply(this.scale)
|
|
49
|
+
)
|
|
50
|
+
: getBisector(this.A, this.B, this.C);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get bisectorVector() {
|
|
54
|
+
return this.bisector.vector;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get bisectorAngle() {
|
|
58
|
+
return this.bisector.angle;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
calcOrthogonalProjection(
|
|
62
|
+
from: Point,
|
|
63
|
+
to: Point,
|
|
64
|
+
magnitude: number = this.strokeProjectionMagnitude
|
|
65
|
+
) {
|
|
66
|
+
const vector = this.createSideVector(from, to);
|
|
67
|
+
const orthogonalProjection = getOrthonormalVector(vector);
|
|
68
|
+
const correctSide = StrokeProjectionsBase.getAcuteAngleFactor(
|
|
69
|
+
orthogonalProjection,
|
|
70
|
+
this.bisectorVector
|
|
71
|
+
);
|
|
72
|
+
return this.scaleUnitVector(orthogonalProjection, magnitude * correctSide);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* BEVEL
|
|
77
|
+
* Calculation: the projection points are formed by the vector orthogonal to the vertex.
|
|
78
|
+
*
|
|
79
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-2-bevel
|
|
80
|
+
*/
|
|
81
|
+
projectBevel() {
|
|
82
|
+
return [this.B, this.C].map((to) => this.projectOrthogonally(this.A, to));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* MITER
|
|
87
|
+
* Calculation: the corner is formed by extending the outer edges of the stroke
|
|
88
|
+
* at the tangents of the path segments until they intersect.
|
|
89
|
+
*
|
|
90
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-1-miter
|
|
91
|
+
*/
|
|
92
|
+
projectMiter() {
|
|
93
|
+
const alpha = Math.abs(this.bisectorAngle),
|
|
94
|
+
hypotUnitScalar = 1 / Math.sin(alpha / 2),
|
|
95
|
+
miterVector = this.scaleUnitVector(
|
|
96
|
+
this.bisectorVector,
|
|
97
|
+
-this.strokeProjectionMagnitude * hypotUnitScalar
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// When two line segments meet at a sharp angle, it is possible for the join to extend,
|
|
101
|
+
// far beyond the thickness of the line stroking the path. The stroke-miterlimit imposes
|
|
102
|
+
// a limit on the extent of the line join.
|
|
103
|
+
// MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
|
|
104
|
+
// When the stroke is uniform, scaling changes the arrangement of points, this changes the miter-limit
|
|
105
|
+
const strokeMiterLimit = this.options.strokeUniform
|
|
106
|
+
? hypotUnitScalar
|
|
107
|
+
: this.options.strokeMiterLimit;
|
|
108
|
+
|
|
109
|
+
if (
|
|
110
|
+
magnitude(miterVector) / this.strokeProjectionMagnitude <=
|
|
111
|
+
strokeMiterLimit
|
|
112
|
+
) {
|
|
113
|
+
return [this.applySkew(this.A.add(miterVector))];
|
|
114
|
+
} else {
|
|
115
|
+
// when the miter-limit is reached, the stroke line join becomes of type bevel
|
|
116
|
+
return this.projectBevel();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* ROUND (without skew)
|
|
122
|
+
* Calculation: the projections are the two vectors parallel to X and Y axes
|
|
123
|
+
*
|
|
124
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-1-round-without-skew
|
|
125
|
+
*/
|
|
126
|
+
private projectRoundNoSkew() {
|
|
127
|
+
// correctSide is used to only consider projecting for the outer side
|
|
128
|
+
const correctSide = new Point(
|
|
129
|
+
StrokeProjectionsBase.getAcuteAngleFactor(this.bisectorVector),
|
|
130
|
+
StrokeProjectionsBase.getAcuteAngleFactor(
|
|
131
|
+
new Point(this.bisectorVector.y, this.bisectorVector.x)
|
|
132
|
+
)
|
|
133
|
+
),
|
|
134
|
+
radiusOnAxisX = new Point(1, 0)
|
|
135
|
+
.scalarMultiply(this.strokeProjectionMagnitude)
|
|
136
|
+
.multiply(this.strokeUniformScalar)
|
|
137
|
+
.multiply(correctSide),
|
|
138
|
+
radiusOnAxisY = new Point(0, 1)
|
|
139
|
+
.scalarMultiply(this.strokeProjectionMagnitude)
|
|
140
|
+
.multiply(this.strokeUniformScalar)
|
|
141
|
+
.multiply(correctSide);
|
|
142
|
+
|
|
143
|
+
return [this.A.add(radiusOnAxisX), this.A.add(radiusOnAxisY)];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* ROUND (with skew)
|
|
148
|
+
* Calculation: the projections are the points furthest from the vertex in
|
|
149
|
+
* the direction of the X and Y axes after distortion.
|
|
150
|
+
*
|
|
151
|
+
* @todo TODO:
|
|
152
|
+
* - Consider only projections that are inside the beginning and end of the circle segment
|
|
153
|
+
*
|
|
154
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344#2-3-2-round-skew
|
|
155
|
+
*/
|
|
156
|
+
private projectRoundWithSkew() {
|
|
157
|
+
const projections: Point[] = [];
|
|
158
|
+
|
|
159
|
+
// The start and end points of the circle segment
|
|
160
|
+
[this.B, this.C].forEach((to) =>
|
|
161
|
+
projections.push(this.projectOrthogonally(this.A, to))
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const { skewX, skewY } = this.options;
|
|
165
|
+
// The points furthest from the vertex in the direction of the X and Y axes after distortion
|
|
166
|
+
const circleRadius = new Point()
|
|
167
|
+
.scalarAdd(this.strokeProjectionMagnitude)
|
|
168
|
+
.multiply(this.strokeUniformScalar),
|
|
169
|
+
newY =
|
|
170
|
+
circleRadius.y / Math.sqrt(1 + Math.tan(degreesToRadians(skewY)) ** 2),
|
|
171
|
+
furthestY = new Point(
|
|
172
|
+
Math.sqrt(
|
|
173
|
+
circleRadius.x ** 2 - ((newY * circleRadius.x) / circleRadius.y) ** 2
|
|
174
|
+
),
|
|
175
|
+
newY
|
|
176
|
+
),
|
|
177
|
+
newX =
|
|
178
|
+
circleRadius.x / Math.sqrt(1 + Math.tan(degreesToRadians(skewX)) ** 2),
|
|
179
|
+
furthestX = new Point(
|
|
180
|
+
newX,
|
|
181
|
+
Math.sqrt(newY ** 2 - ((newX * newY) / circleRadius.x) ** 2)
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
[furthestX, furthestY].forEach((vector) => {
|
|
185
|
+
projections.push(
|
|
186
|
+
this.applySkew(this.A.add(vector)),
|
|
187
|
+
this.applySkew(this.A.subtract(vector))
|
|
188
|
+
);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
return projections;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
projectRound() {
|
|
195
|
+
if (!this.isSkewed()) {
|
|
196
|
+
return this.projectRoundNoSkew();
|
|
197
|
+
} else {
|
|
198
|
+
return this.projectRoundWithSkew();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Project stroke width on points returning projections for each point as follows:
|
|
204
|
+
* - `miter`: 1 point corresponding to the outer boundary. If the miter limit is exceeded, it will be 2 points (becomes bevel)
|
|
205
|
+
* - `bevel`: 2 points corresponding to the bevel possible boundaries, orthogonal to the stroke.
|
|
206
|
+
* - `round`: same as `bevel` when it has no skew, with skew are 4 points.
|
|
207
|
+
*/
|
|
208
|
+
protected projectPoints() {
|
|
209
|
+
switch (this.options.strokeLineJoin) {
|
|
210
|
+
case 'miter':
|
|
211
|
+
return this.projectMiter();
|
|
212
|
+
case 'round':
|
|
213
|
+
return this.projectRound();
|
|
214
|
+
default:
|
|
215
|
+
return this.projectBevel();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public project(): TProjection[] {
|
|
220
|
+
return this.projectPoints().map((point) => ({
|
|
221
|
+
originPoint: this.A,
|
|
222
|
+
projectedPoint: point,
|
|
223
|
+
bisector: this.bisector,
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { halfPI } from '../../../constants';
|
|
2
|
+
import { XY, Point } from '../../../Point';
|
|
3
|
+
import { degreesToRadians } from '../radiansDegreesConversion';
|
|
4
|
+
import {
|
|
5
|
+
calcAngleBetweenVectors,
|
|
6
|
+
calcVectorRotation,
|
|
7
|
+
createVector,
|
|
8
|
+
} from '../vectors';
|
|
9
|
+
import { TProjectStrokeOnPointsOptions, TProjection } from './types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344
|
|
13
|
+
*/
|
|
14
|
+
export abstract class StrokeProjectionsBase {
|
|
15
|
+
declare options: TProjectStrokeOnPointsOptions;
|
|
16
|
+
declare scale: Point;
|
|
17
|
+
declare strokeUniformScalar: Point;
|
|
18
|
+
declare strokeProjectionMagnitude: number;
|
|
19
|
+
|
|
20
|
+
static getAcuteAngleFactor(vector1: Point, vector2?: Point) {
|
|
21
|
+
const angle = vector2
|
|
22
|
+
? calcAngleBetweenVectors(vector1, vector2)
|
|
23
|
+
: calcVectorRotation(vector1);
|
|
24
|
+
return Math.abs(angle) < halfPI ? -1 : 1;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
constructor(options: TProjectStrokeOnPointsOptions) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.strokeProjectionMagnitude = this.options.strokeWidth / 2;
|
|
30
|
+
this.scale = new Point(this.options.scaleX, this.options.scaleY);
|
|
31
|
+
this.strokeUniformScalar = this.options.strokeUniform
|
|
32
|
+
? new Point(1 / this.options.scaleX, 1 / this.options.scaleY)
|
|
33
|
+
: new Point(1, 1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* When the stroke is uniform, scaling affects the arrangement of points. So we must take it into account.
|
|
38
|
+
*/
|
|
39
|
+
protected createSideVector(from: XY, to: XY) {
|
|
40
|
+
const v = createVector(from, to);
|
|
41
|
+
return this.options.strokeUniform ? v.multiply(this.scale) : v;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
protected abstract calcOrthogonalProjection(
|
|
45
|
+
from: Point,
|
|
46
|
+
to: Point,
|
|
47
|
+
magnitude?: number
|
|
48
|
+
): Point;
|
|
49
|
+
|
|
50
|
+
protected projectOrthogonally(from: Point, to: Point, magnitude?: number) {
|
|
51
|
+
return this.applySkew(
|
|
52
|
+
from.add(this.calcOrthogonalProjection(from, to, magnitude))
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected isSkewed() {
|
|
57
|
+
return this.options.skewX !== 0 || this.options.skewY !== 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected applySkew(point: Point) {
|
|
61
|
+
const p = new Point(point);
|
|
62
|
+
// skewY must be applied before skewX as this distortion affects skewX calculation
|
|
63
|
+
p.y += p.x * Math.tan(degreesToRadians(this.options.skewY));
|
|
64
|
+
p.x += p.y * Math.tan(degreesToRadians(this.options.skewX));
|
|
65
|
+
return p;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected scaleUnitVector(unitVector: Point, scalar: number) {
|
|
69
|
+
return unitVector.multiply(this.strokeUniformScalar).scalarMultiply(scalar);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected abstract projectPoints(): Point[];
|
|
73
|
+
|
|
74
|
+
public abstract project(): TProjection[];
|
|
75
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { XY } from '../../../Point';
|
|
2
|
+
import { StrokeLineCapProjections } from './StrokeLineCapProjections';
|
|
3
|
+
import { StrokeLineJoinProjections } from './StrokeLineJoinProjections';
|
|
4
|
+
import { TProjection, TProjectStrokeOnPointsOptions } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* Used to calculate object's bounding box
|
|
9
|
+
*
|
|
10
|
+
* @see https://github.com/fabricjs/fabric.js/pull/8344
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export const projectStrokeOnPoints = (
|
|
14
|
+
points: XY[],
|
|
15
|
+
options: TProjectStrokeOnPointsOptions,
|
|
16
|
+
openPath = false
|
|
17
|
+
): TProjection[] => {
|
|
18
|
+
const projections: TProjection[] = [];
|
|
19
|
+
|
|
20
|
+
if (points.length <= 1) {
|
|
21
|
+
return projections;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
points.forEach((A, index) => {
|
|
25
|
+
let B: XY, C: XY;
|
|
26
|
+
if (index === 0) {
|
|
27
|
+
C = points[1];
|
|
28
|
+
B = openPath ? A : points[points.length - 1];
|
|
29
|
+
} else if (index === points.length - 1) {
|
|
30
|
+
B = points[index - 1];
|
|
31
|
+
C = openPath ? A : points[0];
|
|
32
|
+
} else {
|
|
33
|
+
B = points[index - 1];
|
|
34
|
+
C = points[index + 1];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (openPath && (index === 0 || index === points.length - 1)) {
|
|
38
|
+
projections.push(
|
|
39
|
+
...new StrokeLineCapProjections(
|
|
40
|
+
A,
|
|
41
|
+
index === 0 ? C : B,
|
|
42
|
+
options
|
|
43
|
+
).project()
|
|
44
|
+
);
|
|
45
|
+
} else {
|
|
46
|
+
projections.push(
|
|
47
|
+
...new StrokeLineJoinProjections(A, B, C, options).project()
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return projections;
|
|
53
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Point } from '../../../Point';
|
|
2
|
+
import { TDegree } from '../../../typedefs';
|
|
3
|
+
import { getBisector } from '../vectors';
|
|
4
|
+
|
|
5
|
+
export type TProjectStrokeOnPointsOptions = {
|
|
6
|
+
strokeWidth: number;
|
|
7
|
+
strokeLineCap: CanvasLineCap;
|
|
8
|
+
strokeLineJoin: CanvasLineJoin;
|
|
9
|
+
/**
|
|
10
|
+
* https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit
|
|
11
|
+
*/
|
|
12
|
+
strokeMiterLimit: number;
|
|
13
|
+
strokeUniform: boolean;
|
|
14
|
+
scaleX: number;
|
|
15
|
+
scaleY: number;
|
|
16
|
+
skewX: TDegree;
|
|
17
|
+
skewY: TDegree;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type TProjection = {
|
|
21
|
+
projectedPoint: Point;
|
|
22
|
+
originPoint: Point;
|
|
23
|
+
bisector?: ReturnType<typeof getBisector>;
|
|
24
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TRadian, TDegree } from '../../typedefs';
|
|
2
|
+
import { PiBy180 } from '../../constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Transforms degrees to radians.
|
|
6
|
+
* @param {TDegree} degrees value in degrees
|
|
7
|
+
* @return {TRadian} value in radians
|
|
8
|
+
*/
|
|
9
|
+
export const degreesToRadians = (degrees: TDegree): TRadian =>
|
|
10
|
+
(degrees * PiBy180) as TRadian;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Transforms radians to degrees.
|
|
14
|
+
* @param {TRadian} radians value in radians
|
|
15
|
+
* @return {TDegree} value in degrees
|
|
16
|
+
*/
|
|
17
|
+
export const radiansToDegrees = (radians: TRadian): TDegree =>
|
|
18
|
+
(radians / PiBy180) as TDegree;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TOriginX, TOriginY } from '../../typedefs';
|
|
2
|
+
|
|
3
|
+
const originOffset = {
|
|
4
|
+
left: -0.5,
|
|
5
|
+
top: -0.5,
|
|
6
|
+
center: 0,
|
|
7
|
+
bottom: 0.5,
|
|
8
|
+
right: 0.5,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Resolves origin value relative to center
|
|
12
|
+
* @private
|
|
13
|
+
* @param {TOriginX | TOriginY} originValue originX / originY
|
|
14
|
+
* @returns number
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const resolveOrigin = (
|
|
18
|
+
originValue: TOriginX | TOriginY | number
|
|
19
|
+
): number =>
|
|
20
|
+
typeof originValue === 'string'
|
|
21
|
+
? originOffset[originValue]
|
|
22
|
+
: originValue - 0.5;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Point } from '../../Point';
|
|
2
|
+
import type { TRadian } from '../../typedefs';
|
|
3
|
+
/**
|
|
4
|
+
* Rotates `point` around `origin` with `radians`
|
|
5
|
+
* @deprecated use the Point.rotate
|
|
6
|
+
* @param {Point} origin The origin of the rotation
|
|
7
|
+
* @param {Point} origin The origin of the rotation
|
|
8
|
+
* @param {TRadian} radians The radians of the angle for the rotation
|
|
9
|
+
* @return {Point} The new rotated point
|
|
10
|
+
*/
|
|
11
|
+
export const rotatePoint = (
|
|
12
|
+
point: Point,
|
|
13
|
+
origin: Point,
|
|
14
|
+
radians: TRadian
|
|
15
|
+
): Point => point.rotate(radians, origin);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TRadian } from '../../typedefs';
|
|
2
|
+
import { halfPI } from '../../constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Calculate the cos of an angle, avoiding returning floats for known results
|
|
6
|
+
* This function is here just to avoid getting 0.999999999999999 when dealing
|
|
7
|
+
* with numbers that are really 1 or 0.
|
|
8
|
+
* @param {TRadian} angle the angle
|
|
9
|
+
* @return {Number} the sin value for angle.
|
|
10
|
+
*/
|
|
11
|
+
export const sin = (angle: TRadian): number => {
|
|
12
|
+
if (angle === 0) {
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
const angleSlice = angle / halfPI;
|
|
16
|
+
const value = Math.sign(angle);
|
|
17
|
+
switch (angleSlice) {
|
|
18
|
+
case 1:
|
|
19
|
+
return value;
|
|
20
|
+
case 2:
|
|
21
|
+
return 0;
|
|
22
|
+
case 3:
|
|
23
|
+
return -value;
|
|
24
|
+
}
|
|
25
|
+
return Math.sin(angle);
|
|
26
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Color } from '../../color/Color';
|
|
2
|
+
import { config } from '../../config';
|
|
3
|
+
import { DEFAULT_SVG_FONT_SIZE } from '../../constants';
|
|
4
|
+
import {
|
|
5
|
+
SupportedSVGUnit,
|
|
6
|
+
SVGElementName,
|
|
7
|
+
TBBox,
|
|
8
|
+
TMat2D,
|
|
9
|
+
} from '../../typedefs';
|
|
10
|
+
import { toFixed } from './toFixed';
|
|
11
|
+
/**
|
|
12
|
+
* Returns array of attributes for given svg that fabric parses
|
|
13
|
+
* @param {SVGElementName} type Type of svg element (eg. 'circle')
|
|
14
|
+
* @return {Array} string names of supported attributes
|
|
15
|
+
*/
|
|
16
|
+
export const getSvgAttributes = (type: SVGElementName) => {
|
|
17
|
+
const commonAttributes = ['instantiated_by_use', 'style', 'id', 'class'];
|
|
18
|
+
switch (type) {
|
|
19
|
+
case SVGElementName.linearGradient:
|
|
20
|
+
return commonAttributes.concat([
|
|
21
|
+
'x1',
|
|
22
|
+
'y1',
|
|
23
|
+
'x2',
|
|
24
|
+
'y2',
|
|
25
|
+
'gradientUnits',
|
|
26
|
+
'gradientTransform',
|
|
27
|
+
]);
|
|
28
|
+
case 'radialGradient':
|
|
29
|
+
return commonAttributes.concat([
|
|
30
|
+
'gradientUnits',
|
|
31
|
+
'gradientTransform',
|
|
32
|
+
'cx',
|
|
33
|
+
'cy',
|
|
34
|
+
'r',
|
|
35
|
+
'fx',
|
|
36
|
+
'fy',
|
|
37
|
+
'fr',
|
|
38
|
+
]);
|
|
39
|
+
case 'stop':
|
|
40
|
+
return commonAttributes.concat(['offset', 'stop-color', 'stop-opacity']);
|
|
41
|
+
}
|
|
42
|
+
return commonAttributes;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Converts from attribute value to pixel value if applicable.
|
|
47
|
+
* Returns converted pixels or original value not converted.
|
|
48
|
+
* @param {string} value number to operate on
|
|
49
|
+
* @param {number} fontSize
|
|
50
|
+
* @return {number}
|
|
51
|
+
*/
|
|
52
|
+
export const parseUnit = (value: string, fontSize: number) => {
|
|
53
|
+
const unit = /\D{0,2}$/.exec(value),
|
|
54
|
+
number = parseFloat(value);
|
|
55
|
+
if (!fontSize) {
|
|
56
|
+
fontSize = DEFAULT_SVG_FONT_SIZE;
|
|
57
|
+
}
|
|
58
|
+
const dpi = config.DPI;
|
|
59
|
+
switch (unit?.[0]) {
|
|
60
|
+
case SupportedSVGUnit.mm:
|
|
61
|
+
return (number * dpi) / 25.4;
|
|
62
|
+
|
|
63
|
+
case SupportedSVGUnit.cm:
|
|
64
|
+
return (number * dpi) / 2.54;
|
|
65
|
+
|
|
66
|
+
case SupportedSVGUnit.in:
|
|
67
|
+
return number * dpi;
|
|
68
|
+
|
|
69
|
+
case SupportedSVGUnit.pt:
|
|
70
|
+
return (number * dpi) / 72; // or * 4 / 3
|
|
71
|
+
|
|
72
|
+
case SupportedSVGUnit.pc:
|
|
73
|
+
return ((number * dpi) / 72) * 12; // or * 16
|
|
74
|
+
|
|
75
|
+
case SupportedSVGUnit.em:
|
|
76
|
+
return number * fontSize;
|
|
77
|
+
|
|
78
|
+
default:
|
|
79
|
+
return number;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const enum MeetOrSlice {
|
|
84
|
+
meet = 'meet',
|
|
85
|
+
slice = 'slice',
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const enum MinMidMax {
|
|
89
|
+
min = 'Min',
|
|
90
|
+
mid = 'Mid',
|
|
91
|
+
max = 'Max',
|
|
92
|
+
none = 'none',
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export type TPreserveArParsed = {
|
|
96
|
+
meetOrSlice: MeetOrSlice;
|
|
97
|
+
alignX: MinMidMax;
|
|
98
|
+
alignY: MinMidMax;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// align can be either none or undefined or a combination of mid/max
|
|
102
|
+
const parseAlign = (align: string): MinMidMax[] => {
|
|
103
|
+
//divide align in alignX and alignY
|
|
104
|
+
if (align && align !== MinMidMax.none) {
|
|
105
|
+
return [align.slice(1, 4) as MinMidMax, align.slice(5, 8) as MinMidMax];
|
|
106
|
+
} else if (align === MinMidMax.none) {
|
|
107
|
+
return [align, align];
|
|
108
|
+
}
|
|
109
|
+
return [MinMidMax.mid, MinMidMax.mid];
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Parse preserveAspectRatio attribute from element
|
|
114
|
+
* https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
|
|
115
|
+
* @param {string} attribute to be parsed
|
|
116
|
+
* @return {Object} an object containing align and meetOrSlice attribute
|
|
117
|
+
*/
|
|
118
|
+
export const parsePreserveAspectRatioAttribute = (
|
|
119
|
+
attribute: string
|
|
120
|
+
): TPreserveArParsed => {
|
|
121
|
+
const [firstPart, secondPart] = attribute.trim().split(' ') as [
|
|
122
|
+
MinMidMax,
|
|
123
|
+
MeetOrSlice | undefined
|
|
124
|
+
];
|
|
125
|
+
const [alignX, alignY] = parseAlign(firstPart);
|
|
126
|
+
return {
|
|
127
|
+
meetOrSlice: secondPart || MeetOrSlice.meet,
|
|
128
|
+
alignX,
|
|
129
|
+
alignY,
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* given an array of 6 number returns something like `"matrix(...numbers)"`
|
|
135
|
+
* @param {TMat2D} transform an array with 6 numbers
|
|
136
|
+
* @return {String} transform matrix for svg
|
|
137
|
+
*/
|
|
138
|
+
export const matrixToSVG = (transform: TMat2D) =>
|
|
139
|
+
'matrix(' +
|
|
140
|
+
transform
|
|
141
|
+
.map((value) => toFixed(value, config.NUM_FRACTION_DIGITS))
|
|
142
|
+
.join(' ') +
|
|
143
|
+
')';
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values
|
|
147
|
+
* we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1
|
|
148
|
+
* @param prop
|
|
149
|
+
* @param value
|
|
150
|
+
* @returns
|
|
151
|
+
*/
|
|
152
|
+
export const colorPropToSVG = (prop: string, value?: any) => {
|
|
153
|
+
if (!value) {
|
|
154
|
+
return `${prop}: none; `;
|
|
155
|
+
} else if (value.toLive) {
|
|
156
|
+
return `${prop}: url(#SVGID_${value.id}); `;
|
|
157
|
+
} else {
|
|
158
|
+
const color = new Color(value),
|
|
159
|
+
opacity = color.getAlpha();
|
|
160
|
+
|
|
161
|
+
let str = `${prop}: ${color.toRgb()}; `;
|
|
162
|
+
|
|
163
|
+
if (opacity !== 1) {
|
|
164
|
+
//change the color in rgb + opacity
|
|
165
|
+
str += `${prop}-opacity: ${opacity.toString()}; `;
|
|
166
|
+
}
|
|
167
|
+
return str;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
export const createSVGRect = (
|
|
172
|
+
color: string,
|
|
173
|
+
{ left, top, width, height }: TBBox,
|
|
174
|
+
precision = config.NUM_FRACTION_DIGITS
|
|
175
|
+
) => {
|
|
176
|
+
const svgColor = colorPropToSVG('fill', color);
|
|
177
|
+
const [x, y, w, h] = [left, top, width, height].map((value) =>
|
|
178
|
+
toFixed(value, precision)
|
|
179
|
+
);
|
|
180
|
+
return `<rect ${svgColor} x="${x}" y="${y}" width="${w}" height="${h}"></rect>`;
|
|
181
|
+
};
|