#!/usr/bin/perl
# hdbd64.pl - Generate palette of readable text/background colors
# 2014 David Meyer <papa@sdf.org>  +JMJ
#
# Original name: textpltt.pl
#
# Source: Richard H. Hall. Color Combinations and Readability.
#         Missouri University of Science and Technology.
#         <http://web.mst.edu/~rhall/web_design/color_readability.html>
#         accessed December 30, 2014.

sub abs {
    my($a) = @_;
    if ($a < 0) {return -1 * $a;}
    else {return $a;}
}

sub bright {
    my($r, $g, $b) = @_;
    return ($r * 299 + $g * 587 + $b * 114) / 1000;
}

sub byte {
    my($b) = @_;
    return $b * 16 + $b;
}

sub bytesc {
    my($b) = @_;
    return $b == 255 ? 15 : ($b == 170 ? 10 : ($b == 85 ? 5 : $b));
}

sub colorsc {
    my($r, $g, $b) = @_;
    return sprintf("#%x%x%x", bytesc($r), bytesc($g), bytesc($b));
}

sub max {
    my($a, $b) = @_;
    if ($a < $b) {return $b;}
    else {return $a;}
}

print <<EOF;
<table>
<tr><th>BG<br/>color</th><td colspan=3>Text color<br/>Hue difference<br/>Brightness diff.</td></tr>
EOF

$combos = 0;

# $bgr, $bgg, $bgb: Background red, green, blue
# $fgr, $fgg, $fgb: Foreground red, green, blue

$bgcd_prev = "";

for $bgr (0, 85, 170, 255) {
    for $bgg (0, 85, 170, 255) {
	for $bgb (0, 85, 170, 255) {
	    for $fgr (0, 85, 170, 255) {
		for $fgg (0, 85, 170, 255) {
		    for $fgb (0, 85, 170, 255) {

			# Hue difference ...
			$hd = max($fgr-$bgr, $bgr-$fgr) +
			    max($fgg-$bgg, $bgg-$fgg) +
			    max($fgb-$bgb, $bgb-$fgb);

			# Brightness difference ...
			$bd = abs(bright($fgr, $fgg, $fgb) -
				  bright($bgr, $bgg, $bgb));

			# Readability ...
			if ($hd >= 500 && $bd >= 125) {$read = 1;}
			else {$read = 0;}

			if ($read) {
			    $bgcd = colorsc($bgr, $bgg, $bgb);
			    $fgcd = colorsc($fgr, $fgg, $fgb);
			    if ($bgcd ne $bgcd_prev) {
				print "</tr>\n<tr><th>$bgcd</th>\n";
				$bgcd_prev = $bgcd;
			    }
			    printf("<td style='background-color:%s;color:%s'>%s<br/>%d %d</td>\n", $bgcd, $fgcd, $fgcd, $hd, $bd);
			    ++ $combos;
			}
		    }
		}
	    }
	}
    }
}

print <<EOF;
</tr>
</table>
<p>$combos combinations</p>
EOF