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,813 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
TBBox,
|
|
3
|
+
TCornerPoint,
|
|
4
|
+
TDegree,
|
|
5
|
+
TMat2D,
|
|
6
|
+
TOriginX,
|
|
7
|
+
TOriginY,
|
|
8
|
+
} from '../../typedefs';
|
|
9
|
+
import { iMatrix } from '../../constants';
|
|
10
|
+
import { Intersection } from '../../Intersection';
|
|
11
|
+
import { Point } from '../../Point';
|
|
12
|
+
import { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';
|
|
13
|
+
import { cos } from '../../util/misc/cos';
|
|
14
|
+
import {
|
|
15
|
+
calcRotateMatrix,
|
|
16
|
+
composeMatrix,
|
|
17
|
+
invertTransform,
|
|
18
|
+
multiplyTransformMatrices,
|
|
19
|
+
qrDecompose,
|
|
20
|
+
transformPoint,
|
|
21
|
+
} from '../../util/misc/matrix';
|
|
22
|
+
import { degreesToRadians } from '../../util/misc/radiansDegreesConversion';
|
|
23
|
+
import { sin } from '../../util/misc/sin';
|
|
24
|
+
import type { Canvas } from '../../canvas/Canvas';
|
|
25
|
+
import type { StaticCanvas } from '../../canvas/StaticCanvas';
|
|
26
|
+
import { ObjectOrigin } from './ObjectOrigin';
|
|
27
|
+
import { ObjectEvents } from '../../EventTypeDefs';
|
|
28
|
+
import { ControlProps } from './types/ControlProps';
|
|
29
|
+
|
|
30
|
+
type TLineDescriptor = {
|
|
31
|
+
o: Point;
|
|
32
|
+
d: Point;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type TBBoxLines = {
|
|
36
|
+
topline: TLineDescriptor;
|
|
37
|
+
leftline: TLineDescriptor;
|
|
38
|
+
bottomline: TLineDescriptor;
|
|
39
|
+
rightline: TLineDescriptor;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type TMatrixCache = {
|
|
43
|
+
key: string;
|
|
44
|
+
value: TMat2D;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
type TACoords = TCornerPoint;
|
|
48
|
+
|
|
49
|
+
export class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>
|
|
50
|
+
extends ObjectOrigin<EventSpec>
|
|
51
|
+
implements Pick<ControlProps, 'padding'>
|
|
52
|
+
{
|
|
53
|
+
declare padding: number;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Describe object's corner position in canvas object absolute coordinates
|
|
57
|
+
* properties are tl,tr,bl,br and describe the four main corner.
|
|
58
|
+
* each property is an object with x, y, instance of Fabric.Point.
|
|
59
|
+
* The coordinates depends from this properties: width, height, scaleX, scaleY
|
|
60
|
+
* skewX, skewY, angle, strokeWidth, top, left.
|
|
61
|
+
* Those coordinates are useful to understand where an object is. They get updated
|
|
62
|
+
* with lineCoords or oCoords in interactive cases but they do not need to be updated when zoom or panning change.
|
|
63
|
+
* The coordinates get updated with @method setCoords.
|
|
64
|
+
* You can calculate them without updating with @method calcACoords();
|
|
65
|
+
*/
|
|
66
|
+
declare aCoords: TACoords;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Describe object's corner position in canvas element coordinates.
|
|
70
|
+
* includes padding. Used of object detection.
|
|
71
|
+
* set and refreshed with setCoords.
|
|
72
|
+
* Those could go away
|
|
73
|
+
* @todo investigate how to get rid of those
|
|
74
|
+
*/
|
|
75
|
+
declare lineCoords: TCornerPoint;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* storage cache for object transform matrix
|
|
79
|
+
*/
|
|
80
|
+
declare ownMatrixCache?: TMatrixCache;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* storage cache for object full transform matrix
|
|
84
|
+
*/
|
|
85
|
+
declare matrixCache?: TMatrixCache;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* A Reference of the Canvas where the object is actually added
|
|
89
|
+
* @type StaticCanvas | Canvas;
|
|
90
|
+
* @default undefined
|
|
91
|
+
* @private
|
|
92
|
+
*/
|
|
93
|
+
declare canvas?: StaticCanvas | Canvas;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @returns {number} x position according to object's {@link originX} property in canvas coordinate plane
|
|
97
|
+
*/
|
|
98
|
+
getX(): number {
|
|
99
|
+
return this.getXY().x;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @param {number} value x position according to object's {@link originX} property in canvas coordinate plane
|
|
104
|
+
*/
|
|
105
|
+
setX(value: number) {
|
|
106
|
+
this.setXY(this.getXY().setX(value));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @returns {number} y position according to object's {@link originY} property in canvas coordinate plane
|
|
111
|
+
*/
|
|
112
|
+
getY(): number {
|
|
113
|
+
return this.getXY().y;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @param {number} value y position according to object's {@link originY} property in canvas coordinate plane
|
|
118
|
+
*/
|
|
119
|
+
setY(value: number) {
|
|
120
|
+
this.setXY(this.getXY().setY(value));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @returns {number} x position according to object's {@link originX} property in parent's coordinate plane\
|
|
125
|
+
* if parent is canvas then this property is identical to {@link getX}
|
|
126
|
+
*/
|
|
127
|
+
getRelativeX(): number {
|
|
128
|
+
return this.left;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @param {number} value x position according to object's {@link originX} property in parent's coordinate plane\
|
|
133
|
+
* if parent is canvas then this method is identical to {@link setX}
|
|
134
|
+
*/
|
|
135
|
+
setRelativeX(value: number) {
|
|
136
|
+
this.left = value;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @returns {number} y position according to object's {@link originY} property in parent's coordinate plane\
|
|
141
|
+
* if parent is canvas then this property is identical to {@link getY}
|
|
142
|
+
*/
|
|
143
|
+
getRelativeY(): number {
|
|
144
|
+
return this.top;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @param {number} value y position according to object's {@link originY} property in parent's coordinate plane\
|
|
149
|
+
* if parent is canvas then this property is identical to {@link setY}
|
|
150
|
+
*/
|
|
151
|
+
setRelativeY(value: number) {
|
|
152
|
+
this.top = value;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @returns {Point} x position according to object's {@link originX} {@link originY} properties in canvas coordinate plane
|
|
157
|
+
*/
|
|
158
|
+
getXY(): Point {
|
|
159
|
+
const relativePosition = this.getRelativeXY();
|
|
160
|
+
return this.group
|
|
161
|
+
? transformPoint(relativePosition, this.group.calcTransformMatrix())
|
|
162
|
+
: relativePosition;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.
|
|
167
|
+
* You can specify {@link originX} and {@link originY} values,
|
|
168
|
+
* that otherwise are the object's current values.
|
|
169
|
+
* @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>
|
|
170
|
+
* object.setXY(new Point(5, 5), 'left', 'bottom').
|
|
171
|
+
* @param {Point} point position in canvas coordinate plane
|
|
172
|
+
* @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
|
|
173
|
+
* @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
|
|
174
|
+
*/
|
|
175
|
+
setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
|
|
176
|
+
if (this.group) {
|
|
177
|
+
point = transformPoint(
|
|
178
|
+
point,
|
|
179
|
+
invertTransform(this.group.calcTransformMatrix())
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
this.setRelativeXY(point, originX, originY);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @returns {Point} x,y position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
|
|
187
|
+
*/
|
|
188
|
+
getRelativeXY(): Point {
|
|
189
|
+
return new Point(this.left, this.top);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)
|
|
194
|
+
* @param {Point} point position according to object's {@link originX} {@link originY} properties in parent's coordinate plane
|
|
195
|
+
* @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'
|
|
196
|
+
* @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'
|
|
197
|
+
*/
|
|
198
|
+
setRelativeXY(point: Point, originX?: TOriginX, originY?: TOriginY) {
|
|
199
|
+
this.setPositionByOrigin(
|
|
200
|
+
point,
|
|
201
|
+
originX || this.originX,
|
|
202
|
+
originY || this.originY
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* return correct set of coordinates for intersection
|
|
208
|
+
* this will return either aCoords or lineCoords.
|
|
209
|
+
* @param {boolean} absolute will return aCoords if true or lineCoords
|
|
210
|
+
* @param {boolean} calculate will calculate the coords or use the one
|
|
211
|
+
* that are attached to the object instance
|
|
212
|
+
* @return {Object} {tl, tr, br, bl} points
|
|
213
|
+
*/
|
|
214
|
+
_getCoords(absolute = false, calculate = false): TCornerPoint {
|
|
215
|
+
if (calculate) {
|
|
216
|
+
return absolute ? this.calcACoords() : this.calcLineCoords();
|
|
217
|
+
}
|
|
218
|
+
// swapped this double if in place of setCoords();
|
|
219
|
+
if (!this.aCoords) {
|
|
220
|
+
this.aCoords = this.calcACoords();
|
|
221
|
+
}
|
|
222
|
+
if (!this.lineCoords) {
|
|
223
|
+
this.lineCoords = this.calcLineCoords();
|
|
224
|
+
}
|
|
225
|
+
return absolute ? this.aCoords : this.lineCoords;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* return correct set of coordinates for intersection
|
|
230
|
+
* this will return either aCoords or lineCoords.
|
|
231
|
+
* The coords are returned in an array.
|
|
232
|
+
* @param {boolean} absolute will return aCoords if true or lineCoords
|
|
233
|
+
* @param {boolean} calculate will return aCoords if true or lineCoords
|
|
234
|
+
* @return {Array} [tl, tr, br, bl] of points
|
|
235
|
+
*/
|
|
236
|
+
getCoords(absolute = false, calculate = false): Point[] {
|
|
237
|
+
const { tl, tr, br, bl } = this._getCoords(absolute, calculate);
|
|
238
|
+
const coords = [tl, tr, br, bl];
|
|
239
|
+
if (this.group) {
|
|
240
|
+
const t = this.group.calcTransformMatrix();
|
|
241
|
+
return coords.map((p) => transformPoint(p, t));
|
|
242
|
+
}
|
|
243
|
+
return coords;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Checks if object intersects with an area formed by 2 points
|
|
248
|
+
* @param {Object} pointTL top-left point of area
|
|
249
|
+
* @param {Object} pointBR bottom-right point of area
|
|
250
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
251
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of stored one
|
|
252
|
+
* @return {Boolean} true if object intersects with an area formed by 2 points
|
|
253
|
+
*/
|
|
254
|
+
intersectsWithRect(
|
|
255
|
+
pointTL: Point,
|
|
256
|
+
pointBR: Point,
|
|
257
|
+
absolute?: boolean,
|
|
258
|
+
calculate?: boolean
|
|
259
|
+
): boolean {
|
|
260
|
+
const coords = this.getCoords(absolute, calculate),
|
|
261
|
+
intersection = Intersection.intersectPolygonRectangle(
|
|
262
|
+
coords,
|
|
263
|
+
pointTL,
|
|
264
|
+
pointBR
|
|
265
|
+
);
|
|
266
|
+
return intersection.status === 'Intersection';
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Checks if object intersects with another object
|
|
271
|
+
* @param {Object} other Object to test
|
|
272
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
273
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of calculating them
|
|
274
|
+
* @return {Boolean} true if object intersects with another object
|
|
275
|
+
*/
|
|
276
|
+
intersectsWithObject(
|
|
277
|
+
other: ObjectGeometry,
|
|
278
|
+
absolute = false,
|
|
279
|
+
calculate = false
|
|
280
|
+
): boolean {
|
|
281
|
+
const intersection = Intersection.intersectPolygonPolygon(
|
|
282
|
+
this.getCoords(absolute, calculate),
|
|
283
|
+
other.getCoords(absolute, calculate)
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
return (
|
|
287
|
+
intersection.status === 'Intersection' ||
|
|
288
|
+
intersection.status === 'Coincident' ||
|
|
289
|
+
other.isContainedWithinObject(this, absolute, calculate) ||
|
|
290
|
+
this.isContainedWithinObject(other, absolute, calculate)
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Checks if object is fully contained within area of another object
|
|
296
|
+
* @param {Object} other Object to test
|
|
297
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
298
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of store ones
|
|
299
|
+
* @return {Boolean} true if object is fully contained within area of another object
|
|
300
|
+
*/
|
|
301
|
+
isContainedWithinObject(
|
|
302
|
+
other: ObjectGeometry,
|
|
303
|
+
absolute = false,
|
|
304
|
+
calculate = false
|
|
305
|
+
): boolean {
|
|
306
|
+
const points = this.getCoords(absolute, calculate),
|
|
307
|
+
otherCoords = absolute ? other.aCoords : other.lineCoords,
|
|
308
|
+
lines = other._getImageLines(otherCoords);
|
|
309
|
+
for (let i = 0; i < 4; i++) {
|
|
310
|
+
if (!other.containsPoint(points[i], lines)) {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Checks if object is fully contained within area formed by 2 points
|
|
319
|
+
* @param {Object} pointTL top-left point of area
|
|
320
|
+
* @param {Object} pointBR bottom-right point of area
|
|
321
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
322
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of stored one
|
|
323
|
+
* @return {Boolean} true if object is fully contained within area formed by 2 points
|
|
324
|
+
*/
|
|
325
|
+
isContainedWithinRect(
|
|
326
|
+
pointTL: Point,
|
|
327
|
+
pointBR: Point,
|
|
328
|
+
absolute?: boolean,
|
|
329
|
+
calculate?: boolean
|
|
330
|
+
): boolean {
|
|
331
|
+
const boundingRect = this.getBoundingRect(absolute, calculate);
|
|
332
|
+
return (
|
|
333
|
+
boundingRect.left >= pointTL.x &&
|
|
334
|
+
boundingRect.left + boundingRect.width <= pointBR.x &&
|
|
335
|
+
boundingRect.top >= pointTL.y &&
|
|
336
|
+
boundingRect.top + boundingRect.height <= pointBR.y
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
isOverlapping<T extends ObjectGeometry>(other: T): boolean {
|
|
341
|
+
return (
|
|
342
|
+
this.intersectsWithObject(other) ||
|
|
343
|
+
this.isContainedWithinObject(other) ||
|
|
344
|
+
other.isContainedWithinObject(this)
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Checks if point is inside the object
|
|
350
|
+
* @param {Point} point Point to check against
|
|
351
|
+
* @param {Object} [lines] object returned from @method _getImageLines
|
|
352
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
353
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of stored ones
|
|
354
|
+
* @return {Boolean} true if point is inside the object
|
|
355
|
+
*/
|
|
356
|
+
containsPoint(
|
|
357
|
+
point: Point,
|
|
358
|
+
lines?: TBBoxLines,
|
|
359
|
+
absolute = false,
|
|
360
|
+
calculate = false
|
|
361
|
+
): boolean {
|
|
362
|
+
const coords = this._getCoords(absolute, calculate),
|
|
363
|
+
imageLines = lines || this._getImageLines(coords),
|
|
364
|
+
xPoints = this._findCrossPoints(point, imageLines);
|
|
365
|
+
// if xPoints is odd then point is inside the object
|
|
366
|
+
return xPoints !== 0 && xPoints % 2 === 1;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Checks if object is contained within the canvas with current viewportTransform
|
|
371
|
+
* the check is done stopping at first point that appears on screen
|
|
372
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of .aCoords
|
|
373
|
+
* @return {Boolean} true if object is fully or partially contained within canvas
|
|
374
|
+
*/
|
|
375
|
+
isOnScreen(calculate = false): boolean {
|
|
376
|
+
if (!this.canvas) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const { tl, br } = this.canvas.vptCoords;
|
|
380
|
+
const points = this.getCoords(true, calculate);
|
|
381
|
+
// if some point is on screen, the object is on screen.
|
|
382
|
+
if (
|
|
383
|
+
points.some(
|
|
384
|
+
(point) =>
|
|
385
|
+
point.x <= br.x &&
|
|
386
|
+
point.x >= tl.x &&
|
|
387
|
+
point.y <= br.y &&
|
|
388
|
+
point.y >= tl.y
|
|
389
|
+
)
|
|
390
|
+
) {
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
// no points on screen, check intersection with absolute coordinates
|
|
394
|
+
if (this.intersectsWithRect(tl, br, true, calculate)) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
return this._containsCenterOfCanvas(tl, br, calculate);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Checks if the object contains the midpoint between canvas extremities
|
|
402
|
+
* Does not make sense outside the context of isOnScreen and isPartiallyOnScreen
|
|
403
|
+
* @private
|
|
404
|
+
* @param {Point} pointTL Top Left point
|
|
405
|
+
* @param {Point} pointBR Top Right point
|
|
406
|
+
* @param {Boolean} calculate use coordinates of current position instead of stored ones
|
|
407
|
+
* @return {Boolean} true if the object contains the point
|
|
408
|
+
*/
|
|
409
|
+
private _containsCenterOfCanvas(
|
|
410
|
+
pointTL: Point,
|
|
411
|
+
pointBR: Point,
|
|
412
|
+
calculate?: boolean
|
|
413
|
+
): boolean {
|
|
414
|
+
// worst case scenario the object is so big that contains the screen
|
|
415
|
+
const centerPoint = pointTL.midPointFrom(pointBR);
|
|
416
|
+
return this.containsPoint(centerPoint, undefined, true, calculate);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Checks if object is partially contained within the canvas with current viewportTransform
|
|
421
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of stored ones
|
|
422
|
+
* @return {Boolean} true if object is partially contained within canvas
|
|
423
|
+
*/
|
|
424
|
+
isPartiallyOnScreen(calculate?: boolean): boolean {
|
|
425
|
+
if (!this.canvas) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
const { tl, br } = this.canvas.vptCoords;
|
|
429
|
+
if (this.intersectsWithRect(tl, br, true, calculate)) {
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
const allPointsAreOutside = this.getCoords(true, calculate).every(
|
|
433
|
+
(point) =>
|
|
434
|
+
(point.x >= br.x || point.x <= tl.x) &&
|
|
435
|
+
(point.y >= br.y || point.y <= tl.y)
|
|
436
|
+
);
|
|
437
|
+
return (
|
|
438
|
+
allPointsAreOutside && this._containsCenterOfCanvas(tl, br, calculate)
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Method that returns an object with the object edges in it, given the coordinates of the corners
|
|
444
|
+
* @private
|
|
445
|
+
* @param {Object} lineCoords or aCoords Coordinates of the object corners
|
|
446
|
+
*/
|
|
447
|
+
_getImageLines({ tl, tr, bl, br }: TCornerPoint): TBBoxLines {
|
|
448
|
+
const lines = {
|
|
449
|
+
topline: {
|
|
450
|
+
o: tl,
|
|
451
|
+
d: tr,
|
|
452
|
+
},
|
|
453
|
+
rightline: {
|
|
454
|
+
o: tr,
|
|
455
|
+
d: br,
|
|
456
|
+
},
|
|
457
|
+
bottomline: {
|
|
458
|
+
o: br,
|
|
459
|
+
d: bl,
|
|
460
|
+
},
|
|
461
|
+
leftline: {
|
|
462
|
+
o: bl,
|
|
463
|
+
d: tl,
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
// // debugging
|
|
468
|
+
// if (this.canvas.contextTop) {
|
|
469
|
+
// this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
|
|
470
|
+
// this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
|
|
471
|
+
//
|
|
472
|
+
// this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
|
|
473
|
+
// this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
|
|
474
|
+
//
|
|
475
|
+
// this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
|
|
476
|
+
// this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
|
|
477
|
+
//
|
|
478
|
+
// this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
|
|
479
|
+
// this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
|
|
480
|
+
// }
|
|
481
|
+
|
|
482
|
+
return lines;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Helper method to determine how many cross points are between the 4 object edges
|
|
487
|
+
* and the horizontal line determined by a point on canvas
|
|
488
|
+
* @private
|
|
489
|
+
* @param {Point} point Point to check
|
|
490
|
+
* @param {Object} lines Coordinates of the object being evaluated
|
|
491
|
+
* @return {number} number of crossPoint
|
|
492
|
+
*/
|
|
493
|
+
_findCrossPoints(point: Point, lines: TBBoxLines): number {
|
|
494
|
+
let xcount = 0;
|
|
495
|
+
|
|
496
|
+
for (const lineKey in lines) {
|
|
497
|
+
let xi;
|
|
498
|
+
const iLine = lines[lineKey as keyof TBBoxLines];
|
|
499
|
+
// optimization 1: line below point. no cross
|
|
500
|
+
if (iLine.o.y < point.y && iLine.d.y < point.y) {
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
// optimization 2: line above point. no cross
|
|
504
|
+
if (iLine.o.y >= point.y && iLine.d.y >= point.y) {
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
// optimization 3: vertical line case
|
|
508
|
+
if (iLine.o.x === iLine.d.x && iLine.o.x >= point.x) {
|
|
509
|
+
xi = iLine.o.x;
|
|
510
|
+
}
|
|
511
|
+
// calculate the intersection point
|
|
512
|
+
else {
|
|
513
|
+
const b1 = 0;
|
|
514
|
+
const b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);
|
|
515
|
+
const a1 = point.y - b1 * point.x;
|
|
516
|
+
const a2 = iLine.o.y - b2 * iLine.o.x;
|
|
517
|
+
|
|
518
|
+
xi = -(a1 - a2) / (b1 - b2);
|
|
519
|
+
}
|
|
520
|
+
// don't count xi < point.x cases
|
|
521
|
+
if (xi >= point.x) {
|
|
522
|
+
xcount += 1;
|
|
523
|
+
}
|
|
524
|
+
// optimization 4: specific for square images
|
|
525
|
+
if (xcount === 2) {
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return xcount;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Returns coordinates of object's bounding rectangle (left, top, width, height)
|
|
534
|
+
* the box is intended as aligned to axis of canvas.
|
|
535
|
+
* @param {Boolean} [absolute] use coordinates without viewportTransform
|
|
536
|
+
* @param {Boolean} [calculate] use coordinates of current position instead of .lineCoords / .aCoords
|
|
537
|
+
* @return {Object} Object with left, top, width, height properties
|
|
538
|
+
*/
|
|
539
|
+
getBoundingRect(absolute?: boolean, calculate?: boolean): TBBox {
|
|
540
|
+
return makeBoundingBoxFromPoints(this.getCoords(absolute, calculate));
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Returns width of an object's bounding box counting transformations
|
|
545
|
+
* @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
|
|
546
|
+
* @return {Number} width value
|
|
547
|
+
*/
|
|
548
|
+
getScaledWidth(): number {
|
|
549
|
+
return this._getTransformedDimensions().x;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Returns height of an object bounding box counting transformations
|
|
554
|
+
* @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?
|
|
555
|
+
* @return {Number} height value
|
|
556
|
+
*/
|
|
557
|
+
getScaledHeight(): number {
|
|
558
|
+
return this._getTransformedDimensions().y;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Scales an object (equally by x and y)
|
|
563
|
+
* @param {Number} value Scale factor
|
|
564
|
+
* @return {void}
|
|
565
|
+
*/
|
|
566
|
+
scale(value: number): void {
|
|
567
|
+
this._set('scaleX', value);
|
|
568
|
+
this._set('scaleY', value);
|
|
569
|
+
this.setCoords();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Scales an object to a given width, with respect to bounding box (scaling by x/y equally)
|
|
574
|
+
* @param {Number} value New width value
|
|
575
|
+
* @param {Boolean} absolute ignore viewport
|
|
576
|
+
* @return {void}
|
|
577
|
+
*/
|
|
578
|
+
scaleToWidth(value: number, absolute?: boolean) {
|
|
579
|
+
// adjust to bounding rect factor so that rotated shapes would fit as well
|
|
580
|
+
const boundingRectFactor =
|
|
581
|
+
this.getBoundingRect(absolute).width / this.getScaledWidth();
|
|
582
|
+
return this.scale(value / this.width / boundingRectFactor);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Scales an object to a given height, with respect to bounding box (scaling by x/y equally)
|
|
587
|
+
* @param {Number} value New height value
|
|
588
|
+
* @param {Boolean} absolute ignore viewport
|
|
589
|
+
* @return {void}
|
|
590
|
+
*/
|
|
591
|
+
scaleToHeight(value: number, absolute = false) {
|
|
592
|
+
// adjust to bounding rect factor so that rotated shapes would fit as well
|
|
593
|
+
const boundingRectFactor =
|
|
594
|
+
this.getBoundingRect(absolute).height / this.getScaledHeight();
|
|
595
|
+
return this.scale(value / this.height / boundingRectFactor);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
getCanvasRetinaScaling() {
|
|
599
|
+
return this.canvas?.getRetinaScaling() || 1;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Returns the object angle relative to canvas counting also the group property
|
|
604
|
+
* @returns {TDegree}
|
|
605
|
+
*/
|
|
606
|
+
getTotalAngle(): TDegree {
|
|
607
|
+
return this.group
|
|
608
|
+
? qrDecompose(this.calcTransformMatrix()).angle
|
|
609
|
+
: this.angle;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* return the coordinate of the 4 corners of the bounding box in HTMLCanvasElement coordinates
|
|
614
|
+
* used for bounding box interactivity with the mouse
|
|
615
|
+
* @returns {TCornerPoint}
|
|
616
|
+
*/
|
|
617
|
+
calcLineCoords(): TCornerPoint {
|
|
618
|
+
const vpt = this.getViewportTransform(),
|
|
619
|
+
padding = this.padding,
|
|
620
|
+
angle = degreesToRadians(this.getTotalAngle()),
|
|
621
|
+
cosP = cos(angle) * padding,
|
|
622
|
+
sinP = sin(angle) * padding,
|
|
623
|
+
cosPSinP = cosP + sinP,
|
|
624
|
+
cosPMinusSinP = cosP - sinP,
|
|
625
|
+
{ tl, tr, bl, br } = this.calcACoords();
|
|
626
|
+
|
|
627
|
+
const lineCoords: TCornerPoint = {
|
|
628
|
+
tl: transformPoint(tl, vpt),
|
|
629
|
+
tr: transformPoint(tr, vpt),
|
|
630
|
+
bl: transformPoint(bl, vpt),
|
|
631
|
+
br: transformPoint(br, vpt),
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
if (padding) {
|
|
635
|
+
lineCoords.tl.x -= cosPMinusSinP;
|
|
636
|
+
lineCoords.tl.y -= cosPSinP;
|
|
637
|
+
lineCoords.tr.x += cosPSinP;
|
|
638
|
+
lineCoords.tr.y -= cosPMinusSinP;
|
|
639
|
+
lineCoords.bl.x -= cosPSinP;
|
|
640
|
+
lineCoords.bl.y += cosPMinusSinP;
|
|
641
|
+
lineCoords.br.x += cosPMinusSinP;
|
|
642
|
+
lineCoords.br.y += cosPSinP;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
return lineCoords;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Retrieves viewportTransform from Object's canvas if possible
|
|
650
|
+
* @method getViewportTransform
|
|
651
|
+
* @memberOf FabricObject.prototype
|
|
652
|
+
* @return {TMat2D}
|
|
653
|
+
*/
|
|
654
|
+
getViewportTransform(): TMat2D {
|
|
655
|
+
return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.
|
|
660
|
+
* those never change with zoom or viewport changes.
|
|
661
|
+
* @return {TCornerPoint}
|
|
662
|
+
*/
|
|
663
|
+
calcACoords(): TCornerPoint {
|
|
664
|
+
const rotateMatrix = calcRotateMatrix({ angle: this.angle }),
|
|
665
|
+
center = this.getRelativeCenterPoint(),
|
|
666
|
+
translateMatrix = [1, 0, 0, 1, center.x, center.y] as TMat2D,
|
|
667
|
+
finalMatrix = multiplyTransformMatrices(translateMatrix, rotateMatrix),
|
|
668
|
+
dim = this._getTransformedDimensions(),
|
|
669
|
+
w = dim.x / 2,
|
|
670
|
+
h = dim.y / 2;
|
|
671
|
+
return {
|
|
672
|
+
// corners
|
|
673
|
+
tl: transformPoint({ x: -w, y: -h }, finalMatrix),
|
|
674
|
+
tr: transformPoint({ x: w, y: -h }, finalMatrix),
|
|
675
|
+
bl: transformPoint({ x: -w, y: h }, finalMatrix),
|
|
676
|
+
br: transformPoint({ x: w, y: h }, finalMatrix),
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Sets corner and controls position coordinates based on current angle, width and height, left and top.
|
|
682
|
+
* aCoords are used to quickly find an object on the canvas
|
|
683
|
+
* lineCoords are used to quickly find object during pointer events.
|
|
684
|
+
* See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}
|
|
685
|
+
* @param {Boolean} [skipCorners] skip calculation of aCoord, lineCoords.
|
|
686
|
+
* @return {void}
|
|
687
|
+
*/
|
|
688
|
+
setCoords(): void {
|
|
689
|
+
this.aCoords = this.calcACoords();
|
|
690
|
+
// in case we are in a group, for how the inner group target check works,
|
|
691
|
+
// lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.
|
|
692
|
+
this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
transformMatrixKey(skipGroup = false): string {
|
|
696
|
+
const sep = '_';
|
|
697
|
+
let prefix = '';
|
|
698
|
+
if (!skipGroup && this.group) {
|
|
699
|
+
prefix = this.group.transformMatrixKey(skipGroup) + sep;
|
|
700
|
+
}
|
|
701
|
+
return (
|
|
702
|
+
prefix +
|
|
703
|
+
this.top +
|
|
704
|
+
sep +
|
|
705
|
+
this.left +
|
|
706
|
+
sep +
|
|
707
|
+
this.scaleX +
|
|
708
|
+
sep +
|
|
709
|
+
this.scaleY +
|
|
710
|
+
sep +
|
|
711
|
+
this.skewX +
|
|
712
|
+
sep +
|
|
713
|
+
this.skewY +
|
|
714
|
+
sep +
|
|
715
|
+
this.angle +
|
|
716
|
+
sep +
|
|
717
|
+
this.originX +
|
|
718
|
+
sep +
|
|
719
|
+
this.originY +
|
|
720
|
+
sep +
|
|
721
|
+
this.width +
|
|
722
|
+
sep +
|
|
723
|
+
this.height +
|
|
724
|
+
sep +
|
|
725
|
+
this.strokeWidth +
|
|
726
|
+
this.flipX +
|
|
727
|
+
this.flipY
|
|
728
|
+
);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* calculate transform matrix that represents the current transformations from the
|
|
733
|
+
* object's properties.
|
|
734
|
+
* @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations
|
|
735
|
+
* There are some situation in which this is useful to avoid the fake rotation.
|
|
736
|
+
* @return {TMat2D} transform matrix for the object
|
|
737
|
+
*/
|
|
738
|
+
calcTransformMatrix(skipGroup = false): TMat2D {
|
|
739
|
+
let matrix = this.calcOwnMatrix();
|
|
740
|
+
if (skipGroup || !this.group) {
|
|
741
|
+
return matrix;
|
|
742
|
+
}
|
|
743
|
+
const key = this.transformMatrixKey(skipGroup),
|
|
744
|
+
cache = this.matrixCache;
|
|
745
|
+
if (cache && cache.key === key) {
|
|
746
|
+
return cache.value;
|
|
747
|
+
}
|
|
748
|
+
if (this.group) {
|
|
749
|
+
matrix = multiplyTransformMatrices(
|
|
750
|
+
this.group.calcTransformMatrix(false),
|
|
751
|
+
matrix
|
|
752
|
+
);
|
|
753
|
+
}
|
|
754
|
+
this.matrixCache = {
|
|
755
|
+
key,
|
|
756
|
+
value: matrix,
|
|
757
|
+
};
|
|
758
|
+
return matrix;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* calculate transform matrix that represents the current transformations from the
|
|
763
|
+
* object's properties, this matrix does not include the group transformation
|
|
764
|
+
* @return {TMat2D} transform matrix for the object
|
|
765
|
+
*/
|
|
766
|
+
calcOwnMatrix(): TMat2D {
|
|
767
|
+
const key = this.transformMatrixKey(true),
|
|
768
|
+
cache = this.ownMatrixCache;
|
|
769
|
+
if (cache && cache.key === key) {
|
|
770
|
+
return cache.value;
|
|
771
|
+
}
|
|
772
|
+
const center = this.getRelativeCenterPoint(),
|
|
773
|
+
options = {
|
|
774
|
+
angle: this.angle,
|
|
775
|
+
translateX: center.x,
|
|
776
|
+
translateY: center.y,
|
|
777
|
+
scaleX: this.scaleX,
|
|
778
|
+
scaleY: this.scaleY,
|
|
779
|
+
skewX: this.skewX,
|
|
780
|
+
skewY: this.skewY,
|
|
781
|
+
flipX: this.flipX,
|
|
782
|
+
flipY: this.flipY,
|
|
783
|
+
},
|
|
784
|
+
value = composeMatrix(options);
|
|
785
|
+
this.ownMatrixCache = {
|
|
786
|
+
key,
|
|
787
|
+
value,
|
|
788
|
+
};
|
|
789
|
+
return value;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* Calculate object dimensions from its properties
|
|
794
|
+
* @private
|
|
795
|
+
* @returns {Point} dimensions
|
|
796
|
+
*/
|
|
797
|
+
_getNonTransformedDimensions(): Point {
|
|
798
|
+
return new Point(this.width, this.height).scalarAdd(this.strokeWidth);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/**
|
|
802
|
+
* Calculate object dimensions for controls box, including padding and canvas zoom.
|
|
803
|
+
* and active selection
|
|
804
|
+
* @private
|
|
805
|
+
* @param {object} [options] transform options
|
|
806
|
+
* @returns {Point} dimensions
|
|
807
|
+
*/
|
|
808
|
+
_calculateCurrentDimensions(options?: any): Point {
|
|
809
|
+
return this._getTransformedDimensions(options)
|
|
810
|
+
.transform(this.getViewportTransform(), true)
|
|
811
|
+
.scalarAdd(2 * this.padding);
|
|
812
|
+
}
|
|
813
|
+
}
|