@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
53 lines (52 loc) • 2.41 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const labConstants = require("./lab-constants.cjs");
require("../../utils/type.cjs");
const unpack = require("../../utils/unpack.cjs");
const rgb2lab = (...args) => {
const [r, g, b, ...rest] = unpack(args, "rgb");
const [x, y, z] = rgb2xyz(r, g, b);
const [L, a, b_] = xyz2lab(x, y, z);
return [L, a, b_, ...rest.length > 0 && rest[0] < 1 ? [rest[0]] : []];
};
function xyz2lab(x, y, z) {
const { Xn, Yn, Zn, kE, kK } = labConstants.default;
const xr = x / Xn;
const yr = y / Yn;
const zr = z / Zn;
const fx = xr > kE ? Math.pow(xr, 1 / 3) : (kK * xr + 16) / 116;
const fy = yr > kE ? Math.pow(yr, 1 / 3) : (kK * yr + 16) / 116;
const fz = zr > kE ? Math.pow(zr, 1 / 3) : (kK * zr + 16) / 116;
return [116 * fy - 16, 500 * (fx - fy), 200 * (fy - fz)];
}
function gammaAdjustSRGB(companded) {
const sign = Math.sign(companded);
companded = Math.abs(companded);
const linear = companded <= 0.04045 ? companded / 12.92 : Math.pow((companded + 0.055) / 1.055, 2.4);
return linear * sign;
}
const rgb2xyz = (r, g, b) => {
r = gammaAdjustSRGB(r / 255);
g = gammaAdjustSRGB(g / 255);
b = gammaAdjustSRGB(b / 255);
const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } = labConstants.default;
let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;
let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;
let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;
const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;
const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;
const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;
let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;
let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;
let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;
X *= Ad / As;
Y *= Bd / Bs;
Z *= Cd / Cs;
x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;
y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;
z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;
return [x, y, z];
};
exports.default = rgb2lab;
exports.rgb2xyz = rgb2xyz;
//# sourceMappingURL=rgb2lab.cjs.map