Loop: an explicit enable, four named marks with grabbable caps, and the crossfade painted where it is actually heard

hasLoop becomes user-owned with the gestures as shortcuts onto it; no format change. START uses overlay/trace, not accent/primary, which is the waveform's own fill.
This commit is contained in:
2026-08-02 05:18:53 -04:00
parent ef59265e7a
commit a7c3c7a828
26 changed files with 1190 additions and 191 deletions
+9 -2
View File
@@ -55,7 +55,14 @@ void ReaSamplerEditor::paintSample(LICE_IBitmap* bmp, int w, int h) {
const FaceLayout fl = faceLayout(w, h);
const bool empty = selectedId_.empty();
paintChrome(bmp, fl, empty);
// Resolved ONCE per paint and handed to both bands that show it. The chrome enable and the
// waveform marks are two views of the same `hasLoop`, so they must not resolve it
// separately — and with no loop override set the resolve costs a bridge read plus a bank
// parse, which is not a cost to pay twice a frame.
SetupMarkers marks;
if (!empty) marks = pickedMarkers(static_cast<std::int64_t>(monoPcmFor(selectedId_).size()));
paintChrome(bmp, fl, empty, marks);
// Nothing loaded: the lower bands carry the "pick a capture" prompt pointing at Browse
// (which the chrome lit above), and there is nothing to deck.
@@ -66,7 +73,7 @@ void ReaSamplerEditor::paintSample(LICE_IBitmap* bmp, int w, int h) {
return;
}
paintWaveform(bmp, fl.bands.waveform);
paintWaveform(bmp, fl.bands.waveform, marks);
paintDeck(bmp, fl);
// The curve popup: a centered sheet over the whole face, drawn last.