public void XYZToRGB(float X, float Y, float Z, out int r, out int g, out int b)
{
/* Multiply through the matrix to get luminosity values. */
float Yr = display.d_mat[0][0] * X + display.d_mat[0][1] * Y + display.d_mat[0][2] * Z;
float Yg = display.d_mat[1][0] * X + display.d_mat[1][1] * Y + display.d_mat[1][2] * Z;
float Yb = display.d_mat[2][0] * X + display.d_mat[2][1] * Y + display.d_mat[2][2] * Z;
/* Clip input */
Yr = Math.Max(Yr, display.d_Y0R);
Yg = Math.Max(Yg, display.d_Y0G);
Yb = Math.Max(Yb, display.d_Y0B);
/* Avoid overflow in case of wrong input values */
Yr = Math.Min(Yr, display.d_YCR);
Yg = Math.Min(Yg, display.d_YCG);
Yb = Math.Min(Yb, display.d_YCB);
/* Turn luminosity to color value. */
int i = (int)((Yr - display.d_Y0R) / rstep);
i = Math.Min(range, i);
r = rInt(Yr2r[i]);
i = (int)((Yg - display.d_Y0G) / gstep);
i = Math.Min(range, i);
g = rInt(Yg2g[i]);
i = (int)((Yb - display.d_Y0B) / bstep);
i = Math.Min(range, i);
b = rInt(Yb2b[i]);
/* Clip output. */
r = Math.Min(r, display.d_Vrwr);
g = Math.Min(g, display.d_Vrwg);
b = Math.Min(b, display.d_Vrwb);
}