///|
/// CICP primaries 10 carries CIE XYZ components, so its recovered channels
/// cannot be labelled RGB. Decode the declared transfer, convert linear XYZ
/// to BT.709 D65 RGB, and encode sRGB. Values retain the source normalization;
/// there is no chromatic adaptation or HDR tone mapping. The caller performs
/// final gamut clipping and rounding to the requested output precision.
fn av1_color_xyz_to_srgb(
x : Double,
y : Double,
z : Double,
transfer : Int,
) -> (Double, Double, Double)? {
let x = match av1_color_linear(x, transfer) {
Some(value) => value
None => return None
}
let y = match av1_color_linear(y, transfer) {
Some(value) => value
None => return None
}
let z = match av1_color_linear(z, transfer) {
Some(value) => value
None => return None
}
let linear_r = 3.2409699419045226 * x -
1.537383177570094 * y -
0.4986107602930034 * z
let linear_g = -0.9692436362808796 * x +
1.8759675015077202 * y +
0.04155505740717559 * z
let linear_b = 0.05563007969699366 * x -
0.20397695888897652 * y +
1.0569715142428786 * z
let r = match av1_color_nonlinear(linear_r, 13) {
Some(value) => value
None => return None
}
let g = match av1_color_nonlinear(linear_g, 13) {
Some(value) => value
None => return None
}
let b = match av1_color_nonlinear(linear_b, 13) {
Some(value) => value
None => return None
}
Some((r, g, b))
}