/
hsia-rgba.ts
36 lines (34 loc) · 954 Bytes
/
hsia-rgba.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { setC3 } from "@thi.ng/vectors";
import type { ColorOp } from "./api";
import { clampH } from "./clamp";
// https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSI
export const hsiaRgba: ColorOp = (out, src) => {
out = clampH(out || src, src);
const s = out[1];
const i = out[2];
if (s < 1e-6) {
return setC3(out, i, i, i);
}
const h = (out[0] * 6) % 6;
const m = i * (1 - s);
const z = 1 - Math.abs((h % 2) - 1);
let c = (3 * i * s) / (1 + z);
const x = c * z + m;
c += m;
switch (h | 0) {
case 0:
return setC3(out, c, x, m);
case 1:
return setC3(out, x, c, m);
case 2:
return setC3(out, m, c, x);
case 3:
return setC3(out, m, x, c);
case 4:
return setC3(out, x, m, c);
case 5:
return setC3(out, c, m, x);
default:
return setC3(out, m, m, m);
}
};