vi: implement missing features from upstream release 8.0
[sheet.git] / termcol.inc.pl
1 use 5.014;
2 use utf8;
3 use Shiar_Sheet::Colour 1.05;
4
5 +{
6         default => [qw( ansi ansi88 ansi256 )],
7         more    => [qw( ansi mirc pastel slutty solarized ansi88 ansi256 )],
8         ansi    => [qw( cga putty xterm tango app html cgarne )],
9         legacy  => [qw( c64 msx mac2 risc arnegame db16 cpc cpcboy shiar32 ppu 2c03 shovel 64 )],
10
11         xcolors => sub {
12                 my $pals = do 'data/termcol-xcolor.inc.pl' or die $! || $@;
13                 $_[0]->{$_} = $pals->{$_} for keys %{$pals};
14                 return 'xcolor';
15         },
16
17         html => {
18                 title => 'HTML keywords (inherited by CSS≥2.1 and SVG), mostly identical to X11',
19                 href => 'http://www.w3.org/TR/css3-color/#html4',
20                 list => [qw(
21                         000000:black 800000:maroon  008000:green 808000:olive
22                         000080:navy  800080:purple  008080:cyan  C0C0C0:silver
23                         808080:gray  FF0000:red     00FF00:lime  FFFF00:yellow
24                         0000FF:blue  FF00FF:fuchsia 00FFFF:aqua  FFFFFF:white
25                 )],
26                 parent => 'cga',
27         },
28         cga => {
29                 # linux console, kde?
30                 list => [qw(
31                         000000 AA0000 00AA00 AA5500 0000AA AA00AA 00AAAA AAAAAA
32                         555555 FF5555 55FF55 FFFF55 5555FF FF55FF 55FFFF FFFFFF
33                 )],
34                 # reset bold dim italic underline blink fastblink reverse hidden
35                 hueorder => [ 1,3,2,6,4,5, 0,7 , 9,11,10,14,12,13, 8,15 ],
36         },
37         xterm => {
38                 # rxvt except for blues
39                 list => [qw(
40                         000000 CC0000 00CC00 CCCC00 4682B4 CC00CC 00CCCC E5E5E5
41                         4C4C4C FF0000 00FF00 FFFF00 1E90FF FF00FF 00FFFF FFFFFF
42                 )],
43                 parent => 'cga',
44         },
45         tango => {
46                 # default Gnome theme
47                 list => [qw(
48                         2E3436 CC0000 4E9A06 C4A000 3465A4 75507B 06989A D3D7CF
49                         555753 EF2929 8AE234 FCE94F 729FCF AD7FA8 34E2E2 EEEEEC
50                 )],
51                 parent => 'cga',
52         },
53         xkcd => {
54                 title => 'human averages in xkcd survey results',
55                 href => 'http://blog.xkcd.com/2010/05/03/color-survey-results/',
56                 list => [qw(
57                         000000:black 650021:maroon  15b01a:green 6e750e:olive
58                         01153e:navy  7e1e9c:purple  029386:teal  c5c9c7:silver
59                         929591:grey  e50000:red     aaff32:lime  ffff14:yellow
60                         0343df:blue  ed0dd9:fuchsia 00ffff:cyan  ffffff:white
61                 )],
62                 parent => 'cga',
63         },
64         android => {
65                 href => 'http://developer.android.com/guide/practices/ui_guidelines/icon_design.html',
66                 title => 'recommended colour palette for Android icons',
67                 list => [qw(
68                         FFFFFF:white   BFBFBF:light   808080:medium  404040:dark
69                         000000:black   6699FF:blue1   3366CC:blue2   003399:blue3
70                         99CC33:green1  00CC00:green2  669933:green3  FFCC00:orange1
71                         FF9900:orange2 FF6600:orange3 CC0000:red
72                 )],
73         },
74         app => {
75                 name => 'Term.app',
76                 title => 'Mac OSX Yosemite Terminal app',
77                 list => [qw(
78                         000000 990B00 35A600 999900 0000B3 B304B2 31A6B3 BFBFBF
79                         666666 E51600 48D901 E5E600 0100FF E607E5 48E6E6 E6E5E6
80                 )],
81                 parent => 'cga',
82         },
83         iterm => ['putty'], # identical in v2.2.1
84         pastel => {
85                 name => 'iTerm Pastel',
86                 list => [qw(
87                         4F4F4F FF6C60 A8FF60 FFFFB6 96CBFE FF73FD C6C5FE EEEEEE
88                         7C7C7C FFB6B0 CEFFAC FFFFCC B5DCFF FF9CFE DFDFFE FFFFFF
89                 )],
90                 parent => 'cga',
91         },
92         putty => {
93                 name => 'PuTTY',
94                 list => [qw(
95                         000000 BB0000 00BB00 BBBB00 0000BB BB00BB 00BBBB BBBBBB
96                         555555 FF5555 55FF55 FFFF55 5555FF FF55FF 55FFFF FFFFFF
97                 )],
98                 parent => 'cga',
99         },
100         slutty => {
101                 name => 'SluTTY',
102                 href => 'http://www.npjh.com/slutty.html',
103                 title => 'PuTTY fork with light colour scheme',
104                 list => [qw(
105                         000000 9C1D1D 6C9446 AC9A47 335786 8F6496 486768 E0DCDC
106                         2F2F2F CD5757 8FC35B D1C45E 5C81A9 BC95B7 76CBCB EEEEEC
107                 )],
108                 parent => 'cga',
109         },
110         mirc => {
111                 name => 'mIRC',
112                 href => 'http://www.mirc.com/colors.html',
113                 list => [qw(
114                         FFFFFF 000000 00007F 009300 FF0000 7F0000 9C009C FC7F00
115                         FFFF00 00FC00 009393 00FFFF 0000FC FF00FF 7F7F7F D2D2D2
116                 )],
117                 ansiorder => [ 1,5,3,7,2,6,10,15 , 14,4,9,8,12,13,11,0  ],
118                 hueorder => [ 5,7,3,10,2,6, 1,15 , 4,8,9,11,12,13, 14,0 ],
119         },
120         mac2 => {
121                 name => 'MacII',
122                 list => [qw(
123                         FFFFFF FBF305 FF6403 DD0907 F20884 4700A5 0000D3 02ABEA
124                         1FB714 006412 562C05 90713A C0C0C0 808080 404040 000000
125                 )],
126                 ansiorder => [ 15,3,9,11,6,5,7,12 , 14,2,8,1,10,4,13,0 ],
127                 hueorder => [ 3,2,1,8,7,6,5,4 , 10,11,9 , 15,14,13,12,0 ],
128         },
129         risc => {
130                 name => 'RISC',  # v2/3
131                 list => [qw(
132                         FFFFFF DDDDDD BBBBBB 999999 777777 555555 333333 000000
133                         004499 EEEE00 00CC00 DD0000 EEEEBB 558800 FFBB00 00BBFF
134                 )],
135                 ansiorder => [ 7,5,13,14,4,3,2,1 , 6,11,10,9,8,12,15,0 ],
136                 hueorder => [ 11,14,9,12,13,10,15,8 , reverse 0..7 ],
137         },
138         c64 => {
139                 name => 'C=64',  # commodore 64/128
140                 list => [ map {
141                         # 5-bit luma ± 2-bit colour angle
142                         my ($y, $neg, $hue) = split /(-)|\+/;
143
144                         # convert to yuv
145                         my ($u, $v) = (0, 0);
146                         if (defined $hue) {
147                                 my $RAD = 3.14159;
148                                 $hue *= $RAD / 8;
149                                 $hue += $RAD if $neg;
150                                 $u = cos $hue;
151                                 $v = sin $hue;
152                         }
153
154                         # convert to rgb
155                         $y /= 32;
156                         $_ /= 2 for $u, $v;
157                         Shiar_Sheet::Colour->newyuv($y, $u, $v)->rgb48;
158                 } qw(
159                         0    32  10+5 20-5 12+2 16-2 8+0  24-0
160                         12+6 8+7 16+5 10   15   24-2 15+0 20
161                 )],
162                 ansiorder => [ 0,2,5,9,6,4,3,15 , 11,10,13,7,14,8,12,1 ],
163                 hueorder => [ 2,8,7,5,3,6,4,9 , 10,13,14,0,11,12,15,1 ],
164         },
165
166         msx => [qw( msx1 msx2 arnejmp )],
167         msx1 => {
168                 name => 'MSX',
169                 list => [ map {
170                         my ($y, @c) = split /;/;
171                         $_ = ($_ - .47) / .53 / 2 for @c;
172                         Shiar_Sheet::Colour->newyuv($y, @c)->rgb48;
173                 } qw(
174                         0.00;0.47;0.47 0.00;0.47;0.47 0.53;0.20;0.07 0.67;0.27;0.17
175                         0.40;1.00;0.40 0.53;0.93;0.43 0.47;0.30;0.83 0.73;0.70;0.00
176                         0.53;0.27;0.93 0.67;0.27;0.93 0.73;0.07;0.57 0.80;0.17;0.57
177                         0.47;0.23;0.13 0.53;0.67;0.73 0.80;0.47;0.47 1.00;0.47;0.47
178                 )],
179                 ansiorder => [ 0,6,12,10,4,13,7,14 , 1,8,2,11,5,9,3,15 ],
180                 hueorder => [ 8,10,2,12,4,6, 1,0 , 9,11,3,7,5,13, 14,15 ],
181         },
182         msx2 => {
183                 name => 'MSX2',
184                 list => [
185                         map { s{([0-7])}{sprintf '%02X', $1 / 7 * 255}egr } qw(
186                         000 000 161 373 117 237 511 267
187                         711 733 661 663 141 625 555 777
188                 )],
189                 parent => 'msx1',
190         },
191         arnejmp => {
192                 href => 'http://androidarts.com/palette/16pal.htm',
193                 title => "Arne's Japanese Machine Palette v3 (MSX)",
194                 name => 'A:JMP',
195                 list => [qw(
196                         000000 191028 46AF45 A1D685 453E78 7664FE 833129 9EC2E8
197                         DC534B E18D79 D6B97B E9D8A1 216C4B D365C8 AFAAB9 F5F4EB
198                 )],
199                 parent => 'msx1',
200         },
201
202         arnegame => {
203                 href => 'http://androidarts.com/palette/16pal.htm',
204                 title => 'Generic 16 color game palette v20 by Arne Niklas Jansson',
205                 name => 'Arne',
206                 list => [qw(
207                         000000:void     9D9D9D:ash     FFFFFF:blind   BE2633:bloodred
208                         E06F8B:pigmeat  493C2B:oldpoop A46422:newpoop EB8931:blaze
209                         F7E26B:zornskin 2F484E:shade   44891A:leaf    A3CE27:slime
210                         1B2632:night    005784:sea     31A2F2:sky     B2DCEF:cloud
211                 )],
212                 hueorder => [ 3,7,8,11,10,9,13,14 , 4,6,5,15,12,0,1,2 ],
213                 ansiorder => [ 0,3,10,6,13,12,9,1 , 5,7,11,8,14,4,15,2 ],
214                 lumorder => [ 0,5,9,12 , 3,6,10,13,1 , 4,7,8,11,14,15,2 ], # by brightness
215         },
216         cgarne => {
217                 href => 'http://androidarts.com/palette/16pal.htm',
218                 title => "version E",
219                 name => 'CGArne',
220                 list => [qw(
221                         000000 8A3622 0C7E45 AA5C3D 2234D1 5C2E78 44AACC B5B5B5
222                         5E606E EB8A60 6CD947 FFD93F 4C81FB E23D69 7BE2F9 FFFFFF
223                 )],
224                 parent => 'cga',
225         },
226         db16 => {
227                 href => 'http://pixeljoint.com/forum/forum_posts.asp?TID=12795',
228                 title => "DawnBringer's 16 color palette v1.0",
229                 name => 'DawnBringer16',
230                 list => [qw(
231                         140C1C 442434 30346D 4E4A4E 854C30 346524 D04648 757161
232                         597DCE D27D2C 8595A1 6DAA2C D2AA99 6DC2CA DAD45E DEEED6
233                 )],
234                 ansiorder => [ 0,1,5,4,2,12,10,7 , 3,6,11,14,8,9,13,15 ],
235                 hueorder => [ 6,9,14,11,13,8,2,1 , 12,4,7,5,15,10,3,0 ],
236         },
237         db32 => {
238                 href => 'http://pixeljoint.com/forum/forum_posts.asp?TID=16247',
239                 title => "DawnBringer's 32 color palette v1.0",
240                 name => 'DawnBringer32',
241                 list => [qw(
242                         000000 222034 45283C 663931 8F563B DF7126 D9A066 EEC39A
243                         FBF236 99E550 6ABE30 37946E 4B692F 524B24 323C39 3F3F74
244                         306082 5B6EE1 639BFF 5FCDE4 CBDBFC FFFFFF 9BADB7 847E87
245                         696A6A 595652 76428A AC3232 D95763 D77BBA 8F974A 8A6F30
246                 )],
247         },
248         solarized => {
249                 href => 'http://ethanschoonover.com/solarized',
250                 list => [qw(
251                         002b36:base03 073642:base02 586e75:base01 657b83:base00
252                         839496:base0  93a1a1:base1  eee8d5:base2  fdf6e3:base3
253                         b58900:yellow cb4b16:orange dc322f:red    d33682:magenta
254                         6c71c4:violet 268bd2:blue   2aa198:cyan   859900:green
255                 )],
256                 ansiorder => [ 1,10,15,8,13,11,14,6 , 0,9,2,3,4,12,5,7 ],
257         },
258
259         cpc => {
260                 name => 'Amstrad CPC',
261                 rgbmap => [
262                         3 => sub {
263                                 $_[2] + 3 * ($_[0] + 3 * $_[1]),
264                                 map { $_ && $_ * 127 + 1 } @_
265                         },
266                 ],
267         },
268         cpcboy => {
269                 name => 'Arne CPC Boy v3',
270                 href => 'http://androidarts.com/palette/16pal.htm',
271                 rgbmap => [
272                         3 => sub {
273                                 my $index = $_[2] + 3 * ($_[0] + 3 * $_[1]);
274                                 $index,
275                                 map { map { hex } /(..)/g } [qw(
276                                         000000 1B1B76 3636D8  761F28 623870 953EA7  CC3636 CE4B7A E3669A
277                                         1B761B 197F96 1986F2  8C6E1A 8E8E8E 9C9EE7  E48E2A EAA597 FE80FE
278                                         54BF47 37C79F 35CFE4  8DD836 B8D1B5 97E9D1  EDD446 EBE4A4 FFFFFF
279                                 )]->[$index]
280                         },
281                 ],
282                 table => [
283                         # gameboy ramp
284                         [qw( 293941:31       :   F2EFE7:27 )],
285                         [qw( 485D48:30 859550:29 BAC375:28 )],
286                 ],
287                 parent => 'cpc',
288         },
289         shiar32 => {
290                 name => 'Shiar32',
291                 table => [
292                         [qw( 761F28:2A CC2222:3A CC8B7B:4A )],
293                         [qw( 4C3C2B:1B CB4B16:3B EB8931:5B )],
294                         [qw( 5E581A:2C B58900:3C C0C070:4C )],
295                         [qw(         0 859900:3D         0 )],
296                         [qw( 1B661B:2E 4E9A06:3E 8BBB7B:4E )],
297                         [qw(         0 37A76F:3F         0 )],
298                         [qw( 2F484E:1G 06989A:3G 31E2C2:5G )],
299                         [qw(         0 0088CC:3H         0 )],
300                         [qw( 00337C:2I 3465A4:3I 6899AA:4I )],
301                         [qw(         0 6C71C4:3J         0 )],
302                         [qw( 362747:1K 75507B:3K F06FCB:5K )],
303                         [qw(         0 D33662:3L         0 )],
304                         [qw( 000000:0  686868:2  CCCCCC:4  )],
305                         [qw( 444444:1  B0B0B0:3  FFFFFF:5  )],
306                 ],
307                 parent => 'cpc',
308         },
309
310         ppu => {
311                 name => '<abbr title="Picture Processing Unit">PPU</abbr> (Famicom/NES)',
312                 table => [
313                         [qw( 717171:00 BABABA:10 FFFFFF:20 FFFFFF:<s>30</s> )],
314                         [qw( 012FB3:01 235CFF:11 5380FF:21 ACC1FF:31 )],
315                         [qw( 2B17C2:02 5139FF:12 7562FF:22 BAB1FF:32 )],
316                         [qw( 5705AA:03 932AFF:13 AC5AFF:23 D7B1FF:33 )],
317                         [qw( 780071:04 C222BA:14 FE69F6:24 FEC0FB:34 )],
318                         [qw( 860627:05 D52C57:15 FE6A90:25 FEBECF:35 )],
319                         [qw( 7C1800:06 C84300:16 FE853F:26 FECBAD:36 )],
320                         [qw( 5F3100:07 A16400:17 F2B403:27 FEE59D:37 )],
321                         [qw( 344900:08 698400:18 B9D500:28 E9F596:38 )],
322                         [qw( 095B00:09 2F9B00:19 7FEC0F:29 D1FFA3:39 )],
323                         [qw( 006100:0A 04A40D:1A 52F55B:2A BCFFC0:3A )],
324                         [qw( 005A39:0B 009B6F:1B 40EBBF:2B B7FEEC:3B )],
325                         [qw( 004881:0C 0083CE:1C 43BBFF:2C AEE1FF:3C )],
326                         [qw( 000000:0D 0C0C0C:1D 5B5B5B:2D C3C3C3:3D )],
327                 ],
328                 hueorder => [6..12, 1..5, 13, 0],
329         },
330         '2c03' => {
331                 name => '2C03–5 PPU (PlayChoice/Famicom)',
332                 table => [
333                         do {
334                                 my @rgb = qw(
335                                         333 555 777 777
336                                         014 036 357 567
337                                         006 027 447 657
338                                         326 407 637 757
339                                         403 507 707 747
340                                         503 704 737 755
341                                         510 700 740 764
342                                         420 630 750 770
343                                         320 430 660 773
344                                         120 140 360 572
345                                         031 040 070 473
346                                         040 053 276 276
347                                         022 044 077 467
348                                         111 222 444 666
349                                 );
350                                 my %dup;
351                                 map { [
352                                         map { [ $dup{$_}++ ? "<s>$_</s>" : $_, map { $_ * 255 / 7 } split // ] }
353                                         map { $rgb[$_] }
354                                         $_*4 .. $_*4+3
355                                 ] } 0..13
356                         }
357                 ],
358                 parent => 'ppu',
359         },
360         neslike => {
361                 name => '0xDB NESLike',
362                 table => [
363                         [qw( 3F3F3F:00 7F7F7F:10 F9F9F9:20 FFFFFF:30 )],
364                         [qw( 2B34AD:01 6B74ED:11 ABB4FF:21 EAF3FF:31 )],
365                         [qw( 591DAB:02 995DEB:12 D99CFF:22 FFDCFF:32 )],
366                         [qw( 810F8C:03 C04FCC:13 FF8EFF:23 FFCEFF:33 )],
367                         [qw( 960E59:04 D64E98:14 FF8DD8:24 FFCDFF:34 )],
368                         [qw( 951A1E:05 D45A5E:15 FF9A9E:25 FFD9DD:35 )],
369                         [qw( 7C3000:06 BC702C:16 FCB06C:26 FFEFAC:36 )],
370                         [qw( 534A00:07 938A11:17 D3CA51:27 FFFF90:37 )],
371                         [qw( 256200:08 65A113:18 A5E153:28 E4FF92:38 )],
372                         [qw( 096C00:09 49AC25:19 89EC65:29 C9FFA4:39 )],
373                         [qw( 007213:0A 2DB153:1A 6CF193:2A ACFFD2:3A )],
374                         [qw( 006A4D:0B 26AA8D:1B 66E9CD:2B A6FFFF:3B )],
375                         [qw( 005683:0C 3896C3:1C 77D6FF:2C B7FFFF:3C )],
376                         [qw( 000000:<s>0D</s> 000000:1D 333333:2D 8C8C8C:3D )],
377                 ],
378                 parent => 'ppu',
379                 hueorder => [6..12, 1..5, 13, 0],
380         },
381         shovel => {
382                 name => 'Shovel Knight PPU',
383                 table => [
384                         [qw( 7C7C7C:00 BCBCBC:10 F8F8F8:20 FCFCFC:30 )],
385                         [qw( 0000FC:01 0078F8:11 3CBCFC:21 A4E4FC:31 )],
386                         [qw( 0000BC:02 0058F8:12 6888FC:22 B8B8F8:32 )],
387                         [qw( 4428BC:03 6844FC:13 9878F8:23 D8B8F8:33 )],
388                         [qw( 940084:04 D800CC:14 F878F8:24 F8B8F8:34 )],
389                         [qw( A80020:05 E40058:15 F85898:25 F8A4C0:35 )],
390                         [qw( A81000:06 F83800:16 F87858:26 F0D0B0:36 )],
391                         [qw( 881400:07 E45C10:17 FCA044:27 FCE0A8:37 )],
392                         [qw( 503000:08 AC7C00:18 F8B800:28 F8D878:38 )],
393                         [qw( 007800:09 00B800:19 B8F818:29 D8F878:39 )],
394                         [qw( 006800:0A 00A800:1A 58D854:2A B8F8B8:3A )],
395                         [qw( 005800:0B 00A844:1B 58F898:2B B8F8D8:3B )],
396                         [qw( 004058:0C 008888:1C 00E8D8:2C 00FCFC:3C )],
397                         [qw( 000000:0D 080808:1D 787878:2D D8D8D8:3D )],
398                         [qw( 22123B:0S 360900:1S 824E00:2S 9E9E5C:3S )],
399                 ],
400                 parent => 'ppu',
401                 hueorder => [6..12, 1..5, 13, 0, 14],
402         },
403
404         64 => {
405                 name => '6-bit (Sega Master System, EGA, FAP80)',
406                 rgbmap => [4],
407         },
408         ansi88 => {
409                 name => 'rxvt 88 colour extension',
410                 rgbmap => [
411                         4 => sub {
412                                 $_[2] + 4 * ($_[1] + 4 * $_[0]) + 16,
413                                 map { (0, 139, 205, 255)[$_] } @_
414                         },
415                         [ map { [80 + $_, (($_ + 2 + ($_>0)) * 255/11) x 3] } 0 .. 7 ],
416                 ],
417         },
418         ansi256 => {
419                 name => 'xterm 256 colour extension',
420                 # \033[38;5;${FG}m
421                 rgbmap => [
422                         6 => sub {
423                                 $_[2] + 6 * ($_[1] + 6 * $_[0]) + 16,
424                                 map { $_ && $_*40 + 55 } @_
425                         },
426                         [ map { [232 + $_, ($_ * 10 + 8) x 3] } 0 .. 23 ],
427                 ],
428         },
429         512 => {
430                 name => '9-bit RGB map',
431                 # atari st, msx2, sega genesis/nomad, turbografx16
432                 rgbmap => [8],
433         },
434         '4k' => {
435                 name => '12-bit RGB map',
436                 # amiga, apple IIgs, game gear, neo geo, lynx, cpc+, nextstation
437                 rgbmap => [
438                         12 => sub {
439                                 join('', map { sprintf '%X', $_ } @_),
440                                 map { int $_ * 255 / 11 } @_
441                         },
442                 ],
443         },
444 }