Skip to content

Commit 375a0d2

Browse files
committed
fix: Fix the infinite loop caused by equalizeSegments in special cases
1 parent 633e97d commit 375a0d2

1 file changed

Lines changed: 25 additions & 19 deletions

File tree

src/path/util/equalize-segments.ts

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { segmentCubicFactory } from './segment-cubic-factory';
44

55
type SplitArray = [number, number, number, number, number, number, number, number, number];
66

7+
const MAX_RECURSION_DEPTH = 50;
8+
79
function splitCubic(pts: SplitArray, t = 0.5): [CurveArray, CurveArray] {
810
const p0 = pts.slice(0, 2) as [number, number];
911
const p1 = pts.slice(2, 4) as [number, number];
@@ -32,17 +34,17 @@ function getCurveArray(segments: PathArray) {
3234
// @ts-ignore
3335
const curveLength = i
3436
? segmentCubicFactory(
35-
segmentData[0],
36-
segmentData[1],
37-
segmentData[2],
38-
segmentData[3],
39-
segmentData[4],
40-
segmentData[5],
41-
segmentData[6],
42-
segmentData[7],
43-
segmentData[8],
44-
{ bbox: false },
45-
).length
37+
segmentData[0],
38+
segmentData[1],
39+
segmentData[2],
40+
segmentData[3],
41+
segmentData[4],
42+
segmentData[5],
43+
segmentData[6],
44+
segmentData[7],
45+
segmentData[8],
46+
{ bbox: false },
47+
).length
4648
: 0;
4749

4850
let subsegs;
@@ -61,7 +63,11 @@ function getCurveArray(segments: PathArray) {
6163
});
6264
}
6365

64-
export function equalizeSegments(path1: PathArray, path2: PathArray, TL?: number): CurveArray[] {
66+
export function equalizeSegments(path1: PathArray, path2: PathArray, TL?: number, depth = 0): CurveArray[] {
67+
if (depth > MAX_RECURSION_DEPTH) {
68+
console.warn('Maximum recursion depth reached in equalizeSegments');
69+
return [path1, path2] as CurveArray[];
70+
}
6571
const c1 = getCurveArray(path1);
6672
const c2 = getCurveArray(path2);
6773
const L1 = c1.length;
@@ -79,13 +85,13 @@ export function equalizeSegments(path1: PathArray, path2: PathArray, TL?: number
7985
x.l === tl
8086
? x.map((y) => y.s)
8187
: x
82-
.map((y, j) => {
83-
canSplit = j && dif[i] && y.l >= mm[i];
84-
dif[i] -= canSplit ? 1 : 0;
85-
return canSplit ? y.ss : [y.s];
86-
})
87-
.flat(),
88+
.map((y, j) => {
89+
canSplit = j && dif[i] && y.l >= mm[i];
90+
dif[i] -= canSplit ? 1 : 0;
91+
return canSplit ? y.ss : [y.s];
92+
})
93+
.flat(),
8894
) as CurveArray[];
8995

90-
return result[0].length === result[1].length ? result : equalizeSegments(result[0], result[1], tl);
96+
return result[0].length === result[1].length ? result : equalizeSegments(result[0], result[1], tl, depth + 1);
9197
}

0 commit comments

Comments
 (0)