-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab.gleam
53 lines (51 loc) · 1.02 KB
/
lab.gleam
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
import gleam/float
import gleam/result
import lumi
import util
pub fn to_xyz(lab: lumi.Lab) {
let lumi.Lab(l: l, a: a, b: b) = lab
let delta = 6.0 /. 29.0
let f = fn(t) {
case t >. delta {
True ->
float.power(t, 3.0)
|> result.unwrap(0.0)
False ->
3.0
*. {
float.power(delta, 2.0)
|> result.unwrap(0.0)
}
*. { t -. 4.0 /. 29.0 }
}
}
let c = { l +. 16.0 } /. 116.0
lumi.Xyz(
x: 95.0489 *. f(c +. a /. 500.0),
y: 100.0 *. f(c),
z: 108.884 *. f(c -. b /. 200.0),
)
}
pub fn to_lchab(lab: lumi.Lab) {
let lumi.Lab(l: l, a: a, b: b) = lab
let c =
float.power(
{
{
float.power(a, 2.0)
|> result.unwrap(0.0)
}
+. {
float.power(b, 2.0)
|> result.unwrap(0.0)
}
},
0.5,
)
|> result.unwrap(0.0)
let h =
util.atan(b /. a)
|> util.radians_to_degrees()
|> util.wrap_to_range(0.0, 360.0)
lumi.Lchab(l: l, c: c, h: h)
}