fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 4.99 kB
Source Map (JSON)
{"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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"}