#!/usr/bin/perl -w

my (@l,$i,$j);

$i=0;
open(INFILE,"/usr/X11R6/lib/X11/rgb.txt");
while (<INFILE>) {
  $c=$_; $c=~s/^.*\t//; $c=~s/\n//; $c=~tr/A-Z/a-z/;
  @l=split(" ",$_);
  foreach $j (0 .. 2) { $Colors{$c}[$j]=$l[$j]; }
}
close(INFILE);

@Names=keys %Colors;

# $c=ConvertColor("blue"); 
# $c=ConvertColor([245,0,34]);
# $c=ConvertColor("rgb:23/34/ff"); 
# $c=ConvertColor("rgb:0/0/ffff"); 
# $c=ConvertColor("#ffffffff0000");
# print GimpColor2aabbcc($c); 
# print $$c[1];
sub ConvertColor { my ($retval);

  my $a=$_[0]; my($i,@a);

  if ($#$a<0) { 

    my $la=0;
    if ($a=~/rgb/) { 
      $a=~s/rgb://; @a=split(/\//,$a);
      my $l;
      foreach $i (0 .. 2) {
        $l=length($a[$i]);
        if ($l>$la) {$la=$l;}
      }
      foreach $i (0 .. 2) {
        $a[$i]=hex(padafter($a[$i],0,$la))/(16**$la-1)*255;
      }
    } elsif ($a=~/#/) { 
      $a=~s/#//; $la=int(length($a)/3);
      foreach $i (0 .. 2) {
        $a[$i]=hex(substr($a,$la*$i,$la))/(16**$la-1)*255;
      }
    } else {
      @a=@{SearchColor($a)};
    }

  } else {
    @a=@$a;
  }

  return \@a;
}

# print InterpolateColors("grey30","grey40");
# $c=InterpolateColors("grey30","grey40");
sub InterpolateColors { my($c1,$c2)=@_;
  my($i,@a);
  $c1=ConvertColor($c1);
  $c2=ConvertColor($c2);
  foreach $i (0 .. 2) {
    $a[$i]=($$c1[$i]+$$c2[$i])/2;
  }
#   return \@a;
  return ConvertColor2aabbcc(\@a);
}

# $c=ConvertColor2aabbcc("grey59"); -> #969696
sub ConvertColor2aabbcc { my $c=$_[0];
  return GimpColor2aabbcc(ConvertColor($c));
}

# $a=GimpColor2aabbcc($c);
sub GimpColor2aabbcc { my $c=$_[0];
  my $i; my $r="";
  foreach $i (0 .. 2) {
    $r=$r.padbefore(int2hex($$c[$i]),"0",2);
  }
  return "#".$r;
}

# PrintColor(\@c);
sub PrintColor { my $c=$_[0];
  print $$c[0].' '.$$c[1].' '.$$c[2];
}

# $c=Contrast(\@c1,\@c2)
sub Contrast { my($c1,$c2)=@_;
  $c1=ConvertColor($c1);
  $c2=ConvertColor($c2);
  my $i; my $a=0;
  foreach $i (0 .. 2) {
    $a+=abs($$c1[$i]-$$c2[$i]);
  }
  return $a/765;
}

sub SearchColor { my $p=$_[0];
  my $i; my $found=0; my $n="";
  foreach $i (0 .. $#Names) {
    if ($Names[$i]=~m/^$p$/) {
      $found=1; $n=$i;
    }
  }
  if ($found) {
    return $Colors{$Names[$n]};
  } else {
    return 0;
  }
}

# $h=int2hex(255); -> ff
sub int2hex { my $i=$_[0];
  my @H=(0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f");
  my $h=""; my $first=0; my $n;
  for ($j=10; $j>=0; $j--) {
    $n=$H[$i/16**$j];
    if ($n) {$first=1;}
    if ($first) {$h=$h.$n;}
    $i=$i%16**$j;
  }
  return $h;
}

# $i=hex2int("ff");
sub hex2int {
  return hex($_[0]);
}

# "00abc"=padbefore("abc","0",5);
sub padbefore{ my ($s,$p,$n)=@_;
  my $nn=$n-length($s);
  if ($nn>0) {
    $s="$p"x$nn.$s;
  }
  return $s;
}

# "abc00"=padafter("abc","0",5);
sub padafter{ my ($s,$p,$n)=@_;
  my $nn=$n-length($s);
  if ($nn>0) {
    $s=$s."$p"x$nn;
  }
  return $s;
}
