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