+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 style="%s; padding:0 1ex">%s<td style="%s">%s<td style="%s">%s',
+ "background:#$rgb48; color:#$inverse",
+ $id,
+ "background:#000; color:#$rgb48",
+ $rgb24,
+ "background:#FFF; color:#$rgb48",
+ $rgb24,
+}
+