solveOnAll function
Moves the OKLCH lightness of argb (keeping chroma and hue) until it
reaches target against every colour in backdrops; tries a
neutral, then black/white. Null if unreachable.
Implementation
int? solveOnAll(int argb, List<int> backdrops, double target) {
if (_minContrast(argb, backdrops) >= target) return argb;
final lch = argbToOklch(argb);
// Binding backdrop: the one closest in luminance on the text's side.
var meanY = 0.0;
for (final b in backdrops) {
meanY += luminanceArgb(b);
}
meanY /= backdrops.length;
final lighter = luminanceArgb(argb) >= meanY;
var binding = backdrops.first;
for (final b in backdrops) {
final y = luminanceArgb(b);
final by = luminanceArgb(binding);
if (lighter ? y > by : y < by) binding = b;
}
for (final c in [lch.c, 0.0]) {
final solved = solveLightness(
l0: lch.l,
c: c,
hDeg: lch.h,
againstArgb: binding,
target: target,
preferLighter: lighter,
);
if (solved != null && _minContrast(solved, backdrops) >= target) {
return solved;
}
}
for (final bw in [0xFFFFFFFF, 0xFF000000]) {
if (_minContrast(bw, backdrops) >= target) return bw;
}
return null;
}