epiphany/crates
Levi Neuwirth 586969125e Push 3 (slur quality) 2/3: split break-spanning slur curves (de Casteljau)
E2 drew a slur spanning a system break whole in its start system, with a
floating end control point detached from its end note (the documented Minimal
boundary). Casting now SPLITS such a curve into per-system sub-curves.

curve_system → curve_fate, mirroring stroke_fate: a curve that fits in one
system rides it whole (CurveFate::Rigid, byte-identical to before); a curve
overlapping ≥2 systems' clip intervals splits (CurveFate::Split) into one
sub-cubic per system, cut at each system's content clip edges. The cut uses de
Casteljau subdivision (sub_cubic = two splits: take [0,t1], then its [t0/t1,1]
tail) at the parameters param_at_x finds by bisecting the x-monotonic curve
(a slur's control points are x-ascending by construction; a non-monotonic curve
— not engraver-produced — falls back to riding its start system whole). The
first segment carries the slur's exact provenance (the round-trip surjection
recovers the source once); later segments synthesize continuations under
SYSTEM_CONTINUATION_SYNTHESIS with a (stable_id, ordinal) key, as split strokes
do. Each segment's control hull grows its own system's extent.

ENGRAVER_VERSION 6→7 (a break-spanning slur's baked geometry differs); a slur
that fits in one system is unchanged, so the fixture goldens are byte-identical
(its slurs are short). Tests: sub_cubic reproduces the original curve on its
sub-range + param_at_x inverts x; a whole-score slur splits into ≥2 segments
across distinct system y-bands with correct provenance. 934 tests, 8/8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 17:21:19 -04:00
..
epiphany-bundle Phase B follow-up: real acceleration-snapshot path + base role bound 2026-07-07 16:54:06 -04:00
epiphany-core Schema major 2 Phase D: the repeat-authoring pair (code tranche) 2026-07-07 20:06:18 -04:00
epiphany-determinism P12-I2: wire the ratified MUSCLOID layout-object id derivation 2026-06-27 12:46:19 -04:00
epiphany-editor-core Schema major 2 Phase E2: slur curves + cubic-bézier primitive 2026-07-08 15:33:00 -04:00
epiphany-editor-gui Schema major 2 Phase E2: slur curves + cubic-bézier primitive 2026-07-08 15:33:00 -04:00
epiphany-engrave Push 3 (slur quality) 2/3: split break-spanning slur curves (de Casteljau) 2026-07-08 17:21:19 -04:00
epiphany-layout-ir Push 3 (slur quality) 1/3: render dashed/dotted slurs faithfully 2026-07-08 17:13:32 -04:00
epiphany-ops Phase D follow-up: anchor-site liveness and containment, all object kinds 2026-07-07 20:18:29 -04:00
epiphany-render-svg Push 3 (slur quality) 1/3: render dashed/dotted slurs faithfully 2026-07-08 17:13:32 -04:00
epiphany-testkit Push 3 (slur quality) 1/3: render dashed/dotted slurs faithfully 2026-07-08 17:13:32 -04:00