static void XYZ_to_sRGB_WhitePoint(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B, FX_FLOAT Xw, FX_FLOAT Yw, FX_FLOAT Zw) { // The following RGB_xyz is based on // sRGB value {Rx,Ry}={0.64, 0.33}, {Gx,Gy}={0.30, 0.60}, {Bx,By}={0.15, 0.06} FX_FLOAT Rx = 0.64f, Ry = 0.33f; FX_FLOAT Gx = 0.30f, Gy = 0.60f; FX_FLOAT Bx = 0.15f, By = 0.06f; CFX_Matrix_3by3 RGB_xyz(Rx, Gx, Bx, Ry, Gy, By, 1 - Rx - Ry, 1 - Gx - Gy, 1 - Bx - By); CFX_Vector_3by1 whitePoint(Xw, Yw, Zw); CFX_Vector_3by1 XYZ(X, Y, Z); CFX_Vector_3by1 RGB_Sum_XYZ = RGB_xyz.Inverse().TransformVector(whitePoint); CFX_Matrix_3by3 RGB_SUM_XYZ_DIAG(RGB_Sum_XYZ.a, 0, 0, 0, RGB_Sum_XYZ.b, 0, 0, 0, RGB_Sum_XYZ.c); CFX_Matrix_3by3 M = RGB_xyz.Multiply(RGB_SUM_XYZ_DIAG); CFX_Vector_3by1 RGB = M.Inverse().TransformVector(XYZ); R = RGB_Conversion(RGB.a); G = RGB_Conversion(RGB.b); B = RGB_Conversion(RGB.c); }
static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) { FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z; FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z; FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z; R = RGB_Conversion(R1); G = RGB_Conversion(G1); B = RGB_Conversion(B1); }