class HexaPDF::ImageLoader::PNG

def calrgb_definition_from_chrm(xw, yw, xr, yr, xg, yg, xb, yb)

See: PDF2.0 s8.6.5.3

of the white point and the red, green and blue primaries.
Returns a hash for a CalRGB color space definition using the x,y chromaticity coordinates
def calrgb_definition_from_chrm(xw, yw, xr, yr, xg, yg, xb, yb)
  z = yw * ((xg - xb) * yr - (xr - xb) * yg + (xr - xg) * yb)
  mya = yr * ((xg - xb) * yw - (xw - xb) * yg + (xw - xg) * yb) / z
  mxa = mya * xr / yr
  mza = mya * ((1 - xr) / yr - 1)
  myb = - (yg * ((xr - xb) * yw - (xw - xb) * yr + (xw - xr) * yb)) / z
  mxb = myb * xg / yg
  mzb = myb * ((1 - xg) / yg - 1)
  myc = yb * ((xr - xg) * yw - (xw - xg) * yr + (xw - xr) * yg) / z
  mxc = myc * xb / yb
  mzc = myc * ((1 - xb) / yb - 1)
  mxw = mxa + mxb + mxc
  myw = 1.0 # mya + myb + myc
  mzw = mza + mzb + mzc
  {WhitePoint: [mxw, myw, mzw], Matrix: [mxa, mya, mza, mxb, myb, mzb, mxc, myc, mzc]}
end