1
+ use crate :: { cmap, ColorMap } ;
2
+ use fltk:: utils:: oncelock:: Lazy ;
3
+
4
+ const fn gray_ramp ( light : u8 , dark : u8 , n : u8 ) -> u8 {
5
+ let l = light as u16 ;
6
+ let d = dark as u16 ;
7
+ ( d + ( ( l - d) * n as u16 + 11 ) / 23 ) as u8
8
+ }
9
+
10
+ const fn gray_ramp_inv ( light : u8 , dark : u8 , n : u8 ) -> u8 {
11
+ let l = light as u16 ;
12
+ let d = dark as u16 ;
13
+ ( l - ( ( l - d) * n as u16 + 11 ) / 23 ) as u8
14
+ }
15
+
16
+ const fn cube_chan ( i : u8 , steps : u8 , max : u8 ) -> u8 {
17
+ ( ( i as u16 * max as u16 + ( ( steps - 1 ) / 2 ) as u16 )
18
+ / ( steps as u16 - 1 ) ) as u8
19
+ }
20
+
21
+ pub fn make_dark_theme (
22
+ overrides : & ' static [ ( u8 , u8 , u8 , u8 ) ] ,
23
+ ramp : ( u8 , u8 ) ,
24
+ cube_max : u8 ,
25
+ ) -> Lazy < [ ColorMap ; 256 ] > {
26
+ let ( ramp_light, ramp_dark) = ramp;
27
+
28
+ Lazy :: new ( move || {
29
+ std:: array:: from_fn ( |idx| {
30
+ let idx8 = idx as u8 ;
31
+
32
+ if let Some ( & ( _, r, g, b) ) =
33
+ overrides. iter ( ) . rev ( ) . find ( |& & ( i, ..) | i == idx8)
34
+ {
35
+ return cmap ! ( idx8, r, g, b) ;
36
+ }
37
+
38
+ if ( 32 ..=55 ) . contains ( & idx) {
39
+ let shade = gray_ramp_inv ( ramp_light, ramp_dark, idx8 - 32 ) ;
40
+ return cmap ! ( idx8, shade, shade, shade) ;
41
+ }
42
+
43
+ if idx >= 56 {
44
+ let n = idx8 - 56 ;
45
+ let b = n / ( 5 * 8 ) ;
46
+ let r = ( n / 8 ) % 5 ;
47
+ let g = n % 8 ;
48
+ let rr = cube_chan ( r, 5 , cube_max) ;
49
+ let gg = cube_chan ( g, 8 , cube_max) ;
50
+ let bb = cube_chan ( b, 5 , cube_max) ;
51
+ return cmap ! ( idx8, rr, gg, bb) ;
52
+ }
53
+
54
+ cmap ! ( idx8, 0 , 0 , 0 )
55
+ } )
56
+ } )
57
+ }
58
+
59
+ pub fn make_light_theme (
60
+ overrides : & ' static [ ( u8 , u8 , u8 , u8 ) ] ,
61
+ ramp : ( u8 , u8 ) ,
62
+ cube_max : u8 ,
63
+ ) -> once_cell:: sync:: Lazy < [ ColorMap ; 256 ] > {
64
+ let ( ramp_dark, ramp_light) = ramp;
65
+
66
+ once_cell:: sync:: Lazy :: new ( move || {
67
+ std:: array:: from_fn ( |idx| {
68
+ let idx8 = idx as u8 ;
69
+
70
+ if let Some ( & ( _, r, g, b) ) =
71
+ overrides. iter ( ) . rev ( ) . find ( |& & ( i, ..) | i == idx8)
72
+ {
73
+ return cmap ! ( idx8, r, g, b) ;
74
+ }
75
+
76
+ if ( 32 ..=55 ) . contains ( & idx) {
77
+ let shade = gray_ramp ( ramp_dark, ramp_light, idx8 - 32 ) ;
78
+ return cmap ! ( idx8, shade, shade, shade) ;
79
+ }
80
+
81
+ if idx >= 56 {
82
+ let n = idx8 - 56 ;
83
+ let b = n / ( 5 * 8 ) ;
84
+ let r = ( n / 8 ) % 5 ;
85
+ let g = n % 8 ;
86
+ let rr = cube_chan ( r, 5 , cube_max) ;
87
+ let gg = cube_chan ( g, 8 , cube_max) ;
88
+ let bb = cube_chan ( b, 5 , cube_max) ;
89
+ return cmap ! ( idx8, rr, gg, bb) ;
90
+ }
91
+
92
+ cmap ! ( idx8, 0 , 0 , 0 )
93
+ } )
94
+ } )
95
+ }
96
+
97
+ pub const GRUVBOX_DARK : Lazy < [ crate :: ColorMap ; 256 ] > = make_dark_theme (
98
+ & [
99
+ ( 0 , 235 , 219 , 178 ) ,
100
+ ( 1 , 251 , 73 , 52 ) ,
101
+ ( 2 , 184 , 187 , 38 ) ,
102
+ ( 3 , 250 , 189 , 47 ) ,
103
+ ( 4 , 131 , 165 , 152 ) ,
104
+ ( 5 , 211 , 134 , 155 ) ,
105
+ ( 6 , 142 , 192 , 124 ) ,
106
+ ( 7 , 60 , 60 , 60 ) ,
107
+ ( 15 , 131 , 165 , 152 ) ,
108
+ ( 49 , 40 , 40 , 40 ) ,
109
+ ] ,
110
+ ( 180 , 40 ) , // gray ramp light → dark
111
+ 110 ,
112
+ ) ;
113
+
114
+ pub const MONOKAI_DARK : Lazy < [ ColorMap ; 256 ] > = make_dark_theme (
115
+ & [
116
+ ( 0 , 249 , 249 , 249 ) , // fg
117
+ ( 1 , 249 , 38 , 114 ) , // red
118
+ ( 2 , 166 , 226 , 46 ) , // green
119
+ ( 3 , 253 , 151 , 31 ) , // yellow/orange
120
+ ( 4 , 102 , 217 , 239 ) , // cyan
121
+ ( 5 , 174 , 129 , 255 ) , // magenta
122
+ ( 7 , 51 , 52 , 46 ) , // darkest bg
123
+ ( 49 , 39 , 40 , 34 ) , // FL_GRAY
124
+ ] ,
125
+ ( 0xCC , 0x27 ) , // light ≈ #CCCBB3, dark ≈ #272822
126
+ 110 ,
127
+ ) ;
128
+
129
+ pub const SOLARIZED_LIGHT : Lazy < [ ColorMap ; 256 ] > = make_light_theme (
130
+ & [
131
+ ( 0 , 42 , 42 , 42 ) , // label text (base00)
132
+ ( 7 , 253 , 246 , 227 ) , // main bg (base3)
133
+ ( 49 , 238 , 232 , 213 ) , // FL_GRAY (base2)
134
+ ( 1 , 220 , 50 , 47 ) , // error red
135
+ ( 2 , 133 , 153 , 0 ) , // ok green
136
+ ( 3 , 181 , 137 , 0 ) , // warning yellow
137
+ ( 4 , 38 , 139 , 210 ) , // info blue
138
+ ( 5 , 211 , 54 , 130 ) , // magenta
139
+ ( 15 , 38 , 139 , 210 ) , // check-mark colour
140
+ ] ,
141
+ ( 200 , 255 ) , // gray ramp: 32 = #C8C8C8, 55 = #FFFFFF
142
+ 180 , // cube max: keep shadows mildly muted
143
+ ) ;
0 commit comments