Line data Source code
1 : ;;; tty-colors.el --- color support for character terminals
2 :
3 : ;; Copyright (C) 1999-2017 Free Software Foundation, Inc.
4 :
5 : ;; Author: Eli Zaretskii
6 : ;; Maintainer: emacs-devel@gnu.org
7 : ;; Keywords: terminals, faces
8 :
9 : ;; This file is part of GNU Emacs.
10 :
11 : ;; GNU Emacs is free software: you can redistribute it and/or modify
12 : ;; it under the terms of the GNU General Public License as published by
13 : ;; the Free Software Foundation, either version 3 of the License, or
14 : ;; (at your option) any later version.
15 :
16 : ;; GNU Emacs is distributed in the hope that it will be useful,
17 : ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : ;; GNU General Public License for more details.
20 :
21 : ;; You should have received a copy of the GNU General Public License
22 : ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
23 :
24 : ;;; Commentary:
25 :
26 : ;; Emacs support for colors evolved from the X Window System; color
27 : ;; support for character-based terminals came later. Many Lisp
28 : ;; packages use color names defined by X and assume the availability
29 : ;; of certain functions that look up colors, convert them to pixel
30 : ;; values, etc.
31 :
32 : ;; This file provides a more or less useful emulation of the X color
33 : ;; functionality for character-based terminals, and thus relieves the
34 : ;; rest of Emacs from including special code for this case.
35 :
36 : ;; Here's how it works. The support for terminal and MSDOS frames
37 : ;; maintains an alist, called `tty-defined-color-alist', which
38 : ;; associates colors supported by the terminal driver with small
39 : ;; integers. (These small integers are passed to the library
40 : ;; functions which set the color, and are effectively indices of the
41 : ;; colors in the supported color palette.) When Emacs needs to send a
42 : ;; color command to the terminal, the color name is first looked up in
43 : ;; `tty-defined-color-alist'. If not found, functions from this file
44 : ;; can be used to map the color to one of the supported colors.
45 : ;; Specifically, the X RGB values of the requested color are extracted
46 : ;; from `color-name-rgb-alist' and then the supported color is found
47 : ;; with the minimal distance in the RGB space from the requested
48 : ;; color.
49 :
50 : ;; `tty-defined-color-alist' is created at startup by calling the
51 : ;; function `tty-register-default-colors', defined below, which in
52 : ;; turn calls `tty-color-define', passing it each supported color, its
53 : ;; index, and its RGB values. The standard list of colors supported
54 : ;; by many Unix color terminals, including xterm, FreeBSD, and
55 : ;; GNU/Linux, is supplied below in `tty-standard-colors'. Some
56 : ;; terminal-specific files in lisp/term define their own standard
57 : ;; colors. If your terminal supports different or additional colors,
58 : ;; call `tty-color-define' from your `.emacs' or `site-start.el'. For
59 : ;; more-or-less standard definitions of VGA text-mode colors, see
60 : ;; lisp/term/pc-win.el.
61 :
62 : ;;; Code:
63 :
64 : ;; The following list is taken from rgb.txt distributed with X.
65 : ;;
66 : ;; WARNING: Some colors, such as "lightred", do not appear in this
67 : ;; list. If you think it's a good idea to add them, don't! The
68 : ;; problem is that the X-standard definition of "red" actually
69 : ;; corresponds to "lightred" on VGA (that's why pc-win.el and
70 : ;; w32-fns.el define "lightred" with the same RGB values as "red"
71 : ;; below). Adding "lightred" here would therefore create confusing
72 : ;; and counter-intuitive results, like "red" and "lightred" being the
73 : ;; same color. A similar situation exists with other "light*" colors.
74 : ;;
75 : ;; Nevertheless, "lightred" and other similar color names *are*
76 : ;; defined for the MS-DOS and MS-Windows consoles, because the users
77 : ;; on those systems expect these colors to be available.
78 : ;;
79 : ;; For these reasons, package maintainers are advised NOT to use color
80 : ;; names such as "lightred" or "lightblue", because they will have
81 : ;; different effect on different displays. Instead, use "red1" and
82 : ;; "blue1", respectively.
83 : ;;
84 : ;; Note: the RGB values below are in the range 0-65535, but are derived
85 : ;; from the standard 8-bit X definitions (so the upper and lower bytes
86 : ;; of each value are actually identical).
87 : ;;
88 : (defconst color-name-rgb-alist
89 : '(("snow" 65535 64250 64250)
90 : ("ghostwhite" 63736 63736 65535)
91 : ("whitesmoke" 62965 62965 62965)
92 : ("gainsboro" 56540 56540 56540)
93 : ("floralwhite" 65535 64250 61680)
94 : ("oldlace" 65021 62965 59110)
95 : ("linen" 64250 61680 59110)
96 : ("antiquewhite" 64250 60395 55255)
97 : ("papayawhip" 65535 61423 54741)
98 : ("blanchedalmond" 65535 60395 52685)
99 : ("bisque" 65535 58596 50372)
100 : ("peachpuff" 65535 56026 47545)
101 : ("navajowhite" 65535 57054 44461)
102 : ("moccasin" 65535 58596 46517)
103 : ("cornsilk" 65535 63736 56540)
104 : ("ivory" 65535 65535 61680)
105 : ("lemonchiffon" 65535 64250 52685)
106 : ("seashell" 65535 62965 61166)
107 : ("honeydew" 61680 65535 61680)
108 : ("mintcream" 62965 65535 64250)
109 : ("azure" 61680 65535 65535)
110 : ("aliceblue" 61680 63736 65535)
111 : ("lavender" 59110 59110 64250)
112 : ("lavenderblush" 65535 61680 62965)
113 : ("mistyrose" 65535 58596 57825)
114 : ("white" 65535 65535 65535)
115 : ("black" 0 0 0)
116 : ("darkslategray" 12079 20303 20303)
117 : ("darkslategrey" 12079 20303 20303)
118 : ("dimgray" 26985 26985 26985)
119 : ("dimgrey" 26985 26985 26985)
120 : ("slategray" 28784 32896 37008)
121 : ("slategrey" 28784 32896 37008)
122 : ("lightslategray" 30583 34952 39321)
123 : ("lightslategrey" 30583 34952 39321)
124 : ("gray" 48830 48830 48830)
125 : ("grey" 48830 48830 48830)
126 : ("lightgrey" 54227 54227 54227)
127 : ("lightgray" 54227 54227 54227)
128 : ("midnightblue" 6425 6425 28784)
129 : ("navy" 0 0 32896)
130 : ("navyblue" 0 0 32896)
131 : ("cornflowerblue" 25700 38293 60909)
132 : ("darkslateblue" 18504 15677 35723)
133 : ("slateblue" 27242 23130 52685)
134 : ("mediumslateblue" 31611 26728 61166)
135 : ("lightslateblue" 33924 28784 65535)
136 : ("mediumblue" 0 0 52685)
137 : ("royalblue" 16705 26985 57825)
138 : ("blue" 0 0 65535)
139 : ("dodgerblue" 7710 37008 65535)
140 : ("deepskyblue" 0 49087 65535)
141 : ("skyblue" 34695 52942 60395)
142 : ("lightskyblue" 34695 52942 64250)
143 : ("steelblue" 17990 33410 46260)
144 : ("lightsteelblue" 45232 50372 57054)
145 : ("lightblue" 44461 55512 59110)
146 : ("powderblue" 45232 57568 59110)
147 : ("paleturquoise" 44975 61166 61166)
148 : ("darkturquoise" 0 52942 53713)
149 : ("mediumturquoise" 18504 53713 52428)
150 : ("turquoise" 16448 57568 53456)
151 : ("cyan" 0 65535 65535)
152 : ("lightcyan" 57568 65535 65535)
153 : ("cadetblue" 24415 40606 41120)
154 : ("mediumaquamarine" 26214 52685 43690)
155 : ("aquamarine" 32639 65535 54484)
156 : ("darkgreen" 0 25700 0)
157 : ("darkolivegreen" 21845 27499 12079)
158 : ("darkseagreen" 36751 48316 36751)
159 : ("seagreen" 11822 35723 22359)
160 : ("mediumseagreen" 15420 46003 29041)
161 : ("lightseagreen" 8224 45746 43690)
162 : ("palegreen" 39064 64507 39064)
163 : ("springgreen" 0 65535 32639)
164 : ("lawngreen" 31868 64764 0)
165 : ("green" 0 65535 0)
166 : ("chartreuse" 32639 65535 0)
167 : ("mediumspringgreen" 0 64250 39578)
168 : ("greenyellow" 44461 65535 12079)
169 : ("limegreen" 12850 52685 12850)
170 : ("yellowgreen" 39578 52685 12850)
171 : ("forestgreen" 8738 35723 8738)
172 : ("olivedrab" 27499 36494 8995)
173 : ("darkkhaki" 48573 47031 27499)
174 : ("khaki" 61680 59110 35980)
175 : ("palegoldenrod" 61166 59624 43690)
176 : ("lightgoldenrodyellow" 64250 64250 53970)
177 : ("lightyellow" 65535 65535 57568)
178 : ("yellow" 65535 65535 0)
179 : ("gold" 65535 55255 0)
180 : ("lightgoldenrod" 61166 56797 33410)
181 : ("goldenrod" 56026 42405 8224)
182 : ("darkgoldenrod" 47288 34438 2827)
183 : ("rosybrown" 48316 36751 36751)
184 : ("indianred" 52685 23644 23644)
185 : ("saddlebrown" 35723 17733 4883)
186 : ("sienna" 41120 21074 11565)
187 : ("peru" 52685 34181 16191)
188 : ("burlywood" 57054 47288 34695)
189 : ("beige" 62965 62965 56540)
190 : ("wheat" 62965 57054 46003)
191 : ("sandybrown" 62708 42148 24672)
192 : ("tan" 53970 46260 35980)
193 : ("chocolate" 53970 26985 7710)
194 : ("firebrick" 45746 8738 8738)
195 : ("brown" 42405 10794 10794)
196 : ("darksalmon" 59881 38550 31354)
197 : ("salmon" 64250 32896 29298)
198 : ("lightsalmon" 65535 41120 31354)
199 : ("orange" 65535 42405 0)
200 : ("darkorange" 65535 35980 0)
201 : ("coral" 65535 32639 20560)
202 : ("lightcoral" 61680 32896 32896)
203 : ("tomato" 65535 25443 18247)
204 : ("orangered" 65535 17733 0)
205 : ("red" 65535 0 0)
206 : ("hotpink" 65535 26985 46260)
207 : ("deeppink" 65535 5140 37779)
208 : ("pink" 65535 49344 52171)
209 : ("lightpink" 65535 46774 49601)
210 : ("palevioletred" 56283 28784 37779)
211 : ("maroon" 45232 12336 24672)
212 : ("mediumvioletred" 51143 5397 34181)
213 : ("violetred" 53456 8224 37008)
214 : ("magenta" 65535 0 65535)
215 : ("violet" 61166 33410 61166)
216 : ("plum" 56797 41120 56797)
217 : ("orchid" 56026 28784 54998)
218 : ("mediumorchid" 47802 21845 54227)
219 : ("darkorchid" 39321 12850 52428)
220 : ("darkviolet" 38036 0 54227)
221 : ("blueviolet" 35466 11051 58082)
222 : ("purple" 41120 8224 61680)
223 : ("mediumpurple" 37779 28784 56283)
224 : ("thistle" 55512 49087 55512)
225 : ("snow1" 65535 64250 64250)
226 : ("snow2" 61166 59881 59881)
227 : ("snow3" 52685 51657 51657)
228 : ("snow4" 35723 35209 35209)
229 : ("seashell1" 65535 62965 61166)
230 : ("seashell2" 61166 58853 57054)
231 : ("seashell3" 52685 50629 49087)
232 : ("seashell4" 35723 34438 33410)
233 : ("antiquewhite1" 65535 61423 56283)
234 : ("antiquewhite2" 61166 57311 52428)
235 : ("antiquewhite3" 52685 49344 45232)
236 : ("antiquewhite4" 35723 33667 30840)
237 : ("bisque1" 65535 58596 50372)
238 : ("bisque2" 61166 54741 47031)
239 : ("bisque3" 52685 47031 40606)
240 : ("bisque4" 35723 32125 27499)
241 : ("peachpuff1" 65535 56026 47545)
242 : ("peachpuff2" 61166 52171 44461)
243 : ("peachpuff3" 52685 44975 38293)
244 : ("peachpuff4" 35723 30583 25957)
245 : ("navajowhite1" 65535 57054 44461)
246 : ("navajowhite2" 61166 53199 41377)
247 : ("navajowhite3" 52685 46003 35723)
248 : ("navajowhite4" 35723 31097 24158)
249 : ("lemonchiffon1" 65535 64250 52685)
250 : ("lemonchiffon2" 61166 59881 49087)
251 : ("lemonchiffon3" 52685 51657 42405)
252 : ("lemonchiffon4" 35723 35209 28784)
253 : ("cornsilk1" 65535 63736 56540)
254 : ("cornsilk2" 61166 59624 52685)
255 : ("cornsilk3" 52685 51400 45489)
256 : ("cornsilk4" 35723 34952 30840)
257 : ("ivory1" 65535 65535 61680)
258 : ("ivory2" 61166 61166 57568)
259 : ("ivory3" 52685 52685 49601)
260 : ("ivory4" 35723 35723 33667)
261 : ("honeydew1" 61680 65535 61680)
262 : ("honeydew2" 57568 61166 57568)
263 : ("honeydew3" 49601 52685 49601)
264 : ("honeydew4" 33667 35723 33667)
265 : ("lavenderblush1" 65535 61680 62965)
266 : ("lavenderblush2" 61166 57568 58853)
267 : ("lavenderblush3" 52685 49601 50629)
268 : ("lavenderblush4" 35723 33667 34438)
269 : ("mistyrose1" 65535 58596 57825)
270 : ("mistyrose2" 61166 54741 53970)
271 : ("mistyrose3" 52685 47031 46517)
272 : ("mistyrose4" 35723 32125 31611)
273 : ("azure1" 61680 65535 65535)
274 : ("azure2" 57568 61166 61166)
275 : ("azure3" 49601 52685 52685)
276 : ("azure4" 33667 35723 35723)
277 : ("slateblue1" 33667 28527 65535)
278 : ("slateblue2" 31354 26471 61166)
279 : ("slateblue3" 26985 22873 52685)
280 : ("slateblue4" 18247 15420 35723)
281 : ("royalblue1" 18504 30326 65535)
282 : ("royalblue2" 17219 28270 61166)
283 : ("royalblue3" 14906 24415 52685)
284 : ("royalblue4" 10023 16448 35723)
285 : ("blue1" 0 0 65535)
286 : ("blue2" 0 0 61166)
287 : ("blue3" 0 0 52685)
288 : ("blue4" 0 0 35723)
289 : ("dodgerblue1" 7710 37008 65535)
290 : ("dodgerblue2" 7196 34438 61166)
291 : ("dodgerblue3" 6168 29812 52685)
292 : ("dodgerblue4" 4112 20046 35723)
293 : ("steelblue1" 25443 47288 65535)
294 : ("steelblue2" 23644 44204 61166)
295 : ("steelblue3" 20303 38036 52685)
296 : ("steelblue4" 13878 25700 35723)
297 : ("deepskyblue1" 0 49087 65535)
298 : ("deepskyblue2" 0 45746 61166)
299 : ("deepskyblue3" 0 39578 52685)
300 : ("deepskyblue4" 0 26728 35723)
301 : ("skyblue1" 34695 52942 65535)
302 : ("skyblue2" 32382 49344 61166)
303 : ("skyblue3" 27756 42662 52685)
304 : ("skyblue4" 19018 28784 35723)
305 : ("lightskyblue1" 45232 58082 65535)
306 : ("lightskyblue2" 42148 54227 61166)
307 : ("lightskyblue3" 36237 46774 52685)
308 : ("lightskyblue4" 24672 31611 35723)
309 : ("slategray1" 50886 58082 65535)
310 : ("slategray2" 47545 54227 61166)
311 : ("slategray3" 40863 46774 52685)
312 : ("slategray4" 27756 31611 35723)
313 : ("lightsteelblue1" 51914 57825 65535)
314 : ("lightsteelblue2" 48316 53970 61166)
315 : ("lightsteelblue3" 41634 46517 52685)
316 : ("lightsteelblue4" 28270 31611 35723)
317 : ("lightblue1" 49087 61423 65535)
318 : ("lightblue2" 45746 57311 61166)
319 : ("lightblue3" 39578 49344 52685)
320 : ("lightblue4" 26728 33667 35723)
321 : ("lightcyan1" 57568 65535 65535)
322 : ("lightcyan2" 53713 61166 61166)
323 : ("lightcyan3" 46260 52685 52685)
324 : ("lightcyan4" 31354 35723 35723)
325 : ("paleturquoise1" 48059 65535 65535)
326 : ("paleturquoise2" 44718 61166 61166)
327 : ("paleturquoise3" 38550 52685 52685)
328 : ("paleturquoise4" 26214 35723 35723)
329 : ("cadetblue1" 39064 62965 65535)
330 : ("cadetblue2" 36494 58853 61166)
331 : ("cadetblue3" 31354 50629 52685)
332 : ("cadetblue4" 21331 34438 35723)
333 : ("turquoise1" 0 62965 65535)
334 : ("turquoise2" 0 58853 61166)
335 : ("turquoise3" 0 50629 52685)
336 : ("turquoise4" 0 34438 35723)
337 : ("cyan1" 0 65535 65535)
338 : ("cyan2" 0 61166 61166)
339 : ("cyan3" 0 52685 52685)
340 : ("cyan4" 0 35723 35723)
341 : ("darkslategray1" 38807 65535 65535)
342 : ("darkslategray2" 36237 61166 61166)
343 : ("darkslategray3" 31097 52685 52685)
344 : ("darkslategray4" 21074 35723 35723)
345 : ("aquamarine1" 32639 65535 54484)
346 : ("aquamarine2" 30326 61166 50886)
347 : ("aquamarine3" 26214 52685 43690)
348 : ("aquamarine4" 17733 35723 29812)
349 : ("darkseagreen1" 49601 65535 49601)
350 : ("darkseagreen2" 46260 61166 46260)
351 : ("darkseagreen3" 39835 52685 39835)
352 : ("darkseagreen4" 26985 35723 26985)
353 : ("seagreen1" 21588 65535 40863)
354 : ("seagreen2" 20046 61166 38036)
355 : ("seagreen3" 17219 52685 32896)
356 : ("seagreen4" 11822 35723 22359)
357 : ("palegreen1" 39578 65535 39578)
358 : ("palegreen2" 37008 61166 37008)
359 : ("palegreen3" 31868 52685 31868)
360 : ("palegreen4" 21588 35723 21588)
361 : ("springgreen1" 0 65535 32639)
362 : ("springgreen2" 0 61166 30326)
363 : ("springgreen3" 0 52685 26214)
364 : ("springgreen4" 0 35723 17733)
365 : ("green1" 0 65535 0)
366 : ("green2" 0 61166 0)
367 : ("green3" 0 52685 0)
368 : ("green4" 0 35723 0)
369 : ("chartreuse1" 32639 65535 0)
370 : ("chartreuse2" 30326 61166 0)
371 : ("chartreuse3" 26214 52685 0)
372 : ("chartreuse4" 17733 35723 0)
373 : ("olivedrab1" 49344 65535 15934)
374 : ("olivedrab2" 46003 61166 14906)
375 : ("olivedrab3" 39578 52685 12850)
376 : ("olivedrab4" 26985 35723 8738)
377 : ("darkolivegreen1" 51914 65535 28784)
378 : ("darkolivegreen2" 48316 61166 26728)
379 : ("darkolivegreen3" 41634 52685 23130)
380 : ("darkolivegreen4" 28270 35723 15677)
381 : ("khaki1" 65535 63222 36751)
382 : ("khaki2" 61166 59110 34181)
383 : ("khaki3" 52685 50886 29555)
384 : ("khaki4" 35723 34438 20046)
385 : ("lightgoldenrod1" 65535 60652 35723)
386 : ("lightgoldenrod2" 61166 56540 33410)
387 : ("lightgoldenrod3" 52685 48830 28784)
388 : ("lightgoldenrod4" 35723 33153 19532)
389 : ("lightyellow1" 65535 65535 57568)
390 : ("lightyellow2" 61166 61166 53713)
391 : ("lightyellow3" 52685 52685 46260)
392 : ("lightyellow4" 35723 35723 31354)
393 : ("yellow1" 65535 65535 0)
394 : ("yellow2" 61166 61166 0)
395 : ("yellow3" 52685 52685 0)
396 : ("yellow4" 35723 35723 0)
397 : ("gold1" 65535 55255 0)
398 : ("gold2" 61166 51657 0)
399 : ("gold3" 52685 44461 0)
400 : ("gold4" 35723 30069 0)
401 : ("goldenrod1" 65535 49601 9509)
402 : ("goldenrod2" 61166 46260 8738)
403 : ("goldenrod3" 52685 39835 7453)
404 : ("goldenrod4" 35723 26985 5140)
405 : ("darkgoldenrod1" 65535 47545 3855)
406 : ("darkgoldenrod2" 61166 44461 3598)
407 : ("darkgoldenrod3" 52685 38293 3084)
408 : ("darkgoldenrod4" 35723 25957 2056)
409 : ("rosybrown1" 65535 49601 49601)
410 : ("rosybrown2" 61166 46260 46260)
411 : ("rosybrown3" 52685 39835 39835)
412 : ("rosybrown4" 35723 26985 26985)
413 : ("indianred1" 65535 27242 27242)
414 : ("indianred2" 61166 25443 25443)
415 : ("indianred3" 52685 21845 21845)
416 : ("indianred4" 35723 14906 14906)
417 : ("sienna1" 65535 33410 18247)
418 : ("sienna2" 61166 31097 16962)
419 : ("sienna3" 52685 26728 14649)
420 : ("sienna4" 35723 18247 9766)
421 : ("burlywood1" 65535 54227 39835)
422 : ("burlywood2" 61166 50629 37265)
423 : ("burlywood3" 52685 43690 32125)
424 : ("burlywood4" 35723 29555 21845)
425 : ("wheat1" 65535 59367 47802)
426 : ("wheat2" 61166 55512 44718)
427 : ("wheat3" 52685 47802 38550)
428 : ("wheat4" 35723 32382 26214)
429 : ("tan1" 65535 42405 20303)
430 : ("tan2" 61166 39578 18761)
431 : ("tan3" 52685 34181 16191)
432 : ("tan4" 35723 23130 11051)
433 : ("chocolate1" 65535 32639 9252)
434 : ("chocolate2" 61166 30326 8481)
435 : ("chocolate3" 52685 26214 7453)
436 : ("chocolate4" 35723 17733 4883)
437 : ("firebrick1" 65535 12336 12336)
438 : ("firebrick2" 61166 11308 11308)
439 : ("firebrick3" 52685 9766 9766)
440 : ("firebrick4" 35723 6682 6682)
441 : ("brown1" 65535 16448 16448)
442 : ("brown2" 61166 15163 15163)
443 : ("brown3" 52685 13107 13107)
444 : ("brown4" 35723 8995 8995)
445 : ("salmon1" 65535 35980 26985)
446 : ("salmon2" 61166 33410 25186)
447 : ("salmon3" 52685 28784 21588)
448 : ("salmon4" 35723 19532 14649)
449 : ("lightsalmon1" 65535 41120 31354)
450 : ("lightsalmon2" 61166 38293 29298)
451 : ("lightsalmon3" 52685 33153 25186)
452 : ("lightsalmon4" 35723 22359 16962)
453 : ("orange1" 65535 42405 0)
454 : ("orange2" 61166 39578 0)
455 : ("orange3" 52685 34181 0)
456 : ("orange4" 35723 23130 0)
457 : ("darkorange1" 65535 32639 0)
458 : ("darkorange2" 61166 30326 0)
459 : ("darkorange3" 52685 26214 0)
460 : ("darkorange4" 35723 17733 0)
461 : ("coral1" 65535 29298 22102)
462 : ("coral2" 61166 27242 20560)
463 : ("coral3" 52685 23387 17733)
464 : ("coral4" 35723 15934 12079)
465 : ("tomato1" 65535 25443 18247)
466 : ("tomato2" 61166 23644 16962)
467 : ("tomato3" 52685 20303 14649)
468 : ("tomato4" 35723 13878 9766)
469 : ("orangered1" 65535 17733 0)
470 : ("orangered2" 61166 16448 0)
471 : ("orangered3" 52685 14135 0)
472 : ("orangered4" 35723 9509 0)
473 : ("red1" 65535 0 0)
474 : ("red2" 61166 0 0)
475 : ("red3" 52685 0 0)
476 : ("red4" 35723 0 0)
477 : ("deeppink1" 65535 5140 37779)
478 : ("deeppink2" 61166 4626 35209)
479 : ("deeppink3" 52685 4112 30326)
480 : ("deeppink4" 35723 2570 20560)
481 : ("hotpink1" 65535 28270 46260)
482 : ("hotpink2" 61166 27242 42919)
483 : ("hotpink3" 52685 24672 37008)
484 : ("hotpink4" 35723 14906 25186)
485 : ("pink1" 65535 46517 50629)
486 : ("pink2" 61166 43433 47288)
487 : ("pink3" 52685 37265 40606)
488 : ("pink4" 35723 25443 27756)
489 : ("lightpink1" 65535 44718 47545)
490 : ("lightpink2" 61166 41634 44461)
491 : ("lightpink3" 52685 35980 38293)
492 : ("lightpink4" 35723 24415 25957)
493 : ("palevioletred1" 65535 33410 43947)
494 : ("palevioletred2" 61166 31097 40863)
495 : ("palevioletred3" 52685 26728 35209)
496 : ("palevioletred4" 35723 18247 23901)
497 : ("maroon1" 65535 13364 46003)
498 : ("maroon2" 61166 12336 42919)
499 : ("maroon3" 52685 10537 37008)
500 : ("maroon4" 35723 7196 25186)
501 : ("violetred1" 65535 15934 38550)
502 : ("violetred2" 61166 14906 35980)
503 : ("violetred3" 52685 12850 30840)
504 : ("violetred4" 35723 8738 21074)
505 : ("magenta1" 65535 0 65535)
506 : ("magenta2" 61166 0 61166)
507 : ("magenta3" 52685 0 52685)
508 : ("magenta4" 35723 0 35723)
509 : ("orchid1" 65535 33667 64250)
510 : ("orchid2" 61166 31354 59881)
511 : ("orchid3" 52685 26985 51657)
512 : ("orchid4" 35723 18247 35209)
513 : ("plum1" 65535 48059 65535)
514 : ("plum2" 61166 44718 61166)
515 : ("plum3" 52685 38550 52685)
516 : ("plum4" 35723 26214 35723)
517 : ("mediumorchid1" 57568 26214 65535)
518 : ("mediumorchid2" 53713 24415 61166)
519 : ("mediumorchid3" 46260 21074 52685)
520 : ("mediumorchid4" 31354 14135 35723)
521 : ("darkorchid1" 49087 15934 65535)
522 : ("darkorchid2" 45746 14906 61166)
523 : ("darkorchid3" 39578 12850 52685)
524 : ("darkorchid4" 26728 8738 35723)
525 : ("purple1" 39835 12336 65535)
526 : ("purple2" 37265 11308 61166)
527 : ("purple3" 32125 9766 52685)
528 : ("purple4" 21845 6682 35723)
529 : ("mediumpurple1" 43947 33410 65535)
530 : ("mediumpurple2" 40863 31097 61166)
531 : ("mediumpurple3" 35209 26728 52685)
532 : ("mediumpurple4" 23901 18247 35723)
533 : ("thistle1" 65535 57825 65535)
534 : ("thistle2" 61166 53970 61166)
535 : ("thistle3" 52685 46517 52685)
536 : ("thistle4" 35723 31611 35723)
537 : ("gray0" 0 0 0)
538 : ("grey0" 0 0 0)
539 : ("gray1" 771 771 771)
540 : ("grey1" 771 771 771)
541 : ("gray2" 1285 1285 1285)
542 : ("grey2" 1285 1285 1285)
543 : ("gray3" 2056 2056 2056)
544 : ("grey3" 2056 2056 2056)
545 : ("gray4" 2570 2570 2570)
546 : ("grey4" 2570 2570 2570)
547 : ("gray5" 3341 3341 3341)
548 : ("grey5" 3341 3341 3341)
549 : ("gray6" 3855 3855 3855)
550 : ("grey6" 3855 3855 3855)
551 : ("gray7" 4626 4626 4626)
552 : ("grey7" 4626 4626 4626)
553 : ("gray8" 5140 5140 5140)
554 : ("grey8" 5140 5140 5140)
555 : ("gray9" 5911 5911 5911)
556 : ("grey9" 5911 5911 5911)
557 : ("gray10" 6682 6682 6682)
558 : ("grey10" 6682 6682 6682)
559 : ("gray11" 7196 7196 7196)
560 : ("grey11" 7196 7196 7196)
561 : ("gray12" 7967 7967 7967)
562 : ("grey12" 7967 7967 7967)
563 : ("gray13" 8481 8481 8481)
564 : ("grey13" 8481 8481 8481)
565 : ("gray14" 9252 9252 9252)
566 : ("grey14" 9252 9252 9252)
567 : ("gray15" 9766 9766 9766)
568 : ("grey15" 9766 9766 9766)
569 : ("gray16" 10537 10537 10537)
570 : ("grey16" 10537 10537 10537)
571 : ("gray17" 11051 11051 11051)
572 : ("grey17" 11051 11051 11051)
573 : ("gray18" 11822 11822 11822)
574 : ("grey18" 11822 11822 11822)
575 : ("gray19" 12336 12336 12336)
576 : ("grey19" 12336 12336 12336)
577 : ("gray20" 13107 13107 13107)
578 : ("grey20" 13107 13107 13107)
579 : ("gray21" 13878 13878 13878)
580 : ("grey21" 13878 13878 13878)
581 : ("gray22" 14392 14392 14392)
582 : ("grey22" 14392 14392 14392)
583 : ("gray23" 15163 15163 15163)
584 : ("grey23" 15163 15163 15163)
585 : ("gray24" 15677 15677 15677)
586 : ("grey24" 15677 15677 15677)
587 : ("gray25" 16448 16448 16448)
588 : ("grey25" 16448 16448 16448)
589 : ("gray26" 16962 16962 16962)
590 : ("grey26" 16962 16962 16962)
591 : ("gray27" 17733 17733 17733)
592 : ("grey27" 17733 17733 17733)
593 : ("gray28" 18247 18247 18247)
594 : ("grey28" 18247 18247 18247)
595 : ("gray29" 19018 19018 19018)
596 : ("grey29" 19018 19018 19018)
597 : ("gray30" 19789 19789 19789)
598 : ("grey30" 19789 19789 19789)
599 : ("gray31" 20303 20303 20303)
600 : ("grey31" 20303 20303 20303)
601 : ("gray32" 21074 21074 21074)
602 : ("grey32" 21074 21074 21074)
603 : ("gray33" 21588 21588 21588)
604 : ("grey33" 21588 21588 21588)
605 : ("gray34" 22359 22359 22359)
606 : ("grey34" 22359 22359 22359)
607 : ("gray35" 22873 22873 22873)
608 : ("grey35" 22873 22873 22873)
609 : ("gray36" 23644 23644 23644)
610 : ("grey36" 23644 23644 23644)
611 : ("gray37" 24158 24158 24158)
612 : ("grey37" 24158 24158 24158)
613 : ("gray38" 24929 24929 24929)
614 : ("grey38" 24929 24929 24929)
615 : ("gray39" 25443 25443 25443)
616 : ("grey39" 25443 25443 25443)
617 : ("gray40" 26214 26214 26214)
618 : ("grey40" 26214 26214 26214)
619 : ("gray41" 26985 26985 26985)
620 : ("grey41" 26985 26985 26985)
621 : ("gray42" 27499 27499 27499)
622 : ("grey42" 27499 27499 27499)
623 : ("gray43" 28270 28270 28270)
624 : ("grey43" 28270 28270 28270)
625 : ("gray44" 28784 28784 28784)
626 : ("grey44" 28784 28784 28784)
627 : ("gray45" 29555 29555 29555)
628 : ("grey45" 29555 29555 29555)
629 : ("gray46" 30069 30069 30069)
630 : ("grey46" 30069 30069 30069)
631 : ("gray47" 30840 30840 30840)
632 : ("grey47" 30840 30840 30840)
633 : ("gray48" 31354 31354 31354)
634 : ("grey48" 31354 31354 31354)
635 : ("gray49" 32125 32125 32125)
636 : ("grey49" 32125 32125 32125)
637 : ("gray50" 32639 32639 32639)
638 : ("grey50" 32639 32639 32639)
639 : ("gray51" 33410 33410 33410)
640 : ("grey51" 33410 33410 33410)
641 : ("gray52" 34181 34181 34181)
642 : ("grey52" 34181 34181 34181)
643 : ("gray53" 34695 34695 34695)
644 : ("grey53" 34695 34695 34695)
645 : ("gray54" 35466 35466 35466)
646 : ("grey54" 35466 35466 35466)
647 : ("gray55" 35980 35980 35980)
648 : ("grey55" 35980 35980 35980)
649 : ("gray56" 36751 36751 36751)
650 : ("grey56" 36751 36751 36751)
651 : ("gray57" 37265 37265 37265)
652 : ("grey57" 37265 37265 37265)
653 : ("gray58" 38036 38036 38036)
654 : ("grey58" 38036 38036 38036)
655 : ("gray59" 38550 38550 38550)
656 : ("grey59" 38550 38550 38550)
657 : ("gray60" 39321 39321 39321)
658 : ("grey60" 39321 39321 39321)
659 : ("gray61" 40092 40092 40092)
660 : ("grey61" 40092 40092 40092)
661 : ("gray62" 40606 40606 40606)
662 : ("grey62" 40606 40606 40606)
663 : ("gray63" 41377 41377 41377)
664 : ("grey63" 41377 41377 41377)
665 : ("gray64" 41891 41891 41891)
666 : ("grey64" 41891 41891 41891)
667 : ("gray65" 42662 42662 42662)
668 : ("grey65" 42662 42662 42662)
669 : ("gray66" 43176 43176 43176)
670 : ("grey66" 43176 43176 43176)
671 : ("gray67" 43947 43947 43947)
672 : ("grey67" 43947 43947 43947)
673 : ("gray68" 44461 44461 44461)
674 : ("grey68" 44461 44461 44461)
675 : ("gray69" 45232 45232 45232)
676 : ("grey69" 45232 45232 45232)
677 : ("gray70" 46003 46003 46003)
678 : ("grey70" 46003 46003 46003)
679 : ("gray71" 46517 46517 46517)
680 : ("grey71" 46517 46517 46517)
681 : ("gray72" 47288 47288 47288)
682 : ("grey72" 47288 47288 47288)
683 : ("gray73" 47802 47802 47802)
684 : ("grey73" 47802 47802 47802)
685 : ("gray74" 48573 48573 48573)
686 : ("grey74" 48573 48573 48573)
687 : ("gray75" 49087 49087 49087)
688 : ("grey75" 49087 49087 49087)
689 : ("gray76" 49858 49858 49858)
690 : ("grey76" 49858 49858 49858)
691 : ("gray77" 50372 50372 50372)
692 : ("grey77" 50372 50372 50372)
693 : ("gray78" 51143 51143 51143)
694 : ("grey78" 51143 51143 51143)
695 : ("gray79" 51657 51657 51657)
696 : ("grey79" 51657 51657 51657)
697 : ("gray80" 52428 52428 52428)
698 : ("grey80" 52428 52428 52428)
699 : ("gray81" 53199 53199 53199)
700 : ("grey81" 53199 53199 53199)
701 : ("gray82" 53713 53713 53713)
702 : ("grey82" 53713 53713 53713)
703 : ("gray83" 54484 54484 54484)
704 : ("grey83" 54484 54484 54484)
705 : ("gray84" 54998 54998 54998)
706 : ("grey84" 54998 54998 54998)
707 : ("gray85" 55769 55769 55769)
708 : ("grey85" 55769 55769 55769)
709 : ("gray86" 56283 56283 56283)
710 : ("grey86" 56283 56283 56283)
711 : ("gray87" 57054 57054 57054)
712 : ("grey87" 57054 57054 57054)
713 : ("gray88" 57568 57568 57568)
714 : ("grey88" 57568 57568 57568)
715 : ("gray89" 58339 58339 58339)
716 : ("grey89" 58339 58339 58339)
717 : ("gray90" 58853 58853 58853)
718 : ("grey90" 58853 58853 58853)
719 : ("gray91" 59624 59624 59624)
720 : ("grey91" 59624 59624 59624)
721 : ("gray92" 60395 60395 60395)
722 : ("grey92" 60395 60395 60395)
723 : ("gray93" 60909 60909 60909)
724 : ("grey93" 60909 60909 60909)
725 : ("gray94" 61680 61680 61680)
726 : ("grey94" 61680 61680 61680)
727 : ("gray95" 62194 62194 62194)
728 : ("grey95" 62194 62194 62194)
729 : ("gray96" 62965 62965 62965)
730 : ("grey96" 62965 62965 62965)
731 : ("gray97" 63479 63479 63479)
732 : ("grey97" 63479 63479 63479)
733 : ("gray98" 64250 64250 64250)
734 : ("grey98" 64250 64250 64250)
735 : ("gray99" 64764 64764 64764)
736 : ("grey99" 64764 64764 64764)
737 : ("gray100" 65535 65535 65535)
738 : ("grey100" 65535 65535 65535)
739 : ("darkgrey" 43433 43433 43433)
740 : ("darkgray" 43433 43433 43433)
741 : ("darkblue" 0 0 35723)
742 : ("darkcyan" 0 35723 35723) ; no "lightmagenta", see comment above
743 : ("darkmagenta" 35723 0 35723)
744 : ("darkred" 35723 0 0) ; but no "lightred", see comment above
745 : ("lightgreen" 37008 61166 37008))
746 : "An alist of X color names and associated 16-bit RGB values.")
747 :
748 : (defconst tty-standard-colors
749 : '(("black" 0 0 0 0)
750 : ("red" 1 65535 0 0)
751 : ("green" 2 0 65535 0)
752 : ("yellow" 3 65535 65535 0)
753 : ("blue" 4 0 0 65535)
754 : ("magenta" 5 65535 0 65535)
755 : ("cyan" 6 0 65535 65535)
756 : ("white" 7 65535 65535 65535))
757 : "An alist of 8 standard tty colors, their indices and RGB values.")
758 :
759 : ;; This is used by term.c
760 : (defconst tty-color-mode-alist
761 : '((never . -1)
762 : (no . -1)
763 : (default . 0)
764 : (auto . 0)
765 : (ansi8 . 8)
766 : (always . 8)
767 : (yes . 8))
768 : "An alist of supported standard tty color modes and their aliases.")
769 :
770 : (defun tty-color-alist (&optional _frame)
771 : "Return an alist of colors supported by FRAME's terminal.
772 : FRAME defaults to the selected frame.
773 : Each element of the returned alist is of the form:
774 : (NAME INDEX R G B)
775 : where NAME is the name of the color, a string;
776 : INDEX is the index of this color to be sent to the terminal driver
777 : when the color should be displayed; it is typically a small integer;
778 : R, G, and B are the intensities of, accordingly, red, green, and blue
779 : components of the color, represented as numbers between 0 and 65535.
780 : The file `etc/rgb.txt' in the Emacs distribution lists the standard
781 : RGB values of the X colors. If RGB is nil, this color will not be
782 : considered by `tty-color-translate' as an approximation to another
783 : color."
784 0 : tty-defined-color-alist)
785 :
786 : (defun tty-modify-color-alist (elt &optional frame)
787 : "Put the association ELT into the alist of terminal colors for FRAME.
788 : ELT should be of the form (NAME INDEX R G B) (see `tty-color-alist'
789 : for details).
790 : If the association for NAME already exists in the color alist, it is
791 : modified to specify (INDEX R G B) as its cdr. Otherwise, ELT is
792 : appended to the end of the color alist.
793 : If FRAME is unspecified or nil, it defaults to the selected frame.
794 : Value is the modified color alist for FRAME."
795 0 : (let* ((entry (assoc (car elt) (tty-color-alist frame))))
796 0 : (if entry
797 0 : (setcdr entry (cdr elt))
798 : ;; Keep the colors in the order they are registered.
799 0 : (setq entry
800 0 : (list (append (list (car elt)
801 0 : (cadr elt))
802 0 : (copy-sequence (cddr elt)))))
803 0 : (setq tty-defined-color-alist (nconc tty-defined-color-alist entry)))
804 0 : tty-defined-color-alist))
805 :
806 : (defun tty-register-default-colors ()
807 : "Register the default set of colors for a character terminal."
808 0 : (let* ((colors tty-standard-colors)
809 0 : (color (car colors)))
810 0 : (while colors
811 0 : (tty-color-define (car color) (cadr color) (cddr color))
812 0 : (setq colors (cdr colors) color (car colors)))
813 : ;; Modifying color mappings means realized faces don't use the
814 : ;; right colors, so clear them, if we modified colors on a TTY
815 : ;; frame.
816 0 : (or (display-graphic-p)
817 0 : (clear-face-cache))))
818 :
819 : (defun tty-color-canonicalize (color)
820 : "Return COLOR in canonical form.
821 : A canonicalized color name is all-lower case, with any blanks removed."
822 0 : (let ((case-fold-search nil))
823 0 : (if (string-match "[A-Z ]" color)
824 0 : (replace-regexp-in-string " +" "" (downcase color))
825 0 : color)))
826 :
827 : (defun tty-color-24bit (rgb)
828 : "Return pixel value on 24-bit terminals. Return nil if RGB is
829 : nil or not on 24-bit terminal."
830 0 : (when (and rgb (= (display-color-cells) 16777216))
831 0 : (let ((r (lsh (car rgb) -8))
832 0 : (g (lsh (cadr rgb) -8))
833 0 : (b (lsh (nth 2 rgb) -8)))
834 0 : (logior (lsh r 16) (lsh g 8) b))))
835 :
836 : (defun tty-color-define (name index &optional rgb frame)
837 : "Specify a tty color by its NAME, terminal INDEX and RGB values.
838 : NAME is a string, INDEX is typically a small integer used to send to
839 : the terminal driver a command to switch this color on, and RGB is a
840 : list of 3 numbers that specify the intensity of red, green, and blue
841 : components of the color.
842 : If specified, each one of the RGB components must be a number between
843 : 0 and 65535. If RGB is omitted, the specified color will never be used
844 : by `tty-color-translate' as an approximation to another color.
845 : FRAME is the frame where the defined color should be used.
846 : If FRAME is not specified or is nil, it defaults to the selected frame."
847 0 : (if (or (not (stringp name))
848 0 : (not (integerp index))
849 0 : (and rgb (or (not (listp rgb)) (/= (length rgb) 3))))
850 0 : (error "Invalid specification for tty color \"%s\"" name))
851 0 : (tty-modify-color-alist
852 0 : (append (list (tty-color-canonicalize name)
853 0 : (or (tty-color-24bit rgb) index))
854 0 : rgb)
855 0 : frame))
856 :
857 : (defun tty-color-clear (&optional _frame)
858 : "Clear the list of supported tty colors for frame FRAME.
859 : If FRAME is unspecified or nil, it defaults to the selected frame."
860 0 : (setq tty-defined-color-alist nil))
861 :
862 : (defun tty-color-off-gray-diag (r g b)
863 : "Compute the angle between the color given by R,G,B and the gray diagonal.
864 : The gray diagonal is the diagonal of the 3D cube in RGB space which
865 : connects the points corresponding to the black and white colors. All the
866 : colors whose RGB coordinates belong to this diagonal are various shades
867 : of gray, thus the name."
868 0 : (let ((mag (sqrt (* 3 (+ (* r r) (* g g) (* b b))))))
869 0 : (if (< mag 1) 0 (acos (/ (+ r g b) mag)))))
870 :
871 : (defun tty-color-approximate (rgb &optional frame)
872 : "Find the color in `tty-color-alist' that best approximates RGB.
873 : Value is a list of the form (NAME INDEX R G B).
874 : The argument RGB should be an rgb value, that is, a list of three
875 : integers in the 0..65535 range.
876 : FRAME defaults to the selected frame."
877 0 : (let* ((color-list (tty-color-alist frame))
878 0 : (candidate (car color-list))
879 : (best-distance 195076) ;; 3 * 255^2 + 15
880 0 : (r (ash (car rgb) -8))
881 0 : (g (ash (cadr rgb) -8))
882 0 : (b (ash (nth 2 rgb) -8))
883 : best-color)
884 0 : (while candidate
885 0 : (let ((try-rgb (cddr candidate))
886 : ;; If the approximated color is not close enough to the
887 : ;; gray diagonal of the RGB cube, favor non-gray colors.
888 : ;; (The number 0.065 is an empirical ad-hoc'ery.)
889 0 : (favor-non-gray (>= (tty-color-off-gray-diag r g b) 0.065))
890 : try-r try-g try-b
891 : dif-r dif-g dif-b dist)
892 : ;; If the RGB values of the candidate color are unknown, we
893 : ;; never consider it for approximating another color.
894 0 : (if try-rgb
895 0 : (progn
896 0 : (setq try-r (lsh (car try-rgb) -8)
897 0 : try-g (lsh (cadr try-rgb) -8)
898 0 : try-b (lsh (nth 2 try-rgb) -8))
899 0 : (setq dif-r (- r try-r)
900 0 : dif-g (- g try-g)
901 0 : dif-b (- b try-b))
902 0 : (setq dist (+ (* dif-r dif-r) (* dif-g dif-g) (* dif-b dif-b)))
903 0 : (if (and (< dist best-distance)
904 : ;; The candidate color is on the gray diagonal
905 : ;; if its RGB components are all equal.
906 0 : (or (/= try-r try-g) (/= try-g try-b)
907 0 : (not favor-non-gray)))
908 0 : (setq best-distance dist
909 0 : best-color candidate)))))
910 0 : (setq color-list (cdr color-list))
911 0 : (setq candidate (car color-list)))
912 0 : best-color))
913 :
914 : (defun tty-color-standard-values (color)
915 : "Return standard RGB values of the color COLOR.
916 :
917 : The result is a list of integer RGB values--(RED GREEN BLUE).
918 : These values range from 0 to 65535; white is (65535 65535 65535).
919 :
920 : The returned value reflects the standard X definition of COLOR,
921 : regardless of whether the terminal can display it, so the return value
922 : should be the same regardless of what display is being used."
923 0 : (let ((len (length color)))
924 0 : (cond ((and (>= len 4) ;; X-style "#XXYYZZ" color spec
925 0 : (eq (aref color 0) ?#)
926 0 : (member (aref color 1)
927 : '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
928 0 : ?a ?b ?c ?d ?e ?f)))
929 : ;; Translate the string "#XXYYZZ" into a list
930 : ;; of numbers (XX YY ZZ). If the primary colors
931 : ;; are specified with less than 4 hex digits,
932 : ;; the used digits represent the most significant
933 : ;; bits of the value (e.g. #XYZ = #X000Y000Z000).
934 0 : (let* ((ndig (/ (- len 1) 3))
935 : (i1 1)
936 0 : (i2 (+ i1 ndig))
937 0 : (i3 (+ i2 ndig)))
938 0 : (list
939 0 : (lsh
940 0 : (string-to-number (substring color i1 i2) 16)
941 0 : (* 4 (- 4 ndig)))
942 0 : (lsh
943 0 : (string-to-number (substring color i2 i3) 16)
944 0 : (* 4 (- 4 ndig)))
945 0 : (lsh
946 0 : (string-to-number (substring color i3) 16)
947 0 : (* 4 (- 4 ndig))))))
948 0 : ((and (>= len 9) ;; X-style RGB:xx/yy/zz color spec
949 0 : (string= (substring color 0 4) "rgb:"))
950 : ;; Translate the string "RGB:XX/YY/ZZ" into a list
951 : ;; of numbers (XX YY ZZ). If fewer than 4 hex
952 : ;; digits are used, they represent the fraction
953 : ;; of the maximum value (RGB:X/Y/Z = #XXXXYYYYZZZZ).
954 0 : (let* ((ndig (/ (- len 3) 3))
955 0 : (maxval (1- (ash 1 (* 4 (- ndig 1)))))
956 : (i1 4)
957 0 : (i2 (+ i1 ndig))
958 0 : (i3 (+ i2 ndig)))
959 0 : (list
960 0 : (/ (* (string-to-number
961 0 : (substring color i1 (- i2 1)) 16)
962 0 : 255)
963 0 : maxval)
964 0 : (/ (* (string-to-number
965 0 : (substring color i2 (- i3 1)) 16)
966 0 : 255)
967 0 : maxval)
968 0 : (/ (* (string-to-number
969 0 : (substring color i3) 16)
970 0 : 255)
971 0 : maxval))))
972 : (t
973 0 : (cdr (assoc color color-name-rgb-alist))))))
974 :
975 : (defun tty-color-translate (color &optional frame)
976 : "Given a color COLOR, return the index of the corresponding TTY color.
977 :
978 : COLOR must be a string that is either the color's name, or its X-style
979 : specification like \"#RRGGBB\" or \"RGB:rr/gg/bb\", where each primary.
980 : color can be given with 1 to 4 hex digits.
981 :
982 : If COLOR is a color name that is found among supported colors in
983 : `tty-color-alist', the associated index is returned. Otherwise, the
984 : RGB values of the color, either as given by the argument or from
985 : looking up the name in `color-name-rgb-alist', are used to find the
986 : supported color that is the best approximation for COLOR in the RGB
987 : space.
988 : If COLOR is neither a valid X RGB specification of the color, nor a
989 : name of a color in `color-name-rgb-alist', the returned value is nil.
990 :
991 : If FRAME is unspecified or nil, it defaults to the selected frame."
992 0 : (cadr (tty-color-desc color frame)))
993 :
994 : (defun tty-color-by-index (idx &optional frame)
995 : "Given a numeric index of a tty color, return its description.
996 :
997 : FRAME, if unspecified or nil, defaults to the selected frame.
998 : Value is a list of the form (NAME INDEX R G B)."
999 0 : (and idx
1000 0 : (let ((colors (tty-color-alist frame))
1001 : desc found)
1002 0 : (while colors
1003 0 : (setq desc (car colors))
1004 0 : (if (eq idx (car (cdr desc)))
1005 0 : (setq found desc))
1006 0 : (setq colors (cdr colors)))
1007 0 : found)))
1008 :
1009 : (defun tty-color-values (color &optional frame)
1010 : "Return RGB values of the color COLOR on a termcap frame FRAME.
1011 :
1012 : If COLOR is not directly supported by the display, return the RGB
1013 : values for a supported color that is its best approximation.
1014 : The value is a list of integer RGB values--(RED GREEN BLUE).
1015 : These values range from 0 to 65535; white is (65535 65535 65535).
1016 : If FRAME is omitted or nil, use the selected frame."
1017 0 : (cddr (tty-color-desc color frame)))
1018 :
1019 : (defun tty-color-desc (color &optional frame)
1020 : "Return the description of the color COLOR for a character terminal.
1021 : Value is a list of the form (NAME INDEX R G B). The returned NAME or
1022 : RGB value may not be the same as the argument COLOR, because the latter
1023 : might need to be approximated if it is not supported directly."
1024 0 : (and (stringp color)
1025 0 : (let ((color (tty-color-canonicalize color)))
1026 0 : (or (assoc color (tty-color-alist frame))
1027 0 : (let ((rgb (tty-color-standard-values color)))
1028 0 : (and rgb
1029 0 : (let ((pixel (tty-color-24bit rgb)))
1030 0 : (or (and pixel (cons color (cons pixel rgb)))
1031 0 : (tty-color-approximate rgb frame)))))))))
1032 :
1033 : (defun tty-color-gray-shades (&optional display)
1034 : "Return the number of gray colors supported by DISPLAY's terminal.
1035 : A color is considered gray if the 3 components of its RGB value are equal."
1036 0 : (let* ((frame (if (framep display) display
1037 : ;; FIXME: this uses an arbitrary frame from DISPLAY!
1038 0 : (car (frames-on-display-list display))))
1039 0 : (colors (tty-color-alist frame))
1040 : (count 0)
1041 : desc r g b)
1042 0 : (while colors
1043 0 : (setq desc (cddr (car colors))
1044 0 : r (car desc)
1045 0 : g (cadr desc)
1046 0 : b (car (cddr desc)))
1047 0 : (and (numberp r)
1048 0 : (eq r g) (eq g b)
1049 0 : (setq count (1+ count)))
1050 0 : (setq colors (cdr colors)))
1051 0 : count))
1052 :
1053 : (provide 'term/tty-colors)
1054 :
1055 : ;;; tty-colors.el ends here
|