sub darken_hexrgb { my ($hexrgb, $darken) = @_; my @rgb = map hex, unpack "A2"x3, $hexrgb; my $max = (sort {$a <=> $b} @rgb)[-1]; return "000000" if $max <= $darken; my $fact = ($max - $darken) / $max; return sprintf "%02X"x3, map { int($_ * $fact) } @rgb }