@flighthq/path-boolean 0.5.1-next.3269.831c174 → 0.5.1-next.3308.79ae053

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/README.md CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/path-boolean`. The `
13
13
  This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
14
14
 
15
15
  - [Flight project](https://github.com/flighthq/flight)
16
- - [Source for @flighthq/path-boolean@0.5.1-next.3269.831c174](https://github.com/flighthq/flight/tree/831c174bfb28953d8f2cebaefa5a2743e35045e3/packages/path-boolean)
17
- - [License](https://github.com/flighthq/flight/blob/831c174bfb28953d8f2cebaefa5a2743e35045e3/LICENSE.md)
16
+ - [Source for @flighthq/path-boolean@0.5.1-next.3308.79ae053](https://github.com/flighthq/flight/tree/79ae05332d95f01cdbd3492cf912bbd3b8f9658a/packages/path-boolean)
17
+ - [License](https://github.com/flighthq/flight/blob/79ae05332d95f01cdbd3492cf912bbd3b8f9658a/LICENSE.md)
@@ -1,7 +1,7 @@
1
1
  import type { PathBooleanKernel, Path, PathBooleanOperation, PathBooleanOptions } from '@flighthq/types/contract';
2
- export declare function booleanPaths(pathBooleanKernel: Readonly<PathBooleanKernel>, subject: Readonly<Path>, clip: Readonly<Path>, operation: PathBooleanOperation, out?: Path, options?: Readonly<PathBooleanOptions>): Path;
3
- export declare function differencePaths(pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, out?: Path, options?: Readonly<PathBooleanOptions>): Path;
4
- export declare function intersectPaths(pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, out?: Path, options?: Readonly<PathBooleanOptions>): Path;
5
- export declare function unionPaths(pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, out?: Path, options?: Readonly<PathBooleanOptions>): Path;
6
- export declare function xorPaths(pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, out?: Path, options?: Readonly<PathBooleanOptions>): Path;
2
+ export declare function booleanPaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, subject: Readonly<Path>, clip: Readonly<Path>, operation: PathBooleanOperation, options?: Readonly<PathBooleanOptions>): void;
3
+ export declare function differencePaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, options?: Readonly<PathBooleanOptions>): void;
4
+ export declare function intersectPaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, options?: Readonly<PathBooleanOptions>): void;
5
+ export declare function unionPaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, options?: Readonly<PathBooleanOptions>): void;
6
+ export declare function xorPaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, a: Readonly<Path>, b: Readonly<Path>, options?: Readonly<PathBooleanOptions>): void;
7
7
  //# sourceMappingURL=booleanPaths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"booleanPaths.d.ts","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIlH,wBAAgB,YAAY,CAC1B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,EACvB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,SAAS,EAAE,oBAAoB,EAC/B,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAMN;AAED,wBAAgB,eAAe,CAC7B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,UAAU,CACxB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,QAAQ,CACtB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN"}
1
+ {"version":3,"file":"booleanPaths.d.ts","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIlH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,EACvB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,SAAS,EAAE,oBAAoB,EAC/B,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAMN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN"}
@@ -1,22 +1,22 @@
1
1
  import { flattenPath } from '@flighthq/path/contract';
2
2
  import { writePathBooleanContours } from "./writePathBooleanContours.js";
3
- export function booleanPaths(pathBooleanKernel, subject, clip, operation, out, options) {
3
+ export function booleanPaths(out, pathBooleanKernel, subject, clip, operation, options) {
4
4
  const fillRule = options?.fillRule ?? 'nonZero';
5
5
  const subjectContours = flattenPath(subject, options?.tolerance);
6
6
  const clipContours = flattenPath(clip, options?.tolerance);
7
7
  const result = pathBooleanKernel.computePathBoolean(subjectContours, clipContours, operation, fillRule);
8
- return writePathBooleanContours(result, out);
8
+ writePathBooleanContours(out, result);
9
9
  }
10
- export function differencePaths(pathBooleanKernel, a, b, out, options) {
11
- return booleanPaths(pathBooleanKernel, a, b, 'difference', out, options);
10
+ export function differencePaths(out, pathBooleanKernel, a, b, options) {
11
+ booleanPaths(out, pathBooleanKernel, a, b, 'difference', options);
12
12
  }
13
- export function intersectPaths(pathBooleanKernel, a, b, out, options) {
14
- return booleanPaths(pathBooleanKernel, a, b, 'intersection', out, options);
13
+ export function intersectPaths(out, pathBooleanKernel, a, b, options) {
14
+ booleanPaths(out, pathBooleanKernel, a, b, 'intersection', options);
15
15
  }
16
- export function unionPaths(pathBooleanKernel, a, b, out, options) {
17
- return booleanPaths(pathBooleanKernel, a, b, 'union', out, options);
16
+ export function unionPaths(out, pathBooleanKernel, a, b, options) {
17
+ booleanPaths(out, pathBooleanKernel, a, b, 'union', options);
18
18
  }
19
- export function xorPaths(pathBooleanKernel, a, b, out, options) {
20
- return booleanPaths(pathBooleanKernel, a, b, 'xor', out, options);
19
+ export function xorPaths(out, pathBooleanKernel, a, b, options) {
20
+ booleanPaths(out, pathBooleanKernel, a, b, 'xor', options);
21
21
  }
22
22
  //# sourceMappingURL=booleanPaths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"booleanPaths.js","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,YAAY,CAC1B,iBAA8C,EAC9C,OAAuB,EACvB,IAAoB,EACpB,SAA+B,EAC/B,GAAU,EACV,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxG,OAAO,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,GAAU,EACV,OAAsC;IAEtC,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,GAAU,EACV,OAAsC;IAEtC,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,GAAU,EACV,OAAsC;IAEtC,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,GAAU,EACV,OAAsC;IAEtC,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"booleanPaths.js","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,YAAY,CAC1B,GAAS,EACT,iBAA8C,EAC9C,OAAuB,EACvB,IAAoB,EACpB,SAA+B,EAC/B,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAS,EACT,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAS,EACT,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,GAAS,EACT,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,GAAS,EACT,iBAA8C,EAC9C,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC"}
@@ -1,4 +1,4 @@
1
- import { flattenPath } from '@flighthq/path/contract';
1
+ import { createPath, flattenPath } from '@flighthq/path/contract';
2
2
  import { offsetPath } from "./offsetPath.js";
3
3
  import { simplifyPath } from "./simplifyPath.js";
4
4
  export function explainOffsetPath(pathBooleanKernel, path, delta, options) {
@@ -6,15 +6,15 @@ export function explainOffsetPath(pathBooleanKernel, path, delta, options) {
6
6
  return { operation: 'offset', reason: 'non-finite-delta' };
7
7
  if (flattenPath(path, options?.tolerance).length === 0)
8
8
  return { operation: 'offset', reason: 'empty-input' };
9
- return offsetPath(pathBooleanKernel, path, delta, options).commands.length === 0
10
- ? { operation: 'offset', reason: 'collapsed-or-degenerate' }
11
- : null;
9
+ const out = createPath('nonZero');
10
+ offsetPath(out, pathBooleanKernel, path, delta, options);
11
+ return out.commands.length === 0 ? { operation: 'offset', reason: 'collapsed-or-degenerate' } : null;
12
12
  }
13
13
  export function explainSimplifyPath(pathBooleanKernel, path, options) {
14
14
  if (flattenPath(path, options?.tolerance).length === 0)
15
15
  return { operation: 'simplify', reason: 'empty-input' };
16
- return simplifyPath(pathBooleanKernel, path, options).commands.length === 0
17
- ? { operation: 'simplify', reason: 'collapsed-or-degenerate' }
18
- : null;
16
+ const out = createPath('nonZero');
17
+ simplifyPath(out, pathBooleanKernel, path, options);
18
+ return out.commands.length === 0 ? { operation: 'simplify', reason: 'collapsed-or-degenerate' } : null;
19
19
  }
20
20
  //# sourceMappingURL=explainPathBoolean.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"explainPathBoolean.js","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAStD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,iBAAiB,CAC/B,iBAA8C,EAC9C,IAAoB,EACpB,KAAa,EACb,OAAqC;IAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACxF,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC9G,OAAO,UAAU,CAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC9E,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC5D,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,iBAA8C,EAC9C,IAAoB,EACpB,OAAsC;IAEtC,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAChH,OAAO,YAAY,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACzE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE;QAC9D,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"explainPathBoolean.js","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AASlE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,iBAAiB,CAC/B,iBAA8C,EAC9C,IAAoB,EACpB,KAAa,EACb,OAAqC;IAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACxF,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC9G,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,iBAA8C,EAC9C,IAAoB,EACpB,OAAsC;IAEtC,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAChH,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAClC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzG,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { PathBooleanKernel, Path, PathOffsetOptions } from '@flighthq/types/contract';
2
- export declare function offsetPath(pathBooleanKernel: Readonly<PathBooleanKernel>, path: Readonly<Path>, delta: number, options?: Readonly<PathOffsetOptions>, out?: Path): Path;
2
+ export declare function offsetPath(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, path: Readonly<Path>, delta: number, options?: Readonly<PathOffsetOptions>): void;
3
3
  //# sourceMappingURL=offsetPath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"offsetPath.d.ts","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,IAAI,EAGJ,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAclC,wBAAgB,UAAU,CACxB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,GAAG,CAAC,EAAE,IAAI,GACT,IAAI,CAgDN"}
1
+ {"version":3,"file":"offsetPath.d.ts","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,IAAI,EAGJ,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAclC,wBAAgB,UAAU,CACxB,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GACpC,IAAI,CAgDN"}
@@ -1,7 +1,7 @@
1
1
  import { flattenPath } from '@flighthq/path/contract';
2
2
  import { resolvePathRegions } from "./resolvePathRegions.js";
3
3
  // Offsets a path outward (positive `delta`, inflate) or inward (negative `delta`, deflate) by a signed
4
- // distance, returning a fresh polygon-outline `Path`. The input is flattened to polygon contours at the
4
+ // distance, writing a polygon outline into `out`. The input is flattened to polygon contours at the
5
5
  // option tolerance; each closed contour is offset into a grown/shrunk ring and each open contour is
6
6
  // offset into a closed slab outline capped at both terminals. Corner style on the convex side of a
7
7
  // vertex is chosen by `options.join` (miter/bevel/round/square); open-path terminals by `options.end`
@@ -10,7 +10,7 @@ import { resolvePathRegions } from "./resolvePathRegions.js";
10
10
  // clean, hole-correct outline. `delta` is signed against a canonical orientation, so positive always
11
11
  // grows regardless of input winding. Over-deflating a region past self-collapse drops it, so the result
12
12
  // can be an empty path (no commands).
13
- export function offsetPath(pathBooleanKernel, path, delta, options, out) {
13
+ export function offsetPath(out, pathBooleanKernel, path, delta, options) {
14
14
  const join = options?.join ?? 'miter';
15
15
  const end = options?.end ?? 'butt';
16
16
  const miterLimit = options?.miterLimit ?? DEFAULT_MITER_LIMIT;
@@ -61,7 +61,7 @@ export function offsetPath(pathBooleanKernel, path, delta, options, out) {
61
61
  // corner's inner-miter emission overshoots on a feature narrower than 2·|delta|, it dissolves the
62
62
  // negatively-wound self-overlap that non-zero fill would have kept; it also merges touching rings and
63
63
  // emits a clean, hole-correct outline (empty ring set → empty path).
64
- return resolvePathRegions(pathBooleanKernel, rawRings, 'positive', out);
64
+ resolvePathRegions(out, pathBooleanKernel, rawRings, 'positive');
65
65
  }
66
66
  // Assembles one offset ring for a closed vertex loop by walking its vertices and emitting, at each, the
67
67
  // join (or end cap, for the flagged terminal indices of an open-path loop) that bridges the offset end
@@ -1 +1 @@
1
- {"version":3,"file":"offsetPath.js","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"offsetPath.js","sourceRoot":"","sources":["../src/offsetPath.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { PathBooleanKernel, Path, PathBooleanContour, PathBooleanFillRule } from '@flighthq/types/contract';
2
- export declare function resolvePathRegions(pathBooleanKernel: Readonly<PathBooleanKernel>, rings: readonly PathBooleanContour[], fillRule: PathBooleanFillRule, out?: Path): Path;
2
+ export declare function resolvePathRegions(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, rings: readonly PathBooleanContour[], fillRule: PathBooleanFillRule): void;
3
3
  //# sourceMappingURL=resolvePathRegions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePathRegions.d.ts","sourceRoot":"","sources":["../src/resolvePathRegions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIjH,wBAAgB,kBAAkB,CAChC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,CAAC,EAAE,IAAI,GACT,IAAI,CAIN"}
1
+ {"version":3,"file":"resolvePathRegions.d.ts","sourceRoot":"","sources":["../src/resolvePathRegions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIjH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAON"}
@@ -1,9 +1,11 @@
1
1
  import { writePathBooleanContours } from "./writePathBooleanContours.js";
2
- export function resolvePathRegions(pathBooleanKernel, rings, fillRule, out) {
3
- if (rings.length === 0)
4
- return writePathBooleanContours(EMPTY_CONTOURS, out);
2
+ export function resolvePathRegions(out, pathBooleanKernel, rings, fillRule) {
3
+ if (rings.length === 0) {
4
+ writePathBooleanContours(out, EMPTY_CONTOURS);
5
+ return;
6
+ }
5
7
  const resolved = pathBooleanKernel.computePathBoolean(rings, EMPTY_CONTOURS, 'union', fillRule);
6
- return writePathBooleanContours(resolved, out);
8
+ writePathBooleanContours(out, resolved);
7
9
  }
8
10
  const EMPTY_CONTOURS = [];
9
11
  //# sourceMappingURL=resolvePathRegions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePathRegions.js","sourceRoot":"","sources":["../src/resolvePathRegions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAChC,iBAA8C,EAC9C,KAAoC,EACpC,QAA6B,EAC7B,GAAU;IAEV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChG,OAAO,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,cAAc,GAAkC,EAAE,CAAC"}
1
+ {"version":3,"file":"resolvePathRegions.js","sourceRoot":"","sources":["../src/resolvePathRegions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAChC,GAAS,EACT,iBAA8C,EAC9C,KAAoC,EACpC,QAA6B;IAE7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,wBAAwB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,cAAc,GAAkC,EAAE,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { PathBooleanKernel, Path, PathBooleanOptions } from '@flighthq/types/contract';
2
- export declare function simplifyPath(pathBooleanKernel: Readonly<PathBooleanKernel>, path: Readonly<Path>, options?: Readonly<PathBooleanOptions>, out?: Path): Path;
2
+ export declare function simplifyPath(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, path: Readonly<Path>, options?: Readonly<PathBooleanOptions>): void;
3
3
  //# sourceMappingURL=simplifyPath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplifyPath.d.ts","sourceRoot":"","sources":["../src/simplifyPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI5F,wBAAgB,YAAY,CAC1B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACtC,GAAG,CAAC,EAAE,IAAI,GACT,IAAI,CAIN"}
1
+ {"version":3,"file":"simplifyPath.d.ts","sourceRoot":"","sources":["../src/simplifyPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI5F,wBAAgB,YAAY,CAC1B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAIN"}
@@ -1,8 +1,8 @@
1
1
  import { flattenPath } from '@flighthq/path/contract';
2
2
  import { resolvePathRegions } from "./resolvePathRegions.js";
3
- export function simplifyPath(pathBooleanKernel, path, options, out) {
3
+ export function simplifyPath(out, pathBooleanKernel, path, options) {
4
4
  const fillRule = options?.fillRule ?? 'nonZero';
5
5
  const contours = flattenPath(path, options?.tolerance);
6
- return resolvePathRegions(pathBooleanKernel, contours, fillRule, out);
6
+ resolvePathRegions(out, pathBooleanKernel, contours, fillRule);
7
7
  }
8
8
  //# sourceMappingURL=simplifyPath.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplifyPath.js","sourceRoot":"","sources":["../src/simplifyPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,UAAU,YAAY,CAC1B,iBAA8C,EAC9C,IAAoB,EACpB,OAAsC,EACtC,GAAU;IAEV,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,OAAO,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"simplifyPath.js","sourceRoot":"","sources":["../src/simplifyPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,UAAU,YAAY,CAC1B,GAAS,EACT,iBAA8C,EAC9C,IAAoB,EACpB,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { PathBooleanKernel, Path, PathBooleanOptions } from '@flighthq/types/contract';
2
- export declare function unionAllPaths(pathBooleanKernel: Readonly<PathBooleanKernel>, paths: readonly Readonly<Path>[], out?: Path, options?: Readonly<PathBooleanOptions>): Path;
2
+ export declare function unionAllPaths(out: Path, pathBooleanKernel: Readonly<PathBooleanKernel>, paths: readonly Readonly<Path>[], options?: Readonly<PathBooleanOptions>): void;
3
3
  //# sourceMappingURL=unionAllPaths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unionAllPaths.d.ts","sourceRoot":"","sources":["../src/unionAllPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAsB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIhH,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,KAAK,EAAE,SAAS,QAAQ,CAAC,IAAI,CAAC,EAAE,EAChC,GAAG,CAAC,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAYN"}
1
+ {"version":3,"file":"unionAllPaths.d.ts","sourceRoot":"","sources":["../src/unionAllPaths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAsB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIhH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAC9C,KAAK,EAAE,SAAS,QAAQ,CAAC,IAAI,CAAC,EAAE,EAChC,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAYN"}
@@ -1,6 +1,6 @@
1
1
  import { flattenPath } from '@flighthq/path/contract';
2
2
  import { writePathBooleanContours } from "./writePathBooleanContours.js";
3
- export function unionAllPaths(pathBooleanKernel, paths, out, options) {
3
+ export function unionAllPaths(out, pathBooleanKernel, paths, options) {
4
4
  const fillRule = options?.fillRule ?? 'nonZero';
5
5
  const contours = [];
6
6
  for (const path of paths) {
@@ -10,7 +10,7 @@ export function unionAllPaths(pathBooleanKernel, paths, out, options) {
10
10
  const result = contours.length === 0
11
11
  ? EMPTY_CONTOURS
12
12
  : pathBooleanKernel.computePathBoolean(contours, EMPTY_CONTOURS, 'union', fillRule);
13
- return writePathBooleanContours(result, out);
13
+ writePathBooleanContours(out, result);
14
14
  }
15
15
  const EMPTY_CONTOURS = [];
16
16
  //# sourceMappingURL=unionAllPaths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unionAllPaths.js","sourceRoot":"","sources":["../src/unionAllPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,aAAa,CAC3B,iBAA8C,EAC9C,KAAgC,EAChC,GAAU,EACV,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExF,OAAO,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,cAAc,GAAkC,EAAE,CAAC"}
1
+ {"version":3,"file":"unionAllPaths.js","sourceRoot":"","sources":["../src/unionAllPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,UAAU,aAAa,CAC3B,GAAS,EACT,iBAA8C,EAC9C,KAAgC,EAChC,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExF,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,cAAc,GAAkC,EAAE,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { Path, PathBooleanContour } from '@flighthq/types/contract';
2
- export declare function writePathBooleanContours(contours: readonly PathBooleanContour[], out?: Path): Path;
2
+ export declare function writePathBooleanContours(out: Path, contours: readonly PathBooleanContour[]): void;
3
3
  //# sourceMappingURL=writePathBooleanContours.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writePathBooleanContours.d.ts","sourceRoot":"","sources":["../src/writePathBooleanContours.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAYlG"}
1
+ {"version":3,"file":"writePathBooleanContours.d.ts","sourceRoot":"","sources":["../src/writePathBooleanContours.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAUjG"}
@@ -1,17 +1,15 @@
1
- import { appendPathClose, appendPathLineTo, appendPathMoveTo, createPath } from '@flighthq/path/contract';
2
- export function writePathBooleanContours(contours, out) {
3
- const path = out ?? createPath('nonZero');
4
- path.commands.length = 0;
5
- path.data.length = 0;
6
- path.winding = 'nonZero';
1
+ import { appendPathClose, appendPathLineTo, appendPathMoveTo } from '@flighthq/path/contract';
2
+ export function writePathBooleanContours(out, contours) {
3
+ out.commands.length = 0;
4
+ out.data.length = 0;
5
+ out.winding = 'nonZero';
7
6
  for (const ring of contours) {
8
7
  if (ring.length < 6)
9
8
  continue;
10
- appendPathMoveTo(path, ring[0], ring[1]);
9
+ appendPathMoveTo(out, ring[0], ring[1]);
11
10
  for (let i = 2; i < ring.length; i += 2)
12
- appendPathLineTo(path, ring[i], ring[i + 1]);
13
- appendPathClose(path);
11
+ appendPathLineTo(out, ring[i], ring[i + 1]);
12
+ appendPathClose(out);
14
13
  }
15
- return path;
16
14
  }
17
15
  //# sourceMappingURL=writePathBooleanContours.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"writePathBooleanContours.js","sourceRoot":"","sources":["../src/writePathBooleanContours.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1G,MAAM,UAAU,wBAAwB,CAAC,QAAuC,EAAE,GAAU;IAC1F,MAAM,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtF,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"writePathBooleanContours.js","sourceRoot":"","sources":["../src/writePathBooleanContours.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG9F,MAAM,UAAU,wBAAwB,CAAC,GAAS,EAAE,QAAuC;IACzF,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,eAAe,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/path-boolean",
3
- "version": "0.5.1-next.3269.831c174",
3
+ "version": "0.5.1-next.3308.79ae053",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,9 +38,9 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.5.1-next.3269.831c174",
42
- "@flighthq/path": "0.5.1-next.3269.831c174",
43
- "@flighthq/types": "0.5.1-next.3269.831c174"
41
+ "@flighthq/entity": "0.5.1-next.3308.79ae053",
42
+ "@flighthq/path": "0.5.1-next.3308.79ae053",
43
+ "@flighthq/types": "0.5.1-next.3308.79ae053"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "^5.3.0"
@@ -49,39 +49,39 @@ describe('booleanPaths', () => {
49
49
  it('dispatches to the operation named in the argument', () => {
50
50
  const a = rectanglePath(0, 0, 10, 10);
51
51
  const b = rectanglePath(5, 5, 10, 10);
52
- expect(pathFilledArea(booleanPaths(kernel, a, b, 'union'))).toBeCloseTo(175, 4);
53
- expect(pathFilledArea(booleanPaths(kernel, a, b, 'intersection'))).toBeCloseTo(25, 4);
54
- expect(pathFilledArea(booleanPaths(kernel, a, b, 'difference'))).toBeCloseTo(75, 4);
55
- expect(pathFilledArea(booleanPaths(kernel, a, b, 'xor'))).toBeCloseTo(150, 4);
52
+ const union = createPath();
53
+ const intersection = createPath();
54
+ const difference = createPath();
55
+ const xor = createPath();
56
+ booleanPaths(union, kernel, a, b, 'union');
57
+ booleanPaths(intersection, kernel, a, b, 'intersection');
58
+ booleanPaths(difference, kernel, a, b, 'difference');
59
+ booleanPaths(xor, kernel, a, b, 'xor');
60
+ expect(pathFilledArea(union)).toBeCloseTo(175, 4);
61
+ expect(pathFilledArea(intersection)).toBeCloseTo(25, 4);
62
+ expect(pathFilledArea(difference)).toBeCloseTo(75, 4);
63
+ expect(pathFilledArea(xor)).toBeCloseTo(150, 4);
56
64
  });
57
65
 
58
- it('returns a fresh non-zero path when out is omitted', () => {
59
- const result = booleanPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(20, 20, 5, 5), 'union');
60
- expect(result.winding).toBe('nonZero');
61
- expect(result.commands.length).toBeGreaterThan(0);
62
- });
63
-
64
- it('writes into the provided out path and returns it', () => {
65
- const out = createPath('nonZero');
66
- const returned = booleanPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10), 'union', out);
67
- expect(returned).toBe(out);
66
+ it('writes into the required out path', () => {
67
+ const out = createPath('evenOdd');
68
+ booleanPaths(out, kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10), 'union');
68
69
  expect(pathFilledArea(out)).toBeCloseTo(175, 4);
70
+ expect(out.winding).toBe('nonZero');
69
71
  });
70
72
 
71
73
  it('is safe when out aliases the subject input', () => {
72
74
  const a = rectanglePath(0, 0, 10, 10);
73
75
  const b = rectanglePath(5, 5, 10, 10);
74
- const result = booleanPaths(kernel, a, b, 'union', a);
75
- expect(result).toBe(a);
76
- expect(pathFilledArea(result)).toBeCloseTo(175, 4);
76
+ booleanPaths(a, kernel, a, b, 'union');
77
+ expect(pathFilledArea(a)).toBeCloseTo(175, 4);
77
78
  });
78
79
 
79
80
  it('is safe when out aliases the clip input', () => {
80
81
  const a = rectanglePath(0, 0, 10, 10);
81
82
  const b = rectanglePath(5, 5, 10, 10);
82
- const result = booleanPaths(kernel, a, b, 'intersection', b);
83
- expect(result).toBe(b);
84
- expect(pathFilledArea(result)).toBeCloseTo(25, 4);
83
+ booleanPaths(b, kernel, a, b, 'intersection');
84
+ expect(pathFilledArea(b)).toBeCloseTo(25, 4);
85
85
  });
86
86
 
87
87
  it('honors the even-odd fill rule option on self-overlapping input', () => {
@@ -89,26 +89,27 @@ describe('booleanPaths', () => {
89
89
  appendPathRectangle(a, 0, 0, 10, 10);
90
90
  appendPathRectangle(a, 5, 5, 10, 10);
91
91
  const empty = createPath('nonZero');
92
- expect(pathFilledArea(booleanPaths(kernel, a, empty, 'union', undefined, { fillRule: 'nonZero' }))).toBeCloseTo(
93
- 175,
94
- 4,
95
- );
96
- expect(pathFilledArea(booleanPaths(kernel, a, empty, 'union', undefined, { fillRule: 'evenOdd' }))).toBeCloseTo(
97
- 150,
98
- 4,
99
- );
92
+ const nonZero = createPath();
93
+ const evenOdd = createPath();
94
+ booleanPaths(nonZero, kernel, a, empty, 'union', { fillRule: 'nonZero' });
95
+ booleanPaths(evenOdd, kernel, a, empty, 'union', { fillRule: 'evenOdd' });
96
+ expect(pathFilledArea(nonZero)).toBeCloseTo(175, 4);
97
+ expect(pathFilledArea(evenOdd)).toBeCloseTo(150, 4);
100
98
  });
101
99
 
102
100
  it('accepts a coarser tolerance option without error', () => {
103
101
  const a = rectanglePath(0, 0, 10, 10);
104
102
  const b = rectanglePath(5, 5, 10, 10);
105
- expect(pathFilledArea(booleanPaths(kernel, a, b, 'union', undefined, { tolerance: 2 }))).toBeCloseTo(175, 4);
103
+ const out = createPath();
104
+ booleanPaths(out, kernel, a, b, 'union', { tolerance: 2 });
105
+ expect(pathFilledArea(out)).toBeCloseTo(175, 4);
106
106
  });
107
107
  });
108
108
 
109
109
  describe('differencePaths', () => {
110
110
  it('cuts a contained hole', () => {
111
- const result = differencePaths(kernel, rectanglePath(0, 0, 30, 30), rectanglePath(10, 10, 10, 10));
111
+ const result = createPath();
112
+ differencePaths(result, kernel, rectanglePath(0, 0, 30, 30), rectanglePath(10, 10, 10, 10));
112
113
  expect(pathFilledArea(result)).toBeCloseTo(800, 4);
113
114
  expect(pathFillContains(result, 15, 15)).toBe(false);
114
115
  expect(pathFillContains(result, 2, 2)).toBe(true);
@@ -117,32 +118,41 @@ describe('differencePaths', () => {
117
118
  it('is empty for a path differenced against itself', () => {
118
119
  const a = rectanglePath(0, 0, 10, 10);
119
120
  const b = rectanglePath(0, 0, 10, 10);
120
- expect(pathFilledArea(differencePaths(kernel, a, b))).toBeCloseTo(0, 4);
121
+ const result = createPath();
122
+ differencePaths(result, kernel, a, b);
123
+ expect(pathFilledArea(result)).toBeCloseTo(0, 4);
121
124
  });
122
125
  });
123
126
 
124
127
  describe('intersectPaths', () => {
125
128
  it('keeps the overlap', () => {
126
- const result = intersectPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
129
+ const result = createPath();
130
+ intersectPaths(result, kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
127
131
  expect(pathFilledArea(result)).toBeCloseTo(25, 4);
128
132
  });
129
133
 
130
134
  it('is empty for disjoint inputs', () => {
131
- const result = intersectPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(20, 20, 10, 10));
135
+ const result = createPath();
136
+ intersectPaths(result, kernel, rectanglePath(0, 0, 10, 10), rectanglePath(20, 20, 10, 10));
132
137
  expect(pathFilledArea(result)).toBeCloseTo(0, 4);
133
138
  });
134
139
  });
135
140
 
136
141
  describe('unionPaths', () => {
137
142
  it('merges overlapping rectangles', () => {
138
- const result = unionPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
143
+ const result = createPath();
144
+ unionPaths(result, kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
139
145
  expect(pathFilledArea(result)).toBeCloseTo(175, 4);
140
146
  });
141
147
 
142
148
  it('commutes', () => {
143
149
  const a = rectanglePath(0, 0, 10, 10);
144
150
  const b = rectanglePath(4, 4, 10, 10);
145
- expect(pathFilledArea(unionPaths(kernel, a, b))).toBeCloseTo(pathFilledArea(unionPaths(kernel, b, a)), 4);
151
+ const ab = createPath();
152
+ const ba = createPath();
153
+ unionPaths(ab, kernel, a, b);
154
+ unionPaths(ba, kernel, b, a);
155
+ expect(pathFilledArea(ab)).toBeCloseTo(pathFilledArea(ba), 4);
146
156
  });
147
157
 
148
158
  it('routes through a provided kernel', () => {
@@ -155,7 +165,8 @@ describe('unionPaths', () => {
155
165
  };
156
166
  return finishEntity(out);
157
167
  })();
158
- const result = unionPaths(custom, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
168
+ const result = createPath();
169
+ unionPaths(result, custom, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
159
170
  expect(seen).toBe(true);
160
171
  expect(result.commands.length).toBe(0);
161
172
  });
@@ -163,7 +174,8 @@ describe('unionPaths', () => {
163
174
 
164
175
  describe('xorPaths', () => {
165
176
  it('keeps the symmetric difference', () => {
166
- const result = xorPaths(kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
177
+ const result = createPath();
178
+ xorPaths(result, kernel, rectanglePath(0, 0, 10, 10), rectanglePath(5, 5, 10, 10));
167
179
  expect(pathFilledArea(result)).toBeCloseTo(150, 4);
168
180
  });
169
181
  });
@@ -109,8 +109,10 @@ describe('fuzz invariants', () => {
109
109
  for (let i = start; i < vertices.length; i += 2) appendPathLineTo(path, vertices[i], vertices[i + 1]);
110
110
  }
111
111
  appendPathClose(path);
112
- const nonZero = simplifyPath(kernel, path, { fillRule: 'nonZero' });
113
- const evenOdd = simplifyPath(kernel, path, { fillRule: 'evenOdd' });
112
+ const nonZero = createPath();
113
+ const evenOdd = createPath();
114
+ simplifyPath(nonZero, kernel, path, { fillRule: 'nonZero' });
115
+ simplifyPath(evenOdd, kernel, path, { fillRule: 'evenOdd' });
114
116
  expect(pathArea(nonZero)).toBeGreaterThan(0);
115
117
  expect(pathArea(evenOdd)).toBeCloseTo(0, 6);
116
118
  }
@@ -121,8 +123,10 @@ describe('fuzz invariants', () => {
121
123
  for (let iteration = 0; iteration < 40; iteration++) {
122
124
  const a = polygonPath(randomSimplePolygon(random, 3 + (iteration % 6)));
123
125
  const b = polygonPath(randomSimplePolygon(random, 3 + ((iteration + 3) % 6)));
124
- const ab = unionPaths(kernel, a, b);
125
- const ba = unionPaths(kernel, b, a);
126
+ const ab = createPath();
127
+ const ba = createPath();
128
+ unionPaths(ab, kernel, a, b);
129
+ unionPaths(ba, kernel, b, a);
126
130
  expect(areasClose(pathArea(ab), pathArea(ba))).toBe(true);
127
131
  expect(ringCount(ab)).toBe(ringCount(ba));
128
132
  }
@@ -132,7 +136,8 @@ describe('fuzz invariants', () => {
132
136
  const random = makeRandom(0x55aa33cc);
133
137
  for (let iteration = 0; iteration < 40; iteration++) {
134
138
  const a = polygonPath(randomMessyPolygon(random, 4 + (iteration % 5)));
135
- const result = differencePaths(kernel, a, a);
139
+ const result = createPath();
140
+ differencePaths(result, kernel, a, a);
136
141
  expect(pathArea(result)).toBeCloseTo(0, 6);
137
142
  }
138
143
  });
@@ -141,8 +146,10 @@ describe('fuzz invariants', () => {
141
146
  const random = makeRandom(0x0f0f0f0f);
142
147
  for (let iteration = 0; iteration < 40; iteration++) {
143
148
  const a = polygonPath(randomSimplePolygon(random, 3 + (iteration % 6)));
144
- const union = unionPaths(kernel, a, a);
145
- const simplified = simplifyPath(kernel, a);
149
+ const union = createPath();
150
+ const simplified = createPath();
151
+ unionPaths(union, kernel, a, a);
152
+ simplifyPath(simplified, kernel, a);
146
153
  expect(areasClose(pathArea(union), pathArea(simplified))).toBe(true);
147
154
  expect(ringCount(union)).toBe(ringCount(simplified));
148
155
  }
@@ -152,8 +159,10 @@ describe('fuzz invariants', () => {
152
159
  const random = makeRandom(0x7e577e57);
153
160
  for (let iteration = 0; iteration < 40; iteration++) {
154
161
  const a = polygonPath(randomMessyPolygon(random, 4 + (iteration % 6)));
155
- const once = simplifyPath(kernel, a);
156
- const twice = simplifyPath(kernel, once);
162
+ const once = createPath();
163
+ const twice = createPath();
164
+ simplifyPath(once, kernel, a);
165
+ simplifyPath(twice, kernel, once);
157
166
  expect(areasClose(pathArea(once), pathArea(twice))).toBe(true);
158
167
  expect(ringCount(once)).toBe(ringCount(twice));
159
168
  }
@@ -163,8 +172,10 @@ describe('fuzz invariants', () => {
163
172
  const random = makeRandom(0x13571357);
164
173
  for (let iteration = 0; iteration < 40; iteration++) {
165
174
  const a = polygonPath(randomMessyPolygon(random, 4 + (iteration % 6)));
166
- const union = unionAllPaths(kernel, [a]);
167
- const simplified = simplifyPath(kernel, a);
175
+ const union = createPath();
176
+ const simplified = createPath();
177
+ unionAllPaths(union, kernel, [a]);
178
+ simplifyPath(simplified, kernel, a);
168
179
  expect(areasClose(pathArea(union), pathArea(simplified))).toBe(true);
169
180
  expect(ringCount(union)).toBe(ringCount(simplified));
170
181
  }
@@ -175,7 +186,8 @@ describe('fuzz invariants', () => {
175
186
  for (let iteration = 0; iteration < 40; iteration++) {
176
187
  const vertices = randomSimplePolygon(random, 3 + (iteration % 6));
177
188
  const a = polygonPath(vertices);
178
- const zeroOffset = offsetPath(kernel, a, 0);
189
+ const zeroOffset = createPath();
190
+ offsetPath(zeroOffset, kernel, a, 0);
179
191
  expect(areasClose(pathArea(zeroOffset), pathArea(a), 1e-2, 1e-2)).toBe(true);
180
192
  expect(ringCount(zeroOffset)).toBe(1);
181
193
  }
@@ -189,8 +201,10 @@ describe('fuzz invariants', () => {
189
201
  const a = polygonPath(vertices);
190
202
  const baseArea = pathArea(a);
191
203
  if (baseArea < 50) continue;
192
- const grown = offsetPath(kernel, a, 3, { join: 'miter', miterLimit: 100 });
193
- const recovered = offsetPath(kernel, grown, -3, { join: 'miter', miterLimit: 100 });
204
+ const grown = createPath();
205
+ const recovered = createPath();
206
+ offsetPath(grown, kernel, a, 3, { join: 'miter', miterLimit: 100 });
207
+ offsetPath(recovered, kernel, grown, -3, { join: 'miter', miterLimit: 100 });
194
208
  expect(ringCount(recovered)).toBe(1);
195
209
  expect(areasClose(pathArea(recovered), baseArea, 3e-2, 1)).toBe(true);
196
210
  }
@@ -200,9 +214,11 @@ describe('fuzz invariants', () => {
200
214
  const random = makeRandom(0x0c0ffee0);
201
215
  for (let iteration = 0; iteration < 40; iteration++) {
202
216
  const a = polygonPath(randomSimplePolygon(random, 5 + (iteration % 8)));
203
- const offset = offsetPath(kernel, a, 4);
217
+ const offset = createPath();
218
+ offsetPath(offset, kernel, a, 4);
204
219
  if (offset.commands.length === 0) continue;
205
- const simplified = simplifyPath(kernel, offset, { fillRule: 'nonZero' });
220
+ const simplified = createPath();
221
+ simplifyPath(simplified, kernel, offset, { fillRule: 'nonZero' });
206
222
  expect(areasClose(pathArea(simplified), pathArea(offset), 1e-2, 1e-2)).toBe(true);
207
223
  expect(ringCount(simplified)).toBe(ringCount(offset));
208
224
  }
@@ -1,5 +1,5 @@
1
1
  import { createPath, appendPathClose, appendPathLineTo, appendPathMoveTo, flattenPath } from '@flighthq/path/contract';
2
- import type { Path } from '@flighthq/types/contract';
2
+ import type { Path, PathOffsetOptions } from '@flighthq/types/contract';
3
3
  import { describe, expect, it } from 'vitest';
4
4
 
5
5
  import { martinezPathBooleanKernel } from './martinezKernel.ts';
@@ -55,19 +55,24 @@ function ringCount(path: Readonly<Path>): number {
55
55
  return flattenPath(path).length;
56
56
  }
57
57
 
58
+ function runOffsetPath(path: Readonly<Path>, delta: number, options?: Readonly<PathOffsetOptions>): Path {
59
+ const out = createPath('nonZero');
60
+ offsetPath(out, kernel, path, delta, options);
61
+ return out;
62
+ }
63
+
58
64
  const UNIT_SQUARE = [0, 0, 1, 0, 1, 1, 0, 1];
59
65
 
60
66
  describe('offsetPath', () => {
61
67
  it('writes into an existing output and is alias-safe', () => {
62
68
  const path = polygonPath([0, 0, 4, 0, 4, 4, 0, 4], true);
63
- const result = offsetPath(kernel, path, 1, undefined, path);
69
+ offsetPath(path, kernel, path, 1);
64
70
 
65
- expect(result).toBe(path);
66
71
  expect(pathBounds(path)).toEqual({ minX: -1, minY: -1, maxX: 5, maxY: 5 });
67
72
  });
68
73
 
69
74
  it('inflates a closed square by delta on every side with a miter join', () => {
70
- const result = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1);
75
+ const result = runOffsetPath(polygonPath(UNIT_SQUARE, true), 1);
71
76
  const bounds = pathBounds(result);
72
77
  expect(bounds.minX).toBeCloseTo(-1, 6);
73
78
  expect(bounds.minY).toBeCloseTo(-1, 6);
@@ -77,7 +82,7 @@ describe('offsetPath', () => {
77
82
  });
78
83
 
79
84
  it('deflates a closed square on a negative delta', () => {
80
- const result = offsetPath(kernel, polygonPath([0, 0, 4, 0, 4, 4, 0, 4], true), -1);
85
+ const result = runOffsetPath(polygonPath([0, 0, 4, 0, 4, 4, 0, 4], true), -1);
81
86
  const bounds = pathBounds(result);
82
87
  expect(bounds.minX).toBeCloseTo(1, 6);
83
88
  expect(bounds.minY).toBeCloseTo(1, 6);
@@ -87,13 +92,13 @@ describe('offsetPath', () => {
87
92
  });
88
93
 
89
94
  it('emits an empty path when deflation collapses the region', () => {
90
- const result = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), -1);
95
+ const result = runOffsetPath(polygonPath(UNIT_SQUARE, true), -1);
91
96
  expect(result.commands.length).toBe(0);
92
97
  expect(pathArea(result)).toBe(0);
93
98
  });
94
99
 
95
100
  it('chamfers corners with a bevel join', () => {
96
- const result = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, { join: 'bevel' });
101
+ const result = runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, { join: 'bevel' });
97
102
  const bounds = pathBounds(result);
98
103
  expect(bounds.minX).toBeCloseTo(-1, 6);
99
104
  expect(bounds.maxX).toBeCloseTo(2, 6);
@@ -101,19 +106,17 @@ describe('offsetPath', () => {
101
106
  });
102
107
 
103
108
  it('rounds corners with a round join and tessellates denser with radius and finer tolerance', () => {
104
- const rounded = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, { join: 'round' });
109
+ const rounded = runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, { join: 'round' });
105
110
  const bounds = pathBounds(rounded);
106
111
  expect(bounds.minX).toBeCloseTo(-1, 6);
107
112
  expect(bounds.maxX).toBeCloseTo(2, 6);
108
- const fineArea = pathArea(
109
- offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, { join: 'round', arcTolerance: 0.001 }),
110
- );
113
+ const fineArea = pathArea(runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, { join: 'round', arcTolerance: 0.001 }));
111
114
  expect(fineArea).toBeCloseTo(5 + Math.PI, 1);
112
115
 
113
- const largeRadius = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 5, { join: 'round' });
116
+ const largeRadius = runOffsetPath(polygonPath(UNIT_SQUARE, true), 5, { join: 'round' });
114
117
  expect(pathVertexCount(largeRadius)).toBeGreaterThan(pathVertexCount(rounded));
115
118
 
116
- const fineTolerance = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, {
119
+ const fineTolerance = runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, {
117
120
  join: 'round',
118
121
  arcTolerance: 0.01,
119
122
  });
@@ -122,26 +125,26 @@ describe('offsetPath', () => {
122
125
 
123
126
  it('falls back to a bevel when a sharp miter exceeds the miter limit', () => {
124
127
  const wedge = [0, 0, 4, 0.5, 4, -0.5];
125
- const clipped = offsetPath(kernel, polygonPath(wedge, true), 1, { miterLimit: 2 });
126
- const sharp = offsetPath(kernel, polygonPath(wedge, true), 1, { miterLimit: 50 });
128
+ const clipped = runOffsetPath(polygonPath(wedge, true), 1, { miterLimit: 2 });
129
+ const sharp = runOffsetPath(polygonPath(wedge, true), 1, { miterLimit: 50 });
127
130
  expect(pathBounds(clipped).minX).toBeGreaterThan(pathBounds(sharp).minX + 3);
128
131
  expect(pathBounds(sharp).minX).toBeLessThan(-5);
129
132
  });
130
133
 
131
134
  it('squares corners with a square join', () => {
132
- const result = offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, { join: 'square' });
135
+ const result = runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, { join: 'square' });
133
136
  const bounds = pathBounds(result);
134
137
  expect(bounds.minX).toBeCloseTo(-1, 6);
135
138
  expect(bounds.maxX).toBeCloseTo(2, 6);
136
139
  expect(pathArea(result)).toBeCloseTo(9, 4);
137
140
  expect(pathArea(result)).toBeGreaterThan(
138
- pathArea(offsetPath(kernel, polygonPath(UNIT_SQUARE, true), 1, { join: 'bevel' })),
141
+ pathArea(runOffsetPath(polygonPath(UNIT_SQUARE, true), 1, { join: 'bevel' })),
139
142
  );
140
143
  });
141
144
 
142
145
  it('cleans a concave corner into a single valid outline', () => {
143
146
  const lShape = [0, 0, 2, 0, 2, 2, 1, 2, 1, 1, 0, 1];
144
- const result = offsetPath(kernel, polygonPath(lShape, true), 0.25);
147
+ const result = runOffsetPath(polygonPath(lShape, true), 0.25);
145
148
  const bounds = pathBounds(result);
146
149
  expect(bounds.minX).toBeCloseTo(-0.25, 6);
147
150
  expect(bounds.minY).toBeCloseTo(-0.25, 6);
@@ -153,14 +156,15 @@ describe('offsetPath', () => {
153
156
 
154
157
  it('closes a concave slot narrower than 2·delta into a valid self-intersection-free outline', () => {
155
158
  const uShape = [0, 0, 10, 0, 10, 10, 5.5, 10, 5.5, 3, 4.5, 3, 4.5, 10, 0, 10];
156
- const result = offsetPath(kernel, polygonPath(uShape, true), 1);
159
+ const result = runOffsetPath(polygonPath(uShape, true), 1);
157
160
  expect(ringCount(result)).toBe(1);
158
161
  const bounds = pathBounds(result);
159
162
  expect(bounds.minX).toBeCloseTo(-1, 6);
160
163
  expect(bounds.maxX).toBeCloseTo(11, 6);
161
164
  expect(bounds.minY).toBeCloseTo(-1, 6);
162
165
  expect(bounds.maxY).toBeCloseTo(11, 6);
163
- const simplified = simplifyPath(kernel, result, { fillRule: 'nonZero' });
166
+ const simplified = createPath();
167
+ simplifyPath(simplified, kernel, result, { fillRule: 'nonZero' });
164
168
  expect(ringCount(simplified)).toBe(ringCount(result));
165
169
  expect(pathArea(simplified)).toBeCloseTo(pathArea(result), 4);
166
170
  });
@@ -168,9 +172,9 @@ describe('offsetPath', () => {
168
172
  it('offsets consistently across a 1e9 span of coordinate scales (magnitude-relative epsilons)', () => {
169
173
  const lShape = (s: number): number[] => [0, 0, 2 * s, 0, 2 * s, 2 * s, s, 2 * s, s, s, 0, s];
170
174
  const at = (s: number): Readonly<Path> => polygonPath(lShape(s), true);
171
- const small = offsetPath(kernel, at(1e-3), 0.25e-3);
172
- const mid = offsetPath(kernel, at(1), 0.25);
173
- const large = offsetPath(kernel, at(1e6), 0.25e6);
175
+ const small = runOffsetPath(at(1e-3), 0.25e-3);
176
+ const mid = runOffsetPath(at(1), 0.25);
177
+ const large = runOffsetPath(at(1e6), 0.25e6);
174
178
  expect(ringCount(small)).toBe(ringCount(mid));
175
179
  expect(ringCount(large)).toBe(ringCount(mid));
176
180
  expect(pathArea(small) / 1e-3 ** 2).toBeCloseTo(pathArea(mid), 4);
@@ -178,7 +182,7 @@ describe('offsetPath', () => {
178
182
  });
179
183
 
180
184
  it('strokes an open path into a butt-capped rectangle', () => {
181
- const result = offsetPath(kernel, polygonPath([0, 0, 2, 0], false), 0.5, { end: 'butt' });
185
+ const result = runOffsetPath(polygonPath([0, 0, 2, 0], false), 0.5, { end: 'butt' });
182
186
  const bounds = pathBounds(result);
183
187
  expect(bounds.minX).toBeCloseTo(0, 6);
184
188
  expect(bounds.maxX).toBeCloseTo(2, 6);
@@ -188,7 +192,7 @@ describe('offsetPath', () => {
188
192
  });
189
193
 
190
194
  it('extends an open path past its ends with a square cap', () => {
191
- const result = offsetPath(kernel, polygonPath([0, 0, 2, 0], false), 0.5, { end: 'square' });
195
+ const result = runOffsetPath(polygonPath([0, 0, 2, 0], false), 0.5, { end: 'square' });
192
196
  const bounds = pathBounds(result);
193
197
  expect(bounds.minX).toBeCloseTo(-0.5, 6);
194
198
  expect(bounds.maxX).toBeCloseTo(2.5, 6);
@@ -196,7 +200,7 @@ describe('offsetPath', () => {
196
200
  });
197
201
 
198
202
  it('caps an open path with half-circles on a round end', () => {
199
- const result = offsetPath(kernel, polygonPath([0, 0, 2, 0], false), 0.5, { end: 'round', arcTolerance: 0.001 });
203
+ const result = runOffsetPath(polygonPath([0, 0, 2, 0], false), 0.5, { end: 'round', arcTolerance: 0.001 });
200
204
  const bounds = pathBounds(result);
201
205
  expect(bounds.minX).toBeCloseTo(-0.5, 2);
202
206
  expect(bounds.maxX).toBeCloseTo(2.5, 2);
@@ -205,8 +209,8 @@ describe('offsetPath', () => {
205
209
 
206
210
  it('offsets the same vertices differently as an open vs a closed contour', () => {
207
211
  const vertices = [0, 0, 2, 0, 2, 2, 0, 2];
208
- const closed = offsetPath(kernel, polygonPath(vertices, true), 0.5);
209
- const open = offsetPath(kernel, polygonPath(vertices, false), 0.5, { end: 'butt' });
212
+ const closed = runOffsetPath(polygonPath(vertices, true), 0.5);
213
+ const open = runOffsetPath(polygonPath(vertices, false), 0.5, { end: 'butt' });
210
214
  expect(pathArea(closed)).toBeCloseTo(9, 4);
211
215
  expect(pathArea(open)).toBeLessThan(pathArea(closed));
212
216
  });
@@ -1,4 +1,4 @@
1
- import { flattenPath } from '@flighthq/path/contract';
1
+ import { createPath, flattenPath } from '@flighthq/path/contract';
2
2
  import type { Path } from '@flighthq/types/contract';
3
3
  import { describe, expect, it } from 'vitest';
4
4
 
@@ -27,20 +27,23 @@ const SQUARE_B = [2, 2, 6, 2, 6, 6, 2, 6];
27
27
 
28
28
  describe('resolvePathRegions', () => {
29
29
  it('returns an empty path for no rings', () => {
30
- const result = resolvePathRegions(kernel, [], 'nonZero');
30
+ const result = createPath('evenOdd');
31
+ resolvePathRegions(result, kernel, [], 'nonZero');
31
32
  expect(result.commands).toHaveLength(0);
32
33
  expect(result.data).toHaveLength(0);
33
34
  expect(result.winding).toBe('nonZero');
34
35
  });
35
36
 
36
37
  it('self-unions overlapping rings into one outline under nonZero', () => {
37
- const result = resolvePathRegions(kernel, [SQUARE_A, SQUARE_B], 'nonZero');
38
+ const result = createPath('nonZero');
39
+ resolvePathRegions(result, kernel, [SQUARE_A, SQUARE_B], 'nonZero');
38
40
  expect(ringCount(result)).toBe(1);
39
41
  expect(pathArea(result)).toBeCloseTo(28, 6);
40
42
  });
41
43
 
42
44
  it('applies the fill rule to self-overlap under evenOdd', () => {
43
- const result = resolvePathRegions(kernel, [SQUARE_A, SQUARE_B], 'evenOdd');
45
+ const result = createPath('nonZero');
46
+ resolvePathRegions(result, kernel, [SQUARE_A, SQUARE_B], 'evenOdd');
44
47
  expect(pathArea(result)).toBeCloseTo(24, 6);
45
48
  expect(ringCount(result)).toBeGreaterThan(1);
46
49
  });
@@ -63,15 +63,15 @@ const UNIT_SQUARE = [0, 0, 3, 0, 3, 3, 0, 3];
63
63
  describe('simplifyPath', () => {
64
64
  it('writes into an existing output and is alias-safe', () => {
65
65
  const path = polygonPath(BOWTIE);
66
- const result = simplifyPath(kernel, path, undefined, path);
66
+ simplifyPath(path, kernel, path);
67
67
 
68
- expect(result).toBe(path);
69
68
  expect(ringCount(path)).toBe(2);
70
69
  expect(pathArea(path)).toBeCloseTo(2, 6);
71
70
  });
72
71
 
73
72
  it('resolves a self-intersecting bowtie into two triangles', () => {
74
- const result = simplifyPath(kernel, polygonPath(BOWTIE));
73
+ const result = createPath();
74
+ simplifyPath(result, kernel, polygonPath(BOWTIE));
75
75
  expect(ringCount(result)).toBe(2);
76
76
  expect(pathArea(result)).toBeCloseTo(2, 6);
77
77
  });
@@ -88,7 +88,8 @@ describe('simplifyPath', () => {
88
88
  appendPathLineTo(path, 6, 6);
89
89
  appendPathLineTo(path, 2, 6);
90
90
  appendPathClose(path);
91
- const result = simplifyPath(kernel, path, { fillRule: 'nonZero' });
91
+ const result = createPath();
92
+ simplifyPath(result, kernel, path, { fillRule: 'nonZero' });
92
93
  expect(ringCount(result)).toBe(1);
93
94
  expect(pathArea(result)).toBeCloseTo(28, 6);
94
95
  });
@@ -105,14 +106,17 @@ describe('simplifyPath', () => {
105
106
  appendPathLineTo(path, 6, 6);
106
107
  appendPathLineTo(path, 2, 6);
107
108
  appendPathClose(path);
108
- const result = simplifyPath(kernel, path, { fillRule: 'evenOdd' });
109
+ const result = createPath();
110
+ simplifyPath(result, kernel, path, { fillRule: 'evenOdd' });
109
111
  expect(pathArea(result)).toBeCloseTo(24, 6);
110
112
  expect(ringCount(result)).toBeGreaterThan(1);
111
113
  });
112
114
 
113
115
  it('fills a self-overlapping star solid under nonZero but hollow under evenOdd', () => {
114
- const solid = simplifyPath(kernel, pentagramPath(10, 'nonZero'), { fillRule: 'nonZero' });
115
- const hollow = simplifyPath(kernel, pentagramPath(10, 'evenOdd'), { fillRule: 'evenOdd' });
116
+ const solid = createPath();
117
+ const hollow = createPath();
118
+ simplifyPath(solid, kernel, pentagramPath(10, 'nonZero'), { fillRule: 'nonZero' });
119
+ simplifyPath(hollow, kernel, pentagramPath(10, 'evenOdd'), { fillRule: 'evenOdd' });
116
120
  expect(ringCount(solid)).toBe(1);
117
121
  expect(pathArea(solid)).toBeCloseTo(112.257, 2);
118
122
  expect(ringCount(hollow)).toBeGreaterThan(1);
@@ -121,7 +125,8 @@ describe('simplifyPath', () => {
121
125
  });
122
126
 
123
127
  it('passes an already-simple convex path through unchanged', () => {
124
- const result = simplifyPath(kernel, polygonPath(UNIT_SQUARE));
128
+ const result = createPath();
129
+ simplifyPath(result, kernel, polygonPath(UNIT_SQUARE));
125
130
  expect(ringCount(result)).toBe(1);
126
131
  expect(pathArea(result)).toBeCloseTo(9, 6);
127
132
  const bounds = pathBounds(result);
@@ -132,13 +137,15 @@ describe('simplifyPath', () => {
132
137
  });
133
138
 
134
139
  it('returns an empty path for empty input', () => {
135
- const result = simplifyPath(kernel, createPath('nonZero'));
140
+ const result = createPath();
141
+ simplifyPath(result, kernel, createPath('nonZero'));
136
142
  expect(result.commands).toHaveLength(0);
137
143
  expect(result.data).toHaveLength(0);
138
144
  });
139
145
 
140
146
  it('returns an empty path for a degenerate zero-area contour', () => {
141
- const result = simplifyPath(kernel, polygonPath([0, 0, 5, 0, 10, 0]));
147
+ const result = createPath();
148
+ simplifyPath(result, kernel, polygonPath([0, 0, 5, 0, 10, 0]));
142
149
  expect(result.commands).toHaveLength(0);
143
150
  expect(result.data).toHaveLength(0);
144
151
  });
@@ -34,7 +34,8 @@ function ringCount(path: Readonly<Path>): number {
34
34
 
35
35
  describe('unionAllPaths', () => {
36
36
  it('returns an empty path for an empty list', () => {
37
- const result = unionAllPaths(kernel, []);
37
+ const result = createPath('nonZero');
38
+ unionAllPaths(result, kernel, []);
38
39
  expect(result.commands).toHaveLength(0);
39
40
  expect(result.data).toHaveLength(0);
40
41
  });
@@ -51,20 +52,23 @@ describe('unionAllPaths', () => {
51
52
  appendPathLineTo(overlap, 6, 6);
52
53
  appendPathLineTo(overlap, 2, 6);
53
54
  appendPathClose(overlap);
54
- const result = unionAllPaths(kernel, [overlap]);
55
+ const result = createPath('nonZero');
56
+ unionAllPaths(result, kernel, [overlap]);
55
57
  expect(ringCount(result)).toBe(1);
56
58
  expect(pathArea(result)).toBeCloseTo(28, 6);
57
59
  });
58
60
 
59
61
  it('merges a list of overlapping squares into one outline', () => {
60
- const result = unionAllPaths(kernel, [squarePath(0, 0, 10), squarePath(5, 5, 10), squarePath(8, 8, 10)]);
62
+ const result = createPath('nonZero');
63
+ unionAllPaths(result, kernel, [squarePath(0, 0, 10), squarePath(5, 5, 10), squarePath(8, 8, 10)]);
61
64
  expect(ringCount(result)).toBe(1);
62
65
  expect(pathArea(result)).toBeGreaterThan(100);
63
66
  expect(pathArea(result)).toBeLessThan(300);
64
67
  });
65
68
 
66
69
  it('keeps disjoint squares as separate rings summing their areas', () => {
67
- const result = unionAllPaths(kernel, [squarePath(0, 0, 10), squarePath(20, 20, 10), squarePath(40, 0, 10)]);
70
+ const result = createPath('nonZero');
71
+ unionAllPaths(result, kernel, [squarePath(0, 0, 10), squarePath(20, 20, 10), squarePath(40, 0, 10)]);
68
72
  expect(ringCount(result)).toBe(3);
69
73
  expect(pathArea(result)).toBeCloseTo(300, 6);
70
74
  });
@@ -73,8 +77,10 @@ describe('unionAllPaths', () => {
73
77
  const a = squarePath(0, 0, 10);
74
78
  const b = squarePath(5, 5, 10);
75
79
  const c = squarePath(2, 8, 10);
76
- const forward = unionAllPaths(kernel, [a, b, c]);
77
- const reversed = unionAllPaths(kernel, [c, b, a]);
80
+ const forward = createPath('nonZero');
81
+ const reversed = createPath('nonZero');
82
+ unionAllPaths(forward, kernel, [a, b, c]);
83
+ unionAllPaths(reversed, kernel, [c, b, a]);
78
84
  expect(pathArea(forward)).toBeCloseTo(pathArea(reversed), 6);
79
85
  expect(ringCount(forward)).toBe(ringCount(reversed));
80
86
  });
@@ -82,9 +88,8 @@ describe('unionAllPaths', () => {
82
88
  it('writes into a provided out path that aliases an input', () => {
83
89
  const a = squarePath(0, 0, 10);
84
90
  const b = squarePath(5, 5, 10);
85
- const result = unionAllPaths(kernel, [a, b], a);
86
- expect(result).toBe(a);
87
- expect(ringCount(result)).toBe(1);
88
- expect(pathArea(result)).toBeCloseTo(175, 6);
91
+ unionAllPaths(a, kernel, [a, b]);
92
+ expect(ringCount(a)).toBe(1);
93
+ expect(pathArea(a)).toBeCloseTo(175, 6);
89
94
  });
90
95
  });
@@ -6,7 +6,7 @@ import { writePathBooleanContours } from './writePathBooleanContours.ts';
6
6
  describe('writePathBooleanContours', () => {
7
7
  it('rebuilds into a supplied path without allocation', () => {
8
8
  const out = createPath('evenOdd');
9
- expect(writePathBooleanContours([[0, 0, 1, 0, 0, 1]], out)).toBe(out);
9
+ writePathBooleanContours(out, [[0, 0, 1, 0, 0, 1]]);
10
10
  expect(out.winding).toBe('nonZero');
11
11
  expect(out.commands.length).toBe(4);
12
12
  });