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