@macrostrat/column-components
Version:
React rendering primitives for stratigraphic columns
61 lines (60 loc) • 2.61 kB
JavaScript
import labConstants from "./lab-constants.js";
import "../../utils/type.js";
import unpack from "../../utils/unpack.js";
const lab2rgb = (...args) => {
args = unpack(args, "lab");
const [L, a, b] = args;
const [x, y, z] = lab2xyz(L, a, b);
const [r, g, b_] = xyz2rgb(x, y, z);
return [r, g, b_, args.length > 3 ? args[3] : 1];
};
const lab2xyz = (L, a, b) => {
const { kE, kK, kKE, Xn, Yn, Zn } = labConstants;
const fy = (L + 16) / 116;
const fx = 2e-3 * a + fy;
const fz = fy - 5e-3 * b;
const fx3 = fx * fx * fx;
const fz3 = fz * fz * fz;
const xr = fx3 > kE ? fx3 : (116 * fx - 16) / kK;
const yr = L > kKE ? Math.pow((L + 16) / 116, 3) : L / kK;
const zr = fz3 > kE ? fz3 : (116 * fz - 16) / kK;
const x = xr * Xn;
const y = yr * Yn;
const z = zr * Zn;
return [x, y, z];
};
const compand = (linear) => {
const sign = Math.sign(linear);
linear = Math.abs(linear);
return (linear <= 31308e-7 ? linear * 12.92 : 1.055 * Math.pow(linear, 1 / 2.4) - 0.055) * sign;
};
const xyz2rgb = (x, y, z) => {
const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } = labConstants;
const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;
const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;
const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;
const Ad = RefWhiteRGB.X * MtxAdaptMa.m00 + RefWhiteRGB.Y * MtxAdaptMa.m10 + RefWhiteRGB.Z * MtxAdaptMa.m20;
const Bd = RefWhiteRGB.X * MtxAdaptMa.m01 + RefWhiteRGB.Y * MtxAdaptMa.m11 + RefWhiteRGB.Z * MtxAdaptMa.m21;
const Cd = RefWhiteRGB.X * MtxAdaptMa.m02 + RefWhiteRGB.Y * MtxAdaptMa.m12 + RefWhiteRGB.Z * MtxAdaptMa.m22;
const X1 = (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) * (Ad / As);
const Y1 = (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) * (Bd / Bs);
const Z1 = (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) * (Cd / Cs);
const X2 = X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;
const Y2 = X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;
const Z2 = X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;
const r = compand(
X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20
);
const g = compand(
X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21
);
const b = compand(
X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22
);
return [r * 255, g * 255, b * 255];
};
export {
lab2rgb as default,
xyz2rgb
};
//# sourceMappingURL=lab2rgb.js.map