+sub luminance {
+ # perceived brightness (using ITU-R recommendation 601 luma co-efficients)
+ my ($r, $g, $b) = @_;
+ return $r*.299 + $g*.587 + $b*.114;
+}
+
+sub colcell {
+ my $id = shift;
+ my @rgb = @_ >= 3 ? @_ : (map {hex} $_[0] =~ /(..)/g);
+ my $rgb24 = '';
+ $rgb24 .= sprintf '%X', min($_ / 17 + .5, 15) for @rgb[0..2];
+ my $rgb48 = '';
+ $rgb48 .= sprintf '%02X', $_ for @rgb[0..2];
+ my $inverse = sprintf('%X', luminance(@rgb)/255 < .3 ? 12 : 0) x 3;
+ return sprintf '<td title="%s" style="%s">%s<td style="%s">%s<td style="%s">%s'."\n",
+ join(',', map { int } @rgb[0..2]),
+ "background:#$rgb48; color:#$inverse; padding:0 1ex",
+ $id,
+ "background:#000; color:#$rgb48",
+ $rgb24,
+ "background:#FFF; color:#$rgb48",
+ $rgb24,
+}
+