fabric 5.3.0 → 6.0.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.babelrcAlt +19 -0
- package/.browserslistrc +5 -0
- package/.eslintrc.js +43 -0
- package/.eslintrc.json +38 -46
- package/.eslintrc_tests +12 -0
- package/.gitattributes +2 -0
- package/.prettierignore +16 -0
- package/.prettierrc +4 -0
- package/CHANGELOG.md +491 -189
- package/CONTRIBUTING.md +226 -58
- package/README.md +188 -239
- package/bower.json +1 -3
- package/dist/fabric.d.ts +1021 -0
- package/dist/index.cjs +28027 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.min.js +1 -0
- package/dist/index.mjs +27964 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.node.cjs +28092 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.d.ts +15 -0
- package/dist/index.node.mjs +28035 -0
- package/dist/index.node.mjs.map +1 -0
- package/dist/src/Collection.d.ts +126 -0
- package/dist/src/CommonMethods.d.ts +32 -0
- package/dist/src/EventTypeDefs.d.ts +226 -0
- package/dist/src/Intersection.d.ts +100 -0
- package/dist/src/Observable.d.ts +54 -0
- package/dist/src/Pattern.d.ts +104 -0
- package/dist/src/Point.d.ts +232 -0
- package/dist/src/Shadow.d.ts +87 -0
- package/dist/src/brushes/BaseBrush.d.ts +105 -0
- package/dist/src/brushes/CircleBrush.d.ts +49 -0
- package/dist/src/brushes/PatternBrush.d.ts +23 -0
- package/dist/src/brushes/PencilBrush.d.ts +92 -0
- package/dist/src/brushes/SprayBrush.d.ts +79 -0
- package/dist/src/cache.d.ts +46 -0
- package/dist/src/canvas/Canvas.d.ts +567 -0
- package/dist/src/canvas/SelectableCanvas.d.ts +723 -0
- package/dist/src/canvas/StaticCanvas.d.ts +751 -0
- package/dist/src/canvas/TextEditingManager.d.ts +17 -0
- package/dist/src/canvas/canvas_gestures.mixin.d.ts +2 -0
- package/dist/src/color/Color.d.ts +174 -0
- package/dist/src/color/color_map.d.ts +155 -0
- package/dist/src/color/constants.d.ts +22 -0
- package/dist/src/color/util.d.ts +12 -0
- package/dist/src/config.d.ts +115 -0
- package/dist/src/constants.d.ts +14 -0
- package/dist/src/controls/Control.d.ts +228 -0
- package/dist/src/controls/changeWidth.d.ts +13 -0
- package/dist/src/controls/controls.render.d.ts +29 -0
- package/dist/src/controls/default_controls.d.ts +50 -0
- package/dist/src/controls/drag.d.ts +12 -0
- package/dist/src/controls/polyControl.d.ts +5 -0
- package/dist/src/controls/rotate.d.ts +12 -0
- package/dist/src/controls/scale.d.ts +47 -0
- package/dist/src/controls/scaleSkew.d.ts +39 -0
- package/dist/src/controls/skew.d.ts +33 -0
- package/dist/src/controls/util.d.ts +41 -0
- package/dist/src/controls/wrapWithFireEvent.d.ts +8 -0
- package/dist/src/controls/wrapWithFixedAnchor.d.ts +9 -0
- package/dist/src/env/browser.d.ts +3 -0
- package/dist/src/env/index.d.ts +7 -0
- package/dist/src/env/node.d.ts +3 -0
- package/dist/src/env/types.d.ts +15 -0
- package/dist/src/filters/BaseFilter.d.ts +156 -0
- package/dist/src/filters/BlendColor.d.ts +80 -0
- package/dist/src/filters/BlendImage.d.ts +90 -0
- package/dist/src/filters/Blur.d.ts +50 -0
- package/dist/src/filters/Boilerplate.d.ts +46 -0
- package/dist/src/filters/Brightness.d.ts +46 -0
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +27 -0
- package/dist/src/filters/ColorMatrix.d.ts +62 -0
- package/dist/src/filters/ColorMatrixFilters.d.ts +1169 -0
- package/dist/src/filters/Composed.d.ts +47 -0
- package/dist/src/filters/Contrast.d.ts +44 -0
- package/dist/src/filters/Convolute.d.ts +82 -0
- package/dist/src/filters/FilterBackend.d.ts +14 -0
- package/dist/src/filters/Gamma.d.ts +53 -0
- package/dist/src/filters/Grayscale.d.ts +45 -0
- package/dist/src/filters/HueRotation.d.ts +24 -0
- package/dist/src/filters/Invert.d.ts +54 -0
- package/dist/src/filters/Noise.d.ts +53 -0
- package/dist/src/filters/Pixelate.d.ts +43 -0
- package/dist/src/filters/RemoveColor.d.ts +62 -0
- package/dist/src/filters/Resize.d.ts +134 -0
- package/dist/src/filters/Saturation.d.ts +47 -0
- package/dist/src/filters/Vibrance.d.ts +47 -0
- package/dist/src/filters/WebGLFilterBackend.d.ts +126 -0
- package/dist/src/filters/WebGLProbe.d.ts +28 -0
- package/dist/src/filters/typedefs.d.ts +49 -0
- package/dist/src/gradient/Gradient.d.ts +149 -0
- package/dist/src/gradient/constants.d.ts +15 -0
- package/dist/src/gradient/parser/index.d.ts +4 -0
- package/dist/src/gradient/parser/misc.d.ts +4 -0
- package/dist/src/gradient/parser/parseColorStops.d.ts +6 -0
- package/dist/src/gradient/parser/parseCoords.d.ts +17 -0
- package/dist/src/gradient/typedefs.d.ts +93 -0
- package/dist/src/mixins/eraser_brush.mixin.d.ts +2 -0
- package/dist/src/mixins/stateful.mixin.d.ts +18 -0
- package/dist/src/parkinglot/canvas_animation.mixin.d.ts +2 -0
- package/dist/src/parkinglot/straighten.d.ts +2 -0
- package/dist/src/parser/applyViewboxTransform.d.ts +5 -0
- package/dist/src/parser/attributes.d.ts +6 -0
- package/dist/src/parser/constants.d.ts +54 -0
- package/dist/src/parser/doesSomeParentMatch.d.ts +2 -0
- package/dist/src/parser/elementById.d.ts +6 -0
- package/dist/src/parser/elementMatchesRule.d.ts +5 -0
- package/dist/src/parser/elements_parser.d.ts +3 -0
- package/dist/src/parser/getCSSRules.d.ts +7 -0
- package/dist/src/parser/getGlobalStylesForElement.d.ts +5 -0
- package/dist/src/parser/getGradientDefs.d.ts +7 -0
- package/dist/src/parser/getMultipleNodes.d.ts +2 -0
- package/dist/src/parser/getSvgRegex.d.ts +2 -0
- package/dist/src/parser/hasAncestorWithNodeName.d.ts +2 -0
- package/dist/src/parser/loadSVGFromString.d.ts +12 -0
- package/dist/src/parser/loadSVGFromURL.d.ts +13 -0
- package/dist/src/parser/normalizeAttr.d.ts +2 -0
- package/dist/src/parser/normalizeValue.d.ts +2 -0
- package/dist/src/parser/parseAttributes.d.ts +9 -0
- package/dist/src/parser/parseElements.d.ts +11 -0
- package/dist/src/parser/parseFontDeclaration.d.ts +10 -0
- package/dist/src/parser/parsePointsAttribute.d.ts +12 -0
- package/dist/src/parser/parseSVGDocument.d.ts +15 -0
- package/dist/src/parser/parseStyleAttribute.d.ts +9 -0
- package/dist/src/parser/parseStyleObject.d.ts +2 -0
- package/dist/src/parser/parseStyleString.d.ts +2 -0
- package/dist/src/parser/parseTransformAttribute.d.ts +10 -0
- package/dist/src/parser/parseUseDirectives.d.ts +2 -0
- package/dist/src/parser/percent.d.ts +9 -0
- package/dist/src/parser/recursivelyParseGradientsXlink.d.ts +2 -0
- package/dist/src/parser/rotateMatrix.d.ts +2 -0
- package/dist/src/parser/scaleMatrix.d.ts +2 -0
- package/dist/src/parser/selectorMatches.d.ts +2 -0
- package/dist/src/parser/setStrokeFillOpacity.d.ts +6 -0
- package/dist/src/parser/skewMatrix.d.ts +2 -0
- package/dist/src/parser/translateMatrix.d.ts +2 -0
- package/dist/src/shapes/ActiveSelection.d.ts +66 -0
- package/dist/src/shapes/Circle.d.ts +80 -0
- package/dist/src/shapes/Ellipse.d.ts +74 -0
- package/dist/src/shapes/Group.d.ts +381 -0
- package/dist/src/shapes/IText/DraggableTextDelegate.d.ts +78 -0
- package/dist/src/shapes/IText/IText.d.ts +322 -0
- package/dist/src/shapes/IText/ITextBehavior.d.ts +285 -0
- package/dist/src/shapes/IText/ITextClickBehavior.d.ts +81 -0
- package/dist/src/shapes/IText/ITextKeyBehavior.d.ts +193 -0
- package/dist/src/shapes/IText/constants.d.ts +13 -0
- package/dist/src/shapes/Image.d.ts +283 -0
- package/dist/src/shapes/Line.d.ts +117 -0
- package/dist/src/shapes/Object/AnimatableObject.d.ts +33 -0
- package/dist/src/shapes/Object/FabricObject.d.ts +9 -0
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts +74 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts +282 -0
- package/dist/src/shapes/Object/Object.d.ts +906 -0
- package/dist/src/shapes/Object/ObjectGeometry.d.ts +343 -0
- package/dist/src/shapes/Object/ObjectOrigin.d.ts +178 -0
- package/dist/src/shapes/Object/StackedObject.d.ts +62 -0
- package/dist/src/shapes/Object/defaultValues.d.ts +77 -0
- package/dist/src/shapes/Path.d.ts +123 -0
- package/dist/src/shapes/Polygon.d.ts +7 -0
- package/dist/src/shapes/Polyline.d.ts +130 -0
- package/dist/src/shapes/Rect.d.ts +62 -0
- package/dist/src/shapes/Text/StyledText.d.ts +118 -0
- package/dist/src/shapes/Text/Text.d.ts +656 -0
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +32 -0
- package/dist/src/shapes/Textbox.d.ts +170 -0
- package/dist/src/shapes/Triangle.d.ts +17 -0
- package/dist/src/typedefs.d.ts +93 -0
- package/dist/src/util/animation/AnimationBase.d.ts +54 -0
- package/dist/src/util/animation/AnimationFrameProvider.d.ts +8 -0
- package/dist/src/util/animation/AnimationRegistry.d.ts +29 -0
- package/dist/src/util/animation/ArrayAnimation.d.ts +10 -0
- package/dist/src/util/animation/ColorAnimation.d.ts +11 -0
- package/dist/src/util/animation/ValueAnimation.d.ts +10 -0
- package/dist/src/util/animation/animate.d.ts +37 -0
- package/dist/src/util/animation/easing.d.ts +130 -0
- package/dist/src/util/animation/types.d.ts +87 -0
- package/dist/src/util/applyMixins.d.ts +8 -0
- package/dist/src/util/class_registry.d.ts +14 -0
- package/dist/src/util/dom_event.d.ts +5 -0
- package/dist/src/util/dom_misc.d.ts +40 -0
- package/dist/src/util/dom_request.d.ts +14 -0
- package/dist/src/util/dom_style.d.ts +7 -0
- package/dist/src/util/fireEvent.d.ts +3 -0
- package/dist/src/util/internals/cloneDeep.d.ts +2 -0
- package/dist/src/util/internals/getRandomInt.d.ts +8 -0
- package/dist/src/util/internals/ifNaN.d.ts +8 -0
- package/dist/src/util/internals/index.d.ts +4 -0
- package/dist/src/util/internals/removeFromArray.d.ts +9 -0
- package/dist/src/util/internals/uid.d.ts +2 -0
- package/dist/src/util/lang_class.d.ts +12 -0
- package/dist/src/util/lang_string.d.ts +22 -0
- package/dist/src/util/misc/boundingBoxFromPoints.d.ts +9 -0
- package/dist/src/util/misc/capValue.d.ts +2 -0
- package/dist/src/util/misc/cos.d.ts +10 -0
- package/dist/src/util/misc/dom.d.ts +28 -0
- package/dist/src/util/misc/findScaleTo.d.ts +29 -0
- package/dist/src/util/misc/groupSVGElements.d.ts +9 -0
- package/dist/src/util/misc/isTransparent.d.ts +11 -0
- package/dist/src/util/misc/matrix.d.ts +92 -0
- package/dist/src/util/misc/mergeClipPaths.d.ts +23 -0
- package/dist/src/util/misc/objectEnlive.d.ts +56 -0
- package/dist/src/util/misc/objectTransforms.d.ts +68 -0
- package/dist/src/util/misc/pick.d.ts +8 -0
- package/dist/src/util/misc/planeChange.d.ts +84 -0
- package/dist/src/util/misc/projectStroke/StrokeLineCapProjections.d.ts +51 -0
- package/dist/src/util/misc/projectStroke/StrokeLineJoinProjections.d.ts +81 -0
- package/dist/src/util/misc/projectStroke/StrokeProjectionsBase.d.ts +25 -0
- package/dist/src/util/misc/projectStroke/index.d.ts +11 -0
- package/dist/src/util/misc/projectStroke/types.d.ts +23 -0
- package/dist/src/util/misc/radiansDegreesConversion.d.ts +14 -0
- package/dist/src/util/misc/resolveOrigin.d.ts +9 -0
- package/dist/src/util/misc/rotatePoint.d.ts +12 -0
- package/dist/src/util/misc/sin.d.ts +10 -0
- package/dist/src/util/misc/svgParsing.d.ts +53 -0
- package/dist/src/util/misc/textStyles.d.ts +32 -0
- package/dist/src/util/misc/toFixed.d.ts +8 -0
- package/dist/src/util/misc/vectors.d.ts +57 -0
- package/dist/src/util/path.d.ts +108 -0
- package/dist/src/util/transform_matrix_removal.d.ts +14 -0
- package/dist/src/util/types.d.ts +19 -0
- package/fabric.ts +427 -0
- package/index.node.ts +43 -0
- package/index.ts +1 -0
- package/package.json +90 -39
- package/publish.js +0 -26
- package/rollup.config.mjs +79 -0
- package/rollup.test.config.js +24 -0
- package/scripts/build.mjs +50 -0
- package/scripts/buildLock.mjs +115 -0
- package/scripts/buildReporter.mjs +15 -0
- package/scripts/buildStats.mjs +139 -0
- package/scripts/dirname.mjs +14 -0
- package/scripts/index.mjs +679 -0
- package/scripts/transform_files.mjs +504 -0
- package/src/Collection.ts +311 -0
- package/src/CommonMethods.ts +63 -0
- package/src/EventTypeDefs.ts +294 -0
- package/src/Intersection.ts +273 -0
- package/src/Observable.ts +175 -0
- package/src/Pattern.ts +211 -0
- package/src/Point.ts +388 -0
- package/src/Shadow.ts +215 -0
- package/src/brushes/{base_brush.class.js → BaseBrush.ts} +65 -42
- package/src/brushes/CircleBrush.ts +145 -0
- package/src/brushes/PatternBrush.ts +70 -0
- package/src/brushes/PencilBrush.ts +300 -0
- package/src/brushes/SprayBrush.ts +219 -0
- package/src/cache.ts +89 -0
- package/src/canvas/Canvas.ts +1672 -0
- package/src/canvas/SelectableCanvas.ts +1636 -0
- package/src/canvas/StaticCanvas.ts +1709 -0
- package/src/canvas/TextEditingManager.ts +48 -0
- package/src/canvas/canvas_gestures.mixin.ts +207 -0
- package/src/color/Color.ts +404 -0
- package/src/color/color_map.ts +154 -0
- package/src/color/constants.ts +26 -0
- package/src/color/util.ts +32 -0
- package/src/config.ts +159 -0
- package/src/constants.ts +19 -0
- package/src/controls/Control.ts +377 -0
- package/src/controls/changeWidth.ts +52 -0
- package/src/controls/controls.render.ts +138 -0
- package/src/controls/default_controls.ts +132 -0
- package/src/controls/drag.ts +31 -0
- package/src/controls/polyControl.ts +135 -0
- package/src/controls/rotate.ts +87 -0
- package/src/controls/scale.ts +277 -0
- package/src/controls/scaleSkew.ts +92 -0
- package/src/controls/skew.ts +242 -0
- package/src/controls/util.ts +154 -0
- package/src/controls/wrapWithFireEvent.ts +25 -0
- package/src/controls/wrapWithFixedAnchor.ts +20 -0
- package/src/env/browser.ts +28 -0
- package/src/env/index.ts +19 -0
- package/src/env/node.ts +52 -0
- package/src/env/types.ts +15 -0
- package/src/filters/{base_filter.class.js → BaseFilter.ts} +201 -149
- package/src/filters/BlendColor.ts +258 -0
- package/src/filters/BlendImage.ts +254 -0
- package/src/filters/Blur.ts +202 -0
- package/src/filters/Boilerplate.ts +91 -0
- package/src/filters/Brightness.ts +93 -0
- package/src/filters/Canvas2dFilterBackend.ts +65 -0
- package/src/filters/ColorMatrix.ts +156 -0
- package/src/filters/ColorMatrixFilters.ts +106 -0
- package/src/filters/Composed.ts +85 -0
- package/src/filters/Contrast.ts +94 -0
- package/src/filters/Convolute.ts +341 -0
- package/src/filters/FilterBackend.ts +32 -0
- package/src/filters/Gamma.ts +127 -0
- package/src/filters/Grayscale.ts +137 -0
- package/src/filters/HueRotation.ts +66 -0
- package/src/filters/Invert.ts +117 -0
- package/src/filters/Noise.ts +109 -0
- package/src/filters/Pixelate.ts +114 -0
- package/src/filters/RemoveColor.ts +148 -0
- package/src/filters/Resize.ts +540 -0
- package/src/filters/Saturation.ts +100 -0
- package/src/filters/Vibrance.ts +103 -0
- package/src/filters/WebGLFilterBackend.ts +430 -0
- package/src/filters/WebGLProbe.ts +62 -0
- package/src/filters/typedefs.ts +65 -0
- package/src/gradient/Gradient.ts +401 -0
- package/src/gradient/constants.ts +12 -0
- package/src/gradient/parser/index.ts +3 -0
- package/src/gradient/parser/misc.ts +13 -0
- package/src/gradient/parser/parseColorStops.ts +55 -0
- package/src/gradient/parser/parseCoords.ts +73 -0
- package/src/gradient/typedefs.ts +104 -0
- package/src/mixins/{eraser_brush.mixin.js → eraser_brush.mixin.ts} +350 -239
- package/src/mixins/stateful.mixin.ts +104 -0
- package/src/parkinglot/canvas_animation.mixin.ts +121 -0
- package/src/parkinglot/straighten.ts +58 -0
- package/src/parser/applyViewboxTransform.ts +162 -0
- package/src/parser/attributes.ts +25 -0
- package/src/parser/constants.ts +118 -0
- package/src/parser/doesSomeParentMatch.ts +19 -0
- package/src/parser/elementById.ts +23 -0
- package/src/parser/elementMatchesRule.ts +19 -0
- package/src/parser/elements_parser.ts +191 -0
- package/src/parser/getCSSRules.ts +62 -0
- package/src/parser/getGlobalStylesForElement.ts +19 -0
- package/src/parser/getGradientDefs.ts +32 -0
- package/src/parser/getMultipleNodes.ts +15 -0
- package/src/parser/getSvgRegex.ts +5 -0
- package/src/parser/hasAncestorWithNodeName.ts +14 -0
- package/src/parser/loadSVGFromString.ts +26 -0
- package/src/parser/loadSVGFromURL.ts +40 -0
- package/src/parser/normalizeAttr.ts +10 -0
- package/src/parser/normalizeValue.ts +63 -0
- package/src/parser/parseAttributes.ts +90 -0
- package/src/parser/parseElements.ts +28 -0
- package/src/parser/parseFontDeclaration.ts +44 -0
- package/src/parser/parsePointsAttribute.ts +36 -0
- package/src/parser/parseSVGDocument.ts +106 -0
- package/src/parser/parseStyleAttribute.ts +27 -0
- package/src/parser/parseStyleObject.ts +15 -0
- package/src/parser/parseStyleString.ts +16 -0
- package/src/parser/parseTransformAttribute.ts +155 -0
- package/src/parser/parseUseDirectives.ts +79 -0
- package/src/parser/percent.ts +27 -0
- package/src/parser/recursivelyParseGradientsXlink.ts +42 -0
- package/src/parser/rotateMatrix.ts +21 -0
- package/src/parser/scaleMatrix.ts +9 -0
- package/src/parser/selectorMatches.ts +25 -0
- package/src/parser/setStrokeFillOpacity.ts +40 -0
- package/src/parser/skewMatrix.ts +6 -0
- package/src/parser/translateMatrix.ts +8 -0
- package/src/shapes/ActiveSelection.ts +157 -0
- package/src/shapes/Circle.ts +205 -0
- package/src/shapes/Ellipse.ts +154 -0
- package/src/shapes/Group.ts +1053 -0
- package/src/shapes/IText/DraggableTextDelegate.ts +394 -0
- package/src/shapes/IText/IText.ts +666 -0
- package/src/shapes/IText/ITextBehavior.ts +1055 -0
- package/src/shapes/IText/ITextClickBehavior.ts +321 -0
- package/src/shapes/IText/ITextKeyBehavior.ts +683 -0
- package/src/shapes/IText/constants.ts +47 -0
- package/src/shapes/Image.ts +789 -0
- package/src/shapes/Line.ts +329 -0
- package/src/shapes/Object/AnimatableObject.ts +106 -0
- package/src/shapes/Object/FabricObject.ts +19 -0
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +277 -0
- package/src/shapes/Object/InteractiveObject.ts +645 -0
- package/src/shapes/Object/Object.ts +1896 -0
- package/src/shapes/Object/ObjectGeometry.ts +830 -0
- package/src/shapes/Object/ObjectOrigin.ts +354 -0
- package/src/shapes/Object/StackedObject.ts +191 -0
- package/src/shapes/Object/defaultValues.ts +112 -0
- package/src/shapes/Path.ts +395 -0
- package/src/shapes/Polygon.ts +19 -0
- package/src/shapes/Polyline.ts +333 -0
- package/src/shapes/Rect.ts +199 -0
- package/src/shapes/Text/StyledText.ts +319 -0
- package/src/shapes/Text/Text.ts +1948 -0
- package/src/shapes/Text/TextSVGExportMixin.ts +288 -0
- package/src/shapes/Textbox.ts +471 -0
- package/src/shapes/Triangle.ts +45 -0
- package/src/typedefs.ts +119 -0
- package/src/util/animation/AnimationBase.ts +166 -0
- package/src/util/animation/AnimationFrameProvider.ts +28 -0
- package/src/util/animation/AnimationRegistry.ts +58 -0
- package/src/util/animation/ArrayAnimation.ts +27 -0
- package/src/util/animation/ColorAnimation.ts +74 -0
- package/src/util/animation/ValueAnimation.ts +29 -0
- package/src/util/animation/animate.ts +74 -0
- package/src/util/animation/easing.ts +327 -0
- package/src/util/animation/types.ts +136 -0
- package/src/util/applyMixins.ts +22 -0
- package/src/util/class_registry.ts +54 -0
- package/src/util/dom_event.ts +28 -0
- package/src/util/dom_misc.ts +138 -0
- package/src/util/dom_request.ts +64 -0
- package/src/util/dom_style.ts +20 -0
- package/src/util/fireEvent.ts +15 -0
- package/src/util/internals/cloneDeep.ts +2 -0
- package/src/util/internals/getRandomInt.ts +8 -0
- package/src/util/internals/ifNaN.ts +9 -0
- package/src/util/internals/index.ts +3 -0
- package/src/util/internals/removeFromArray.ts +14 -0
- package/src/util/internals/uid.ts +3 -0
- package/src/util/lang_class.ts +90 -0
- package/src/util/lang_string.ts +79 -0
- package/src/util/misc/boundingBoxFromPoints.ts +37 -0
- package/src/util/misc/capValue.ts +2 -0
- package/src/util/misc/cos.ts +24 -0
- package/src/util/misc/dom.ts +50 -0
- package/src/util/misc/findScaleTo.ts +44 -0
- package/src/util/misc/groupSVGElements.ts +15 -0
- package/src/util/misc/isTransparent.ts +51 -0
- package/src/util/misc/matrix.ts +207 -0
- package/src/util/misc/mergeClipPaths.ts +40 -0
- package/src/util/misc/objectEnlive.ts +189 -0
- package/src/util/misc/objectTransforms.ts +129 -0
- package/src/util/misc/pick.ts +17 -0
- package/src/util/misc/planeChange.ts +136 -0
- package/src/util/misc/projectStroke/StrokeLineCapProjections.ts +112 -0
- package/src/util/misc/projectStroke/StrokeLineJoinProjections.ts +231 -0
- package/src/util/misc/projectStroke/StrokeProjectionsBase.ts +75 -0
- package/src/util/misc/projectStroke/index.ts +53 -0
- package/src/util/misc/projectStroke/types.ts +24 -0
- package/src/util/misc/radiansDegreesConversion.ts +18 -0
- package/src/util/misc/resolveOrigin.ts +22 -0
- package/src/util/misc/rotatePoint.ts +15 -0
- package/src/util/misc/sin.ts +26 -0
- package/src/util/misc/svgParsing.ts +181 -0
- package/src/util/misc/textStyles.ts +133 -0
- package/src/util/misc/toFixed.ts +8 -0
- package/src/util/misc/vectors.ts +82 -0
- package/src/util/path.ts +941 -0
- package/src/util/transform_matrix_removal.ts +60 -0
- package/src/util/types.ts +78 -0
- package/tsconfig.json +106 -0
- package/HEADER.js +0 -203
- package/build.js +0 -287
- package/dist/fabric.js +0 -31187
- package/dist/fabric.min.js +0 -1
- package/old-travis-reference.yml +0 -97
- package/src/brushes/circle_brush.class.js +0 -144
- package/src/brushes/pattern_brush.class.js +0 -61
- package/src/brushes/pencil_brush.class.js +0 -310
- package/src/brushes/spray_brush.class.js +0 -219
- package/src/canvas.class.js +0 -1312
- package/src/color.class.js +0 -636
- package/src/control.class.js +0 -339
- package/src/controls.actions.js +0 -740
- package/src/controls.render.js +0 -99
- package/src/elements_parser.js +0 -152
- package/src/filters/2d_backend.class.js +0 -65
- package/src/filters/blendcolor_filter.class.js +0 -251
- package/src/filters/blendimage_filter.class.js +0 -247
- package/src/filters/blur_filter.class.js +0 -217
- package/src/filters/brightness_filter.class.js +0 -113
- package/src/filters/colormatrix_filter.class.js +0 -159
- package/src/filters/composed_filter.class.js +0 -72
- package/src/filters/contrast_filter.class.js +0 -113
- package/src/filters/convolute_filter.class.js +0 -352
- package/src/filters/filter_boilerplate.js +0 -111
- package/src/filters/filter_generator.js +0 -85
- package/src/filters/gamma_filter.class.js +0 -136
- package/src/filters/grayscale_filter.class.js +0 -154
- package/src/filters/hue_rotation.class.js +0 -107
- package/src/filters/invert_filter.class.js +0 -111
- package/src/filters/noise_filter.class.js +0 -134
- package/src/filters/pixelate_filter.class.js +0 -137
- package/src/filters/removecolor_filter.class.js +0 -173
- package/src/filters/resize_filter.class.js +0 -490
- package/src/filters/saturate_filter.class.js +0 -119
- package/src/filters/vibrance_filter.class.js +0 -122
- package/src/filters/webgl_backend.class.js +0 -396
- package/src/globalFabric.js +0 -4
- package/src/gradient.class.js +0 -490
- package/src/intersection.class.js +0 -172
- package/src/log.js +0 -11
- package/src/mixins/animation.mixin.js +0 -231
- package/src/mixins/canvas_dataurl_exporter.mixin.js +0 -97
- package/src/mixins/canvas_events.mixin.js +0 -974
- package/src/mixins/canvas_gestures.mixin.js +0 -149
- package/src/mixins/canvas_grouping.mixin.js +0 -177
- package/src/mixins/canvas_serialization.mixin.js +0 -228
- package/src/mixins/collection.mixin.js +0 -170
- package/src/mixins/default_controls.js +0 -114
- package/src/mixins/itext.svg_export.js +0 -241
- package/src/mixins/itext_behavior.mixin.js +0 -940
- package/src/mixins/itext_click_behavior.mixin.js +0 -278
- package/src/mixins/itext_key_behavior.mixin.js +0 -694
- package/src/mixins/object.svg_export.js +0 -258
- package/src/mixins/object_geometry.mixin.js +0 -683
- package/src/mixins/object_interactivity.mixin.js +0 -314
- package/src/mixins/object_origin.mixin.js +0 -255
- package/src/mixins/object_stacking.mixin.js +0 -80
- package/src/mixins/object_straightening.mixin.js +0 -80
- package/src/mixins/observable.mixin.js +0 -141
- package/src/mixins/shared_methods.mixin.js +0 -94
- package/src/mixins/stateful.mixin.js +0 -107
- package/src/mixins/text_style.mixin.js +0 -324
- package/src/parser.js +0 -1090
- package/src/pattern.class.js +0 -189
- package/src/point.class.js +0 -337
- package/src/shadow.class.js +0 -195
- package/src/shapes/active_selection.class.js +0 -155
- package/src/shapes/circle.class.js +0 -210
- package/src/shapes/ellipse.class.js +0 -181
- package/src/shapes/group.class.js +0 -593
- package/src/shapes/image.class.js +0 -764
- package/src/shapes/itext.class.js +0 -526
- package/src/shapes/line.class.js +0 -324
- package/src/shapes/object.class.js +0 -2008
- package/src/shapes/path.class.js +0 -384
- package/src/shapes/polygon.class.js +0 -81
- package/src/shapes/polyline.class.js +0 -268
- package/src/shapes/rect.class.js +0 -187
- package/src/shapes/text.class.js +0 -1696
- package/src/shapes/textbox.class.js +0 -461
- package/src/shapes/triangle.class.js +0 -93
- package/src/static_canvas.class.js +0 -1881
- package/src/util/anim_ease.js +0 -398
- package/src/util/animate.js +0 -254
- package/src/util/animate_color.js +0 -74
- package/src/util/dom_event.js +0 -50
- package/src/util/dom_misc.js +0 -300
- package/src/util/dom_request.js +0 -54
- package/src/util/dom_style.js +0 -70
- package/src/util/lang_array.js +0 -94
- package/src/util/lang_class.js +0 -115
- package/src/util/lang_object.js +0 -75
- package/src/util/lang_string.js +0 -110
- package/src/util/misc.js +0 -1330
- package/src/util/named_accessors.mixin.js +0 -428
- package/src/util/path.js +0 -829
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import type { TClassProperties } from '../typedefs';
|
|
2
|
+
import { AbstractBaseFilter } from './BaseFilter';
|
|
3
|
+
import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
|
|
4
|
+
import { classRegistry } from '../util/class_registry';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Adapted from <a href="http://www.html5rocks.com/en/tutorials/canvas/imagefilters/">html5rocks article</a>
|
|
8
|
+
* @example <caption>Sharpen filter</caption>
|
|
9
|
+
* const filter = new Convolute({
|
|
10
|
+
* matrix: [ 0, -1, 0,
|
|
11
|
+
* -1, 5, -1,
|
|
12
|
+
* 0, -1, 0 ]
|
|
13
|
+
* });
|
|
14
|
+
* object.filters.push(filter);
|
|
15
|
+
* object.applyFilters();
|
|
16
|
+
* canvas.renderAll();
|
|
17
|
+
* @example <caption>Blur filter</caption>
|
|
18
|
+
* const filter = new Convolute({
|
|
19
|
+
* matrix: [ 1/9, 1/9, 1/9,
|
|
20
|
+
* 1/9, 1/9, 1/9,
|
|
21
|
+
* 1/9, 1/9, 1/9 ]
|
|
22
|
+
* });
|
|
23
|
+
* object.filters.push(filter);
|
|
24
|
+
* object.applyFilters();
|
|
25
|
+
* canvas.renderAll();
|
|
26
|
+
* @example <caption>Emboss filter</caption>
|
|
27
|
+
* const filter = new Convolute({
|
|
28
|
+
* matrix: [ 1, 1, 1,
|
|
29
|
+
* 1, 0.7, -1,
|
|
30
|
+
* -1, -1, -1 ]
|
|
31
|
+
* });
|
|
32
|
+
* object.filters.push(filter);
|
|
33
|
+
* object.applyFilters();
|
|
34
|
+
* canvas.renderAll();
|
|
35
|
+
* @example <caption>Emboss filter with opaqueness</caption>
|
|
36
|
+
* const filter = new Convolute({
|
|
37
|
+
* opaque: true,
|
|
38
|
+
* matrix: [ 1, 1, 1,
|
|
39
|
+
* 1, 0.7, -1,
|
|
40
|
+
* -1, -1, -1 ]
|
|
41
|
+
* });
|
|
42
|
+
* object.filters.push(filter);
|
|
43
|
+
* object.applyFilters();
|
|
44
|
+
* canvas.renderAll();
|
|
45
|
+
*/
|
|
46
|
+
export class Convolute extends AbstractBaseFilter<Record<string, string>> {
|
|
47
|
+
/*
|
|
48
|
+
* Opaque value (true/false)
|
|
49
|
+
*/
|
|
50
|
+
declare opaque: boolean;
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* matrix for the filter, max 9x9
|
|
54
|
+
*/
|
|
55
|
+
declare matrix: number[];
|
|
56
|
+
|
|
57
|
+
getCacheKey() {
|
|
58
|
+
return `${this.type}_${Math.sqrt(this.matrix.length)}_${
|
|
59
|
+
this.opaque ? 1 : 0
|
|
60
|
+
}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getFragmentSource() {
|
|
64
|
+
return this.fragmentSource[this.getCacheKey()];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.
|
|
69
|
+
*
|
|
70
|
+
* @param {Object} options
|
|
71
|
+
* @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
|
|
72
|
+
*/
|
|
73
|
+
applyTo2d(options: T2DPipelineState) {
|
|
74
|
+
const imageData = options.imageData,
|
|
75
|
+
data = imageData.data,
|
|
76
|
+
weights = this.matrix,
|
|
77
|
+
side = Math.round(Math.sqrt(weights.length)),
|
|
78
|
+
halfSide = Math.floor(side / 2),
|
|
79
|
+
sw = imageData.width,
|
|
80
|
+
sh = imageData.height,
|
|
81
|
+
output = options.ctx.createImageData(sw, sh),
|
|
82
|
+
dst = output.data,
|
|
83
|
+
// go through the destination image pixels
|
|
84
|
+
alphaFac = this.opaque ? 1 : 0;
|
|
85
|
+
let r, g, b, a, dstOff, scx, scy, srcOff, wt, x, y, cx, cy;
|
|
86
|
+
|
|
87
|
+
for (y = 0; y < sh; y++) {
|
|
88
|
+
for (x = 0; x < sw; x++) {
|
|
89
|
+
dstOff = (y * sw + x) * 4;
|
|
90
|
+
// calculate the weighed sum of the source image pixels that
|
|
91
|
+
// fall under the convolution matrix
|
|
92
|
+
r = 0;
|
|
93
|
+
g = 0;
|
|
94
|
+
b = 0;
|
|
95
|
+
a = 0;
|
|
96
|
+
|
|
97
|
+
for (cy = 0; cy < side; cy++) {
|
|
98
|
+
for (cx = 0; cx < side; cx++) {
|
|
99
|
+
scy = y + cy - halfSide;
|
|
100
|
+
scx = x + cx - halfSide;
|
|
101
|
+
|
|
102
|
+
// eslint-disable-next-line max-depth
|
|
103
|
+
if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
srcOff = (scy * sw + scx) * 4;
|
|
108
|
+
wt = weights[cy * side + cx];
|
|
109
|
+
|
|
110
|
+
r += data[srcOff] * wt;
|
|
111
|
+
g += data[srcOff + 1] * wt;
|
|
112
|
+
b += data[srcOff + 2] * wt;
|
|
113
|
+
// eslint-disable-next-line max-depth
|
|
114
|
+
if (!alphaFac) {
|
|
115
|
+
a += data[srcOff + 3] * wt;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
dst[dstOff] = r;
|
|
120
|
+
dst[dstOff + 1] = g;
|
|
121
|
+
dst[dstOff + 2] = b;
|
|
122
|
+
if (!alphaFac) {
|
|
123
|
+
dst[dstOff + 3] = a;
|
|
124
|
+
} else {
|
|
125
|
+
dst[dstOff + 3] = data[dstOff + 3];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
options.imageData = output;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Return WebGL uniform locations for this filter's shader.
|
|
134
|
+
*
|
|
135
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
136
|
+
* @param {WebGLShaderProgram} program This filter's compiled shader program.
|
|
137
|
+
*/
|
|
138
|
+
getUniformLocations(
|
|
139
|
+
gl: WebGLRenderingContext,
|
|
140
|
+
program: WebGLProgram
|
|
141
|
+
): TWebGLUniformLocationMap {
|
|
142
|
+
return {
|
|
143
|
+
uMatrix: gl.getUniformLocation(program, 'uMatrix'),
|
|
144
|
+
uOpaque: gl.getUniformLocation(program, 'uOpaque'),
|
|
145
|
+
uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),
|
|
146
|
+
uSize: gl.getUniformLocation(program, 'uSize'),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Send data from this filter to its shader program's uniforms.
|
|
152
|
+
*
|
|
153
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
154
|
+
* @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
|
|
155
|
+
*/
|
|
156
|
+
sendUniformData(
|
|
157
|
+
gl: WebGLRenderingContext,
|
|
158
|
+
uniformLocations: TWebGLUniformLocationMap
|
|
159
|
+
) {
|
|
160
|
+
gl.uniform1fv(uniformLocations.uMatrix, this.matrix);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Returns object representation of an instance
|
|
165
|
+
* @return {Object} Object representation of an instance
|
|
166
|
+
*/
|
|
167
|
+
toObject() {
|
|
168
|
+
return {
|
|
169
|
+
...super.toObject(),
|
|
170
|
+
opaque: this.opaque,
|
|
171
|
+
matrix: [...this.matrix],
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static async fromObject(object: any) {
|
|
176
|
+
return new Convolute(object);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export const convoluteDefaultValues: Partial<TClassProperties<Convolute>> = {
|
|
181
|
+
type: 'Convolute',
|
|
182
|
+
opaque: false,
|
|
183
|
+
matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],
|
|
184
|
+
fragmentSource: {
|
|
185
|
+
Convolute_3_1: `
|
|
186
|
+
precision highp float;
|
|
187
|
+
uniform sampler2D uTexture;
|
|
188
|
+
uniform float uMatrix[9];
|
|
189
|
+
uniform float uStepW;
|
|
190
|
+
uniform float uStepH;
|
|
191
|
+
varying vec2 vTexCoord;
|
|
192
|
+
void main() {
|
|
193
|
+
vec4 color = vec4(0, 0, 0, 0);
|
|
194
|
+
for (float h = 0.0; h < 3.0; h+=1.0) {
|
|
195
|
+
for (float w = 0.0; w < 3.0; w+=1.0) {
|
|
196
|
+
vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));
|
|
197
|
+
color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
gl_FragColor = color;
|
|
201
|
+
}
|
|
202
|
+
`,
|
|
203
|
+
Convolute_3_0: `
|
|
204
|
+
precision highp float;
|
|
205
|
+
uniform sampler2D uTexture;
|
|
206
|
+
uniform float uMatrix[9];
|
|
207
|
+
uniform float uStepW;
|
|
208
|
+
uniform float uStepH;
|
|
209
|
+
varying vec2 vTexCoord;
|
|
210
|
+
void main() {
|
|
211
|
+
vec4 color = vec4(0, 0, 0, 1);
|
|
212
|
+
for (float h = 0.0; h < 3.0; h+=1.0) {
|
|
213
|
+
for (float w = 0.0; w < 3.0; w+=1.0) {
|
|
214
|
+
vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));
|
|
215
|
+
color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
float alpha = texture2D(uTexture, vTexCoord).a;
|
|
219
|
+
gl_FragColor = color;
|
|
220
|
+
gl_FragColor.a = alpha;
|
|
221
|
+
}
|
|
222
|
+
`,
|
|
223
|
+
Convolute_5_1: `
|
|
224
|
+
precision highp float;
|
|
225
|
+
uniform sampler2D uTexture;
|
|
226
|
+
uniform float uMatrix[25];
|
|
227
|
+
uniform float uStepW;
|
|
228
|
+
uniform float uStepH;
|
|
229
|
+
varying vec2 vTexCoord;
|
|
230
|
+
void main() {
|
|
231
|
+
vec4 color = vec4(0, 0, 0, 0);
|
|
232
|
+
for (float h = 0.0; h < 5.0; h+=1.0) {
|
|
233
|
+
for (float w = 0.0; w < 5.0; w+=1.0) {
|
|
234
|
+
vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));
|
|
235
|
+
color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
gl_FragColor = color;
|
|
239
|
+
}
|
|
240
|
+
`,
|
|
241
|
+
Convolute_5_0: `
|
|
242
|
+
precision highp float;
|
|
243
|
+
uniform sampler2D uTexture;
|
|
244
|
+
uniform float uMatrix[25];
|
|
245
|
+
uniform float uStepW;
|
|
246
|
+
uniform float uStepH;
|
|
247
|
+
varying vec2 vTexCoord;
|
|
248
|
+
void main() {
|
|
249
|
+
vec4 color = vec4(0, 0, 0, 1);
|
|
250
|
+
for (float h = 0.0; h < 5.0; h+=1.0) {
|
|
251
|
+
for (float w = 0.0; w < 5.0; w+=1.0) {
|
|
252
|
+
vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));
|
|
253
|
+
color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
float alpha = texture2D(uTexture, vTexCoord).a;
|
|
257
|
+
gl_FragColor = color;
|
|
258
|
+
gl_FragColor.a = alpha;
|
|
259
|
+
}
|
|
260
|
+
`,
|
|
261
|
+
Convolute_7_1: `
|
|
262
|
+
precision highp float;
|
|
263
|
+
uniform sampler2D uTexture;
|
|
264
|
+
uniform float uMatrix[49];
|
|
265
|
+
uniform float uStepW;
|
|
266
|
+
uniform float uStepH;
|
|
267
|
+
varying vec2 vTexCoord;
|
|
268
|
+
void main() {
|
|
269
|
+
vec4 color = vec4(0, 0, 0, 0);
|
|
270
|
+
for (float h = 0.0; h < 7.0; h+=1.0) {
|
|
271
|
+
for (float w = 0.0; w < 7.0; w+=1.0) {
|
|
272
|
+
vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));
|
|
273
|
+
color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
gl_FragColor = color;
|
|
277
|
+
}
|
|
278
|
+
`,
|
|
279
|
+
Convolute_7_0: `
|
|
280
|
+
precision highp float;
|
|
281
|
+
uniform sampler2D uTexture;
|
|
282
|
+
uniform float uMatrix[49];
|
|
283
|
+
uniform float uStepW;
|
|
284
|
+
uniform float uStepH;
|
|
285
|
+
varying vec2 vTexCoord;
|
|
286
|
+
void main() {
|
|
287
|
+
vec4 color = vec4(0, 0, 0, 1);
|
|
288
|
+
for (float h = 0.0; h < 7.0; h+=1.0) {
|
|
289
|
+
for (float w = 0.0; w < 7.0; w+=1.0) {
|
|
290
|
+
vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));
|
|
291
|
+
color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
float alpha = texture2D(uTexture, vTexCoord).a;
|
|
295
|
+
gl_FragColor = color;
|
|
296
|
+
gl_FragColor.a = alpha;
|
|
297
|
+
}
|
|
298
|
+
`,
|
|
299
|
+
Convolute_9_1: `
|
|
300
|
+
precision highp float;
|
|
301
|
+
uniform sampler2D uTexture;
|
|
302
|
+
uniform float uMatrix[81];
|
|
303
|
+
uniform float uStepW;
|
|
304
|
+
uniform float uStepH;
|
|
305
|
+
varying vec2 vTexCoord;
|
|
306
|
+
void main() {
|
|
307
|
+
vec4 color = vec4(0, 0, 0, 0);
|
|
308
|
+
for (float h = 0.0; h < 9.0; h+=1.0) {
|
|
309
|
+
for (float w = 0.0; w < 9.0; w+=1.0) {
|
|
310
|
+
vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));
|
|
311
|
+
color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
gl_FragColor = color;
|
|
315
|
+
}
|
|
316
|
+
`,
|
|
317
|
+
Convolute_9_0: `
|
|
318
|
+
precision highp float;
|
|
319
|
+
uniform sampler2D uTexture;
|
|
320
|
+
uniform float uMatrix[81];
|
|
321
|
+
uniform float uStepW;
|
|
322
|
+
uniform float uStepH;
|
|
323
|
+
varying vec2 vTexCoord;
|
|
324
|
+
void main() {
|
|
325
|
+
vec4 color = vec4(0, 0, 0, 1);
|
|
326
|
+
for (float h = 0.0; h < 9.0; h+=1.0) {
|
|
327
|
+
for (float w = 0.0; w < 9.0; w+=1.0) {
|
|
328
|
+
vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));
|
|
329
|
+
color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
float alpha = texture2D(uTexture, vTexCoord).a;
|
|
333
|
+
gl_FragColor = color;
|
|
334
|
+
gl_FragColor.a = alpha;
|
|
335
|
+
}
|
|
336
|
+
`,
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
Object.assign(Convolute.prototype, convoluteDefaultValues);
|
|
341
|
+
classRegistry.setClass(Convolute);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { config } from '../config';
|
|
2
|
+
import { Canvas2dFilterBackend } from './Canvas2dFilterBackend';
|
|
3
|
+
import { WebGLFilterBackend } from './WebGLFilterBackend';
|
|
4
|
+
import { webGLProbe } from './WebGLProbe';
|
|
5
|
+
|
|
6
|
+
export type FilterBackend = WebGLFilterBackend | Canvas2dFilterBackend;
|
|
7
|
+
|
|
8
|
+
let filterBackend: FilterBackend;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Verifies if it is possible to initialize webgl or fallback on a canvas2d filtering backend
|
|
12
|
+
*/
|
|
13
|
+
export function initFilterBackend(): FilterBackend {
|
|
14
|
+
webGLProbe.queryWebGL();
|
|
15
|
+
if (config.enableGLFiltering && webGLProbe.isSupported(config.textureSize)) {
|
|
16
|
+
return new WebGLFilterBackend({ tileSize: config.textureSize });
|
|
17
|
+
} else {
|
|
18
|
+
return new Canvas2dFilterBackend();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the current fabricJS filter backend or initialize one if not avaialble yet
|
|
24
|
+
* @param [strict] pass `true` to create the backend if it wasn't created yet (default behavior),
|
|
25
|
+
* pass `false` to get the backend ref without mutating it
|
|
26
|
+
*/
|
|
27
|
+
export function getFilterBackend(strict = true): FilterBackend {
|
|
28
|
+
if (!filterBackend && strict) {
|
|
29
|
+
filterBackend = initFilterBackend();
|
|
30
|
+
}
|
|
31
|
+
return filterBackend;
|
|
32
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { TClassProperties } from '../typedefs';
|
|
2
|
+
import { BaseFilter, BaseFilterOptions } from './BaseFilter';
|
|
3
|
+
import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
|
|
4
|
+
import { classRegistry } from '../util/class_registry';
|
|
5
|
+
|
|
6
|
+
export type GammaInput = [number, number, number];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Gamma filter class
|
|
10
|
+
* @example
|
|
11
|
+
* const filter = new Gamma({
|
|
12
|
+
* gamma: [1, 0.5, 2.1]
|
|
13
|
+
* });
|
|
14
|
+
* object.filters.push(filter);
|
|
15
|
+
* object.applyFilters();
|
|
16
|
+
*/
|
|
17
|
+
export class Gamma extends BaseFilter {
|
|
18
|
+
/**
|
|
19
|
+
* Gamma array value, from 0.01 to 2.2.
|
|
20
|
+
* @param {Array} gamma
|
|
21
|
+
* @default
|
|
22
|
+
*/
|
|
23
|
+
declare gamma: GammaInput;
|
|
24
|
+
declare rgbValues?: {
|
|
25
|
+
r: Uint8Array;
|
|
26
|
+
g: Uint8Array;
|
|
27
|
+
b: Uint8Array;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
constructor({
|
|
31
|
+
gamma,
|
|
32
|
+
...options
|
|
33
|
+
}: Partial<BaseFilterOptions> & { gamma?: GammaInput } = {}) {
|
|
34
|
+
super(options);
|
|
35
|
+
this.gamma = gamma || [1, 1, 1];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Apply the Gamma operation to a Uint8Array representing the pixels of an image.
|
|
40
|
+
*
|
|
41
|
+
* @param {Object} options
|
|
42
|
+
* @param {ImageData} options.imageData The Uint8Array to be filtered.
|
|
43
|
+
*/
|
|
44
|
+
applyTo2d({ imageData: { data } }: T2DPipelineState) {
|
|
45
|
+
const gamma = this.gamma,
|
|
46
|
+
rInv = 1 / gamma[0],
|
|
47
|
+
gInv = 1 / gamma[1],
|
|
48
|
+
bInv = 1 / gamma[2];
|
|
49
|
+
|
|
50
|
+
if (!this.rgbValues) {
|
|
51
|
+
this.rgbValues = {
|
|
52
|
+
r: new Uint8Array(256),
|
|
53
|
+
g: new Uint8Array(256),
|
|
54
|
+
b: new Uint8Array(256),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// This is an optimization - pre-compute a look-up table for each color channel
|
|
59
|
+
// instead of performing these pow calls for each pixel in the image.
|
|
60
|
+
for (let i = 0; i < 256; i++) {
|
|
61
|
+
this.rgbValues.r[i] = Math.pow(i / 255, rInv) * 255;
|
|
62
|
+
this.rgbValues.g[i] = Math.pow(i / 255, gInv) * 255;
|
|
63
|
+
this.rgbValues.b[i] = Math.pow(i / 255, bInv) * 255;
|
|
64
|
+
}
|
|
65
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
66
|
+
data[i] = this.rgbValues.r[data[i]];
|
|
67
|
+
data[i + 1] = this.rgbValues.g[data[i + 1]];
|
|
68
|
+
data[i + 2] = this.rgbValues.b[data[i + 2]];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Return WebGL uniform locations for this filter's shader.
|
|
74
|
+
*
|
|
75
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
76
|
+
* @param {WebGLShaderProgram} program This filter's compiled shader program.
|
|
77
|
+
*/
|
|
78
|
+
getUniformLocations(
|
|
79
|
+
gl: WebGLRenderingContext,
|
|
80
|
+
program: WebGLProgram
|
|
81
|
+
): TWebGLUniformLocationMap {
|
|
82
|
+
return {
|
|
83
|
+
uGamma: gl.getUniformLocation(program, 'uGamma'),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Send data from this filter to its shader program's uniforms.
|
|
89
|
+
*
|
|
90
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
91
|
+
* @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
|
|
92
|
+
*/
|
|
93
|
+
sendUniformData(
|
|
94
|
+
gl: WebGLRenderingContext,
|
|
95
|
+
uniformLocations: TWebGLUniformLocationMap
|
|
96
|
+
) {
|
|
97
|
+
gl.uniform3fv(uniformLocations.uGamma, this.gamma);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static async fromObject(object: any) {
|
|
101
|
+
return new Gamma(object);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const gammaDefaultValues: Partial<TClassProperties<Gamma>> = {
|
|
106
|
+
type: 'Gamma',
|
|
107
|
+
fragmentSource: `
|
|
108
|
+
precision highp float;
|
|
109
|
+
uniform sampler2D uTexture;
|
|
110
|
+
uniform vec3 uGamma;
|
|
111
|
+
varying vec2 vTexCoord;
|
|
112
|
+
void main() {
|
|
113
|
+
vec4 color = texture2D(uTexture, vTexCoord);
|
|
114
|
+
vec3 correction = (1.0 / uGamma);
|
|
115
|
+
color.r = pow(color.r, correction.r);
|
|
116
|
+
color.g = pow(color.g, correction.g);
|
|
117
|
+
color.b = pow(color.b, correction.b);
|
|
118
|
+
gl_FragColor = color;
|
|
119
|
+
gl_FragColor.rgb *= color.a;
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
mainParameter: 'gamma',
|
|
123
|
+
gamma: [1, 1, 1],
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
Object.assign(Gamma.prototype, gammaDefaultValues);
|
|
127
|
+
classRegistry.setClass(Gamma);
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { TClassProperties } from '../typedefs';
|
|
2
|
+
import { AbstractBaseFilter } from './BaseFilter';
|
|
3
|
+
import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
|
|
4
|
+
import { classRegistry } from '../util/class_registry';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Grayscale image filter class
|
|
8
|
+
* @example
|
|
9
|
+
* const filter = new Grayscale();
|
|
10
|
+
* object.filters.push(filter);
|
|
11
|
+
* object.applyFilters();
|
|
12
|
+
*/
|
|
13
|
+
export class Grayscale extends AbstractBaseFilter<Record<string, string>> {
|
|
14
|
+
declare mode: 'average' | 'lightness' | 'luminosity';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Apply the Grayscale operation to a Uint8Array representing the pixels of an image.
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} options
|
|
20
|
+
* @param {ImageData} options.imageData The Uint8Array to be filtered.
|
|
21
|
+
*/
|
|
22
|
+
applyTo2d({ imageData: { data } }: T2DPipelineState) {
|
|
23
|
+
for (let i = 0, value: number; i < data.length; i += 4) {
|
|
24
|
+
switch (this.mode) {
|
|
25
|
+
case 'average':
|
|
26
|
+
value = (data[i] + data[i + 1] + data[i + 2]) / 3;
|
|
27
|
+
break;
|
|
28
|
+
case 'lightness':
|
|
29
|
+
value =
|
|
30
|
+
(Math.min(data[i], data[i + 1], data[i + 2]) +
|
|
31
|
+
Math.max(data[i], data[i + 1], data[i + 2])) /
|
|
32
|
+
2;
|
|
33
|
+
break;
|
|
34
|
+
case 'luminosity':
|
|
35
|
+
value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
data[i] = value;
|
|
40
|
+
data[i + 1] = value;
|
|
41
|
+
data[i + 2] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getCacheKey() {
|
|
46
|
+
return `${this.type}_${this.mode}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
getFragmentSource() {
|
|
50
|
+
return this.fragmentSource[this.mode];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Return WebGL uniform locations for this filter's shader.
|
|
55
|
+
*
|
|
56
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
57
|
+
* @param {WebGLShaderProgram} program This filter's compiled shader program.
|
|
58
|
+
*/
|
|
59
|
+
getUniformLocations(
|
|
60
|
+
gl: WebGLRenderingContext,
|
|
61
|
+
program: WebGLProgram
|
|
62
|
+
): TWebGLUniformLocationMap {
|
|
63
|
+
return {
|
|
64
|
+
uMode: gl.getUniformLocation(program, 'uMode'),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Send data from this filter to its shader program's uniforms.
|
|
70
|
+
*
|
|
71
|
+
* @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
|
|
72
|
+
* @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
|
|
73
|
+
*/
|
|
74
|
+
sendUniformData(
|
|
75
|
+
gl: WebGLRenderingContext,
|
|
76
|
+
uniformLocations: TWebGLUniformLocationMap
|
|
77
|
+
) {
|
|
78
|
+
const mode = 1;
|
|
79
|
+
gl.uniform1i(uniformLocations.uMode, mode);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Grayscale filter isNeutralState implementation
|
|
84
|
+
* The filter is never neutral
|
|
85
|
+
* on the image
|
|
86
|
+
**/
|
|
87
|
+
isNeutralState() {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static async fromObject(object: any) {
|
|
92
|
+
return new Grayscale(object);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const grayscaleDefaultValues: Partial<TClassProperties<Grayscale>> = {
|
|
97
|
+
type: 'Grayscale',
|
|
98
|
+
fragmentSource: {
|
|
99
|
+
average: `
|
|
100
|
+
precision highp float;
|
|
101
|
+
uniform sampler2D uTexture;
|
|
102
|
+
varying vec2 vTexCoord;
|
|
103
|
+
void main() {
|
|
104
|
+
vec4 color = texture2D(uTexture, vTexCoord);
|
|
105
|
+
float average = (color.r + color.b + color.g) / 3.0;
|
|
106
|
+
gl_FragColor = vec4(average, average, average, color.a);
|
|
107
|
+
}
|
|
108
|
+
`,
|
|
109
|
+
lightness: `
|
|
110
|
+
precision highp float;
|
|
111
|
+
uniform sampler2D uTexture;
|
|
112
|
+
uniform int uMode;
|
|
113
|
+
varying vec2 vTexCoord;
|
|
114
|
+
void main() {
|
|
115
|
+
vec4 col = texture2D(uTexture, vTexCoord);
|
|
116
|
+
float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;
|
|
117
|
+
gl_FragColor = vec4(average, average, average, col.a);
|
|
118
|
+
}
|
|
119
|
+
`,
|
|
120
|
+
luminosity: `
|
|
121
|
+
precision highp float;
|
|
122
|
+
uniform sampler2D uTexture;
|
|
123
|
+
uniform int uMode;
|
|
124
|
+
varying vec2 vTexCoord;
|
|
125
|
+
void main() {
|
|
126
|
+
vec4 col = texture2D(uTexture, vTexCoord);
|
|
127
|
+
float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;
|
|
128
|
+
gl_FragColor = vec4(average, average, average, col.a);
|
|
129
|
+
}
|
|
130
|
+
`,
|
|
131
|
+
},
|
|
132
|
+
mode: 'average',
|
|
133
|
+
mainParameter: 'mode',
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
Object.assign(Grayscale.prototype, grayscaleDefaultValues);
|
|
137
|
+
classRegistry.setClass(Grayscale);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { TClassProperties } from '../typedefs';
|
|
2
|
+
import { cos } from '../util/misc/cos';
|
|
3
|
+
import { sin } from '../util/misc/sin';
|
|
4
|
+
import { ColorMatrix } from './ColorMatrix';
|
|
5
|
+
import type { TWebGLPipelineState, T2DPipelineState } from './typedefs';
|
|
6
|
+
import { classRegistry } from '../util/class_registry';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* HueRotation filter class
|
|
10
|
+
* @example
|
|
11
|
+
* const filter = new HueRotation({
|
|
12
|
+
* rotation: -0.5
|
|
13
|
+
* });
|
|
14
|
+
* object.filters.push(filter);
|
|
15
|
+
* object.applyFilters();
|
|
16
|
+
*/
|
|
17
|
+
// @ts-expect-error fromObject
|
|
18
|
+
export class HueRotation extends ColorMatrix {
|
|
19
|
+
/**
|
|
20
|
+
* HueRotation value, from -1 to 1.
|
|
21
|
+
*/
|
|
22
|
+
declare rotation: number;
|
|
23
|
+
|
|
24
|
+
calculateMatrix() {
|
|
25
|
+
const rad = this.rotation * Math.PI,
|
|
26
|
+
cosine = cos(rad),
|
|
27
|
+
sine = sin(rad),
|
|
28
|
+
aThird = 1 / 3,
|
|
29
|
+
aThirdSqtSin = Math.sqrt(aThird) * sine,
|
|
30
|
+
OneMinusCos = 1 - cosine;
|
|
31
|
+
this.matrix = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0];
|
|
32
|
+
this.matrix[0] = cosine + OneMinusCos / 3;
|
|
33
|
+
this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;
|
|
34
|
+
this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;
|
|
35
|
+
this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;
|
|
36
|
+
this.matrix[6] = cosine + aThird * OneMinusCos;
|
|
37
|
+
this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;
|
|
38
|
+
this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;
|
|
39
|
+
this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;
|
|
40
|
+
this.matrix[12] = cosine + aThird * OneMinusCos;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
isNeutralState() {
|
|
44
|
+
this.calculateMatrix();
|
|
45
|
+
return super.isNeutralState();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
applyTo(options: TWebGLPipelineState | T2DPipelineState) {
|
|
49
|
+
this.calculateMatrix();
|
|
50
|
+
super.applyTo(options);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static async fromObject(object: any) {
|
|
54
|
+
return new HueRotation(object);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const hueRotationDefaultValues: Partial<TClassProperties<HueRotation>> =
|
|
59
|
+
{
|
|
60
|
+
type: 'HueRotation',
|
|
61
|
+
rotation: 0,
|
|
62
|
+
mainParameter: 'rotation',
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
Object.assign(HueRotation.prototype, hueRotationDefaultValues);
|
|
66
|
+
classRegistry.setClass(HueRotation);
|