on master help sign in
add a rgb_color equation to map from arbitrary RGB to xterm 240 palette
commit8c8ee2a8b5d921d9fc8463496f020c641f1f390d authorCorey O'Connor <corey@ooyala.com> dateWed 30 Oct 2013, 13:30 (13 years ago) parent5c7598b
4 files changed+321−48
src/Graphics/Vty/Attributes.hs+7−48 src/Graphics/Vty/Attributes/Color.hs+51 src/Graphics/Vty/Attributes/Color240.hs+261 vty.cabal+2
src/Graphics/Vty/Attributes.hs+7−48
@@ -34,13 +34,19 @@
3434-- Then the foreground color encoded into 8 bits.
3535-- Then the background color encoded into 8 bits.
3636--
37−module Graphics.Vty.Attributes
37+module Graphics.Vty.Attributes ( module Graphics.Vty.Attributes
38+ , module Graphics.Vty.Attributes.Color
39+ , module Graphics.Vty.Attributes.Color240
40+ )
3841 where
3942
4043import Data.Bits
4144import Data.Monoid
4245import Data.Word
4346
47+import Graphics.Vty.Attributes.Color
48+import Graphics.Vty.Attributes.Color240
49+
4450-- | A display attribute defines the Color and Style of all the characters rendered after the
4551-- attribute is applied.
4652--
@@ -91,53 +97,6 @@ instance Eq v => Monoid ( MaybeDefault v ) where
9197 mappend ( SetTo v ) KeepCurrent = SetTo v
9298 mappend ( SetTo _ ) ( SetTo v ) = SetTo v
9399
94−-- | Abstract data type representing a color.
95−--
96−-- Currently the foreground and background color are specified as points in either a:
97−--
98−-- * 16 color palette. Where the first 8 colors are equal to the 8 colors of the ISO 6429 (ANSI) 8
99−-- color palette and the second 8 colors are bright/vivid versions of the first 8 colors.
100−--
101−-- * 240 color palette. This palette is a regular sampling of the full RGB colorspace.
102−--
103−-- The 8 ISO 6429 (ANSI) colors are as follows:
104−--
105−-- 0. black
106−--
107−-- 1. red
108−--
109−-- 2. green
110−--
111−-- 3. yellow
112−--
113−-- 4. blue
114−--
115−-- 5. magenta
116−--
117−-- 6. cyan
118−--
119−-- 7. white
120−--
121−-- The mapping from points in the 240 color palette to colors actually displayable by the terminal
122−-- depends on the number of colors the terminal claims to support. Which is usually determined by
123−-- the terminfo "colors" property. If this property is not being accurately reported then the color
124−-- reproduction will be incorrect.
125−--
126−-- If the terminal reports <= 16 colors then the 240 color palette points are only mapped to the 8
127−-- color pallete. I'm not sure of the RGB points for the "bright" colors which is why they are not
128−-- addressable via the 240 color palette.
129−--
130−-- If the terminal reports > 16 colors then the 240 color palette points are mapped to the nearest
131−-- points in a ("color count" - 16) subsampling of the 240 color palette.
132−--
133−-- All of this assumes the terminals are behaving similarly to xterm and rxvt when handling colors.
134−-- And that the individual colors have not been remapped by the user. There may be a way to verify
135−-- this through terminfo but I don't know it.
136−--
137−-- Seriously, terminal color support is INSANE.
138−data Color = ISOColor !Word8 | Color240 !Word8
139− deriving ( Eq, Show )
140−
141100-- | Standard 8-color ANSI terminal color codes.
142101black, red, green, yellow, blue, magenta, cyan, white :: Color
143102black = ISOColor 0
src/Graphics/Vty/Attributes/Color.hsnew file+51
@@ -0,0 +1,51 @@
1+module Graphics.Vty.Attributes.Color where
2+import Data.Word
3+
4+-- | Abstract data type representing a color.
5+--
6+-- Currently the foreground and background color are specified as points in either a:
7+--
8+-- * 16 color palette. Where the first 8 colors are equal to the 8 colors of the ISO 6429 (ANSI) 8
9+-- color palette and the second 8 colors are bright/vivid versions of the first 8 colors.
10+--
11+-- * 240 color palette. This palette is a regular sampling of the full RGB colorspace for the first
12+-- 224 colors. The remaining 16 colors is a greyscale palette.
13+--
14+-- The 8 ISO 6429 (ANSI) colors are as follows:
15+--
16+-- 0. black
17+--
18+-- 1. red
19+--
20+-- 2. green
21+--
22+-- 3. yellow
23+--
24+-- 4. blue
25+--
26+-- 5. magenta
27+--
28+-- 6. cyan
29+--
30+-- 7. white
31+--
32+-- The mapping from points in the 240 color palette to colors actually displayable by the terminal
33+-- depends on the number of colors the terminal claims to support. Which is usually determined by
34+-- the terminfo "colors" property. If this property is not being accurately reported then the color
35+-- reproduction will be incorrect.
36+--
37+-- If the terminal reports <= 16 colors then the 240 color palette points are only mapped to the 8
38+-- color pallete. I'm not sure of the RGB points for the "bright" colors which is why they are not
39+-- addressable via the 240 color palette.
40+--
41+-- If the terminal reports > 16 colors then the 240 color palette points are mapped to the nearest
42+-- points in a ("color count" - 16) subsampling of the 240 color palette.
43+--
44+-- All of this assumes the terminals are behaving similarly to xterm and rxvt when handling colors.
45+-- And that the individual colors have not been remapped by the user. There may be a way to verify
46+-- this through terminfo but I don't know it.
47+--
48+-- Seriously, terminal color support is INSANE.
49+data Color = ISOColor !Word8 | Color240 !Word8
50+ deriving ( Eq, Show )
51+
src/Graphics/Vty/Attributes/Color240.hsnew file+261
@@ -0,0 +1,261 @@
1+{-
2+ - This header file was generated by ./256colres.pl
3+ -}
4+module Graphics.Vty.Attributes.Color240 where
5+
6+import Graphics.Vty.Attributes.Color
7+
8+import Text.Printf
9+
10+-- | RGB color to 240 color palette.
11+--
12+-- generated from 256colres.pl which is forked from xterm 256colres.pl
13+-- todo: all values get clamped high.
14+rgb_color :: Integral i => i -> i -> i -> Color
15+rgb_color r g b
16+ | r < 0 && g < 0 && b < 0 = error "rgb_color with negative color component intensity"
17+ | r == 8 && g == 8 && b == 8 = Color240 216
18+ | r == 18 && g == 18 && b == 18 = Color240 217
19+ | r == 28 && g == 28 && b == 28 = Color240 218
20+ | r == 38 && g == 38 && b == 38 = Color240 219
21+ | r == 48 && g == 48 && b == 48 = Color240 220
22+ | r == 58 && g == 58 && b == 58 = Color240 221
23+ | r == 68 && g == 68 && b == 68 = Color240 222
24+ | r == 78 && g == 78 && b == 78 = Color240 223
25+ | r == 88 && g == 88 && b == 88 = Color240 224
26+ | r == 98 && g == 98 && b == 98 = Color240 225
27+ | r == 108 && g == 108 && b == 108 = Color240 226
28+ | r == 118 && g == 118 && b == 118 = Color240 227
29+ | r == 128 && g == 128 && b == 128 = Color240 228
30+ | r == 138 && g == 138 && b == 138 = Color240 229
31+ | r == 148 && g == 148 && b == 148 = Color240 230
32+ | r == 158 && g == 158 && b == 158 = Color240 231
33+ | r == 168 && g == 168 && b == 168 = Color240 232
34+ | r == 178 && g == 178 && b == 178 = Color240 233
35+ | r == 188 && g == 188 && b == 188 = Color240 234
36+ | r == 198 && g == 198 && b == 198 = Color240 235
37+ | r == 208 && g == 208 && b == 208 = Color240 236
38+ | r == 218 && g == 218 && b == 218 = Color240 237
39+ | r == 228 && g == 228 && b == 228 = Color240 238
40+ | r == 238 && g == 238 && b == 238 = Color240 239
41+ | r <= 0 && g <= 0 && b <= 0 = Color240 0
42+ | r <= 0 && g <= 0 && b <= 95 = Color240 1
43+ | r <= 0 && g <= 0 && b <= 135 = Color240 2
44+ | r <= 0 && g <= 0 && b <= 175 = Color240 3
45+ | r <= 0 && g <= 0 && b <= 215 = Color240 4
46+ | r <= 0 && g <= 0 && b <= 255 = Color240 5
47+ | r <= 0 && g <= 95 && b <= 0 = Color240 6
48+ | r <= 0 && g <= 95 && b <= 95 = Color240 7
49+ | r <= 0 && g <= 95 && b <= 135 = Color240 8
50+ | r <= 0 && g <= 95 && b <= 175 = Color240 9
51+ | r <= 0 && g <= 95 && b <= 215 = Color240 10
52+ | r <= 0 && g <= 95 && b <= 255 = Color240 11
53+ | r <= 0 && g <= 135 && b <= 0 = Color240 12
54+ | r <= 0 && g <= 135 && b <= 95 = Color240 13
55+ | r <= 0 && g <= 135 && b <= 135 = Color240 14
56+ | r <= 0 && g <= 135 && b <= 175 = Color240 15
57+ | r <= 0 && g <= 135 && b <= 215 = Color240 16
58+ | r <= 0 && g <= 135 && b <= 255 = Color240 17
59+ | r <= 0 && g <= 175 && b <= 0 = Color240 18
60+ | r <= 0 && g <= 175 && b <= 95 = Color240 19
61+ | r <= 0 && g <= 175 && b <= 135 = Color240 20
62+ | r <= 0 && g <= 175 && b <= 175 = Color240 21
63+ | r <= 0 && g <= 175 && b <= 215 = Color240 22
64+ | r <= 0 && g <= 175 && b <= 255 = Color240 23
65+ | r <= 0 && g <= 215 && b <= 0 = Color240 24
66+ | r <= 0 && g <= 215 && b <= 95 = Color240 25
67+ | r <= 0 && g <= 215 && b <= 135 = Color240 26
68+ | r <= 0 && g <= 215 && b <= 175 = Color240 27
69+ | r <= 0 && g <= 215 && b <= 215 = Color240 28
70+ | r <= 0 && g <= 215 && b <= 255 = Color240 29
71+ | r <= 0 && g <= 255 && b <= 0 = Color240 30
72+ | r <= 0 && g <= 255 && b <= 95 = Color240 31
73+ | r <= 0 && g <= 255 && b <= 135 = Color240 32
74+ | r <= 0 && g <= 255 && b <= 175 = Color240 33
75+ | r <= 0 && g <= 255 && b <= 215 = Color240 34
76+ | r <= 0 && g <= 255 && b <= 255 = Color240 35
77+ | r <= 95 && g <= 0 && b <= 0 = Color240 36
78+ | r <= 95 && g <= 0 && b <= 95 = Color240 37
79+ | r <= 95 && g <= 0 && b <= 135 = Color240 38
80+ | r <= 95 && g <= 0 && b <= 175 = Color240 39
81+ | r <= 95 && g <= 0 && b <= 215 = Color240 40
82+ | r <= 95 && g <= 0 && b <= 255 = Color240 41
83+ | r <= 95 && g <= 95 && b <= 0 = Color240 42
84+ | r <= 95 && g <= 95 && b <= 95 = Color240 43
85+ | r <= 95 && g <= 95 && b <= 135 = Color240 44
86+ | r <= 95 && g <= 95 && b <= 175 = Color240 45
87+ | r <= 95 && g <= 95 && b <= 215 = Color240 46
88+ | r <= 95 && g <= 95 && b <= 255 = Color240 47
89+ | r <= 95 && g <= 135 && b <= 0 = Color240 48
90+ | r <= 95 && g <= 135 && b <= 95 = Color240 49
91+ | r <= 95 && g <= 135 && b <= 135 = Color240 50
92+ | r <= 95 && g <= 135 && b <= 175 = Color240 51
93+ | r <= 95 && g <= 135 && b <= 215 = Color240 52
94+ | r <= 95 && g <= 135 && b <= 255 = Color240 53
95+ | r <= 95 && g <= 175 && b <= 0 = Color240 54
96+ | r <= 95 && g <= 175 && b <= 95 = Color240 55
97+ | r <= 95 && g <= 175 && b <= 135 = Color240 56
98+ | r <= 95 && g <= 175 && b <= 175 = Color240 57
99+ | r <= 95 && g <= 175 && b <= 215 = Color240 58
100+ | r <= 95 && g <= 175 && b <= 255 = Color240 59
101+ | r <= 95 && g <= 215 && b <= 0 = Color240 60
102+ | r <= 95 && g <= 215 && b <= 95 = Color240 61
103+ | r <= 95 && g <= 215 && b <= 135 = Color240 62
104+ | r <= 95 && g <= 215 && b <= 175 = Color240 63
105+ | r <= 95 && g <= 215 && b <= 215 = Color240 64
106+ | r <= 95 && g <= 215 && b <= 255 = Color240 65
107+ | r <= 95 && g <= 255 && b <= 0 = Color240 66
108+ | r <= 95 && g <= 255 && b <= 95 = Color240 67
109+ | r <= 95 && g <= 255 && b <= 135 = Color240 68
110+ | r <= 95 && g <= 255 && b <= 175 = Color240 69
111+ | r <= 95 && g <= 255 && b <= 215 = Color240 70
112+ | r <= 95 && g <= 255 && b <= 255 = Color240 71
113+ | r <= 135 && g <= 0 && b <= 0 = Color240 72
114+ | r <= 135 && g <= 0 && b <= 95 = Color240 73
115+ | r <= 135 && g <= 0 && b <= 135 = Color240 74
116+ | r <= 135 && g <= 0 && b <= 175 = Color240 75
117+ | r <= 135 && g <= 0 && b <= 215 = Color240 76
118+ | r <= 135 && g <= 0 && b <= 255 = Color240 77
119+ | r <= 135 && g <= 95 && b <= 0 = Color240 78
120+ | r <= 135 && g <= 95 && b <= 95 = Color240 79
121+ | r <= 135 && g <= 95 && b <= 135 = Color240 80
122+ | r <= 135 && g <= 95 && b <= 175 = Color240 81
123+ | r <= 135 && g <= 95 && b <= 215 = Color240 82
124+ | r <= 135 && g <= 95 && b <= 255 = Color240 83
125+ | r <= 135 && g <= 135 && b <= 0 = Color240 84
126+ | r <= 135 && g <= 135 && b <= 95 = Color240 85
127+ | r <= 135 && g <= 135 && b <= 135 = Color240 86
128+ | r <= 135 && g <= 135 && b <= 175 = Color240 87
129+ | r <= 135 && g <= 135 && b <= 215 = Color240 88
130+ | r <= 135 && g <= 135 && b <= 255 = Color240 89
131+ | r <= 135 && g <= 175 && b <= 0 = Color240 90
132+ | r <= 135 && g <= 175 && b <= 95 = Color240 91
133+ | r <= 135 && g <= 175 && b <= 135 = Color240 92
134+ | r <= 135 && g <= 175 && b <= 175 = Color240 93
135+ | r <= 135 && g <= 175 && b <= 215 = Color240 94
136+ | r <= 135 && g <= 175 && b <= 255 = Color240 95
137+ | r <= 135 && g <= 215 && b <= 0 = Color240 96
138+ | r <= 135 && g <= 215 && b <= 95 = Color240 97
139+ | r <= 135 && g <= 215 && b <= 135 = Color240 98
140+ | r <= 135 && g <= 215 && b <= 175 = Color240 99
141+ | r <= 135 && g <= 215 && b <= 215 = Color240 100
142+ | r <= 135 && g <= 215 && b <= 255 = Color240 101
143+ | r <= 135 && g <= 255 && b <= 0 = Color240 102
144+ | r <= 135 && g <= 255 && b <= 95 = Color240 103
145+ | r <= 135 && g <= 255 && b <= 135 = Color240 104
146+ | r <= 135 && g <= 255 && b <= 175 = Color240 105
147+ | r <= 135 && g <= 255 && b <= 215 = Color240 106
148+ | r <= 135 && g <= 255 && b <= 255 = Color240 107
149+ | r <= 175 && g <= 0 && b <= 0 = Color240 108
150+ | r <= 175 && g <= 0 && b <= 95 = Color240 109
151+ | r <= 175 && g <= 0 && b <= 135 = Color240 110
152+ | r <= 175 && g <= 0 && b <= 175 = Color240 111
153+ | r <= 175 && g <= 0 && b <= 215 = Color240 112
154+ | r <= 175 && g <= 0 && b <= 255 = Color240 113
155+ | r <= 175 && g <= 95 && b <= 0 = Color240 114
156+ | r <= 175 && g <= 95 && b <= 95 = Color240 115
157+ | r <= 175 && g <= 95 && b <= 135 = Color240 116
158+ | r <= 175 && g <= 95 && b <= 175 = Color240 117
159+ | r <= 175 && g <= 95 && b <= 215 = Color240 118
160+ | r <= 175 && g <= 95 && b <= 255 = Color240 119
161+ | r <= 175 && g <= 135 && b <= 0 = Color240 120
162+ | r <= 175 && g <= 135 && b <= 95 = Color240 121
163+ | r <= 175 && g <= 135 && b <= 135 = Color240 122
164+ | r <= 175 && g <= 135 && b <= 175 = Color240 123
165+ | r <= 175 && g <= 135 && b <= 215 = Color240 124
166+ | r <= 175 && g <= 135 && b <= 255 = Color240 125
167+ | r <= 175 && g <= 175 && b <= 0 = Color240 126
168+ | r <= 175 && g <= 175 && b <= 95 = Color240 127
169+ | r <= 175 && g <= 175 && b <= 135 = Color240 128
170+ | r <= 175 && g <= 175 && b <= 175 = Color240 129
171+ | r <= 175 && g <= 175 && b <= 215 = Color240 130
172+ | r <= 175 && g <= 175 && b <= 255 = Color240 131
173+ | r <= 175 && g <= 215 && b <= 0 = Color240 132
174+ | r <= 175 && g <= 215 && b <= 95 = Color240 133
175+ | r <= 175 && g <= 215 && b <= 135 = Color240 134
176+ | r <= 175 && g <= 215 && b <= 175 = Color240 135
177+ | r <= 175 && g <= 215 && b <= 215 = Color240 136
178+ | r <= 175 && g <= 215 && b <= 255 = Color240 137
179+ | r <= 175 && g <= 255 && b <= 0 = Color240 138
180+ | r <= 175 && g <= 255 && b <= 95 = Color240 139
181+ | r <= 175 && g <= 255 && b <= 135 = Color240 140
182+ | r <= 175 && g <= 255 && b <= 175 = Color240 141
183+ | r <= 175 && g <= 255 && b <= 215 = Color240 142
184+ | r <= 175 && g <= 255 && b <= 255 = Color240 143
185+ | r <= 215 && g <= 0 && b <= 0 = Color240 144
186+ | r <= 215 && g <= 0 && b <= 95 = Color240 145
187+ | r <= 215 && g <= 0 && b <= 135 = Color240 146
188+ | r <= 215 && g <= 0 && b <= 175 = Color240 147
189+ | r <= 215 && g <= 0 && b <= 215 = Color240 148
190+ | r <= 215 && g <= 0 && b <= 255 = Color240 149
191+ | r <= 215 && g <= 95 && b <= 0 = Color240 150
192+ | r <= 215 && g <= 95 && b <= 95 = Color240 151
193+ | r <= 215 && g <= 95 && b <= 135 = Color240 152
194+ | r <= 215 && g <= 95 && b <= 175 = Color240 153
195+ | r <= 215 && g <= 95 && b <= 215 = Color240 154
196+ | r <= 215 && g <= 95 && b <= 255 = Color240 155
197+ | r <= 215 && g <= 135 && b <= 0 = Color240 156
198+ | r <= 215 && g <= 135 && b <= 95 = Color240 157
199+ | r <= 215 && g <= 135 && b <= 135 = Color240 158
200+ | r <= 215 && g <= 135 && b <= 175 = Color240 159
201+ | r <= 215 && g <= 135 && b <= 215 = Color240 160
202+ | r <= 215 && g <= 135 && b <= 255 = Color240 161
203+ | r <= 215 && g <= 175 && b <= 0 = Color240 162
204+ | r <= 215 && g <= 175 && b <= 95 = Color240 163
205+ | r <= 215 && g <= 175 && b <= 135 = Color240 164
206+ | r <= 215 && g <= 175 && b <= 175 = Color240 165
207+ | r <= 215 && g <= 175 && b <= 215 = Color240 166
208+ | r <= 215 && g <= 175 && b <= 255 = Color240 167
209+ | r <= 215 && g <= 215 && b <= 0 = Color240 168
210+ | r <= 215 && g <= 215 && b <= 95 = Color240 169
211+ | r <= 215 && g <= 215 && b <= 135 = Color240 170
212+ | r <= 215 && g <= 215 && b <= 175 = Color240 171
213+ | r <= 215 && g <= 215 && b <= 215 = Color240 172
214+ | r <= 215 && g <= 215 && b <= 255 = Color240 173
215+ | r <= 215 && g <= 255 && b <= 0 = Color240 174
216+ | r <= 215 && g <= 255 && b <= 95 = Color240 175
217+ | r <= 215 && g <= 255 && b <= 135 = Color240 176
218+ | r <= 215 && g <= 255 && b <= 175 = Color240 177
219+ | r <= 215 && g <= 255 && b <= 215 = Color240 178
220+ | r <= 215 && g <= 255 && b <= 255 = Color240 179
221+ | r <= 255 && g <= 0 && b <= 0 = Color240 180
222+ | r <= 255 && g <= 0 && b <= 95 = Color240 181
223+ | r <= 255 && g <= 0 && b <= 135 = Color240 182
224+ | r <= 255 && g <= 0 && b <= 175 = Color240 183
225+ | r <= 255 && g <= 0 && b <= 215 = Color240 184
226+ | r <= 255 && g <= 0 && b <= 255 = Color240 185
227+ | r <= 255 && g <= 95 && b <= 0 = Color240 186
228+ | r <= 255 && g <= 95 && b <= 95 = Color240 187
229+ | r <= 255 && g <= 95 && b <= 135 = Color240 188
230+ | r <= 255 && g <= 95 && b <= 175 = Color240 189
231+ | r <= 255 && g <= 95 && b <= 215 = Color240 190
232+ | r <= 255 && g <= 95 && b <= 255 = Color240 191
233+ | r <= 255 && g <= 135 && b <= 0 = Color240 192
234+ | r <= 255 && g <= 135 && b <= 95 = Color240 193
235+ | r <= 255 && g <= 135 && b <= 135 = Color240 194
236+ | r <= 255 && g <= 135 && b <= 175 = Color240 195
237+ | r <= 255 && g <= 135 && b <= 215 = Color240 196
238+ | r <= 255 && g <= 135 && b <= 255 = Color240 197
239+ | r <= 255 && g <= 175 && b <= 0 = Color240 198
240+ | r <= 255 && g <= 175 && b <= 95 = Color240 199
241+ | r <= 255 && g <= 175 && b <= 135 = Color240 200
242+ | r <= 255 && g <= 175 && b <= 175 = Color240 201
243+ | r <= 255 && g <= 175 && b <= 215 = Color240 202
244+ | r <= 255 && g <= 175 && b <= 255 = Color240 203
245+ | r <= 255 && g <= 215 && b <= 0 = Color240 204
246+ | r <= 255 && g <= 215 && b <= 95 = Color240 205
247+ | r <= 255 && g <= 215 && b <= 135 = Color240 206
248+ | r <= 255 && g <= 215 && b <= 175 = Color240 207
249+ | r <= 255 && g <= 215 && b <= 215 = Color240 208
250+ | r <= 255 && g <= 215 && b <= 255 = Color240 209
251+ | r <= 255 && g <= 255 && b <= 0 = Color240 210
252+ | r <= 255 && g <= 255 && b <= 95 = Color240 211
253+ | r <= 255 && g <= 255 && b <= 135 = Color240 212
254+ | r <= 255 && g <= 255 && b <= 175 = Color240 213
255+ | r <= 255 && g <= 255 && b <= 215 = Color240 214
256+ | r <= 255 && g <= 255 && b <= 255 = Color240 215
257+ | otherwise = error (printf "RGB color %d %d %d does not map to 240 palette."
258+ (fromIntegral r :: Int)
259+ (fromIntegral g :: Int)
260+ (fromIntegral b :: Int))
261+
vty.cabal+2
@@ -83,6 +83,8 @@ library
8383 Graphics.Vty.Terminal.XTermColor
8484 Graphics.Vty.Terminal.TerminfoBased
8585
86+ other-modules: Graphics.Vty.Attributes.Color
87+ Graphics.Vty.Attributes.Color240
8688
8789 c-sources: cbits/gwinsz.c
8890 cbits/set_term_timing.c