rybitten
Version:
A color space conversion library for transforming between RGB and RYB colors.
101 lines (100 loc) • 1.84 kB
JavaScript
import { RYB_ITTEN as g } from "./cubes.mjs";
const m = (n) => n * n * (3 - 2 * n), f = (n, r, a) => n + a * (r - n), e = (n, r, a, o, t, s) => f(f(n, r, t), f(a, o, t), s), p = (n, r, a, o, t, s, l, T, i, k, h) => f(
e(n, r, a, o, i, k),
e(t, s, l, T, i, k),
h
);
function w(n, { cube: r = g, easingFn: a = m } = {}) {
const o = a(n[0]), t = a(n[1]), s = a(n[2]);
return [
p(
r[0][0],
r[1][0],
r[2][0],
r[3][0],
r[4][0],
r[5][0],
r[6][0],
r[7][0],
o,
t,
s
),
p(
r[0][1],
r[1][1],
r[2][1],
r[3][1],
r[4][1],
r[5][1],
r[6][1],
r[7][1],
o,
t,
s
),
p(
r[0][2],
r[1][2],
r[2][2],
r[3][2],
r[4][2],
r[5][2],
r[6][2],
r[7][2],
o,
t,
s
)
];
}
function M(n) {
return (n % 360 + 360) % 360;
}
function R(n) {
let [r] = n;
const [, a, o] = n;
r = M(r || 0);
const t = o + a * (o < 0.5 ? o : 1 - o), s = t - (t - o) * 2 * Math.abs(r / 60 % 2 - 1);
let l;
switch (Math.floor(r / 60)) {
case 0:
l = [t, s, 2 * o - t];
break;
case 1:
l = [s, t, 2 * o - t];
break;
case 2:
l = [2 * o - t, t, s];
break;
case 3:
l = [2 * o - t, s, t];
break;
case 4:
l = [s, 2 * o - t, t];
break;
case 5:
l = [t, 2 * o - t, s];
break;
default:
l = [2 * o - t, 2 * o - t, 2 * o - t];
}
return l;
}
function A(n, {
cube: r = g,
easingFn: a = m,
invertLightness: o = !0
} = {}) {
const t = o ? 1 - n[2] : n[2], s = R([n[0], n[1], t]);
return w(s, { cube: r, easingFn: a });
}
export {
e as blerp,
m as easingSmoothstep,
R as hslToRgb,
f as lerp,
w as ryb2rgb,
A as rybHsl2rgb,
p as trilerp
};