/
color.go
67 lines (57 loc) · 1.03 KB
/
color.go
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
package graph
import (
"fmt"
"math"
)
func hslahex(h, s, l, a float64) string {
r, g, b, xa := hsla(h, s, l, a)
return fmt.Sprintf("\"#%02x%02x%02x%02x\"", sat8(r), sat8(g), sat8(b), sat8(xa))
}
func hue(v1, v2, h float64) float64 {
if h < 0 {
h += 1
}
if h > 1 {
h -= 1
}
if 6*h < 1 {
return v1 + (v2-v1)*6*h
} else if 2*h < 1 {
return v2
} else if 3*h < 2 {
return v1 + (v2-v1)*(2.0/3.0-h)*6
}
return v1
}
func hsla(h, s, l, a float64) (r, g, b, ra float64) {
if s == 0 {
return l, l, l, a
}
_, h = math.Modf(h)
var v2 float64
if l < 0.5 {
v2 = l * (1 + s)
} else {
v2 = (l + s) - s*l
}
v1 := 2*l - v2
r = hue(v1, v2, h+1.0/3.0)
g = hue(v1, v2, h)
b = hue(v1, v2, h-1.0/3.0)
ra = a
return
}
// sat8 converts 0..1 float to 0..255 uint8.
// sat8 is short for saturate 8, referring to 8 byte saturation arithmetic.
//
// sat8(x) = 0 if x < 0
// sat8(x) = 255 if x > 1
func sat8(v float64) uint8 {
v *= 255.0
if v >= 255 {
return 255
} else if v <= 0 {
return 0
}
return uint8(v)
}