+#!/usr/bin/perl
+use Convert::Color::HUSL;
+use strict;
+use v5.10;
+
+my $white = Convert::Color::HUSL->new(0, 0, 100);
+my $red = Convert::Color::HUSL->new(12.17, 100, 50);
+my $green = Convert::Color::HUSL->new(127.7, 100, 50);
+my $blue = Convert::Color::HUSL->new(258.9, 100, 50);
+my $yellow = Convert::Color::HUSL->new(86, 100, 92);
+my $orange = Convert::Color::HUSL->new(47.6, 100, 71.2);
+my $purple = Convert::Color::HUSL->new(316, 100, 50);
+
+my @palette = (
+ [ # 0 - EGA 16-color
+ [0x00, 0x00, 0x00], # black
+ [0x00, 0x00, 0xAA], # blue
+ [0x00, 0xAA, 0x00], # green
+ [0x00, 0xAA, 0xAA], # cyan
+ [0xAA, 0x00, 0x00], # red
+ [0xAA, 0x00, 0xAA], # magenta
+ [0xAA, 0x55, 0x00], # brown
+ [0xAA, 0xAA, 0xAA], # light gray
+ [0x55, 0x55, 0x55], # dark gray
+ [0x55, 0x55, 0xFF], # bright blue
+ [0x55, 0xFF, 0x55], # bright green
+ [0x55, 0xFF, 0xFF], # bright cyan
+ [0xFF, 0x55, 0x55], # bright red
+ [0xFF, 0x55, 0xFF], # bright magenta
+ [0xFF, 0xFF, 0x55], # bright yellow
+ [0xFF, 0xFF, 0xFF], # white
+ ],
+ [ # 1 - Gray/R/G/B
+ lightness_progression($white, 0.0, 0.25, 0.5, 0.75),
+ map {
+ lightness_progression($_, 0.4, 0.65, 0.9, 1.15)
+ } ($red, $green, $blue),
+ ],
+ [ # 2 - Red/Blue/Yellow
+ [0x00, 0x00, 0x00],
+ map {
+ lightness_progression($_, 0.3, 0.5, 0.7, 0.9, 1.1)
+ } ($red, $blue, $yellow),
+ ],
+ [ # 3 - Purple/Orange/Green
+ [0x00, 0x00, 0x00],
+ map {
+ lightness_progression($_, 0.3, 0.5, 0.7, 0.9, 1.1)
+ } ($purple, $orange, $green),
+ ],
+ [ # 4 - Red/Green
+ map {
+ lightness_progression($_, 0.2, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0)
+ } ($red, $green),
+ ],
+ [ # 5 - Orange/Blue
+ map {
+ lightness_progression($_, 0.2, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0)
+ } ($orange, $blue),
+ # ILL!
+ # INI!
+ ],
+ [ # 6 - Yellow/Purple
+ map {
+ lightness_progression($_, 0.2, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0)
+ } ($yellow, $purple),
+ ],
+ [ # 7 - Red
+ lightness_progression($red, map { $_ / 16 } 1..16),
+ ],
+ [ # 8 - Green
+ lightness_progression($green, map { $_ / 16 } 1..16),
+ ],
+ [ # 9 - Blue
+ lightness_progression($blue, map { $_ / 16 } 1..16),
+ ],
+);
+
+sub lightness_progression {
+ my $c = shift;
+ map {
+ [Convert::Color::HUSL->new($c->H, $c->S, $c->L * $_)->convert_to('rgb8')->rgb8];
+ } @_;
+}
+
+sub print_color_js {
+ my $c = shift;
+ say " [", join(', ', map { sprintf("0x%02X", $_) } @$c), "],";
+}
+
+sub print_palette {
+ my $p = shift;
+ say "[";
+ for my $c (@{$palette[$p]}) {
+ print_color_js($c);
+ }
+ say "],";
+}
+
+if (@ARGV) {
+ for my $p (@ARGV) {
+ print_palette($p);
+ }
+} else {
+ for my $p (0..$#palette) {
+ print_palette($p);
+ }
+}