-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcolor.ts
71 lines (56 loc) · 1.46 KB
/
color.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { vec3 } from 'gl-matrix';
export function hsvToRgb(hsv: vec3): vec3 {
function hsvToRgbF(hsv: vec3, n: number) {
const h = hsv[0];
const s = hsv[1];
const v = hsv[2];
const k = (n + h / 60.0) % 6.0;
return v - v * s * Math.max(0.0, Math.min(k, 4.0 - k, 1.0));
}
const rgb = vec3.create();
vec3.set(
rgb,
hsvToRgbF(hsv, 5.0),
hsvToRgbF(hsv, 3.0),
hsvToRgbF(hsv, 1.0)
);
return rgb;
}
export function rgbToHsv(rgb: vec3) {
const hsv = vec3.create();
const xMin = Math.min(rgb[0], rgb[1], rgb[2]);
const xMax = Math.max(rgb[0], rgb[1], rgb[2]);
hsv[2] = xMax;
const chroma = xMax - xMin;
if (xMax !== 0) {
hsv[1] = chroma / xMax;
} else {
hsv[1] = 0;
return hsv;
}
if (chroma === 0) {
hsv[0] = 0;
return hsv;
}
if (rgb[0] === xMax) {
hsv[0] = rgb[1] - rgb[2] / chroma;
} else if (rgb[1] === xMax) {
hsv[0] = 2 + (rgb[2] - rgb[0]) / chroma;
} else {
hsv[0] = 4 + (rgb[0] - rgb[1]) / chroma;
}
hsv[0] *= 60;
if (hsv[0] < 0) {
hsv[0] += 360;
}
return hsv;
}
// Implement IEC 61966-2-1:1999
// defined for floating point colors (range of [0.0, 1.0] for SDR values)
export function srgbToRgb(u: number): number {
if (u <= 0.04045) {
return u / 12.92;
} else {
return Math.pow((u + 0.055) / 1.055, 2.4);
}
}