RecipesRegister Color Spaces
Luv
A recipe to register the Luv color function in Saturon.
import { registerColorFunction } from "saturon/utils";
/**
* @see {@link http://www.brucelindbloom.com/index.html?Eqn_Luv_to_XYZ.html|Luv to XYZ}
* @see {@link http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_Luv.html|XYZ to Luv}
*/
registerColorFunction("luv", {
components: {
l: { index: 0, value: "percentage", precision: 5 },
u: { index: 1, value: [-100, 100], precision: 5 },
v: { index: 2, value: [-100, 100], precision: 5 },
},
targetGamut: null,
bridge: "xyz-d50",
toBridge: ([L, u, v]: number[]) => {
const Xn = 0.96422;
const Yn = 1.0;
const Zn = 0.82521;
if (L === 0) return [0, 0, 0];
const denom_n = Xn + 15 * Yn + 3 * Zn;
const u_n = (4 * Xn) / denom_n;
const v_n = (9 * Yn) / denom_n;
const Y = L > 8 ? Yn * Math.pow((L + 16) / 116, 3) : Yn * (L / 903.3);
const u_prime = u / (13 * L) + u_n;
const v_prime = v / (13 * L) + v_n;
const X = (9 * Y * u_prime) / (4 * v_prime);
const Z = (Y * (12 - 3 * u_prime - 20 * v_prime)) / (4 * v_prime);
return [X, Y, Z];
},
fromBridge: ([X, Y, Z]: number[]) => {
const Xn = 0.96422;
const Yn = 1.0;
const Zn = 0.82521;
const denom_n = Xn + 15 * Yn + 3 * Zn;
const u_n = (4 * Xn) / denom_n;
const v_n = (9 * Yn) / denom_n;
const denom = X + 15 * Y + 3 * Z;
const u_prime = denom !== 0 ? (4 * X) / denom : 0;
const v_prime = denom !== 0 ? (9 * Y) / denom : 0;
const Yr = Y / Yn;
const L = Yr > Math.pow(6 / 29, 3) ? 116 * Math.cbrt(Yr) - 16 : 903.3 * Yr;
if (L === 0) return [0, 0, 0];
const u = 13 * L * (u_prime - u_n);
const v = 13 * L * (v_prime - v_n);
return [L, u, v];
},
});