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