palette: enlarge the region title into WCAG large class; repoint the grabbed envelope handle off hue
Corrects theme.h's large-text thresholds, names accent/secondary's real binding limiter, and adds compositeOver so the loop-span fill's 2.25:1 under-floor pair is asserted rather than assumed.
This commit is contained in:
@@ -25,11 +25,21 @@ using audio::computeEnvelope;
|
||||
|
||||
namespace {
|
||||
// Marker roles — semantic, drawn through the kit's palette: start AND loop start/end both
|
||||
// = teal (secondary). Markers are 2px bars and a 20%-alpha span fill, not the 1px trace, so
|
||||
// = teal (secondary). Markers are 2px bars and a translucent span fill, not the 1px trace, so
|
||||
// they live with 1.92:1 against the waveform; the trace, which cannot, has its own role.
|
||||
// Do not collapse the two back onto one role — they overlap in this rect.
|
||||
// Do not collapse the two back onto one role — they overlap in this rect. The trace crossing
|
||||
// the loop-span fill is a KNOWN, ACCEPTED under-floor pair (2.25:1 against a 3:1 floor), and no
|
||||
// trace value fixes it — see the two-neighbour rule in core/ui/CLAUDE.md. If it is ever
|
||||
// resolved, the FILL is what changes; do not nudge a color to chase it.
|
||||
constexpr Role kRoleStartMarker = Role::AccentSecondary;
|
||||
constexpr Role kRoleLoopMarker = Role::AccentSecondary;
|
||||
|
||||
// Envelope-handle half-extents. Grabbed grows and hollows out; kNodeGrabRadius (envelope_edit)
|
||||
// is the PICK radius and is unrelated — a handle may draw larger than it without widening any
|
||||
// hit region.
|
||||
constexpr int kEnvHandleRadius = 3;
|
||||
constexpr int kEnvHandleGrabbedRadius = 5;
|
||||
constexpr int kEnvHandleRingPx = 2;
|
||||
} // namespace
|
||||
|
||||
void ReaSamplerEditor::paintWaveform(LICE_IBitmap* bmp, const Rect& band) {
|
||||
@@ -84,7 +94,8 @@ void ReaSamplerEditor::paintWaveform(LICE_IBitmap* bmp, const Rect& band) {
|
||||
const int rx = frameToX(overlay, frames, m.loopEnd);
|
||||
if (rx > lx) {
|
||||
LICE_FillRect(bmp, lx, overlayRect.y, rx - lx, overlayRect.height,
|
||||
toLice(roleColor(kRoleLoopMarker)), 0.20f, 0);
|
||||
toLice(roleColor(kRoleLoopMarker)),
|
||||
static_cast<float>(kLoopSpanFillAlpha), 0);
|
||||
}
|
||||
}
|
||||
const std::int64_t markerFrames[3] = {m.start, m.loopStart, m.loopEnd};
|
||||
@@ -124,24 +135,35 @@ void ReaSamplerEditor::paintEnvelopeOverlay(LICE_IBitmap* bmp, const OverlayArea
|
||||
}
|
||||
prev = &v;
|
||||
}
|
||||
// Handles: a square per draggable stage node, a ROUND knot per curvable segment. Lit
|
||||
// accent-hot when this node is the grabbed one. Every vertex is guaranteed in-bounds; the
|
||||
// handle is additionally clamped inside the band so one on an edge node never overhangs
|
||||
// into the neighbouring bands.
|
||||
// Handles: a square per draggable stage node, a ROUND knot per curvable segment. Every
|
||||
// vertex is guaranteed in-bounds; the handle is additionally clamped inside the band so one
|
||||
// on an edge node never overhangs into the neighbouring bands.
|
||||
//
|
||||
// GRAB is signalled by SIZE + a punched-out core, NOT by a hotter hue — the one place the
|
||||
// kit's "brighter = hotter" convention is deliberately inverted, because a brighter tint is
|
||||
// a LOWER-contrast tint here: accent/hot sits at 1.15:1 against the lime it is drawn over.
|
||||
// The two-neighbour ceiling (core/ui/CLAUDE.md) leaves at most 1.05:1 between ANY two values
|
||||
// that both clear the floor over lime and bg/base, so no color can carry this state. The
|
||||
// grabbed mark stays overlay/trace and reads by its 3.07:1 ring against the lime plus a
|
||||
// 3.06:1 bg/base core inside it.
|
||||
const LICE_pixel handle = toLice(roleColor(Role::OverlayTrace));
|
||||
const LICE_pixel handleHot = toLice(roleColor(Role::AccentHot));
|
||||
const LICE_pixel core = toLice(roleColor(Role::BgBase));
|
||||
for (const EnvVertex& v : poly) {
|
||||
if (v.node == EnvNode::Origin || v.node == EnvNode::ReleaseEnd) continue;
|
||||
const bool grabbed = (drag_ == DragKind::kEnvNode && envNode_ == v.node);
|
||||
const int r = 3;
|
||||
const int r = grabbed ? kEnvHandleGrabbedRadius : kEnvHandleRadius;
|
||||
const int ir = r - kEnvHandleRingPx; // core radius; > 0 only when grabbed
|
||||
const int hx = (std::max)(area.x + r, (std::min)(area.right() - 1 - r, v.x));
|
||||
const int hy = (std::max)(area.y + r, (std::min)(area.bottom() - 1 - r, v.y));
|
||||
if (v.knot) {
|
||||
LICE_FillCircle(bmp, static_cast<float>(hx), static_cast<float>(hy),
|
||||
static_cast<float>(r), grabbed ? handleHot : handle, 1.0f, 0, true);
|
||||
static_cast<float>(r), handle, 1.0f, 0, true);
|
||||
if (grabbed)
|
||||
LICE_FillCircle(bmp, static_cast<float>(hx), static_cast<float>(hy),
|
||||
static_cast<float>(ir), core, 1.0f, 0, true);
|
||||
} else {
|
||||
LICE_FillRect(bmp, hx - r, hy - r, 2 * r, 2 * r, grabbed ? handleHot : handle, 1.0f,
|
||||
0);
|
||||
LICE_FillRect(bmp, hx - r, hy - r, 2 * r, 2 * r, handle, 1.0f, 0);
|
||||
if (grabbed) LICE_FillRect(bmp, hx - ir, hy - ir, 2 * ir, 2 * ir, core, 1.0f, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user