UNPKG

allc

Version:

A small typescript package for color conversion.

52 lines (51 loc) 3.21 kB
import { toLinearAdobeRGBBFromCIE1931XYZ, toLinearAdobeRGBGFromCIE1931XYZ, toLinearAdobeRGBRFromCIE1931XYZ, toLinearDisplayP3BFromCIE1931XYZ, toLinearDisplayP3GFromCIE1931XYZ, toLinearDisplayP3RFromCIE1931XYZ, toLinearSRGBBFromCIE1931XYZ, toLinearSRGBGFromCIE1931XYZ, toLinearSRGBRFromCIE1931XYZ, } from "../cie-1931-xyz"; import { toAdobeRGBComponentFromLinearAdobeRGBComponent, toDisplayP3ComponentFromLinearDisplayP3Component, toSRGBComponentFromLinearSRGBComponent, } from "../linear-rgb"; import { toCIE1931XYZXFromCIELAB, toCIE1931XYZYFromCIELAB, toCIE1931XYZZFromCIELAB } from "./cielab-to-cie-1931-xyz"; import { toLABAFromLCH, toLABBFromLCH } from "./lch-to-lab"; import { toCIE1931XYZXFromLMS, toCIE1931XYZYFromLMS, toCIE1931XYZZFromLMS, toLMSComponentFromLMSDashComponent, toLMSDashLFromOklab, toLMSDashMFromOklab, toLMSDashSFromOklab, } from "./oklab-to-cie-1931-xyz"; export const maxChromaIn = (targetColorSpace, luminance, hue, chromaColorSpace) => { let min = 0, max = 1; // Magic number while (max - min > 0.0001) { const mid = (min + max) / 2; const a = toLABAFromLCH(mid, hue), b = toLABBFromLCH(mid, hue); let x, y, z; if (chromaColorSpace === "Ok") { const lmsL = toLMSComponentFromLMSDashComponent(toLMSDashLFromOklab(luminance, a, b)), lmsM = toLMSComponentFromLMSDashComponent(toLMSDashMFromOklab(luminance, a, b)), lmsS = toLMSComponentFromLMSDashComponent(toLMSDashSFromOklab(luminance, a, b)); x = toCIE1931XYZZFromLMS(lmsL, lmsM, lmsS); y = toCIE1931XYZYFromLMS(lmsL, lmsM, lmsS); z = toCIE1931XYZXFromLMS(lmsL, lmsM, lmsS); } else { x = toCIE1931XYZXFromCIELAB(luminance, a); y = toCIE1931XYZYFromCIELAB(luminance); z = toCIE1931XYZZFromCIELAB(luminance, b); } let red, green, blue; if (targetColorSpace === "sRGB") { red = toSRGBComponentFromLinearSRGBComponent(toLinearSRGBRFromCIE1931XYZ(x, y, z)); green = toSRGBComponentFromLinearSRGBComponent(toLinearSRGBGFromCIE1931XYZ(x, y, z)); blue = toSRGBComponentFromLinearSRGBComponent(toLinearSRGBBFromCIE1931XYZ(x, y, z)); } else if (targetColorSpace === "Display P3") { red = toDisplayP3ComponentFromLinearDisplayP3Component(toLinearDisplayP3RFromCIE1931XYZ(x, y, z)); green = toDisplayP3ComponentFromLinearDisplayP3Component(toLinearDisplayP3GFromCIE1931XYZ(x, y, z)); blue = toDisplayP3ComponentFromLinearDisplayP3Component(toLinearDisplayP3BFromCIE1931XYZ(x, y, z)); } else { // Adobe RGB red = toAdobeRGBComponentFromLinearAdobeRGBComponent(toLinearAdobeRGBRFromCIE1931XYZ(x, y, z)); green = toAdobeRGBComponentFromLinearAdobeRGBComponent(toLinearAdobeRGBGFromCIE1931XYZ(x, y, z)); blue = toAdobeRGBComponentFromLinearAdobeRGBComponent(toLinearAdobeRGBBFromCIE1931XYZ(x, y, z)); } if (0 <= red && red <= 1 && 0 <= green && green <= 1 && 0 <= blue && blue <= 1) { min = mid; } else { max = mid; } } return min; };