@nasser-sw/fabric 7.0.0-beta1 → 7.0.1-beta10
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/0 +0 -0
- package/debug/{konva → konva-master}/CHANGELOG.md +2 -1
- package/debug/{konva → konva-master}/README.md +7 -3
- package/debug/{konva → konva-master}/package.json +1 -1
- package/debug/{konva → konva-master}/release.sh +1 -4
- package/debug/{konva → konva-master}/src/Canvas.ts +37 -0
- package/debug/{konva → konva-master}/src/shapes/Text.ts +2 -2
- package/dist/index.js +2198 -272
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +2198 -272
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +2198 -272
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +2198 -272
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/shapes/Line.d.ts +33 -86
- package/dist/src/shapes/Line.d.ts.map +1 -1
- package/dist/src/shapes/Line.min.mjs +1 -1
- package/dist/src/shapes/Line.min.mjs.map +1 -1
- package/dist/src/shapes/Line.mjs +405 -159
- package/dist/src/shapes/Line.mjs.map +1 -1
- package/dist/src/shapes/Polyline.d.ts +7 -0
- package/dist/src/shapes/Polyline.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.min.mjs +1 -1
- package/dist/src/shapes/Polyline.min.mjs.map +1 -1
- package/dist/src/shapes/Polyline.mjs +48 -16
- package/dist/src/shapes/Polyline.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.d.ts +19 -0
- package/dist/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs +302 -16
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Textbox.d.ts +56 -1
- package/dist/src/shapes/Textbox.d.ts.map +1 -1
- package/dist/src/shapes/Textbox.min.mjs +1 -1
- package/dist/src/shapes/Textbox.min.mjs.map +1 -1
- package/dist/src/shapes/Textbox.mjs +633 -11
- package/dist/src/shapes/Textbox.mjs.map +1 -1
- package/dist/src/shapes/Triangle.d.ts +27 -2
- package/dist/src/shapes/Triangle.d.ts.map +1 -1
- package/dist/src/shapes/Triangle.min.mjs +1 -1
- package/dist/src/shapes/Triangle.min.mjs.map +1 -1
- package/dist/src/shapes/Triangle.mjs +72 -12
- package/dist/src/shapes/Triangle.mjs.map +1 -1
- package/dist/src/text/examples/arabicTextExample.d.ts +60 -0
- package/dist/src/text/examples/arabicTextExample.d.ts.map +1 -0
- package/dist/src/text/measure.d.ts +9 -0
- package/dist/src/text/measure.d.ts.map +1 -1
- package/dist/src/text/measure.min.mjs +1 -1
- package/dist/src/text/measure.min.mjs.map +1 -1
- package/dist/src/text/measure.mjs +175 -4
- package/dist/src/text/measure.mjs.map +1 -1
- package/dist/src/text/overlayEditor.d.ts +8 -0
- package/dist/src/text/overlayEditor.d.ts.map +1 -1
- package/dist/src/text/overlayEditor.min.mjs +1 -1
- package/dist/src/text/overlayEditor.min.mjs.map +1 -1
- package/dist/src/text/overlayEditor.mjs +395 -56
- package/dist/src/text/overlayEditor.mjs.map +1 -1
- package/dist/src/text/scriptUtils.d.ts +142 -0
- package/dist/src/text/scriptUtils.d.ts.map +1 -0
- package/dist/src/text/scriptUtils.min.mjs +2 -0
- package/dist/src/text/scriptUtils.min.mjs.map +1 -0
- package/dist/src/text/scriptUtils.mjs +212 -0
- package/dist/src/text/scriptUtils.mjs.map +1 -0
- package/dist/src/util/misc/cornerRadius.d.ts +70 -0
- package/dist/src/util/misc/cornerRadius.d.ts.map +1 -0
- package/dist/src/util/misc/cornerRadius.min.mjs +2 -0
- package/dist/src/util/misc/cornerRadius.min.mjs.map +1 -0
- package/dist/src/util/misc/cornerRadius.mjs +181 -0
- package/dist/src/util/misc/cornerRadius.mjs.map +1 -0
- package/dist-extensions/src/shapes/CustomLine.d.ts +10 -0
- package/dist-extensions/src/shapes/CustomLine.d.ts.map +1 -0
- package/dist-extensions/src/shapes/Line.d.ts +33 -86
- package/dist-extensions/src/shapes/Line.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Polyline.d.ts +7 -0
- package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Text/Text.d.ts +19 -0
- package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Textbox.d.ts +56 -1
- package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Triangle.d.ts +27 -2
- package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
- package/dist-extensions/src/text/measure.d.ts +9 -0
- package/dist-extensions/src/text/measure.d.ts.map +1 -1
- package/dist-extensions/src/text/overlayEditor.d.ts +8 -0
- package/dist-extensions/src/text/overlayEditor.d.ts.map +1 -1
- package/dist-extensions/src/text/scriptUtils.d.ts +142 -0
- package/dist-extensions/src/text/scriptUtils.d.ts.map +1 -0
- package/dist-extensions/src/util/misc/cornerRadius.d.ts +70 -0
- package/dist-extensions/src/util/misc/cornerRadius.d.ts.map +1 -0
- package/fabric-test-editor.html +3552 -0
- package/fabric-test2.html +647 -0
- package/fabric.ts +182 -182
- package/fonts/STV Bold.ttf +0 -0
- package/fonts/STV Light.ttf +0 -0
- package/fonts/STV Regular.ttf +0 -0
- package/package.json +164 -164
- package/src/shapes/Line.ts +484 -157
- package/src/shapes/Polyline.ts +70 -29
- package/src/shapes/Text/Text.ts +317 -19
- package/src/shapes/Textbox.ts +663 -12
- package/src/shapes/Triangle.spec.ts +76 -0
- package/src/shapes/Triangle.ts +85 -15
- package/src/text/measure.ts +200 -50
- package/src/text/overlayEditor.ts +504 -94
- package/src/util/misc/cornerRadius.spec.ts +141 -0
- package/src/util/misc/cornerRadius.ts +269 -0
- /package/debug/{konva → konva-master}/LICENSE +0 -0
- /package/debug/{konva → konva-master}/gulpfile.mjs +0 -0
- /package/debug/{konva → konva-master}/resources/doc-includes/ContainerParams.txt +0 -0
- /package/debug/{konva → konva-master}/resources/doc-includes/NodeParams.txt +0 -0
- /package/debug/{konva → konva-master}/resources/doc-includes/ShapeParams.txt +0 -0
- /package/debug/{konva → konva-master}/resources/jsdoc.conf.json +0 -0
- /package/debug/{konva → konva-master}/rollup.config.mjs +0 -0
- /package/debug/{konva → konva-master}/src/Animation.ts +0 -0
- /package/debug/{konva → konva-master}/src/BezierFunctions.ts +0 -0
- /package/debug/{konva → konva-master}/src/Container.ts +0 -0
- /package/debug/{konva → konva-master}/src/Context.ts +0 -0
- /package/debug/{konva → konva-master}/src/Core.ts +0 -0
- /package/debug/{konva → konva-master}/src/DragAndDrop.ts +0 -0
- /package/debug/{konva → konva-master}/src/Factory.ts +0 -0
- /package/debug/{konva → konva-master}/src/FastLayer.ts +0 -0
- /package/debug/{konva → konva-master}/src/Global.ts +0 -0
- /package/debug/{konva → konva-master}/src/Group.ts +0 -0
- /package/debug/{konva → konva-master}/src/Layer.ts +0 -0
- /package/debug/{konva → konva-master}/src/Node.ts +0 -0
- /package/debug/{konva → konva-master}/src/PointerEvents.ts +0 -0
- /package/debug/{konva → konva-master}/src/Shape.ts +0 -0
- /package/debug/{konva → konva-master}/src/Stage.ts +0 -0
- /package/debug/{konva → konva-master}/src/Tween.ts +0 -0
- /package/debug/{konva → konva-master}/src/Util.ts +0 -0
- /package/debug/{konva → konva-master}/src/Validators.ts +0 -0
- /package/debug/{konva → konva-master}/src/_CoreInternals.ts +0 -0
- /package/debug/{konva → konva-master}/src/_FullInternals.ts +0 -0
- /package/debug/{konva → konva-master}/src/canvas-backend.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Blur.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Brighten.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Brightness.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Contrast.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Emboss.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Enhance.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Grayscale.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/HSL.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/HSV.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Invert.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Kaleidoscope.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Mask.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Noise.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Pixelate.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Posterize.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/RGB.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/RGBA.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Sepia.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Solarize.ts +0 -0
- /package/debug/{konva → konva-master}/src/filters/Threshold.ts +0 -0
- /package/debug/{konva → konva-master}/src/index.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Arc.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Arrow.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Circle.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Ellipse.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Image.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Label.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Line.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Path.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Rect.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/RegularPolygon.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Ring.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Sprite.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Star.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/TextPath.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Transformer.ts +0 -0
- /package/debug/{konva → konva-master}/src/shapes/Wedge.ts +0 -0
- /package/debug/{konva → konva-master}/src/skia-backend.ts +0 -0
- /package/debug/{konva → konva-master}/src/types.ts +0 -0
- /package/debug/{konva → konva-master}/tsconfig.json +0 -0
- /package/debug/{konva → konva-master}/tsconfig.test.json +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\n// @TODO this code is terrible and Line should be a special case of polyline.\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineProps {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineProps {}\n\n/**\n * A Class to draw a line\n * A bunch of methods will be added to Polyline to handle the line case\n * The line class is very strange to work with, is all special, it hardly aligns\n * to what a developer want everytime there is an angle\n * @deprecated\n */\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineProps\n{\n /**\n * x value or first line edge\n * @type number\n */\n declare x1: number;\n\n /**\n * y value or first line edge\n * @type number\n */\n declare y1: number;\n\n /**\n * x value or second line edge\n * @type number\n */\n declare x2: number;\n\n /**\n * y value or second line edge\n * @type number\n */\n declare y2: number;\n\n static type = 'Line';\n\n static cacheProperties = [...cacheProperties, ...coordProps];\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {Line} thisArg\n */\n constructor([x1, y1, x2, y2] = [0, 0, 0, 0], options: Partial<Props> = {}) {\n super();\n Object.assign(this, Line.ownDefaults);\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight() {\n const { x1, y1, x2, y2 } = this;\n this.width = Math.abs(x2 - x1);\n this.height = Math.abs(y2 - y1);\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: x1, y: y1 },\n { x: x2, y: y2 },\n ]);\n const position = new Point(left + width / 2, top + height / 2);\n this.setPositionByOrigin(position, CENTER, CENTER);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineProps)) {\n // this doesn't make sense very much, since setting x1 when top or left\n // are already set, is just going to show a strange result since the\n // line will move way more than the developer expect.\n // in fabric5 it worked only when the line didn't have extra transformations,\n // in fabric6 too. With extra transform they behave bad in different ways.\n // This needs probably a good rework or a tutorial if you have to create a dynamic line\n this._setWidthHeight();\n }\n return this;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke ?? ctx.fillStyle;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n }\n\n /**\n * Recalculates line points given width and height\n * Those points are simply placed around the center,\n * This is not useful outside internal render functions and svg output\n * Is not meant to be for the developer.\n * @private\n */\n calcLinePoints(): UniqueLineProps {\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1,\n yMult = _y1 <= _y2 ? -1 : 1,\n x1 = (xMult * width) / 2,\n y1 = (yMult * height) / 2,\n x2 = (xMult * -width) / 2,\n y2 = (yMult * -height) / 2;\n\n return {\n x1,\n x2,\n y1,\n y2,\n };\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Line.fromElement})\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n /**\n * Returns Line instance from an SVG element\n * @param {HTMLElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Line instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Line>}\n */\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n {\n ...object,\n points: [x1, y1, x2, y2],\n },\n {\n extraParam: 'points',\n },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","Object","assign","ownDefaults","setOptions","_setWidthHeight","left","top","set","LEFT","TOP","width","Math","abs","height","makeBoundingBoxFromPoints","x","y","position","Point","setPositionByOrigin","CENTER","_set","key","value","includes","_render","ctx","beginPath","p","calcLinePoints","moveTo","lineTo","lineWidth","strokeWidth","origStrokeStyle","strokeStyle","isFiller","stroke","toLive","_this$stroke","fillStyle","_renderStroke","_findCenterFromElement","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","strokeLineCap","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Line.mjs","sources":["../../../src/shapes/Line.ts"],"sourcesContent":["import { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport { Point } from '../Point';\nimport { isFiller } from '../util/typeAssertions';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport { makeBoundingBoxFromPoints } from '../util';\nimport { CENTER, LEFT, TOP } from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\nimport { Control } from '../controls/Control';\nimport type { TPointerEvent, Transform } from '../EventTypeDefs';\nimport { Gradient } from '../gradient/Gradient';\n\nconst coordProps = ['x1', 'x2', 'y1', 'y2'] as const;\n\ninterface UniqueLineCoords {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nexport interface SerializedLineProps\n extends SerializedObjectProps,\n UniqueLineCoords {}\n\nexport class Line<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedLineProps = SerializedLineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements UniqueLineCoords\n{\n declare x1: number;\n declare y1: number;\n declare x2: number;\n declare y2: number;\n\n hitStrokeWidth: number | 'auto' = 'auto';\n\n private _updatingEndpoints = false;\n private _useEndpointCoords = true;\n private _exportingSVG = false;\n\n static type = 'Line';\n static cacheProperties = [...cacheProperties, ...coordProps];\n\n constructor(\n [x1, y1, x2, y2] = [0, 0, 100, 0],\n options: Partial<Props & { hitStrokeWidth?: number | 'auto' }> = {},\n ) {\n super();\n this.setOptions(options);\n this.x1 = x1;\n this.x2 = x2;\n this.y1 = y1;\n this.y2 = y2;\n\n if (options.hitStrokeWidth !== undefined) {\n this.hitStrokeWidth = options.hitStrokeWidth;\n }\n\n this.hasBorders = false;\n this.hasControls = true;\n this.selectable = true;\n this.hoverCursor = 'move';\n this.perPixelTargetFind = false;\n this.strokeLineCap = 'butt';\n\n this._setWidthHeight();\n const { left, top } = options;\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n this._setupLineControls();\n }\n\n _setupLineControls() {\n this.controls = {\n p1: new Control({\n x: 0,\n y: 0,\n cursorStyle: 'move',\n actionHandler: this._endpointActionHandler.bind(this),\n positionHandler: this._p1PositionHandler.bind(this),\n render: this._renderEndpointControl.bind(this),\n sizeX: 12,\n sizeY: 12,\n }),\n p2: new Control({\n x: 0,\n y: 0,\n cursorStyle: 'move',\n actionHandler: this._endpointActionHandler.bind(this),\n positionHandler: this._p2PositionHandler.bind(this),\n render: this._renderEndpointControl.bind(this),\n sizeX: 12,\n sizeY: 12,\n }),\n };\n }\n\n _p1PositionHandler() {\n return new Point(this.x1, this.y1).transform(this.getViewportTransform());\n }\n\n _p2PositionHandler() {\n return new Point(this.x2, this.y2).transform(this.getViewportTransform());\n }\n\n _renderEndpointControl(\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n ) {\n const size = 12;\n ctx.save();\n ctx.fillStyle = '#007bff';\n ctx.strokeStyle = '#ffffff';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(left, top, size / 2, 0, 2 * Math.PI);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n drawBorders(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n if (this._useEndpointCoords) {\n this._drawLineBorders(ctx, styleOverride);\n return this;\n }\n return super.drawBorders(ctx, styleOverride, {});\n }\n\n _drawLineBorders(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n const vpt = this.canvas?.viewportTransform || [1, 0, 0, 1, 0, 0];\n ctx.save();\n ctx.setTransform(vpt[0], vpt[1], vpt[2], vpt[3], vpt[4], vpt[5]);\n ctx.strokeStyle =\n styleOverride.borderColor ||\n this.borderColor ||\n 'rgba(100, 200, 200, 0.5)';\n ctx.lineWidth = (this.strokeWidth || 1) + 5;\n ctx.lineCap = this.strokeLineCap || 'butt';\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n ctx.beginPath();\n ctx.moveTo(this.x1, this.y1);\n ctx.lineTo(this.x2, this.y2);\n ctx.stroke();\n ctx.restore();\n }\n\n _renderControls(ctx: CanvasRenderingContext2D, styleOverride: any = {}) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.drawControls(ctx, styleOverride);\n ctx.restore();\n }\n\n getBoundingRect() {\n if (this._useEndpointCoords) {\n const { x1, y1, x2, y2 } = this;\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto' ? this.strokeWidth : this.hitStrokeWidth;\n const padding = Math.max(effectiveStrokeWidth / 2 + 5, 10);\n return {\n left: Math.min(x1, x2) - padding,\n top: Math.min(y1, y2) - padding,\n width: Math.abs(x2 - x1) + padding * 2 || padding * 2,\n height: Math.abs(y2 - y1) + padding * 2 || padding * 2,\n };\n }\n return super.getBoundingRect();\n }\n\n setCoords() {\n if (this._useEndpointCoords) {\n // Set width and height for hit detection and bounding box\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto' ? this.strokeWidth : this.hitStrokeWidth;\n const hitPadding = Math.max(effectiveStrokeWidth / 2 + 5, 10);\n this.width = Math.abs(this.x2 - this.x1) + hitPadding * 2;\n this.height = Math.abs(this.y2 - this.y1) + hitPadding * 2;\n\n // Only update left/top if they haven't been explicitly set (e.g., during loading)\n if (this.left === 0 && this.top === 0) {\n const center = this._findCenterFromElement();\n this.left = center.x;\n this.top = center.y;\n }\n }\n super.setCoords();\n }\n\n getCoords(): [Point, Point, Point, Point] {\n if (this._useEndpointCoords) {\n const deltaX = this.x2 - this.x1;\n const deltaY = this.y2 - this.y1;\n const length = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n if (length === 0) {\n return super.getCoords() as [Point, Point, Point, Point];\n }\n\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto' ? this.strokeWidth : this.hitStrokeWidth;\n const halfWidth = Math.max(effectiveStrokeWidth / 2 + 2, 5);\n\n // Unit vector perpendicular to line\n const perpX = -deltaY / length;\n const perpY = deltaX / length;\n\n // Four corners of oriented rectangle\n return [\n new Point(this.x1 + perpX * halfWidth, this.y1 + perpY * halfWidth),\n new Point(this.x2 + perpX * halfWidth, this.y2 + perpY * halfWidth),\n new Point(this.x2 - perpX * halfWidth, this.y2 - perpY * halfWidth),\n new Point(this.x1 - perpX * halfWidth, this.y1 - perpY * halfWidth),\n ];\n }\n return super.getCoords() as [Point, Point, Point, Point];\n }\n\n containsPoint(point: Point): boolean {\n if (this._useEndpointCoords) {\n if (this.canvas?.getActiveObject() === this) {\n return super.containsPoint(point);\n }\n const distance = this._distanceToLineSegment(point.x, point.y);\n const effectiveStrokeWidth =\n this.hitStrokeWidth === 'auto'\n ? this.strokeWidth\n : this.hitStrokeWidth || 1;\n\n const tolerance = Math.max(effectiveStrokeWidth / 2 + 2, 5);\n return distance <= tolerance;\n }\n return super.containsPoint(point);\n }\n\n _distanceToLineSegment(px: number, py: number): number {\n const x1 = this.x1,\n y1 = this.y1,\n x2 = this.x2,\n y2 = this.y2;\n\n const pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n if (pd2 === 0) {\n return Math.sqrt((px - x1) * (px - x1) + (py - y1) * (py - y1));\n }\n\n const u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / pd2;\n\n let closestX: number, closestY: number;\n if (u < 0) {\n closestX = x1;\n closestY = y1;\n } else if (u > 1) {\n closestX = x2;\n closestY = y2;\n } else {\n closestX = x1 + u * (x2 - x1);\n closestY = y1 + u * (y2 - y1);\n }\n\n return Math.sqrt(\n (px - closestX) * (px - closestX) + (py - closestY) * (py - closestY),\n );\n }\n\n _endpointActionHandler(\n eventData: TPointerEvent,\n transformData: Transform,\n x: number,\n y: number,\n ) {\n const controlKey = transformData.corner;\n const pointer = new Point(x, y);\n let newX = pointer.x;\n let newY = pointer.y;\n\n if (eventData.shiftKey) {\n const otherControl = controlKey === 'p1' ? 'p2' : 'p1';\n const otherX = this[otherControl === 'p1' ? 'x1' : 'x2'];\n const otherY = this[otherControl === 'p1' ? 'y1' : 'y2'];\n const snapped = this._snapToAngle(otherX, otherY, newX, newY);\n newX = snapped.x;\n newY = snapped.y;\n }\n\n if (this._useEndpointCoords) {\n if (controlKey === 'p1') {\n this.x1 = newX;\n this.y1 = newY;\n } else if (controlKey === 'p2') {\n this.x2 = newX;\n this.y2 = newY;\n }\n\n // Update gradient coordinates if stroke is a gradient (but not during SVG export)\n if (this.stroke instanceof Gradient && !this._exportingSVG) {\n this.stroke.coords.x1 = this.x1;\n this.stroke.coords.y1 = this.y1;\n this.stroke.coords.x2 = this.x2;\n this.stroke.coords.y2 = this.y2;\n }\n\n this.dirty = true;\n this.setCoords();\n this.canvas?.requestRenderAll();\n return true;\n }\n\n // Fallback for old system\n this._updatingEndpoints = true;\n if (controlKey === 'p1') {\n this.x1 = newX;\n this.y1 = newY;\n } else if (controlKey === 'p2') {\n this.x2 = newX;\n this.y2 = newY;\n }\n this._setWidthHeight();\n this.dirty = true;\n this._updatingEndpoints = false;\n this.canvas?.requestRenderAll();\n this.fire('modified', {\n transform: transformData,\n target: this,\n e: eventData,\n });\n return true;\n }\n\n _snapToAngle(\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n ): { x: number; y: number } {\n const deltaX = toX - fromX;\n const deltaY = toY - fromY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n if (distance === 0) return { x: toX, y: toY };\n let angle = Math.atan2(deltaY, deltaX) * (180 / Math.PI);\n const snapIncrement = 15;\n const snappedAngle = Math.round(angle / snapIncrement) * snapIncrement;\n const snappedRadians = snappedAngle * (Math.PI / 180);\n return {\n x: fromX + Math.cos(snappedRadians) * distance,\n y: fromY + Math.sin(snappedRadians) * distance,\n };\n }\n\n _setWidthHeight(skipReposition = false) {\n this.width = Math.abs(this.x2 - this.x1) || 1;\n this.height = Math.abs(this.y2 - this.y1) || 1;\n if (!skipReposition && !this._updatingEndpoints) {\n const { left, top, width, height } = makeBoundingBoxFromPoints([\n { x: this.x1, y: this.y1 },\n { x: this.x2, y: this.y2 },\n ]);\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n }\n\n _set(key: string, value: any) {\n const oldLeft = this.left;\n const oldTop = this.top;\n super._set(key, value);\n if (coordProps.includes(key as keyof UniqueLineCoords)) {\n this._setWidthHeight();\n this.dirty = true;\n\n // Update gradient coordinates if stroke is a gradient (but not during SVG export)\n if (this.stroke instanceof Gradient && !this._exportingSVG) {\n this.stroke.coords.x1 = this.x1;\n this.stroke.coords.y1 = this.y1;\n this.stroke.coords.x2 = this.x2;\n this.stroke.coords.y2 = this.y2;\n }\n }\n if (\n (key === 'left' || key === 'top') &&\n this.canvas &&\n !this._updatingEndpoints\n ) {\n const deltaX = this.left - oldLeft;\n const deltaY = this.top - oldTop;\n if (deltaX !== 0 || deltaY !== 0) {\n this._updatingEndpoints = true;\n this.x1 += deltaX;\n this.y1 += deltaY;\n this.x2 += deltaX;\n this.y2 += deltaY;\n\n // Update gradient coordinates if stroke is a gradient\n if (this.stroke instanceof Gradient) {\n this.stroke.coords.x1 = this.x1;\n this.stroke.coords.y1 = this.y1;\n this.stroke.coords.x2 = this.x2;\n this.stroke.coords.y2 = this.y2;\n }\n\n this._updatingEndpoints = false;\n }\n }\n return this;\n }\n\n render(ctx: CanvasRenderingContext2D) {\n if (this._useEndpointCoords) {\n this._renderDirectly(ctx);\n return;\n }\n super.render(ctx);\n }\n\n _renderDirectly(ctx: CanvasRenderingContext2D) {\n if (!this.visible) return;\n ctx.save();\n ctx.globalAlpha = this.opacity;\n ctx.lineWidth = this.strokeWidth;\n ctx.lineCap = this.strokeLineCap || 'butt';\n ctx.beginPath();\n ctx.moveTo(this.x1, this.y1);\n ctx.lineTo(this.x2, this.y2);\n\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n } else {\n ctx.strokeStyle = this.stroke?.toString() || '#000';\n }\n\n ctx.stroke();\n ctx.strokeStyle = origStrokeStyle;\n ctx.restore();\n }\n\n _render(ctx: CanvasRenderingContext2D) {\n if (this._useEndpointCoords) return;\n ctx.beginPath();\n const p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n ctx.lineWidth = this.strokeWidth;\n const origStrokeStyle = ctx.strokeStyle;\n if (isFiller(this.stroke)) {\n ctx.strokeStyle = this.stroke.toLive(ctx)!;\n }\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n }\n\n _findCenterFromElement(): Point {\n return new Point((this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2);\n }\n\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n if (this._useEndpointCoords) {\n return {\n ...super.toObject(propertiesToInclude),\n x1: this.x1,\n y1: this.y1,\n x2: this.x2,\n y2: this.y2,\n };\n }\n return {\n ...super.toObject(propertiesToInclude),\n ...this.calcLinePoints(),\n };\n }\n\n _getNonTransformedDimensions(): Point {\n const dim = super._getNonTransformedDimensions();\n if (this.strokeLineCap === 'round') {\n dim.x += this.strokeWidth;\n dim.y += this.strokeWidth;\n }\n return dim;\n }\n\n calcLinePoints(): UniqueLineCoords {\n if (this._updatingEndpoints) {\n const centerX = (this.x1 + this.x2) / 2;\n const centerY = (this.y1 + this.y2) / 2;\n return {\n x1: this.x1 - centerX,\n y1: this.y1 - centerY,\n x2: this.x2 - centerX,\n y2: this.y2 - centerY,\n };\n }\n const { x1: _x1, x2: _x2, y1: _y1, y2: _y2, width, height } = this;\n const xMult = _x1 <= _x2 ? -1 : 1;\n const yMult = _y1 <= _y2 ? -1 : 1;\n return {\n x1: (xMult * width) / 2,\n y1: (yMult * height) / 2,\n x2: (xMult * -width) / 2,\n y2: (yMult * -height) / 2,\n };\n }\n\n _toSVG() {\n if (this._useEndpointCoords) {\n // Use absolute coordinates to bypass all Fabric.js transforms\n // Handle gradients manually for proper SVG export\n let strokeAttr = '';\n if (this.stroke instanceof Gradient) {\n // Let Fabric.js handle gradient definition, but we'll use the reference\n strokeAttr = `stroke=\"url(#${this.stroke.id})\"`;\n } else {\n strokeAttr = `stroke=\"${this.stroke || 'none'}\"`;\n }\n\n return [\n `<line ${strokeAttr} stroke-width=\"${this.strokeWidth}\" stroke-linecap=\"${this.strokeLineCap}\" `,\n `stroke-dasharray=\"${this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none'}\" `,\n `stroke-dashoffset=\"${this.strokeDashOffset}\" stroke-linejoin=\"${this.strokeLineJoin}\" `,\n `stroke-miterlimit=\"${this.strokeMiterLimit}\" fill=\"${this.fill || 'none'}\" `,\n `fill-rule=\"${this.fillRule}\" opacity=\"${this.opacity}\" `,\n `x1=\"${this.x1}\" y1=\"${this.y1}\" x2=\"${this.x2}\" y2=\"${this.y2}\" />\\n`,\n ];\n } else {\n // Use standard calcLinePoints for legacy mode\n const { x1, x2, y1, y2 } = this.calcLinePoints();\n return [\n '<line ',\n 'COMMON_PARTS',\n `x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" />\\n`,\n ];\n }\n }\n\n toSVG(reviver?: (markup: string) => string): string {\n if (this._useEndpointCoords) {\n // For endpoint coords, we need to bypass transforms but still allow gradients\n // Let's temporarily disable transforms during SVG generation\n const originalLeft = this.left;\n const originalTop = this.top;\n\n // Set position to center of line for gradient calculation\n this.left = (this.x1 + this.x2) / 2;\n this.top = (this.y1 + this.y2) / 2;\n\n // Get the SVG with standard system (for gradient handling)\n const standardSVG = super.toSVG(reviver);\n\n // Restore original position\n this.left = originalLeft;\n this.top = originalTop;\n\n // Extract gradient definition and clean up the line element\n // Remove the transform wrapper and update coordinates\n const cleanSVG = standardSVG\n .replace(/<g transform=\"[^\"]*\"[^>]*>/g, '')\n .replace(/<\\/g>/g, '')\n .replace(/x1=\"[^\"]*\"/g, `x1=\"${this.x1}\"`)\n .replace(/y1=\"[^\"]*\"/g, `y1=\"${this.y1}\"`)\n .replace(/x2=\"[^\"]*\"/g, `x2=\"${this.x2}\"`)\n .replace(/y2=\"[^\"]*\"/g, `y2=\"${this.y2}\"`);\n\n return cleanSVG;\n }\n // Use default behavior for legacy mode\n return super.toSVG(reviver);\n }\n\n static ATTRIBUTE_NAMES = SHARED_ATTRIBUTES.concat(coordProps);\n\n static async fromElement(\n element: HTMLElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const {\n x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n ...parsedAttributes\n } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n return new this([x1, y1, x2, y2], parsedAttributes);\n }\n\n static fromObject<T extends TOptions<SerializedLineProps>>({\n x1,\n y1,\n x2,\n y2,\n ...object\n }: T) {\n return this._fromObject<Line>(\n { ...object, points: [x1, y1, x2, y2] },\n { extraParam: 'points' },\n );\n }\n}\n\nclassRegistry.setClass(Line);\nclassRegistry.setSVGClass(Line);\n"],"names":["coordProps","Line","FabricObject","constructor","x1","y1","x2","y2","arguments","length","undefined","options","_defineProperty","setOptions","hitStrokeWidth","hasBorders","hasControls","selectable","hoverCursor","perPixelTargetFind","strokeLineCap","_setWidthHeight","left","top","set","LEFT","TOP","_setupLineControls","controls","p1","Control","x","y","cursorStyle","actionHandler","_endpointActionHandler","bind","positionHandler","_p1PositionHandler","render","_renderEndpointControl","sizeX","sizeY","p2","_p2PositionHandler","Point","transform","getViewportTransform","ctx","size","save","fillStyle","strokeStyle","lineWidth","beginPath","arc","Math","PI","fill","stroke","restore","drawBorders","styleOverride","_useEndpointCoords","_drawLineBorders","_this$canvas","vpt","canvas","viewportTransform","setTransform","borderColor","strokeWidth","lineCap","globalAlpha","isMoving","borderOpacityWhenMoving","moveTo","lineTo","_renderControls","drawControls","getBoundingRect","effectiveStrokeWidth","padding","max","min","width","abs","height","setCoords","hitPadding","center","_findCenterFromElement","getCoords","deltaX","deltaY","sqrt","halfWidth","perpX","perpY","containsPoint","point","_this$canvas2","getActiveObject","distance","_distanceToLineSegment","tolerance","px","py","pd2","u","closestX","closestY","eventData","transformData","_this$canvas4","controlKey","corner","pointer","newX","newY","shiftKey","otherControl","otherX","otherY","snapped","_snapToAngle","_this$canvas3","Gradient","_exportingSVG","coords","dirty","requestRenderAll","_updatingEndpoints","fire","target","e","fromX","fromY","toX","toY","angle","atan2","snapIncrement","snappedAngle","round","snappedRadians","cos","sin","skipReposition","makeBoundingBoxFromPoints","setPositionByOrigin","CENTER","_set","key","value","oldLeft","oldTop","includes","_renderDirectly","visible","opacity","origStrokeStyle","isFiller","toLive","_this$stroke","toString","_render","p","calcLinePoints","_renderStroke","toObject","propertiesToInclude","_getNonTransformedDimensions","dim","centerX","centerY","_x1","_x2","_y1","_y2","xMult","yMult","_toSVG","strokeAttr","id","strokeDashArray","join","strokeDashOffset","strokeLineJoin","strokeMiterLimit","fillRule","toSVG","reviver","originalLeft","originalTop","standardSVG","cleanSVG","replace","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","_ref","object","_fromObject","points","extraParam","cacheProperties","SHARED_ATTRIBUTES","concat","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import type { CSSRules } from '../parser/typedefs';
|
|
|
9
9
|
export declare const polylineDefaultValues: Partial<TClassProperties<Polyline>>;
|
|
10
10
|
export interface SerializedPolylineProps extends SerializedObjectProps {
|
|
11
11
|
points: XY[];
|
|
12
|
+
cornerRadius: number;
|
|
12
13
|
}
|
|
13
14
|
export declare class Polyline<Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>, SProps extends SerializedPolylineProps = SerializedPolylineProps, EventSpec extends ObjectEvents = ObjectEvents> extends FabricObject<Props, SProps, EventSpec> {
|
|
14
15
|
/**
|
|
@@ -26,6 +27,12 @@ export declare class Polyline<Props extends TOptions<FabricObjectProps> = Partia
|
|
|
26
27
|
* @default false
|
|
27
28
|
*/
|
|
28
29
|
exactBoundingBox: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Corner radius for rounded corners
|
|
32
|
+
* @type Number
|
|
33
|
+
* @default 0
|
|
34
|
+
*/
|
|
35
|
+
cornerRadius: number;
|
|
29
36
|
private initialized;
|
|
30
37
|
static ownDefaults: Partial<TClassProperties<Polyline<Partial<FabricObjectProps>, SerializedPolylineProps, ObjectEvents>>>;
|
|
31
38
|
static type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../src/shapes/Polyline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../src/shapes/Polyline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as s}from"../config.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as e}from"../parser/parseAttributes.min.mjs";import{parsePointsAttribute as o}from"../parser/parsePointsAttribute.min.mjs";import{Point as n}from"../Point.min.mjs";import{classRegistry as r}from"../ClassRegistry.min.mjs";import{makeBoundingBoxFromPoints as h}from"../util/misc/boundingBoxFromPoints.min.mjs";import{calcDimensionsMatrix as m,transformPoint as a}from"../util/misc/matrix.min.mjs";import{projectStrokeOnPoints as p}from"../util/misc/projectStroke/index.min.mjs";import{degreesToRadians as c}from"../util/misc/radiansDegreesConversion.min.mjs";import{toFixed as l}from"../util/misc/toFixed.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{SKEW_X as u,SKEW_Y as d,LEFT as g,TOP as k,CENTER as w,SCALE_X as O,SCALE_Y as x}from"../constants.min.mjs";import{applyCornerRadiusToPolygon as y,generateRoundedPolygonPath as j,renderRoundedPolygon as B}from"../util/misc/cornerRadius.min.mjs";import{cacheProperties as _}from"./Object/defaultValues.min.mjs";const D={exactBoundingBox:!1,cornerRadius:0};class b extends f{static getDefaults(){return{...super.getDefaults(),...b.ownDefaults}}constructor(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"strokeDiff",void 0),Object.assign(this,b.ownDefaults),this.setOptions(i),this.points=s;const{left:e,top:o}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof e&&this.set(g,e),"number"==typeof o&&this.set(k,o)}isOpen(){return!0}_projectStrokeOnPoints(t){return p(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};const s=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===s.length)return{left:0,top:0,width:0,height:0,pathOffset:new n,strokeOffset:new n,strokeDiff:new n};const i=h(s),e=m({...t,scaleX:1,scaleY:1}),o=h(this.points.map(t=>a(t,e,!0))),r=new n(this.scaleX,this.scaleY);let p=i.left+i.width/2,l=i.top+i.height/2;return this.exactBoundingBox&&(p-=l*Math.tan(c(this.skewX)),l-=p*Math.tan(c(this.skewY))),{...i,pathOffset:new n(p,l),strokeOffset:new n(o.left,o.top).subtract(new n(i.left,i.top)).multiply(r),strokeDiff:new n(i.width,i.height).subtract(new n(o.width,o.height)).multiply(r)}}_findCenterFromElement(){const t=h(this.points);return new n(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:s,top:i,width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}=this._calcDimensions();this.set({width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}),t&&this.setPositionByOrigin(new n(s+e/2,i+o/2),w,w)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new n(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let r;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var s,i;const{width:e,height:o}=this._calcDimensions(t);r=new n(null!==(s=t.width)&&void 0!==s?s:e,null!==(i=t.height)&&void 0!==i?i:o)}else{var e,o;r=new n(null!==(e=t.width)&&void 0!==e?e:this.width,null!==(o=t.height)&&void 0!==o?o:this.height)}return r.multiply(new n(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,s){const i=this.initialized&&this[t]!==s,e=super._set(t,s);return this.exactBoundingBox&&i&&((t===O||t===x)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),e}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(["cornerRadius",...t]),points:this.points.map(t=>{let{x:s,y:i}=t;return{x:s,y:i}})}}_toSVG(){if(this.cornerRadius>0&&this.points.length>=3){const t=this.pathOffset.x,s=this.pathOffset.y,i=this.points.map(i=>({x:i.x-t,y:i.y-s})),e=y(i,this.cornerRadius);return["<path ","COMMON_PARTS",`d="${j(e,!this.isOpen())}" />\n`]}{const t=[],i=this.pathOffset.x,e=this.pathOffset.y,o=s.NUM_FRACTION_DIGITS;for(let s=0,n=this.points.length;s<n;s++)t.push(l(this.points[s].x-i,o),",",l(this.points[s].y-e,o)," ");return[`<${this.constructor.type.toLowerCase()} `,"COMMON_PARTS",`points="${t.join("")}" />\n`]}}_render(t){const s=this.points.length,i=this.pathOffset.x,e=this.pathOffset.y;if(s&&!isNaN(this.points[s-1].y)){if(this.cornerRadius>0&&s>=3){const s=this.points.map(t=>({x:t.x-i,y:t.y-e})),o=y(s,this.cornerRadius);B(t,o,!this.isOpen())}else{t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-e);for(let o=0;o<s;o++){const s=this.points[o];t.lineTo(s.x-i,s.y-e)}!this.isOpen()&&t.closePath()}this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,s,i){const n=o(t.getAttribute("points")),{left:r,top:h,...m}=e(t,this.ATTRIBUTE_NAMES,i);return new this(n,{...m,...s})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}}t(b,"ownDefaults",D),t(b,"type","Polyline"),t(b,"layoutProperties",[u,d,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),t(b,"cacheProperties",[..._,"points","cornerRadius"]),t(b,"ATTRIBUTE_NAMES",[...i]),r.setClass(b),r.setSVGClass(b);export{b as Polyline,D as polylineDefaultValues};
|
|
2
2
|
//# sourceMappingURL=Polyline.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.min.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial<TProjectStrokeOnPointsOptions>) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","Polyline","FabricObject","getDefaults","super","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","beginPath","moveTo","point","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Polyline.min.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\nimport {\n applyCornerRadiusToPolygon,\n renderRoundedPolygon,\n generateRoundedPolygonPath,\n} from '../util/misc/cornerRadius';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n cornerRadius: 0,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n cornerRadius: number;\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n /**\n * Corner radius for rounded corners\n * @type Number\n * @default 0\n */\n declare cornerRadius: number;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points', 'cornerRadius'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial<TProjectStrokeOnPointsOptions>) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(['cornerRadius', ...propertiesToInclude]),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n if (this.cornerRadius > 0 && this.points.length >= 3) {\n // Generate rounded polygon/polyline as path\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const adjustedPoints = this.points.map(point => ({\n x: point.x - diffX,\n y: point.y - diffY,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());\n return ['<path ', 'COMMON_PARTS', `d=\"${pathData}\" />\\n`];\n } else {\n // Original sharp corners implementation\n const points = [];\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n\n if (this.cornerRadius > 0 && len >= 3) {\n // Render with rounded corners\n const adjustedPoints = this.points.map(point => ({\n x: point.x - x,\n y: point.y - y,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());\n } else {\n // Original sharp corners implementation\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n }\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","cornerRadius","Polyline","FabricObject","getDefaults","super","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","adjustedPoints","point","roundedCorners","applyCornerRadiusToPolygon","generateRoundedPolygonPath","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","renderRoundedPolygon","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
@@ -12,13 +12,15 @@ import { degreesToRadians } from '../util/misc/radiansDegreesConversion.mjs';
|
|
|
12
12
|
import { toFixed } from '../util/misc/toFixed.mjs';
|
|
13
13
|
import { FabricObject } from './Object/FabricObject.mjs';
|
|
14
14
|
import { SKEW_X, SKEW_Y, LEFT, TOP, CENTER, SCALE_X, SCALE_Y } from '../constants.mjs';
|
|
15
|
+
import { applyCornerRadiusToPolygon, generateRoundedPolygonPath, renderRoundedPolygon } from '../util/misc/cornerRadius.mjs';
|
|
15
16
|
import { cacheProperties } from './Object/defaultValues.mjs';
|
|
16
17
|
|
|
17
18
|
const polylineDefaultValues = {
|
|
18
19
|
/**
|
|
19
20
|
* @deprecated transient option soon to be removed in favor of a different design
|
|
20
21
|
*/
|
|
21
|
-
exactBoundingBox: false
|
|
22
|
+
exactBoundingBox: false,
|
|
23
|
+
cornerRadius: 0
|
|
22
24
|
};
|
|
23
25
|
class Polyline extends FabricObject {
|
|
24
26
|
static getDefaults() {
|
|
@@ -232,7 +234,7 @@ class Polyline extends FabricObject {
|
|
|
232
234
|
toObject() {
|
|
233
235
|
let propertiesToInclude = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
234
236
|
return {
|
|
235
|
-
...super.toObject(propertiesToInclude),
|
|
237
|
+
...super.toObject(['cornerRadius', ...propertiesToInclude]),
|
|
236
238
|
points: this.points.map(_ref => {
|
|
237
239
|
let {
|
|
238
240
|
x,
|
|
@@ -252,14 +254,28 @@ class Polyline extends FabricObject {
|
|
|
252
254
|
* of the instance
|
|
253
255
|
*/
|
|
254
256
|
_toSVG() {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
257
|
+
if (this.cornerRadius > 0 && this.points.length >= 3) {
|
|
258
|
+
// Generate rounded polygon/polyline as path
|
|
259
|
+
const diffX = this.pathOffset.x;
|
|
260
|
+
const diffY = this.pathOffset.y;
|
|
261
|
+
const adjustedPoints = this.points.map(point => ({
|
|
262
|
+
x: point.x - diffX,
|
|
263
|
+
y: point.y - diffY
|
|
264
|
+
}));
|
|
265
|
+
const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);
|
|
266
|
+
const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());
|
|
267
|
+
return ['<path ', 'COMMON_PARTS', `d="${pathData}" />\n`];
|
|
268
|
+
} else {
|
|
269
|
+
// Original sharp corners implementation
|
|
270
|
+
const points = [];
|
|
271
|
+
const diffX = this.pathOffset.x;
|
|
272
|
+
const diffY = this.pathOffset.y;
|
|
273
|
+
const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;
|
|
274
|
+
for (let i = 0, len = this.points.length; i < len; i++) {
|
|
275
|
+
points.push(toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ');
|
|
276
|
+
}
|
|
277
|
+
return [`<${this.constructor.type.toLowerCase()} `, 'COMMON_PARTS', `points="${points.join('')}" />\n`];
|
|
261
278
|
}
|
|
262
|
-
return [`<${this.constructor.type.toLowerCase()} `, 'COMMON_PARTS', `points="${points.join('')}" />\n`];
|
|
263
279
|
}
|
|
264
280
|
|
|
265
281
|
/**
|
|
@@ -275,13 +291,24 @@ class Polyline extends FabricObject {
|
|
|
275
291
|
// NaN comes from parseFloat of a empty string in parser
|
|
276
292
|
return;
|
|
277
293
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
294
|
+
if (this.cornerRadius > 0 && len >= 3) {
|
|
295
|
+
// Render with rounded corners
|
|
296
|
+
const adjustedPoints = this.points.map(point => ({
|
|
297
|
+
x: point.x - x,
|
|
298
|
+
y: point.y - y
|
|
299
|
+
}));
|
|
300
|
+
const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);
|
|
301
|
+
renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());
|
|
302
|
+
} else {
|
|
303
|
+
// Original sharp corners implementation
|
|
304
|
+
ctx.beginPath();
|
|
305
|
+
ctx.moveTo(this.points[0].x - x, this.points[0].y - y);
|
|
306
|
+
for (let i = 0; i < len; i++) {
|
|
307
|
+
const point = this.points[i];
|
|
308
|
+
ctx.lineTo(point.x - x, point.y - y);
|
|
309
|
+
}
|
|
310
|
+
!this.isOpen() && ctx.closePath();
|
|
283
311
|
}
|
|
284
|
-
!this.isOpen() && ctx.closePath();
|
|
285
312
|
this._renderPaintInOrder(ctx);
|
|
286
313
|
}
|
|
287
314
|
|
|
@@ -346,10 +373,15 @@ class Polyline extends FabricObject {
|
|
|
346
373
|
* @type Boolean
|
|
347
374
|
* @default false
|
|
348
375
|
*/
|
|
376
|
+
/**
|
|
377
|
+
* Corner radius for rounded corners
|
|
378
|
+
* @type Number
|
|
379
|
+
* @default 0
|
|
380
|
+
*/
|
|
349
381
|
_defineProperty(Polyline, "ownDefaults", polylineDefaultValues);
|
|
350
382
|
_defineProperty(Polyline, "type", 'Polyline');
|
|
351
383
|
_defineProperty(Polyline, "layoutProperties", [SKEW_X, SKEW_Y, 'strokeLineCap', 'strokeLineJoin', 'strokeMiterLimit', 'strokeWidth', 'strokeUniform', 'points']);
|
|
352
|
-
_defineProperty(Polyline, "cacheProperties", [...cacheProperties, 'points']);
|
|
384
|
+
_defineProperty(Polyline, "cacheProperties", [...cacheProperties, 'points', 'cornerRadius']);
|
|
353
385
|
_defineProperty(Polyline, "ATTRIBUTE_NAMES", [...SHARED_ATTRIBUTES]);
|
|
354
386
|
classRegistry.setClass(Polyline);
|
|
355
387
|
classRegistry.setSVGClass(Polyline);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Polyline.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial<TProjectStrokeOnPointsOptions>) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(propertiesToInclude),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n const points = [],\n diffX = this.pathOffset.x,\n diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","Polyline","FabricObject","getDefaults","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","beginPath","moveTo","point","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Polyline.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["import { config } from '../config';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { parsePointsAttribute } from '../parser/parsePointsAttribute';\nimport type { XY } from '../Point';\nimport { Point } from '../Point';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';\nimport { calcDimensionsMatrix, transformPoint } from '../util/misc/matrix';\nimport { projectStrokeOnPoints } from '../util/misc/projectStroke';\nimport type { TProjectStrokeOnPointsOptions } from '../util/misc/projectStroke/types';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { toFixed } from '../util/misc/toFixed';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport {\n CENTER,\n LEFT,\n SCALE_X,\n SCALE_Y,\n SKEW_X,\n SKEW_Y,\n TOP,\n} from '../constants';\nimport type { CSSRules } from '../parser/typedefs';\nimport {\n applyCornerRadiusToPolygon,\n renderRoundedPolygon,\n generateRoundedPolygonPath,\n} from '../util/misc/cornerRadius';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n cornerRadius: 0,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n cornerRadius: number;\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\n /**\n * Points array\n * @type Array\n */\n declare points: XY[];\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated transient option soon to be removed in favor of a different design\n * @type Boolean\n * @default false\n */\n declare exactBoundingBox: boolean;\n\n /**\n * Corner radius for rounded corners\n * @type Number\n * @default 0\n */\n declare cornerRadius: number;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Polyline.ownDefaults,\n };\n }\n\n /**\n * A list of properties that if changed trigger a recalculation of dimensions\n * @todo check if you really need to recalculate for all cases\n */\n static layoutProperties: (keyof Polyline)[] = [\n SKEW_X,\n SKEW_Y,\n 'strokeLineCap',\n 'strokeLineJoin',\n 'strokeMiterLimit',\n 'strokeWidth',\n 'strokeUniform',\n 'points',\n ];\n\n declare pathOffset: Point;\n\n declare strokeOffset: Point;\n\n static cacheProperties = [...cacheProperties, 'points', 'cornerRadius'];\n\n strokeDiff: Point;\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {Polyline} thisArg\n * @example\n * var poly = new Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n constructor(points: XY[] = [], options: Props = {} as Props) {\n super();\n Object.assign(this, Polyline.ownDefaults);\n this.setOptions(options);\n this.points = points;\n const { left, top } = options;\n this.initialized = true;\n this.setBoundingBox(true);\n typeof left === 'number' && this.set(LEFT, left);\n typeof top === 'number' && this.set(TOP, top);\n }\n\n protected isOpen() {\n return true;\n }\n\n private _projectStrokeOnPoints(options: TProjectStrokeOnPointsOptions) {\n return projectStrokeOnPoints(this.points, options, this.isOpen());\n }\n\n /**\n * Calculate the polygon bounding box\n * @private\n */\n _calcDimensions(options?: Partial<TProjectStrokeOnPointsOptions>) {\n options = {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n strokeLineCap: this.strokeLineCap,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeUniform: this.strokeUniform,\n strokeWidth: this.strokeWidth,\n ...(options || {}),\n };\n const points = this.exactBoundingBox\n ? this._projectStrokeOnPoints(\n options as TProjectStrokeOnPointsOptions,\n ).map((projection) => projection.projectedPoint)\n : this.points;\n if (points.length === 0) {\n return {\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n pathOffset: new Point(),\n strokeOffset: new Point(),\n strokeDiff: new Point(),\n };\n }\n const bbox = makeBoundingBoxFromPoints(points),\n // Remove scale effect, since it's applied after\n matrix = calcDimensionsMatrix({ ...options, scaleX: 1, scaleY: 1 }),\n bboxNoStroke = makeBoundingBoxFromPoints(\n this.points.map((p) => transformPoint(p, matrix, true)),\n ),\n scale = new Point(this.scaleX, this.scaleY);\n let offsetX = bbox.left + bbox.width / 2,\n offsetY = bbox.top + bbox.height / 2;\n if (this.exactBoundingBox) {\n offsetX = offsetX - offsetY * Math.tan(degreesToRadians(this.skewX));\n // Order of those assignments is important.\n // offsetY relies on offsetX being already changed by the line above\n offsetY = offsetY - offsetX * Math.tan(degreesToRadians(this.skewY));\n }\n\n return {\n ...bbox,\n pathOffset: new Point(offsetX, offsetY),\n strokeOffset: new Point(bboxNoStroke.left, bboxNoStroke.top)\n .subtract(new Point(bbox.left, bbox.top))\n .multiply(scale),\n strokeDiff: new Point(bbox.width, bbox.height)\n .subtract(new Point(bboxNoStroke.width, bboxNoStroke.height))\n .multiply(scale),\n };\n }\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates, by look at the polyline/polygon points.\n * @private\n * @return {Point} center point from element coordinates\n */\n _findCenterFromElement(): Point {\n const bbox = makeBoundingBoxFromPoints(this.points);\n return new Point(bbox.left + bbox.width / 2, bbox.top + bbox.height / 2);\n }\n\n setDimensions() {\n this.setBoundingBox();\n }\n\n setBoundingBox(adjustPosition?: boolean) {\n const { left, top, width, height, pathOffset, strokeOffset, strokeDiff } =\n this._calcDimensions();\n this.set({ width, height, pathOffset, strokeOffset, strokeDiff });\n adjustPosition &&\n this.setPositionByOrigin(\n new Point(left + width / 2, top + height / 2),\n CENTER,\n CENTER,\n );\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return this.exactBoundingBox;\n }\n\n /**\n * @override stroke is taken in account in size\n */\n _getNonTransformedDimensions() {\n return this.exactBoundingBox\n ? // TODO: fix this\n new Point(this.width, this.height)\n : super._getNonTransformedDimensions();\n }\n\n /**\n * @override stroke and skewing are taken into account when projecting stroke on points,\n * therefore we don't want the default calculation to account for skewing as well.\n * Though it is possible to pass `width` and `height` in `options`, doing so is very strange, use with discretion.\n *\n * @private\n */\n _getTransformedDimensions(options: any = {}) {\n if (this.exactBoundingBox) {\n let size: Point;\n /* When `strokeUniform = true`, any changes to the properties require recalculating the `width` and `height` because\n the stroke projections are affected.\n When `strokeUniform = false`, we don't need to recalculate for scale transformations, as the effect of scale on\n projections follows a linear function (e.g. scaleX of 2 just multiply width by 2)*/\n if (\n Object.keys(options).some(\n (key) =>\n this.strokeUniform ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof TProjectStrokeOnPointsOptions,\n ),\n )\n ) {\n const { width, height } = this._calcDimensions(options);\n size = new Point(options.width ?? width, options.height ?? height);\n } else {\n size = new Point(\n options.width ?? this.width,\n options.height ?? this.height,\n );\n }\n return size.multiply(\n new Point(options.scaleX || this.scaleX, options.scaleY || this.scaleY),\n );\n } else {\n return super._getTransformedDimensions(options);\n }\n }\n\n /**\n * Recalculates dimensions when changing skew and scale\n * @private\n */\n _set(key: string, value: any) {\n const changed = this.initialized && this[key as keyof this] !== value;\n const output = super._set(key, value);\n if (\n this.exactBoundingBox &&\n changed &&\n (((key === SCALE_X || key === SCALE_Y) &&\n this.strokeUniform &&\n (this.constructor as typeof Polyline).layoutProperties.includes(\n 'strokeUniform',\n )) ||\n (this.constructor as typeof Polyline).layoutProperties.includes(\n key as keyof Polyline,\n ))\n ) {\n this.setDimensions();\n }\n return output;\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(['cornerRadius', ...propertiesToInclude]),\n points: this.points.map(({ x, y }) => ({ x, y })),\n };\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG() {\n if (this.cornerRadius > 0 && this.points.length >= 3) {\n // Generate rounded polygon/polyline as path\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const adjustedPoints = this.points.map(point => ({\n x: point.x - diffX,\n y: point.y - diffY,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());\n return ['<path ', 'COMMON_PARTS', `d=\"${pathData}\" />\\n`];\n } else {\n // Original sharp corners implementation\n const points = [];\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;\n\n for (let i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS),\n ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS),\n ' ',\n );\n }\n return [\n `<${\n (this.constructor as typeof Polyline).type.toLowerCase() as\n | 'polyline'\n | 'polygon'\n } `,\n 'COMMON_PARTS',\n `points=\"${points.join('')}\" />\\n`,\n ];\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n const len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return;\n }\n\n if (this.cornerRadius > 0 && len >= 3) {\n // Render with rounded corners\n const adjustedPoints = this.points.map(point => ({\n x: point.x - x,\n y: point.y - y,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());\n } else {\n // Original sharp corners implementation\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (let i = 0; i < len; i++) {\n const point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n !this.isOpen() && ctx.closePath();\n }\n\n this._renderPaintInOrder(ctx);\n }\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity(): number {\n return this.points.length;\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Polyline.fromElement})\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES];\n\n /**\n * Returns Polyline instance from an SVG element\n * @param {HTMLElement} element Element to parser\n * @param {Object} [options] Options object\n */\n static async fromElement(\n element: HTMLElement | SVGElement,\n options?: Abortable,\n cssRules?: CSSRules,\n ) {\n const points = parsePointsAttribute(element.getAttribute('points')),\n // we omit left and top to instruct the constructor to position the object using the bbox\n\n { left, top, ...parsedAttributes } = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules,\n );\n return new this(points, {\n ...parsedAttributes,\n ...options,\n });\n }\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns Polyline instance from an object representation\n * @param {Object} object Object to create an instance from\n * @returns {Promise<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","cornerRadius","Polyline","FabricObject","getDefaults","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","adjustedPoints","point","roundedCorners","applyCornerRadiusToPolygon","pathData","generateRoundedPolygonPath","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","renderRoundedPolygon","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
|