solveOnAll function

int? solveOnAll(
  1. int argb,
  2. List<int> backdrops,
  3. double target
)

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;
}