lib-colors
Version:
Simple node.js library for work with colors
72 lines (71 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.cmykToLab = cmykToLab;
const xyz_to_lab_helper_1 = require("../../lab/helpers/xyz_to_lab.helper");
function cmykToLab(cmyk) {
const xyz = cmykToXyz(cmyk);
return (0, xyz_to_lab_helper_1.xyzToLab)(xyz);
}
const baseReflectance = {
c: { x: 0.1, y: 0.2, z: 0.8 },
m: { x: 0.6, y: 0.2, z: 0.4 },
y: { x: 0.8, y: 0.9, z: 0.1 },
k: { x: 0.05, y: 0.05, z: 0.05 },
};
function cmykToXyz(cmyk) {
let { c, m, y, k, a } = { ...cmyk };
c /= 100;
m /= 100;
y /= 100;
k /= 100;
const reflectance = calculateReflectance(c, m, y, k);
const illuminantD65 = { x: 95.047, y: 100.0, z: 108.883 };
return {
x: reflectance.x * illuminantD65.x,
y: reflectance.y * illuminantD65.y,
z: reflectance.z * illuminantD65.z,
alpha: a,
};
}
function calculateReflectance(c, m, y, k) {
let r = { x: 0.95, y: 0.95, z: 0.95 };
const blackEffect = 1 - k * 0.9;
r.x *= blackEffect;
r.y *= blackEffect;
r.z *= blackEffect;
const cEffect = {
x: 1 - c * (1 - baseReflectance.c.x),
y: 1 - c * (1 - baseReflectance.c.y),
z: 1 - c * (1 - baseReflectance.c.z),
};
r.x *= cEffect.x;
r.y *= cEffect.y;
r.z *= cEffect.z;
const mEffect = {
x: 1 - m * (1 - baseReflectance.m.x),
y: 1 - m * (1 - baseReflectance.m.y),
z: 1 - m * (1 - baseReflectance.m.z),
};
r.x *= mEffect.x;
r.y *= mEffect.y;
r.z *= mEffect.z;
const yEffect = {
x: 1 - y * (1 - baseReflectance.y.x),
y: 1 - y * (1 - baseReflectance.y.y),
z: 1 - y * (1 - baseReflectance.y.z),
};
r.x *= yEffect.x;
r.y *= yEffect.y;
r.z *= yEffect.z;
const totalInk = c + m + y + k;
const dotGain = Math.min(0.3, totalInk * 0.1);
const gainFactor = 1 - dotGain;
r.x *= gainFactor;
r.y *= gainFactor;
r.z *= gainFactor;
return {
x: Math.max(0, Math.min(1, r.x)),
y: Math.max(0, Math.min(1, r.y)),
z: Math.max(0, Math.min(1, r.z)),
};
}