Add path-bool library (#1952)
* Add path-bool library * Cleanup code * Cargo format * Integrate boolean ops into graphite * Add test for editor crash * Fix edge sort floating point instability * Add unit test for red-dress failure * Backport tests and aux functions * Use curvature based sorting * Convert linear cubic splines to line segments * Deduplicate reversed path segments * Fix epsilon for empty segments * Remove parameter based intersection pruning * Add support for reversed paths * Add benchmark infrastructure * Add intersection benchmark * Add recursion bound * Implement support for overlapping path segments * Remove rouge prinln * Fix sorting for bezier segments with one control point at the start of the segment * Cleanup log statements * Directly translate graphite paths to Path segments * Round data before passing it to path_bool * Fix flag_faces traversal order * Add test for white dots in bottom right of painted dreams * Make rounding configurable * Update demo artwork to remove manual path modifications * Convert from path segments to manipulator groups directly * Remove dead code * Fix clippy lints * Replace functions in path segment with methods and add documentation * Add more documentation * Close subpaths * Reorganize files and add README.md * Add license information * Code review * Fix license info * Adopt new node macro and fix demo artwork * Close subpaths with Z --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 47.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,1.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 1.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,47.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 47.000000000000,24.000000000000 M 21.829116999931,6.631339939284 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 1 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 1 41.503906000000,24.000000000037 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 21.829116999931,6.631339939284 M 21.829117000123,12.394525741323 A 11.805881000000 11.805881000000 0.000000000000 0 0 12.193359000000,24.000000000011 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 26.170883000024,12.394525741351 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 21.829117000123,12.394525741323"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 47.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,1.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 1.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,47.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 47.000000000000,24.000000000000 M 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 1 41.503906000000,24.000000000037 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 21.829116999931,6.631339939284 L 21.829117000000,3.544434500000 L 26.170883000000,3.544434500000 L 26.170883000000,6.631339964278"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,6.631339964278 L 26.170883000000,3.544434500000 L 21.829117000000,3.544434500000 L 21.829117000000,6.631339939282 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 1 26.170883000441,6.631339964327"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,6.631339964278 L 26.170883000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 1 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 12.193359000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 21.829117000123,12.394525741323 L 21.829117000000,6.631339939282 A 17.504802000000 17.504802000000 0.000000000000 0 0 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 41.503906000000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 26.170883000441,6.631339964327"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000037,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 0 21.829116999931,6.631339939284 L 21.829117000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 1 23.999999999989,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 26.170883000024,12.394525741351 L 26.170883000000,6.631339964278"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,12.394525741375 L 26.170883000000,16.502158000000 L 21.829117000000,16.502158000000 L 21.829117000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 0 12.193359000000,24.000000000011 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 26.170883000024,12.394525741351"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000024,12.394525741351 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 21.829117000123,12.394525741323 L 21.829117000000,16.502158000000 L 26.170883000000,16.502158000000 L 26.170883000000,12.394525741375"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 47.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,1.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 1.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,47.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 47.000000000000,24.000000000000 M 21.829116999931,6.631339939284 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 1 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 1 41.503906000000,24.000000000037 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 21.829116999931,6.631339939284 M 21.829117000123,12.394525741323 A 11.805881000000 11.805881000000 0.000000000000 0 0 12.193359000000,24.000000000011 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 26.170883000024,12.394525741351 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 21.829117000123,12.394525741323"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 47.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,1.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 1.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,47.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 47.000000000000,24.000000000000 M 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 1 41.503906000000,24.000000000037 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 1 21.829116999931,6.631339939284 L 21.829117000000,3.544434500000 L 26.170883000000,3.544434500000 L 26.170883000000,6.631339964278"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,6.631339964278 L 26.170883000000,3.544434500000 L 21.829117000000,3.544434500000 L 21.829117000000,6.631339939282 A 17.504802000000 17.504802000000 0.000000000000 0 1 24.000000000000,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 1 26.170883000441,6.631339964327"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,6.631339964278 L 26.170883000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 1 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 12.193359000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 21.829117000123,12.394525741323 L 21.829117000000,6.631339939282 A 17.504802000000 17.504802000000 0.000000000000 0 0 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 41.503906000000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 26.170883000441,6.631339964327"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000037,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 0 21.829116999931,6.631339939284 L 21.829117000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 1 23.999999999989,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 26.170883000024,12.394525741351 L 26.170883000000,6.631339964278"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000000,12.394525741375 L 26.170883000000,16.502158000000 L 21.829117000000,16.502158000000 L 21.829117000000,12.394525741375 A 11.805881000000 11.805881000000 0.000000000000 0 0 12.193359000000,24.000000000011 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 26.170883000024,12.394525741351"/><path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000024,12.394525741351 A 11.805881000000 11.805881000000 0.000000000000 0 0 24.000000000000,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 0 21.829117000123,12.394525741323 L 21.829117000000,16.502158000000 L 26.170883000000,16.502158000000 L 26.170883000000,12.394525741375"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 26.170883000024,12.394525741351 A 11.805881000000 11.805881000000 0.000000000000 0 1 35.806641000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 24.000000000000,35.806641000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 12.193359000000,24.000000000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 21.829117000123,12.394525741323 A 11.805881000000 11.805881000000 0.000000000000 0 1 23.999999999989,12.193359000000 A 11.805881000000 11.805881000000 0.000000000000 0 1 26.170883000024,12.394525741351 M 21.829116999931,6.631339939284 A 17.504802000000 17.504802000000 0.000000000000 0 0 6.496093800000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000000,41.503906000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 41.503906000000,24.000000000000 A 17.504802000000 17.504802000000 0.000000000000 0 0 26.170883000441,6.631339964327 A 17.504802000000 17.504802000000 0.000000000000 0 0 24.000000000037,6.496093800000 A 17.504802000000 17.504802000000 0.000000000000 0 0 21.829116999931,6.631339939284"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path id="a"
|
||||
style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="m 21.829117,3.5444345 h 4.341766 V 16.502158 H 21.829117 Z M 47,24 A 23,23 0 0 1 24,47 23,23 0 0 1 1,24 23,23 0 0 1 24,1 23,23 0 0 1 47,24 Z"/>
|
||||
<path id="b"
|
||||
style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="M 24 6.4960938 A 17.504802 17.504802 0 0 0 6.4960938 24 A 17.504802 17.504802 0 0 0 24 41.503906 A 17.504802 17.504802 0 0 0 41.503906 24 A 17.504802 17.504802 0 0 0 24 6.4960938 z M 24 12.193359 A 11.805881 11.805881 0 0 1 35.806641 24 A 11.805881 11.805881 0 0 1 24 35.806641 A 11.805881 11.805881 0 0 1 12.193359 24 A 11.805881 11.805881 0 0 1 24 12.193359 z "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round" d="M 47.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,1.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 1.000000000000,24.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 24.000000000000,47.000000000000 A 23.000000000000 23.000000000000 0.000000000000 0 0 47.000000000000,24.000000000000"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 716 B |