UNPKG

@texel/color

Version:

a minimal and modern color library

83 lines (74 loc) 2.8 kB
import { vec3 } from "../util.js"; import { linear_ProPhotoRGB_to_XYZ_M, XYZ_to_linear_ProPhotoRGB_M, } from "../conversion_matrices.js"; import { D50_to_D65_M, D65_to_D50_M } from "./xyz.js"; const Et = 1 / 512; const Et2 = 16 / 512; // Transfer curve is gamma 1.8 with a small linear portion const ProPhotoRGBToLinear = (v) => (v < Et2 ? v / 16 : v ** 1.8); const ProPhotoRGBToGamma = (v) => (v >= Et ? v ** (1 / 1.8) : 16 * v); // Note: below is a possibly improved transfer function proposed by CSS Module 4 spec // It is currently not matching the outputs of Colorjs.io when dealing with particular // negative values, such as convert([1,1,1], OKLab, ProPhotoRGB) // const ProPhotoRGBToLinear = (val) => { // // convert an array of prophoto-rgb values // // where in-gamut colors are in the range [0.0 - 1.0] // // to linear light (un-companded) form. // // Transfer curve is gamma 1.8 with a small linear portion // let sign = val < 0 ? -1 : 1; // let abs = Math.abs(val); // return abs <= Et2 ? val / 16 : sign * Math.pow(abs, 1.8); // }; // const ProPhotoRGBToGamma = (val) => { // // convert an array of linear-light prophoto-rgb in the range 0.0-1.0 // // to gamma corrected form // // Transfer curve is gamma 1.8 with a small linear portion // let sign = val < 0 ? -1 : 1; // let abs = Math.abs(val); // return abs >= Et ? sign * Math.pow(abs, 1 / 1.8) : 16 * val; // }; /** * The ProPhotoRGB color space in linear form, without a transfer function, aliased as <code>"prophoto-rgb-linear"</code>. * @type {ColorSpace} * @category spaces */ export const ProPhotoRGBLinear = { id: "prophoto-rgb-linear", adapt: { // chromatic adaptation to and from D65 to: D50_to_D65_M, from: D65_to_D50_M, }, // Note these are in D50 toXYZ_M: linear_ProPhotoRGB_to_XYZ_M, fromXYZ_M: XYZ_to_linear_ProPhotoRGB_M, }; /** * The ProPhotoRGB color space, with a transfer function, aliased as <code>"prophoto-rgb"</code>. Inherits from the {@link ProPhotoRGBLinear} color space. * @type {ColorSpace} * @category spaces */ export const ProPhotoRGB = { id: "prophoto-rgb", base: ProPhotoRGBLinear, toBase: (vec, out = vec3()) => { out[0] = ProPhotoRGBToLinear(vec[0]); out[1] = ProPhotoRGBToLinear(vec[1]); out[2] = ProPhotoRGBToLinear(vec[2]); return out; }, fromBase: (vec, out = vec3()) => { out[0] = ProPhotoRGBToGamma(vec[0]); out[1] = ProPhotoRGBToGamma(vec[1]); out[2] = ProPhotoRGBToGamma(vec[2]); return out; }, }; // Note: this is currently not supported, some overflows are occurring // in the python script. Please file an issue or PR if you think you can help. // export const ProPhotoRGBGamut = { // space: ProPhotoRGB, // coefficients: OKLab_to_linear_ProPhotoRGB_coefficients, // };