#!/usr/local/bin/perl -w
#
# Perl script to convert IDL PS RGB to CMYK
# conversion according to PostScript Language Reference Manual, 2nd Ed
# using UCR(k) = k and BG(k) = k
#
# <- Last updated: Mon Oct 27 17:36:39 2003 -> SGK
#
# released under the GNU General Public License (GPL)
#
while(<>) {
  if      (/^%%/) {
    if (/^%%EndComments/) {
      print "%%DocumentProcessColors: Cyan Magenta Yellow Black\n";
    }
    print $_;
  } elsif (/ setrgbcolor/) {
#    print STDERR $_;
    $_ =~ s/(\d\.\d*) (\d\.\d*) (\d\.\d*) setrgbcolor/ CMYK/; 
#    print STDERR $_;
    ($r,$g,$b) = ($1, $2, $3);
    ($c,$m,$y,$k) = &RGBtoCMYK($r,$g,$b);
    printf STDERR "%.3f %.3f %.3f -> %.3f %.3f %.3f %.3f\n", 
                  $r,$g,$b,$c,$m,$y,$k;
    $cmyk = sprintf("%.3f %.3f %.3f %.3f", $c,$m,$y,$k);
    $_ =~ s/ CMYK/$cmyk setcmykcolor /;
    print $_;
  } else {
    print $_;
  }
}
#
# ---------------------------------------------------------------------------
#
sub RGBtoCMYK {
  my ($r,$g,$b) = @_;
  my ($c,$m,$y,$k);
  $c = 1.-$r;
  $m = 1.-$g;
  $y = 1.-$b;

  $k = &Min(($c,$m,$y));
  $c = &Clip($c-&UCR($k));
  $m = &Clip($m-&UCR($k));
  $y = &Clip($y-&UCR($k));
  $k = &Clip(&BG($k));
  return ($c,$m,$y,$k);
}
#
# ---------------------------------------------------------------------------
#
sub Min {
  my $m = $_[0];
  my $i = 1;
  for (; $i <= $#_; $i++) {
    if ($_[$i] < $m) { $m = $_[$i]; }
  }
  return $m;
}
#
# ---------------------------------------------------------------------------
#
sub Clip {
  my $m = $_[0];
  if ($m < 0.) { $m = 0.; }
  if ($m > 1.) { $m = 1.; }
  return $m;
}
#
# ---------------------------------------------------------------------------
#
sub UCR {
  return $_[0];
}
#
# ---------------------------------------------------------------------------
#
sub BG {
  return $_[0];
}