#!/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]; }