{"version":3,"file":"index.mjs","sources":["../../../../../src/util/misc/projectStroke/index.ts"],"sourcesContent":["import { Point, type XY } from '../../../Point';\nimport { findIndexRight } from '../../internals/findRight';\nimport { StrokeLineCapProjections } from './StrokeLineCapProjections';\nimport { StrokeLineJoinProjections } from './StrokeLineJoinProjections';\nimport type { TProjection, TProjectStrokeOnPointsOptions } from './types';\n\nexport * from './types';\n\n/**\n *\n * Used to calculate object's bounding box\n *\n * @see https://github.com/fabricjs/fabric.js/pull/8344\n *\n */\nexport const projectStrokeOnPoints = (\n  points: XY[],\n  options: TProjectStrokeOnPointsOptions,\n  openPath = false,\n): TProjection[] => {\n  const projections: TProjection[] = [];\n\n  if (points.length === 0) {\n    return projections;\n  }\n\n  // first we remove duplicate neighboring points\n  const reduced = points.reduce(\n    (reduced, point) => {\n      if (!reduced[reduced.length - 1].eq(point)) {\n        reduced.push(new Point(point));\n      }\n      return reduced;\n    },\n    [new Point(points[0])],\n  );\n\n  if (reduced.length === 1) {\n    openPath = true;\n  } else if (!openPath) {\n    // remove points from end in case they equal the first point\n    // in order to correctly project the first point\n    const start = reduced[0];\n    const index = findIndexRight(reduced, (point) => !point.eq(start));\n    reduced.splice(index + 1);\n  }\n\n  reduced.forEach((A, index, points) => {\n    let B: XY, C: XY;\n    if (index === 0) {\n      C = points[1];\n      B = openPath ? A : points[points.length - 1];\n    } else if (index === points.length - 1) {\n      B = points[index - 1];\n      C = openPath ? A : points[0];\n    } else {\n      B = points[index - 1];\n      C = points[index + 1];\n    }\n\n    if (openPath && points.length === 1) {\n      projections.push(\n        ...new StrokeLineCapProjections(A, A, options).project(),\n      );\n    } else if (openPath && (index === 0 || index === points.length - 1)) {\n      projections.push(\n        ...new StrokeLineCapProjections(\n          A,\n          index === 0 ? C : B,\n          options,\n        ).project(),\n      );\n    } else {\n      projections.push(\n        ...new StrokeLineJoinProjections(A, B, C, options).project(),\n      );\n    }\n  });\n\n  return projections;\n};\n"],"names":["projectStrokeOnPoints","points","options","openPath","arguments","length","undefined","projections","reduced","reduce","point","eq","push","Point","start","index","findIndexRight","splice","forEach","A","B","C","StrokeLineCapProjections","project","StrokeLineJoinProjections"],"mappings":"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"}