aws-cqc / aws-cqc/DeviceLayout.jl
Upgrade to Clipper2
- Dominant language
- Julia
- Stars
- 67
- Forks
- 14
- Avg merge
- 1d 16h
- Merged PRs (30d)
- 21
Description
We can get a 2x to 4x speedup on clipping and offsetting operations by switching to Clipper2. I've done some experiments locally, and for the existing benchmarks I get:
| Benchmark | Clipper2 | main | Speedup |
| -------- | -------- | ----- | ------ |
| difference2d 100_square | 165 μs | 672 μs | 4.1x |
| difference2d 961_square | 2.40 ms | 7.53 ms | 3.1x |
| difference2d 3600_square | 9.65 ms | 30.7 ms | 3.2x |
| difference2d 8000_skew | 23.5 ms | 71.7 ms | 3.1x |
| difference2d 10000_square | 30.6 ms | 92.3 ms | 3.0x |
| difference2d 19881_square | 66.3 ms | 193 ms | 2.9x |
| difference2d_offset | 88.2 μs | 230 μs | 2.6x |
Offsetting small polygons is ~4x, large polygons is ~2x.
This was done with a minimal ad-hoc approach to enable the tests, making a drop-in replacement despite breaking changes to the Clipper2 interface itself:
- wrapping Clipper2 with a custom C wrapper matching the [existing custom C wrapper](https://github.com/JuliaPackaging/Yggdrasil/blob/master/C/Clipper/cwrapper/cclipper.cpp) for Clipper1 used by Clipper.jl
- modifying Clipper.jl to use that wrapper
The test suite mostly still passes, with some exceptions where behavior seems to have changed:
- point order changes (fine, some tests fail but can be changed)
- intermediate points on straight edges are not removed (likewise)
- under some circumstances shapes with exactly shared edges are not combined (`union2d(Rectangle(1, 1), Rectangle(1, 1) + Point(1, 0))` returns the same 2 contours, although a float or Unitful version gives 1 as expected) -- needs investigation (does this affect our DotMatrix fonts, which need to be combined for rounding?) but likely fine
So I suspect there are no fundamentally breaking changes, but will want to do more testing.
There was an earlier effort to upgrade Clipper.jl to Clipper2 (https://github.com/JuliaGeometry/Clipper.jl/pull/50) but it seems to have stalled. If we want to pursue this, I would wrap Clipper2 faithfully and put any compatibility shim in DeviceLayout.jl instead of the wrapper/Clipper.jl.
Contributor guide
Assessment
This issue has not been assessed yet.