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
package/src/canvas.class.js
DELETED
|
@@ -1,1312 +0,0 @@
|
|
|
1
|
-
(function() {
|
|
2
|
-
|
|
3
|
-
var getPointer = fabric.util.getPointer,
|
|
4
|
-
degreesToRadians = fabric.util.degreesToRadians,
|
|
5
|
-
isTouchEvent = fabric.util.isTouchEvent;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Canvas class
|
|
9
|
-
* @class fabric.Canvas
|
|
10
|
-
* @extends fabric.StaticCanvas
|
|
11
|
-
* @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}
|
|
12
|
-
* @see {@link fabric.Canvas#initialize} for constructor definition
|
|
13
|
-
*
|
|
14
|
-
* @fires object:modified at the end of a transform or any change when statefull is true
|
|
15
|
-
* @fires object:rotating while an object is being rotated from the control
|
|
16
|
-
* @fires object:scaling while an object is being scaled by controls
|
|
17
|
-
* @fires object:moving while an object is being dragged
|
|
18
|
-
* @fires object:skewing while an object is being skewed from the controls
|
|
19
|
-
*
|
|
20
|
-
* @fires before:transform before a transform is is started
|
|
21
|
-
* @fires before:selection:cleared
|
|
22
|
-
* @fires selection:cleared
|
|
23
|
-
* @fires selection:updated
|
|
24
|
-
* @fires selection:created
|
|
25
|
-
*
|
|
26
|
-
* @fires path:created after a drawing operation ends and the path is added
|
|
27
|
-
* @fires mouse:down
|
|
28
|
-
* @fires mouse:move
|
|
29
|
-
* @fires mouse:up
|
|
30
|
-
* @fires mouse:down:before on mouse down, before the inner fabric logic runs
|
|
31
|
-
* @fires mouse:move:before on mouse move, before the inner fabric logic runs
|
|
32
|
-
* @fires mouse:up:before on mouse up, before the inner fabric logic runs
|
|
33
|
-
* @fires mouse:over
|
|
34
|
-
* @fires mouse:out
|
|
35
|
-
* @fires mouse:dblclick whenever a native dbl click event fires on the canvas.
|
|
36
|
-
*
|
|
37
|
-
* @fires dragover
|
|
38
|
-
* @fires dragenter
|
|
39
|
-
* @fires dragleave
|
|
40
|
-
* @fires drop:before before drop event. same native event. This is added to handle edge cases
|
|
41
|
-
* @fires drop
|
|
42
|
-
* @fires after:render at the end of the render process, receives the context in the callback
|
|
43
|
-
* @fires before:render at start the render process, receives the context in the callback
|
|
44
|
-
*
|
|
45
|
-
*/
|
|
46
|
-
fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Constructor
|
|
50
|
-
* @param {HTMLElement | String} el <canvas> element to initialize instance on
|
|
51
|
-
* @param {Object} [options] Options object
|
|
52
|
-
* @return {Object} thisArg
|
|
53
|
-
*/
|
|
54
|
-
initialize: function(el, options) {
|
|
55
|
-
options || (options = { });
|
|
56
|
-
this.renderAndResetBound = this.renderAndReset.bind(this);
|
|
57
|
-
this.requestRenderAllBound = this.requestRenderAll.bind(this);
|
|
58
|
-
this._initStatic(el, options);
|
|
59
|
-
this._initInteractive();
|
|
60
|
-
this._createCacheCanvas();
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* When true, objects can be transformed by one side (unproportionally)
|
|
65
|
-
* when dragged on the corners that normally would not do that.
|
|
66
|
-
* @type Boolean
|
|
67
|
-
* @default
|
|
68
|
-
* @since fabric 4.0 // changed name and default value
|
|
69
|
-
*/
|
|
70
|
-
uniformScaling: true,
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Indicates which key switches uniform scaling.
|
|
74
|
-
* values: 'altKey', 'shiftKey', 'ctrlKey'.
|
|
75
|
-
* If `null` or 'none' or any other string that is not a modifier key
|
|
76
|
-
* feature is disabled.
|
|
77
|
-
* totally wrong named. this sounds like `uniform scaling`
|
|
78
|
-
* if Canvas.uniformScaling is true, pressing this will set it to false
|
|
79
|
-
* and viceversa.
|
|
80
|
-
* @since 1.6.2
|
|
81
|
-
* @type String
|
|
82
|
-
* @default
|
|
83
|
-
*/
|
|
84
|
-
uniScaleKey: 'shiftKey',
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* When true, objects use center point as the origin of scale transformation.
|
|
88
|
-
* <b>Backwards incompatibility note:</b> This property replaces "centerTransform" (Boolean).
|
|
89
|
-
* @since 1.3.4
|
|
90
|
-
* @type Boolean
|
|
91
|
-
* @default
|
|
92
|
-
*/
|
|
93
|
-
centeredScaling: false,
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* When true, objects use center point as the origin of rotate transformation.
|
|
97
|
-
* <b>Backwards incompatibility note:</b> This property replaces "centerTransform" (Boolean).
|
|
98
|
-
* @since 1.3.4
|
|
99
|
-
* @type Boolean
|
|
100
|
-
* @default
|
|
101
|
-
*/
|
|
102
|
-
centeredRotation: false,
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Indicates which key enable centered Transform
|
|
106
|
-
* values: 'altKey', 'shiftKey', 'ctrlKey'.
|
|
107
|
-
* If `null` or 'none' or any other string that is not a modifier key
|
|
108
|
-
* feature is disabled feature disabled.
|
|
109
|
-
* @since 1.6.2
|
|
110
|
-
* @type String
|
|
111
|
-
* @default
|
|
112
|
-
*/
|
|
113
|
-
centeredKey: 'altKey',
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Indicates which key enable alternate action on corner
|
|
117
|
-
* values: 'altKey', 'shiftKey', 'ctrlKey'.
|
|
118
|
-
* If `null` or 'none' or any other string that is not a modifier key
|
|
119
|
-
* feature is disabled feature disabled.
|
|
120
|
-
* @since 1.6.2
|
|
121
|
-
* @type String
|
|
122
|
-
* @default
|
|
123
|
-
*/
|
|
124
|
-
altActionKey: 'shiftKey',
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Indicates that canvas is interactive. This property should not be changed.
|
|
128
|
-
* @type Boolean
|
|
129
|
-
* @default
|
|
130
|
-
*/
|
|
131
|
-
interactive: true,
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Indicates whether group selection should be enabled
|
|
135
|
-
* @type Boolean
|
|
136
|
-
* @default
|
|
137
|
-
*/
|
|
138
|
-
selection: true,
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Indicates which key or keys enable multiple click selection
|
|
142
|
-
* Pass value as a string or array of strings
|
|
143
|
-
* values: 'altKey', 'shiftKey', 'ctrlKey'.
|
|
144
|
-
* If `null` or empty or containing any other string that is not a modifier key
|
|
145
|
-
* feature is disabled.
|
|
146
|
-
* @since 1.6.2
|
|
147
|
-
* @type String|Array
|
|
148
|
-
* @default
|
|
149
|
-
*/
|
|
150
|
-
selectionKey: 'shiftKey',
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Indicates which key enable alternative selection
|
|
154
|
-
* in case of target overlapping with active object
|
|
155
|
-
* values: 'altKey', 'shiftKey', 'ctrlKey'.
|
|
156
|
-
* For a series of reason that come from the general expectations on how
|
|
157
|
-
* things should work, this feature works only for preserveObjectStacking true.
|
|
158
|
-
* If `null` or 'none' or any other string that is not a modifier key
|
|
159
|
-
* feature is disabled.
|
|
160
|
-
* @since 1.6.5
|
|
161
|
-
* @type null|String
|
|
162
|
-
* @default
|
|
163
|
-
*/
|
|
164
|
-
altSelectionKey: null,
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Color of selection
|
|
168
|
-
* @type String
|
|
169
|
-
* @default
|
|
170
|
-
*/
|
|
171
|
-
selectionColor: 'rgba(100, 100, 255, 0.3)', // blue
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Default dash array pattern
|
|
175
|
-
* If not empty the selection border is dashed
|
|
176
|
-
* @type Array
|
|
177
|
-
*/
|
|
178
|
-
selectionDashArray: [],
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Color of the border of selection (usually slightly darker than color of selection itself)
|
|
182
|
-
* @type String
|
|
183
|
-
* @default
|
|
184
|
-
*/
|
|
185
|
-
selectionBorderColor: 'rgba(255, 255, 255, 0.3)',
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Width of a line used in object/group selection
|
|
189
|
-
* @type Number
|
|
190
|
-
* @default
|
|
191
|
-
*/
|
|
192
|
-
selectionLineWidth: 1,
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Select only shapes that are fully contained in the dragged selection rectangle.
|
|
196
|
-
* @type Boolean
|
|
197
|
-
* @default
|
|
198
|
-
*/
|
|
199
|
-
selectionFullyContained: false,
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Default cursor value used when hovering over an object on canvas
|
|
203
|
-
* @type String
|
|
204
|
-
* @default
|
|
205
|
-
*/
|
|
206
|
-
hoverCursor: 'move',
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Default cursor value used when moving an object on canvas
|
|
210
|
-
* @type String
|
|
211
|
-
* @default
|
|
212
|
-
*/
|
|
213
|
-
moveCursor: 'move',
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Default cursor value used for the entire canvas
|
|
217
|
-
* @type String
|
|
218
|
-
* @default
|
|
219
|
-
*/
|
|
220
|
-
defaultCursor: 'default',
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Cursor value used during free drawing
|
|
224
|
-
* @type String
|
|
225
|
-
* @default
|
|
226
|
-
*/
|
|
227
|
-
freeDrawingCursor: 'crosshair',
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Cursor value used for disabled elements ( corners with disabled action )
|
|
231
|
-
* @type String
|
|
232
|
-
* @since 2.0.0
|
|
233
|
-
* @default
|
|
234
|
-
*/
|
|
235
|
-
notAllowedCursor: 'not-allowed',
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Default element class that's given to wrapper (div) element of canvas
|
|
239
|
-
* @type String
|
|
240
|
-
* @default
|
|
241
|
-
*/
|
|
242
|
-
containerClass: 'canvas-container',
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* When true, object detection happens on per-pixel basis rather than on per-bounding-box
|
|
246
|
-
* @type Boolean
|
|
247
|
-
* @default
|
|
248
|
-
*/
|
|
249
|
-
perPixelTargetFind: false,
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Number of pixels around target pixel to tolerate (consider active) during object detection
|
|
253
|
-
* @type Number
|
|
254
|
-
* @default
|
|
255
|
-
*/
|
|
256
|
-
targetFindTolerance: 0,
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* When true, target detection is skipped. Target detection will return always undefined.
|
|
260
|
-
* click selection won't work anymore, events will fire with no targets.
|
|
261
|
-
* if something is selected before setting it to true, it will be deselected at the first click.
|
|
262
|
-
* area selection will still work. check the `selection` property too.
|
|
263
|
-
* if you deactivate both, you should look into staticCanvas.
|
|
264
|
-
* @type Boolean
|
|
265
|
-
* @default
|
|
266
|
-
*/
|
|
267
|
-
skipTargetFind: false,
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.
|
|
271
|
-
* After mousedown, mousemove creates a shape,
|
|
272
|
-
* and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.
|
|
273
|
-
* @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}
|
|
274
|
-
* @type Boolean
|
|
275
|
-
* @default
|
|
276
|
-
*/
|
|
277
|
-
isDrawingMode: false,
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Indicates whether objects should remain in current stack position when selected.
|
|
281
|
-
* When false objects are brought to top and rendered as part of the selection group
|
|
282
|
-
* @type Boolean
|
|
283
|
-
* @default
|
|
284
|
-
*/
|
|
285
|
-
preserveObjectStacking: false,
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Indicates the angle that an object will lock to while rotating.
|
|
289
|
-
* @type Number
|
|
290
|
-
* @since 1.6.7
|
|
291
|
-
* @default
|
|
292
|
-
*/
|
|
293
|
-
snapAngle: 0,
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Indicates the distance from the snapAngle the rotation will lock to the snapAngle.
|
|
297
|
-
* When `null`, the snapThreshold will default to the snapAngle.
|
|
298
|
-
* @type null|Number
|
|
299
|
-
* @since 1.6.7
|
|
300
|
-
* @default
|
|
301
|
-
*/
|
|
302
|
-
snapThreshold: null,
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Indicates if the right click on canvas can output the context menu or not
|
|
306
|
-
* @type Boolean
|
|
307
|
-
* @since 1.6.5
|
|
308
|
-
* @default
|
|
309
|
-
*/
|
|
310
|
-
stopContextMenu: false,
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Indicates if the canvas can fire right click events
|
|
314
|
-
* @type Boolean
|
|
315
|
-
* @since 1.6.5
|
|
316
|
-
* @default
|
|
317
|
-
*/
|
|
318
|
-
fireRightClick: false,
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Indicates if the canvas can fire middle click events
|
|
322
|
-
* @type Boolean
|
|
323
|
-
* @since 1.7.8
|
|
324
|
-
* @default
|
|
325
|
-
*/
|
|
326
|
-
fireMiddleClick: false,
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Keep track of the subTargets for Mouse Events
|
|
330
|
-
* @type fabric.Object[]
|
|
331
|
-
*/
|
|
332
|
-
targets: [],
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* When the option is enabled, PointerEvent is used instead of MouseEvent.
|
|
336
|
-
* @type Boolean
|
|
337
|
-
* @default
|
|
338
|
-
*/
|
|
339
|
-
enablePointerEvents: false,
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Keep track of the hovered target
|
|
343
|
-
* @type fabric.Object
|
|
344
|
-
* @private
|
|
345
|
-
*/
|
|
346
|
-
_hoveredTarget: null,
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* hold the list of nested targets hovered
|
|
350
|
-
* @type fabric.Object[]
|
|
351
|
-
* @private
|
|
352
|
-
*/
|
|
353
|
-
_hoveredTargets: [],
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* @private
|
|
357
|
-
*/
|
|
358
|
-
_initInteractive: function() {
|
|
359
|
-
this._currentTransform = null;
|
|
360
|
-
this._groupSelector = null;
|
|
361
|
-
this._initWrapperElement();
|
|
362
|
-
this._createUpperCanvas();
|
|
363
|
-
this._initEventListeners();
|
|
364
|
-
|
|
365
|
-
this._initRetinaScaling();
|
|
366
|
-
|
|
367
|
-
this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);
|
|
368
|
-
|
|
369
|
-
this.calcOffset();
|
|
370
|
-
},
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
* Divides objects in two groups, one to render immediately
|
|
374
|
-
* and one to render as activeGroup.
|
|
375
|
-
* @return {Array} objects to render immediately and pushes the other in the activeGroup.
|
|
376
|
-
*/
|
|
377
|
-
_chooseObjectsToRender: function() {
|
|
378
|
-
var activeObjects = this.getActiveObjects(),
|
|
379
|
-
object, objsToRender, activeGroupObjects;
|
|
380
|
-
|
|
381
|
-
if (activeObjects.length > 0 && !this.preserveObjectStacking) {
|
|
382
|
-
objsToRender = [];
|
|
383
|
-
activeGroupObjects = [];
|
|
384
|
-
for (var i = 0, length = this._objects.length; i < length; i++) {
|
|
385
|
-
object = this._objects[i];
|
|
386
|
-
if (activeObjects.indexOf(object) === -1 ) {
|
|
387
|
-
objsToRender.push(object);
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
activeGroupObjects.push(object);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
if (activeObjects.length > 1) {
|
|
394
|
-
this._activeObject._objects = activeGroupObjects;
|
|
395
|
-
}
|
|
396
|
-
objsToRender.push.apply(objsToRender, activeGroupObjects);
|
|
397
|
-
}
|
|
398
|
-
else {
|
|
399
|
-
objsToRender = this._objects;
|
|
400
|
-
}
|
|
401
|
-
return objsToRender;
|
|
402
|
-
},
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Renders both the top canvas and the secondary container canvas.
|
|
406
|
-
* @return {fabric.Canvas} instance
|
|
407
|
-
* @chainable
|
|
408
|
-
*/
|
|
409
|
-
renderAll: function () {
|
|
410
|
-
if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {
|
|
411
|
-
this.clearContext(this.contextTop);
|
|
412
|
-
this.contextTopDirty = false;
|
|
413
|
-
}
|
|
414
|
-
if (this.hasLostContext) {
|
|
415
|
-
this.renderTopLayer(this.contextTop);
|
|
416
|
-
this.hasLostContext = false;
|
|
417
|
-
}
|
|
418
|
-
var canvasToDrawOn = this.contextContainer;
|
|
419
|
-
this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());
|
|
420
|
-
return this;
|
|
421
|
-
},
|
|
422
|
-
|
|
423
|
-
renderTopLayer: function(ctx) {
|
|
424
|
-
ctx.save();
|
|
425
|
-
if (this.isDrawingMode && this._isCurrentlyDrawing) {
|
|
426
|
-
this.freeDrawingBrush && this.freeDrawingBrush._render();
|
|
427
|
-
this.contextTopDirty = true;
|
|
428
|
-
}
|
|
429
|
-
// we render the top context - last object
|
|
430
|
-
if (this.selection && this._groupSelector) {
|
|
431
|
-
this._drawSelection(ctx);
|
|
432
|
-
this.contextTopDirty = true;
|
|
433
|
-
}
|
|
434
|
-
ctx.restore();
|
|
435
|
-
},
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* Method to render only the top canvas.
|
|
439
|
-
* Also used to render the group selection box.
|
|
440
|
-
* @return {fabric.Canvas} thisArg
|
|
441
|
-
* @chainable
|
|
442
|
-
*/
|
|
443
|
-
renderTop: function () {
|
|
444
|
-
var ctx = this.contextTop;
|
|
445
|
-
this.clearContext(ctx);
|
|
446
|
-
this.renderTopLayer(ctx);
|
|
447
|
-
this.fire('after:render');
|
|
448
|
-
return this;
|
|
449
|
-
},
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
* @private
|
|
453
|
-
*/
|
|
454
|
-
_normalizePointer: function (object, pointer) {
|
|
455
|
-
var m = object.calcTransformMatrix(),
|
|
456
|
-
invertedM = fabric.util.invertTransform(m),
|
|
457
|
-
vptPointer = this.restorePointerVpt(pointer);
|
|
458
|
-
return fabric.util.transformPoint(vptPointer, invertedM);
|
|
459
|
-
},
|
|
460
|
-
|
|
461
|
-
/**
|
|
462
|
-
* Returns true if object is transparent at a certain location
|
|
463
|
-
* @param {fabric.Object} target Object to check
|
|
464
|
-
* @param {Number} x Left coordinate
|
|
465
|
-
* @param {Number} y Top coordinate
|
|
466
|
-
* @return {Boolean}
|
|
467
|
-
*/
|
|
468
|
-
isTargetTransparent: function (target, x, y) {
|
|
469
|
-
// in case the target is the activeObject, we cannot execute this optimization
|
|
470
|
-
// because we need to draw controls too.
|
|
471
|
-
if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {
|
|
472
|
-
var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),
|
|
473
|
-
targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),
|
|
474
|
-
targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);
|
|
475
|
-
|
|
476
|
-
var isTransparent = fabric.util.isTransparent(
|
|
477
|
-
target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);
|
|
478
|
-
|
|
479
|
-
return isTransparent;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
var ctx = this.contextCache,
|
|
483
|
-
originalColor = target.selectionBackgroundColor, v = this.viewportTransform;
|
|
484
|
-
|
|
485
|
-
target.selectionBackgroundColor = '';
|
|
486
|
-
|
|
487
|
-
this.clearContext(ctx);
|
|
488
|
-
|
|
489
|
-
ctx.save();
|
|
490
|
-
ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);
|
|
491
|
-
target.render(ctx);
|
|
492
|
-
ctx.restore();
|
|
493
|
-
|
|
494
|
-
target.selectionBackgroundColor = originalColor;
|
|
495
|
-
|
|
496
|
-
var isTransparent = fabric.util.isTransparent(
|
|
497
|
-
ctx, x, y, this.targetFindTolerance);
|
|
498
|
-
|
|
499
|
-
return isTransparent;
|
|
500
|
-
},
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* takes an event and determines if selection key has been pressed
|
|
504
|
-
* @private
|
|
505
|
-
* @param {Event} e Event object
|
|
506
|
-
*/
|
|
507
|
-
_isSelectionKeyPressed: function(e) {
|
|
508
|
-
var selectionKeyPressed = false;
|
|
509
|
-
|
|
510
|
-
if (Array.isArray(this.selectionKey)) {
|
|
511
|
-
selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
selectionKeyPressed = e[this.selectionKey];
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
return selectionKeyPressed;
|
|
518
|
-
},
|
|
519
|
-
|
|
520
|
-
/**
|
|
521
|
-
* @private
|
|
522
|
-
* @param {Event} e Event object
|
|
523
|
-
* @param {fabric.Object} target
|
|
524
|
-
*/
|
|
525
|
-
_shouldClearSelection: function (e, target) {
|
|
526
|
-
var activeObjects = this.getActiveObjects(),
|
|
527
|
-
activeObject = this._activeObject;
|
|
528
|
-
|
|
529
|
-
return (
|
|
530
|
-
!target
|
|
531
|
-
||
|
|
532
|
-
(target &&
|
|
533
|
-
activeObject &&
|
|
534
|
-
activeObjects.length > 1 &&
|
|
535
|
-
activeObjects.indexOf(target) === -1 &&
|
|
536
|
-
activeObject !== target &&
|
|
537
|
-
!this._isSelectionKeyPressed(e))
|
|
538
|
-
||
|
|
539
|
-
(target && !target.evented)
|
|
540
|
-
||
|
|
541
|
-
(target &&
|
|
542
|
-
!target.selectable &&
|
|
543
|
-
activeObject &&
|
|
544
|
-
activeObject !== target)
|
|
545
|
-
);
|
|
546
|
-
},
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* centeredScaling from object can't override centeredScaling from canvas.
|
|
550
|
-
* this should be fixed, since object setting should take precedence over canvas.
|
|
551
|
-
* also this should be something that will be migrated in the control properties.
|
|
552
|
-
* as ability to define the origin of the transformation that the control provide.
|
|
553
|
-
* @private
|
|
554
|
-
* @param {fabric.Object} target
|
|
555
|
-
* @param {String} action
|
|
556
|
-
* @param {Boolean} altKey
|
|
557
|
-
*/
|
|
558
|
-
_shouldCenterTransform: function (target, action, altKey) {
|
|
559
|
-
if (!target) {
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
var centerTransform;
|
|
564
|
-
|
|
565
|
-
if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {
|
|
566
|
-
centerTransform = this.centeredScaling || target.centeredScaling;
|
|
567
|
-
}
|
|
568
|
-
else if (action === 'rotate') {
|
|
569
|
-
centerTransform = this.centeredRotation || target.centeredRotation;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
return centerTransform ? !altKey : altKey;
|
|
573
|
-
},
|
|
574
|
-
|
|
575
|
-
/**
|
|
576
|
-
* should disappear before release 4.0
|
|
577
|
-
* @private
|
|
578
|
-
*/
|
|
579
|
-
_getOriginFromCorner: function(target, corner) {
|
|
580
|
-
var origin = {
|
|
581
|
-
x: target.originX,
|
|
582
|
-
y: target.originY
|
|
583
|
-
};
|
|
584
|
-
|
|
585
|
-
if (corner === 'ml' || corner === 'tl' || corner === 'bl') {
|
|
586
|
-
origin.x = 'right';
|
|
587
|
-
}
|
|
588
|
-
else if (corner === 'mr' || corner === 'tr' || corner === 'br') {
|
|
589
|
-
origin.x = 'left';
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
if (corner === 'tl' || corner === 'mt' || corner === 'tr') {
|
|
593
|
-
origin.y = 'bottom';
|
|
594
|
-
}
|
|
595
|
-
else if (corner === 'bl' || corner === 'mb' || corner === 'br') {
|
|
596
|
-
origin.y = 'top';
|
|
597
|
-
}
|
|
598
|
-
return origin;
|
|
599
|
-
},
|
|
600
|
-
|
|
601
|
-
/**
|
|
602
|
-
* @private
|
|
603
|
-
* @param {Boolean} alreadySelected true if target is already selected
|
|
604
|
-
* @param {String} corner a string representing the corner ml, mr, tl ...
|
|
605
|
-
* @param {Event} e Event object
|
|
606
|
-
* @param {fabric.Object} [target] inserted back to help overriding. Unused
|
|
607
|
-
*/
|
|
608
|
-
_getActionFromCorner: function(alreadySelected, corner, e, target) {
|
|
609
|
-
if (!corner || !alreadySelected) {
|
|
610
|
-
return 'drag';
|
|
611
|
-
}
|
|
612
|
-
var control = target.controls[corner];
|
|
613
|
-
return control.getActionName(e, control, target);
|
|
614
|
-
},
|
|
615
|
-
|
|
616
|
-
/**
|
|
617
|
-
* @private
|
|
618
|
-
* @param {Event} e Event object
|
|
619
|
-
* @param {fabric.Object} target
|
|
620
|
-
*/
|
|
621
|
-
_setupCurrentTransform: function (e, target, alreadySelected) {
|
|
622
|
-
if (!target) {
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
var pointer = this.getPointer(e), corner = target.__corner,
|
|
627
|
-
control = target.controls[corner],
|
|
628
|
-
actionHandler = (alreadySelected && corner) ?
|
|
629
|
-
control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,
|
|
630
|
-
action = this._getActionFromCorner(alreadySelected, corner, e, target),
|
|
631
|
-
origin = this._getOriginFromCorner(target, corner),
|
|
632
|
-
altKey = e[this.centeredKey],
|
|
633
|
-
transform = {
|
|
634
|
-
target: target,
|
|
635
|
-
action: action,
|
|
636
|
-
actionHandler: actionHandler,
|
|
637
|
-
corner: corner,
|
|
638
|
-
scaleX: target.scaleX,
|
|
639
|
-
scaleY: target.scaleY,
|
|
640
|
-
skewX: target.skewX,
|
|
641
|
-
skewY: target.skewY,
|
|
642
|
-
// used by transation
|
|
643
|
-
offsetX: pointer.x - target.left,
|
|
644
|
-
offsetY: pointer.y - target.top,
|
|
645
|
-
originX: origin.x,
|
|
646
|
-
originY: origin.y,
|
|
647
|
-
ex: pointer.x,
|
|
648
|
-
ey: pointer.y,
|
|
649
|
-
lastX: pointer.x,
|
|
650
|
-
lastY: pointer.y,
|
|
651
|
-
// unsure they are useful anymore.
|
|
652
|
-
// left: target.left,
|
|
653
|
-
// top: target.top,
|
|
654
|
-
theta: degreesToRadians(target.angle),
|
|
655
|
-
// end of unsure
|
|
656
|
-
width: target.width * target.scaleX,
|
|
657
|
-
shiftKey: e.shiftKey,
|
|
658
|
-
altKey: altKey,
|
|
659
|
-
original: fabric.util.saveObjectTransform(target),
|
|
660
|
-
};
|
|
661
|
-
|
|
662
|
-
if (this._shouldCenterTransform(target, action, altKey)) {
|
|
663
|
-
transform.originX = 'center';
|
|
664
|
-
transform.originY = 'center';
|
|
665
|
-
}
|
|
666
|
-
transform.original.originX = origin.x;
|
|
667
|
-
transform.original.originY = origin.y;
|
|
668
|
-
this._currentTransform = transform;
|
|
669
|
-
this._beforeTransform(e);
|
|
670
|
-
},
|
|
671
|
-
|
|
672
|
-
/**
|
|
673
|
-
* Set the cursor type of the canvas element
|
|
674
|
-
* @param {String} value Cursor type of the canvas element.
|
|
675
|
-
* @see http://www.w3.org/TR/css3-ui/#cursor
|
|
676
|
-
*/
|
|
677
|
-
setCursor: function (value) {
|
|
678
|
-
this.upperCanvasEl.style.cursor = value;
|
|
679
|
-
},
|
|
680
|
-
|
|
681
|
-
/**
|
|
682
|
-
* @private
|
|
683
|
-
* @param {CanvasRenderingContext2D} ctx to draw the selection on
|
|
684
|
-
*/
|
|
685
|
-
_drawSelection: function (ctx) {
|
|
686
|
-
var selector = this._groupSelector,
|
|
687
|
-
viewportStart = new fabric.Point(selector.ex, selector.ey),
|
|
688
|
-
start = fabric.util.transformPoint(viewportStart, this.viewportTransform),
|
|
689
|
-
viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),
|
|
690
|
-
extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),
|
|
691
|
-
minX = Math.min(start.x, extent.x),
|
|
692
|
-
minY = Math.min(start.y, extent.y),
|
|
693
|
-
maxX = Math.max(start.x, extent.x),
|
|
694
|
-
maxY = Math.max(start.y, extent.y),
|
|
695
|
-
strokeOffset = this.selectionLineWidth / 2;
|
|
696
|
-
|
|
697
|
-
if (this.selectionColor) {
|
|
698
|
-
ctx.fillStyle = this.selectionColor;
|
|
699
|
-
ctx.fillRect(minX, minY, maxX - minX, maxY - minY);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
if (!this.selectionLineWidth || !this.selectionBorderColor) {
|
|
703
|
-
return;
|
|
704
|
-
}
|
|
705
|
-
ctx.lineWidth = this.selectionLineWidth;
|
|
706
|
-
ctx.strokeStyle = this.selectionBorderColor;
|
|
707
|
-
|
|
708
|
-
minX += strokeOffset;
|
|
709
|
-
minY += strokeOffset;
|
|
710
|
-
maxX -= strokeOffset;
|
|
711
|
-
maxY -= strokeOffset;
|
|
712
|
-
// selection border
|
|
713
|
-
fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);
|
|
714
|
-
ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);
|
|
715
|
-
},
|
|
716
|
-
|
|
717
|
-
/**
|
|
718
|
-
* Method that determines what object we are clicking on
|
|
719
|
-
* the skipGroup parameter is for internal use, is needed for shift+click action
|
|
720
|
-
* 11/09/2018 TODO: would be cool if findTarget could discern between being a full target
|
|
721
|
-
* or the outside part of the corner.
|
|
722
|
-
* @param {Event} e mouse event
|
|
723
|
-
* @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through
|
|
724
|
-
* @return {fabric.Object} the target found
|
|
725
|
-
*/
|
|
726
|
-
findTarget: function (e, skipGroup) {
|
|
727
|
-
if (this.skipTargetFind) {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
var ignoreZoom = true,
|
|
732
|
-
pointer = this.getPointer(e, ignoreZoom),
|
|
733
|
-
activeObject = this._activeObject,
|
|
734
|
-
aObjects = this.getActiveObjects(),
|
|
735
|
-
activeTarget, activeTargetSubs,
|
|
736
|
-
isTouch = isTouchEvent(e),
|
|
737
|
-
shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;
|
|
738
|
-
|
|
739
|
-
// first check current group (if one exists)
|
|
740
|
-
// active group does not check sub targets like normal groups.
|
|
741
|
-
// if active group just exits.
|
|
742
|
-
this.targets = [];
|
|
743
|
-
|
|
744
|
-
// if we hit the corner of an activeObject, let's return that.
|
|
745
|
-
if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {
|
|
746
|
-
return activeObject;
|
|
747
|
-
}
|
|
748
|
-
if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {
|
|
749
|
-
return activeObject;
|
|
750
|
-
}
|
|
751
|
-
if (aObjects.length === 1 &&
|
|
752
|
-
activeObject === this._searchPossibleTargets([activeObject], pointer)) {
|
|
753
|
-
if (!this.preserveObjectStacking) {
|
|
754
|
-
return activeObject;
|
|
755
|
-
}
|
|
756
|
-
else {
|
|
757
|
-
activeTarget = activeObject;
|
|
758
|
-
activeTargetSubs = this.targets;
|
|
759
|
-
this.targets = [];
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
var target = this._searchPossibleTargets(this._objects, pointer);
|
|
763
|
-
if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {
|
|
764
|
-
target = activeTarget;
|
|
765
|
-
this.targets = activeTargetSubs;
|
|
766
|
-
}
|
|
767
|
-
return target;
|
|
768
|
-
},
|
|
769
|
-
|
|
770
|
-
/**
|
|
771
|
-
* Checks point is inside the object.
|
|
772
|
-
* @param {Object} [pointer] x,y object of point coordinates we want to check.
|
|
773
|
-
* @param {fabric.Object} obj Object to test against
|
|
774
|
-
* @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.
|
|
775
|
-
* @return {Boolean} true if point is contained within an area of given object
|
|
776
|
-
* @private
|
|
777
|
-
*/
|
|
778
|
-
_checkTarget: function(pointer, obj, globalPointer) {
|
|
779
|
-
if (obj &&
|
|
780
|
-
obj.visible &&
|
|
781
|
-
obj.evented &&
|
|
782
|
-
// http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html
|
|
783
|
-
// http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html
|
|
784
|
-
obj.containsPoint(pointer)
|
|
785
|
-
) {
|
|
786
|
-
if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {
|
|
787
|
-
var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);
|
|
788
|
-
if (!isTransparent) {
|
|
789
|
-
return true;
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
else {
|
|
793
|
-
return true;
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
},
|
|
797
|
-
|
|
798
|
-
/**
|
|
799
|
-
* Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted
|
|
800
|
-
* @param {Array} [objects] objects array to look into
|
|
801
|
-
* @param {Object} [pointer] x,y object of point coordinates we want to check.
|
|
802
|
-
* @return {fabric.Object} object that contains pointer
|
|
803
|
-
* @private
|
|
804
|
-
*/
|
|
805
|
-
_searchPossibleTargets: function(objects, pointer) {
|
|
806
|
-
// Cache all targets where their bounding box contains point.
|
|
807
|
-
var target, i = objects.length, subTarget;
|
|
808
|
-
// Do not check for currently grouped objects, since we check the parent group itself.
|
|
809
|
-
// until we call this function specifically to search inside the activeGroup
|
|
810
|
-
while (i--) {
|
|
811
|
-
var objToCheck = objects[i];
|
|
812
|
-
var pointerToUse = objToCheck.group ?
|
|
813
|
-
this._normalizePointer(objToCheck.group, pointer) : pointer;
|
|
814
|
-
if (this._checkTarget(pointerToUse, objToCheck, pointer)) {
|
|
815
|
-
target = objects[i];
|
|
816
|
-
if (target.subTargetCheck && target instanceof fabric.Group) {
|
|
817
|
-
subTarget = this._searchPossibleTargets(target._objects, pointer);
|
|
818
|
-
subTarget && this.targets.push(subTarget);
|
|
819
|
-
}
|
|
820
|
-
break;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
return target;
|
|
824
|
-
},
|
|
825
|
-
|
|
826
|
-
/**
|
|
827
|
-
* Returns pointer coordinates without the effect of the viewport
|
|
828
|
-
* @param {Object} pointer with "x" and "y" number values
|
|
829
|
-
* @return {Object} object with "x" and "y" number values
|
|
830
|
-
*/
|
|
831
|
-
restorePointerVpt: function(pointer) {
|
|
832
|
-
return fabric.util.transformPoint(
|
|
833
|
-
pointer,
|
|
834
|
-
fabric.util.invertTransform(this.viewportTransform)
|
|
835
|
-
);
|
|
836
|
-
},
|
|
837
|
-
|
|
838
|
-
/**
|
|
839
|
-
* Returns pointer coordinates relative to canvas.
|
|
840
|
-
* Can return coordinates with or without viewportTransform.
|
|
841
|
-
* ignoreZoom false gives back coordinates that represent
|
|
842
|
-
* the point clicked on canvas element.
|
|
843
|
-
* ignoreZoom true gives back coordinates after being processed
|
|
844
|
-
* by the viewportTransform ( sort of coordinates of what is displayed
|
|
845
|
-
* on the canvas where you are clicking.
|
|
846
|
-
* ignoreZoom true = HTMLElement coordinates relative to top,left
|
|
847
|
-
* ignoreZoom false, default = fabric space coordinates, the same used for shape position
|
|
848
|
-
* To interact with your shapes top and left you want to use ignoreZoom true
|
|
849
|
-
* most of the time, while ignoreZoom false will give you coordinates
|
|
850
|
-
* compatible with the object.oCoords system.
|
|
851
|
-
* of the time.
|
|
852
|
-
* @param {Event} e
|
|
853
|
-
* @param {Boolean} ignoreZoom
|
|
854
|
-
* @return {Object} object with "x" and "y" number values
|
|
855
|
-
*/
|
|
856
|
-
getPointer: function (e, ignoreZoom) {
|
|
857
|
-
// return cached values if we are in the event processing chain
|
|
858
|
-
if (this._absolutePointer && !ignoreZoom) {
|
|
859
|
-
return this._absolutePointer;
|
|
860
|
-
}
|
|
861
|
-
if (this._pointer && ignoreZoom) {
|
|
862
|
-
return this._pointer;
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
var pointer = getPointer(e),
|
|
866
|
-
upperCanvasEl = this.upperCanvasEl,
|
|
867
|
-
bounds = upperCanvasEl.getBoundingClientRect(),
|
|
868
|
-
boundsWidth = bounds.width || 0,
|
|
869
|
-
boundsHeight = bounds.height || 0,
|
|
870
|
-
cssScale;
|
|
871
|
-
|
|
872
|
-
if (!boundsWidth || !boundsHeight ) {
|
|
873
|
-
if ('top' in bounds && 'bottom' in bounds) {
|
|
874
|
-
boundsHeight = Math.abs( bounds.top - bounds.bottom );
|
|
875
|
-
}
|
|
876
|
-
if ('right' in bounds && 'left' in bounds) {
|
|
877
|
-
boundsWidth = Math.abs( bounds.right - bounds.left );
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
this.calcOffset();
|
|
882
|
-
pointer.x = pointer.x - this._offset.left;
|
|
883
|
-
pointer.y = pointer.y - this._offset.top;
|
|
884
|
-
if (!ignoreZoom) {
|
|
885
|
-
pointer = this.restorePointerVpt(pointer);
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
var retinaScaling = this.getRetinaScaling();
|
|
889
|
-
if (retinaScaling !== 1) {
|
|
890
|
-
pointer.x /= retinaScaling;
|
|
891
|
-
pointer.y /= retinaScaling;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
if (boundsWidth === 0 || boundsHeight === 0) {
|
|
895
|
-
// If bounds are not available (i.e. not visible), do not apply scale.
|
|
896
|
-
cssScale = { width: 1, height: 1 };
|
|
897
|
-
}
|
|
898
|
-
else {
|
|
899
|
-
cssScale = {
|
|
900
|
-
width: upperCanvasEl.width / boundsWidth,
|
|
901
|
-
height: upperCanvasEl.height / boundsHeight
|
|
902
|
-
};
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
return {
|
|
906
|
-
x: pointer.x * cssScale.width,
|
|
907
|
-
y: pointer.y * cssScale.height
|
|
908
|
-
};
|
|
909
|
-
},
|
|
910
|
-
|
|
911
|
-
/**
|
|
912
|
-
* @private
|
|
913
|
-
* @throws {CANVAS_INIT_ERROR} If canvas can not be initialized
|
|
914
|
-
*/
|
|
915
|
-
_createUpperCanvas: function () {
|
|
916
|
-
var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/, ''),
|
|
917
|
-
lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;
|
|
918
|
-
|
|
919
|
-
// there is no need to create a new upperCanvas element if we have already one.
|
|
920
|
-
if (upperCanvasEl) {
|
|
921
|
-
upperCanvasEl.className = '';
|
|
922
|
-
}
|
|
923
|
-
else {
|
|
924
|
-
upperCanvasEl = this._createCanvasElement();
|
|
925
|
-
this.upperCanvasEl = upperCanvasEl;
|
|
926
|
-
}
|
|
927
|
-
fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);
|
|
928
|
-
|
|
929
|
-
this.wrapperEl.appendChild(upperCanvasEl);
|
|
930
|
-
|
|
931
|
-
this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);
|
|
932
|
-
this._applyCanvasStyle(upperCanvasEl);
|
|
933
|
-
this.contextTop = upperCanvasEl.getContext('2d');
|
|
934
|
-
},
|
|
935
|
-
|
|
936
|
-
/**
|
|
937
|
-
* Returns context of top canvas where interactions are drawn
|
|
938
|
-
* @returns {CanvasRenderingContext2D}
|
|
939
|
-
*/
|
|
940
|
-
getTopContext: function () {
|
|
941
|
-
return this.contextTop;
|
|
942
|
-
},
|
|
943
|
-
|
|
944
|
-
/**
|
|
945
|
-
* @private
|
|
946
|
-
*/
|
|
947
|
-
_createCacheCanvas: function () {
|
|
948
|
-
this.cacheCanvasEl = this._createCanvasElement();
|
|
949
|
-
this.cacheCanvasEl.setAttribute('width', this.width);
|
|
950
|
-
this.cacheCanvasEl.setAttribute('height', this.height);
|
|
951
|
-
this.contextCache = this.cacheCanvasEl.getContext('2d');
|
|
952
|
-
},
|
|
953
|
-
|
|
954
|
-
/**
|
|
955
|
-
* @private
|
|
956
|
-
*/
|
|
957
|
-
_initWrapperElement: function () {
|
|
958
|
-
this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {
|
|
959
|
-
'class': this.containerClass
|
|
960
|
-
});
|
|
961
|
-
fabric.util.setStyle(this.wrapperEl, {
|
|
962
|
-
width: this.width + 'px',
|
|
963
|
-
height: this.height + 'px',
|
|
964
|
-
position: 'relative'
|
|
965
|
-
});
|
|
966
|
-
fabric.util.makeElementUnselectable(this.wrapperEl);
|
|
967
|
-
},
|
|
968
|
-
|
|
969
|
-
/**
|
|
970
|
-
* @private
|
|
971
|
-
* @param {HTMLElement} element canvas element to apply styles on
|
|
972
|
-
*/
|
|
973
|
-
_applyCanvasStyle: function (element) {
|
|
974
|
-
var width = this.width || element.width,
|
|
975
|
-
height = this.height || element.height;
|
|
976
|
-
|
|
977
|
-
fabric.util.setStyle(element, {
|
|
978
|
-
position: 'absolute',
|
|
979
|
-
width: width + 'px',
|
|
980
|
-
height: height + 'px',
|
|
981
|
-
left: 0,
|
|
982
|
-
top: 0,
|
|
983
|
-
'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',
|
|
984
|
-
'-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'
|
|
985
|
-
});
|
|
986
|
-
element.width = width;
|
|
987
|
-
element.height = height;
|
|
988
|
-
fabric.util.makeElementUnselectable(element);
|
|
989
|
-
},
|
|
990
|
-
|
|
991
|
-
/**
|
|
992
|
-
* Copy the entire inline style from one element (fromEl) to another (toEl)
|
|
993
|
-
* @private
|
|
994
|
-
* @param {Element} fromEl Element style is copied from
|
|
995
|
-
* @param {Element} toEl Element copied style is applied to
|
|
996
|
-
*/
|
|
997
|
-
_copyCanvasStyle: function (fromEl, toEl) {
|
|
998
|
-
toEl.style.cssText = fromEl.style.cssText;
|
|
999
|
-
},
|
|
1000
|
-
|
|
1001
|
-
/**
|
|
1002
|
-
* Returns context of canvas where object selection is drawn
|
|
1003
|
-
* @return {CanvasRenderingContext2D}
|
|
1004
|
-
*/
|
|
1005
|
-
getSelectionContext: function() {
|
|
1006
|
-
return this.contextTop;
|
|
1007
|
-
},
|
|
1008
|
-
|
|
1009
|
-
/**
|
|
1010
|
-
* Returns <canvas> element on which object selection is drawn
|
|
1011
|
-
* @return {HTMLCanvasElement}
|
|
1012
|
-
*/
|
|
1013
|
-
getSelectionElement: function () {
|
|
1014
|
-
return this.upperCanvasEl;
|
|
1015
|
-
},
|
|
1016
|
-
|
|
1017
|
-
/**
|
|
1018
|
-
* Returns currently active object
|
|
1019
|
-
* @return {fabric.Object} active object
|
|
1020
|
-
*/
|
|
1021
|
-
getActiveObject: function () {
|
|
1022
|
-
return this._activeObject;
|
|
1023
|
-
},
|
|
1024
|
-
|
|
1025
|
-
/**
|
|
1026
|
-
* Returns an array with the current selected objects
|
|
1027
|
-
* @return {fabric.Object} active object
|
|
1028
|
-
*/
|
|
1029
|
-
getActiveObjects: function () {
|
|
1030
|
-
var active = this._activeObject;
|
|
1031
|
-
if (active) {
|
|
1032
|
-
if (active.type === 'activeSelection' && active._objects) {
|
|
1033
|
-
return active._objects.slice(0);
|
|
1034
|
-
}
|
|
1035
|
-
else {
|
|
1036
|
-
return [active];
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
return [];
|
|
1040
|
-
},
|
|
1041
|
-
|
|
1042
|
-
/**
|
|
1043
|
-
* @private
|
|
1044
|
-
* @param {fabric.Object} obj Object that was removed
|
|
1045
|
-
*/
|
|
1046
|
-
_onObjectRemoved: function(obj) {
|
|
1047
|
-
// removing active object should fire "selection:cleared" events
|
|
1048
|
-
if (obj === this._activeObject) {
|
|
1049
|
-
this.fire('before:selection:cleared', { target: obj });
|
|
1050
|
-
this._discardActiveObject();
|
|
1051
|
-
this.fire('selection:cleared', { target: obj });
|
|
1052
|
-
obj.fire('deselected');
|
|
1053
|
-
}
|
|
1054
|
-
if (obj === this._hoveredTarget){
|
|
1055
|
-
this._hoveredTarget = null;
|
|
1056
|
-
this._hoveredTargets = [];
|
|
1057
|
-
}
|
|
1058
|
-
this.callSuper('_onObjectRemoved', obj);
|
|
1059
|
-
},
|
|
1060
|
-
|
|
1061
|
-
/**
|
|
1062
|
-
* @private
|
|
1063
|
-
* Compares the old activeObject with the current one and fires correct events
|
|
1064
|
-
* @param {fabric.Object} obj old activeObject
|
|
1065
|
-
*/
|
|
1066
|
-
_fireSelectionEvents: function(oldObjects, e) {
|
|
1067
|
-
var somethingChanged = false, objects = this.getActiveObjects(),
|
|
1068
|
-
added = [], removed = [];
|
|
1069
|
-
oldObjects.forEach(function(oldObject) {
|
|
1070
|
-
if (objects.indexOf(oldObject) === -1) {
|
|
1071
|
-
somethingChanged = true;
|
|
1072
|
-
oldObject.fire('deselected', {
|
|
1073
|
-
e: e,
|
|
1074
|
-
target: oldObject
|
|
1075
|
-
});
|
|
1076
|
-
removed.push(oldObject);
|
|
1077
|
-
}
|
|
1078
|
-
});
|
|
1079
|
-
objects.forEach(function(object) {
|
|
1080
|
-
if (oldObjects.indexOf(object) === -1) {
|
|
1081
|
-
somethingChanged = true;
|
|
1082
|
-
object.fire('selected', {
|
|
1083
|
-
e: e,
|
|
1084
|
-
target: object
|
|
1085
|
-
});
|
|
1086
|
-
added.push(object);
|
|
1087
|
-
}
|
|
1088
|
-
});
|
|
1089
|
-
if (oldObjects.length > 0 && objects.length > 0) {
|
|
1090
|
-
somethingChanged && this.fire('selection:updated', {
|
|
1091
|
-
e: e,
|
|
1092
|
-
selected: added,
|
|
1093
|
-
deselected: removed,
|
|
1094
|
-
});
|
|
1095
|
-
}
|
|
1096
|
-
else if (objects.length > 0) {
|
|
1097
|
-
this.fire('selection:created', {
|
|
1098
|
-
e: e,
|
|
1099
|
-
selected: added,
|
|
1100
|
-
});
|
|
1101
|
-
}
|
|
1102
|
-
else if (oldObjects.length > 0) {
|
|
1103
|
-
this.fire('selection:cleared', {
|
|
1104
|
-
e: e,
|
|
1105
|
-
deselected: removed,
|
|
1106
|
-
});
|
|
1107
|
-
}
|
|
1108
|
-
},
|
|
1109
|
-
|
|
1110
|
-
/**
|
|
1111
|
-
* Sets given object as the only active object on canvas
|
|
1112
|
-
* @param {fabric.Object} object Object to set as an active one
|
|
1113
|
-
* @param {Event} [e] Event (passed along when firing "object:selected")
|
|
1114
|
-
* @return {fabric.Canvas} thisArg
|
|
1115
|
-
* @chainable
|
|
1116
|
-
*/
|
|
1117
|
-
setActiveObject: function (object, e) {
|
|
1118
|
-
var currentActives = this.getActiveObjects();
|
|
1119
|
-
this._setActiveObject(object, e);
|
|
1120
|
-
this._fireSelectionEvents(currentActives, e);
|
|
1121
|
-
return this;
|
|
1122
|
-
},
|
|
1123
|
-
|
|
1124
|
-
/**
|
|
1125
|
-
* This is a private method for now.
|
|
1126
|
-
* This is supposed to be equivalent to setActiveObject but without firing
|
|
1127
|
-
* any event. There is commitment to have this stay this way.
|
|
1128
|
-
* This is the functional part of setActiveObject.
|
|
1129
|
-
* @private
|
|
1130
|
-
* @param {Object} object to set as active
|
|
1131
|
-
* @param {Event} [e] Event (passed along when firing "object:selected")
|
|
1132
|
-
* @return {Boolean} true if the selection happened
|
|
1133
|
-
*/
|
|
1134
|
-
_setActiveObject: function(object, e) {
|
|
1135
|
-
if (this._activeObject === object) {
|
|
1136
|
-
return false;
|
|
1137
|
-
}
|
|
1138
|
-
if (!this._discardActiveObject(e, object)) {
|
|
1139
|
-
return false;
|
|
1140
|
-
}
|
|
1141
|
-
if (object.onSelect({ e: e })) {
|
|
1142
|
-
return false;
|
|
1143
|
-
}
|
|
1144
|
-
this._activeObject = object;
|
|
1145
|
-
return true;
|
|
1146
|
-
},
|
|
1147
|
-
|
|
1148
|
-
/**
|
|
1149
|
-
* This is a private method for now.
|
|
1150
|
-
* This is supposed to be equivalent to discardActiveObject but without firing
|
|
1151
|
-
* any events. There is commitment to have this stay this way.
|
|
1152
|
-
* This is the functional part of discardActiveObject.
|
|
1153
|
-
* @param {Event} [e] Event (passed along when firing "object:deselected")
|
|
1154
|
-
* @param {Object} object to set as active
|
|
1155
|
-
* @return {Boolean} true if the selection happened
|
|
1156
|
-
* @private
|
|
1157
|
-
*/
|
|
1158
|
-
_discardActiveObject: function(e, object) {
|
|
1159
|
-
var obj = this._activeObject;
|
|
1160
|
-
if (obj) {
|
|
1161
|
-
// onDeselect return TRUE to cancel selection;
|
|
1162
|
-
if (obj.onDeselect({ e: e, object: object })) {
|
|
1163
|
-
return false;
|
|
1164
|
-
}
|
|
1165
|
-
this._activeObject = null;
|
|
1166
|
-
}
|
|
1167
|
-
return true;
|
|
1168
|
-
},
|
|
1169
|
-
|
|
1170
|
-
/**
|
|
1171
|
-
* Discards currently active object and fire events. If the function is called by fabric
|
|
1172
|
-
* as a consequence of a mouse event, the event is passed as a parameter and
|
|
1173
|
-
* sent to the fire function for the custom events. When used as a method the
|
|
1174
|
-
* e param does not have any application.
|
|
1175
|
-
* @param {event} e
|
|
1176
|
-
* @return {fabric.Canvas} thisArg
|
|
1177
|
-
* @chainable
|
|
1178
|
-
*/
|
|
1179
|
-
discardActiveObject: function (e) {
|
|
1180
|
-
var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();
|
|
1181
|
-
if (currentActives.length) {
|
|
1182
|
-
this.fire('before:selection:cleared', { target: activeObject, e: e });
|
|
1183
|
-
}
|
|
1184
|
-
this._discardActiveObject(e);
|
|
1185
|
-
this._fireSelectionEvents(currentActives, e);
|
|
1186
|
-
return this;
|
|
1187
|
-
},
|
|
1188
|
-
|
|
1189
|
-
/**
|
|
1190
|
-
* Clears a canvas element and removes all event listeners
|
|
1191
|
-
* @return {fabric.Canvas} thisArg
|
|
1192
|
-
* @chainable
|
|
1193
|
-
*/
|
|
1194
|
-
dispose: function () {
|
|
1195
|
-
var wrapper = this.wrapperEl;
|
|
1196
|
-
this.removeListeners();
|
|
1197
|
-
wrapper.removeChild(this.upperCanvasEl);
|
|
1198
|
-
wrapper.removeChild(this.lowerCanvasEl);
|
|
1199
|
-
this.contextCache = null;
|
|
1200
|
-
this.contextTop = null;
|
|
1201
|
-
['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {
|
|
1202
|
-
fabric.util.cleanUpJsdomNode(this[element]);
|
|
1203
|
-
this[element] = undefined;
|
|
1204
|
-
}).bind(this));
|
|
1205
|
-
if (wrapper.parentNode) {
|
|
1206
|
-
wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);
|
|
1207
|
-
}
|
|
1208
|
-
delete this.wrapperEl;
|
|
1209
|
-
fabric.StaticCanvas.prototype.dispose.call(this);
|
|
1210
|
-
return this;
|
|
1211
|
-
},
|
|
1212
|
-
|
|
1213
|
-
/**
|
|
1214
|
-
* Clears all contexts (background, main, top) of an instance
|
|
1215
|
-
* @return {fabric.Canvas} thisArg
|
|
1216
|
-
* @chainable
|
|
1217
|
-
*/
|
|
1218
|
-
clear: function () {
|
|
1219
|
-
// this.discardActiveGroup();
|
|
1220
|
-
this.discardActiveObject();
|
|
1221
|
-
this.clearContext(this.contextTop);
|
|
1222
|
-
return this.callSuper('clear');
|
|
1223
|
-
},
|
|
1224
|
-
|
|
1225
|
-
/**
|
|
1226
|
-
* Draws objects' controls (borders/controls)
|
|
1227
|
-
* @param {CanvasRenderingContext2D} ctx Context to render controls on
|
|
1228
|
-
*/
|
|
1229
|
-
drawControls: function(ctx) {
|
|
1230
|
-
var activeObject = this._activeObject;
|
|
1231
|
-
|
|
1232
|
-
if (activeObject) {
|
|
1233
|
-
activeObject._renderControls(ctx);
|
|
1234
|
-
}
|
|
1235
|
-
},
|
|
1236
|
-
|
|
1237
|
-
/**
|
|
1238
|
-
* @private
|
|
1239
|
-
*/
|
|
1240
|
-
_toObject: function(instance, methodName, propertiesToInclude) {
|
|
1241
|
-
//If the object is part of the current selection group, it should
|
|
1242
|
-
//be transformed appropriately
|
|
1243
|
-
//i.e. it should be serialised as it would appear if the selection group
|
|
1244
|
-
//were to be destroyed.
|
|
1245
|
-
var originalProperties = this._realizeGroupTransformOnObject(instance),
|
|
1246
|
-
object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);
|
|
1247
|
-
//Undo the damage we did by changing all of its properties
|
|
1248
|
-
this._unwindGroupTransformOnObject(instance, originalProperties);
|
|
1249
|
-
return object;
|
|
1250
|
-
},
|
|
1251
|
-
|
|
1252
|
-
/**
|
|
1253
|
-
* Realises an object's group transformation on it
|
|
1254
|
-
* @private
|
|
1255
|
-
* @param {fabric.Object} [instance] the object to transform (gets mutated)
|
|
1256
|
-
* @returns the original values of instance which were changed
|
|
1257
|
-
*/
|
|
1258
|
-
_realizeGroupTransformOnObject: function(instance) {
|
|
1259
|
-
if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {
|
|
1260
|
-
var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];
|
|
1261
|
-
//Copy all the positionally relevant properties across now
|
|
1262
|
-
var originalValues = {};
|
|
1263
|
-
layoutProps.forEach(function(prop) {
|
|
1264
|
-
originalValues[prop] = instance[prop];
|
|
1265
|
-
});
|
|
1266
|
-
fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());
|
|
1267
|
-
return originalValues;
|
|
1268
|
-
}
|
|
1269
|
-
else {
|
|
1270
|
-
return null;
|
|
1271
|
-
}
|
|
1272
|
-
},
|
|
1273
|
-
|
|
1274
|
-
/**
|
|
1275
|
-
* Restores the changed properties of instance
|
|
1276
|
-
* @private
|
|
1277
|
-
* @param {fabric.Object} [instance] the object to un-transform (gets mutated)
|
|
1278
|
-
* @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject
|
|
1279
|
-
*/
|
|
1280
|
-
_unwindGroupTransformOnObject: function(instance, originalValues) {
|
|
1281
|
-
if (originalValues) {
|
|
1282
|
-
instance.set(originalValues);
|
|
1283
|
-
}
|
|
1284
|
-
},
|
|
1285
|
-
|
|
1286
|
-
/**
|
|
1287
|
-
* @private
|
|
1288
|
-
*/
|
|
1289
|
-
_setSVGObject: function(markup, instance, reviver) {
|
|
1290
|
-
//If the object is in a selection group, simulate what would happen to that
|
|
1291
|
-
//object when the group is deselected
|
|
1292
|
-
var originalProperties = this._realizeGroupTransformOnObject(instance);
|
|
1293
|
-
this.callSuper('_setSVGObject', markup, instance, reviver);
|
|
1294
|
-
this._unwindGroupTransformOnObject(instance, originalProperties);
|
|
1295
|
-
},
|
|
1296
|
-
|
|
1297
|
-
setViewportTransform: function (vpt) {
|
|
1298
|
-
if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {
|
|
1299
|
-
this._activeObject.clearContextTop();
|
|
1300
|
-
}
|
|
1301
|
-
fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);
|
|
1302
|
-
}
|
|
1303
|
-
});
|
|
1304
|
-
|
|
1305
|
-
// copying static properties manually to work around Opera's bug,
|
|
1306
|
-
// where "prototype" property is enumerable and overrides existing prototype
|
|
1307
|
-
for (var prop in fabric.StaticCanvas) {
|
|
1308
|
-
if (prop !== 'prototype') {
|
|
1309
|
-
fabric.Canvas[prop] = fabric.StaticCanvas[prop];
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
})();
|