{"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 { cloneDeep } from '../util/internals/cloneDeep';\nimport { CENTER, LEFT, TOP } 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   * @default\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  private declare 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   * 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    'skewX',\n    'skewY',\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({ ...options, 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 === 'scaleX' || key === 'scaleY') &&\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: cloneDeep(this.points),\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   * @static\n   * @memberOf Polyline\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   * @static\n   * @memberOf Polyline\n   * @param {HTMLElement} element Element to parser\n   * @param {Object} [options] Options object\n   */\n  static async fromElement(\n    element: HTMLElement,\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      // eslint-disable-next-line @typescript-eslint/no-unused-vars\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   * @static\n   * @memberOf Polyline\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","_objectSpread","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","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","Object","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","toObject","propertiesToInclude","cloneDeep","_toSVG","diffX","x","diffY","y","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","concat","type","toLowerCase","join","_render","ctx","isNaN","beginPath","moveTo","point","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","parsedAttributes","_objectWithoutProperties","_excluded","fromObject","object","_fromObject","extraParam","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}