parseRgb function

AstryxRgba? parseRgb(
  1. String value
)

Parses an rgb() / rgba() colour.

Accepts comma- or space-separated channels, an optional / alpha, and percentage channels. Returns null for anything else.

Implementation

AstryxRgba? parseRgb(String value) {
  final open = value.indexOf('(');
  if (open == -1 || !value.trim().endsWith(')')) return null;

  final body = value
      .substring(open + 1, value.lastIndexOf(')'))
      .replaceAll('/', ' ');
  final parts = body
      .split(_channelSeparator)
      .map((p) => p.trim())
      .where((p) => p.isNotEmpty)
      .toList();
  if (parts.length < 3) return null;

  double channel(String p) {
    final n = p.endsWith('%')
        ? (parseFloatLoose(p) / 100) * 255
        : parseFloatLoose(p);
    return clampDouble(n, 0, 255);
  }

  final r = channel(parts[0]);
  final g = channel(parts[1]);
  final b = channel(parts[2]);
  if (r.isNaN || g.isNaN || b.isNaN) return null;

  var a = 1.0;
  if (parts.length >= 4) {
    final raw = parts[3];
    a = raw.endsWith('%') ? parseFloatLoose(raw) / 100 : parseFloatLoose(raw);
    if (a.isNaN) return null;
    a = clampDouble(a, 0, 1);
  }

  return AstryxRgba(r: r, g: g, b: b, a: a);
}