xyzInViewingConditions method

List<double> xyzInViewingConditions(
  1. ViewingConditions viewingConditions, {
  2. List<double>? array,
})

XYZ representation of CAM16 seen in viewingConditions.

Implementation

List<double> xyzInViewingConditions(ViewingConditions viewingConditions,
    {List<double>? array}) {
  final double alpha =
      (chroma == 0.0 || j == 0.0) ? 0.0 : chroma / math.sqrt(j / 100.0);

  final num t = math.pow(
      alpha /
          math.pow(
              1.64 -
                  math.pow(0.29, viewingConditions.backgroundYTowhitePointY),
              0.73),
      1.0 / 0.9);
  final double hRad = hue * math.pi / 180.0;

  final double eHue = 0.25 * (math.cos(hRad + 2.0) + 3.8);
  final double ac = viewingConditions.aw *
      math.pow(j / 100.0, 1.0 / viewingConditions.c / viewingConditions.z);
  final double p1 =
      eHue * (50000.0 / 13.0) * viewingConditions.nC * viewingConditions.ncb;

  final double p2 = ac / viewingConditions.nbb;

  final double hSin = math.sin(hRad);
  final double hCos = math.cos(hRad);

  final double gamma = 23.0 *
      (p2 + 0.305) *
      t /
      (23.0 * p1 + 11 * t * hCos + 108.0 * t * hSin);
  final double a = gamma * hCos;
  final double b = gamma * hSin;
  final double rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0;
  final double gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0;
  final double bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0;

  final num rCBase = math.max(0, (27.13 * rA.abs()) / (400.0 - rA.abs()));
  final double rC = MathUtils.signum(rA) *
      (100.0 / viewingConditions.fl) *
      math.pow(rCBase, 1.0 / 0.42);
  final num gCBase = math.max(0, (27.13 * gA.abs()) / (400.0 - gA.abs()));
  final double gC = MathUtils.signum(gA) *
      (100.0 / viewingConditions.fl) *
      math.pow(gCBase, 1.0 / 0.42);
  final num bCBase = math.max(0, (27.13 * bA.abs()) / (400.0 - bA.abs()));
  final double bC = MathUtils.signum(bA) *
      (100.0 / viewingConditions.fl) *
      math.pow(bCBase, 1.0 / 0.42);
  final double rF = rC / viewingConditions.rgbD[0];
  final double gF = gC / viewingConditions.rgbD[1];
  final double bF = bC / viewingConditions.rgbD[2];

  final double x = 1.86206786 * rF - 1.01125463 * gF + 0.14918677 * bF;
  final double y = 0.38752654 * rF + 0.62144744 * gF - 0.00897398 * bF;
  final double z = -0.01584150 * rF - 0.03412294 * gF + 1.04996444 * bF;

  if (array != null) {
    array[0] = x;
    array[1] = y;
    array[2] = z;
    return array;
  } else {
    return <double>[x, y, z];
  }
}