oklabToRgba function

AstryxRgba oklabToRgba({
  1. required double l,
  2. required double aLab,
  3. required double bLab,
  4. double alpha = 1,
})

Converts OKLab to sRGB.

Implementation

AstryxRgba oklabToRgba({
  required double l,
  required double aLab,
  required double bLab,
  double alpha = 1,
}) {
  // OKLab -> LMS (cube roots)
  final lCbrt = l + 0.3963377774 * aLab + 0.2158037573 * bLab;
  final mCbrt = l - 0.1055613458 * aLab - 0.0638541728 * bLab;
  final sCbrt = l - 0.0894841775 * aLab - 1.2914855480 * bLab;

  final lms = lCbrt * lCbrt * lCbrt;
  final mms = mCbrt * mCbrt * mCbrt;
  final sms = sCbrt * sCbrt * sCbrt;

  // LMS -> linear sRGB
  final rLinear = 4.0767416621 * lms - 3.3077115913 * mms + 0.2309699292 * sms;
  final gLinear = -1.2684380046 * lms + 2.6097574011 * mms - 0.3413193965 * sms;
  final bLinear = -0.0041960863 * lms - 0.7034186147 * mms + 1.7076147010 * sms;

  return AstryxRgba(
    r: clampDouble(_gammaEncode(rLinear) * 255, 0, 255),
    g: clampDouble(_gammaEncode(gLinear) * 255, 0, 255),
    b: clampDouble(_gammaEncode(bLinear) * 255, 0, 255),
    a: alpha,
  );
}