#######################################################################
#                              IMGTOPS                                #
#                                                                     #
#              Converts images in almost any format                   #
#                to encapsulated postscript file.                     #
#        Assumes that you have netpbm (for non-jpeg images) and       #
#                djpeg for converting jpeg images                     #
#                                                                     #
#                   AUTHOR: Abhijit Das (Barda)                       #
#           Department of Computer Science and Automation             #
#                   Indian Institute of Science                       #
#                    Bangalore 560 012  India                         #
#                 e-mail: abhij@csa.iisc.ernet.in                     #
#            URL: http://www2.csa.iisc.ernet.in/~abhij/               #
#                                                                     #
#                          VERSION: 1.0                               #
#                   LAST MODIFIED: June 3 1997                        #
#######################################################################
sub helpMessage {
print STDERR <<EOM;
Usage: imgtops [-[d|g]hotv] image_file
Options:
         -d          save image in black and white dithered mode
         -g          save image in grey scale
         -h          print this help message
         -o outfile  specify the output file name
                     (default: same as the input image with extension .ps)
         -t tmpdir   set temp dir to tmpdir (default: /tmp)
         -v          verbose mode (default: non-verbose mode)
         -V          print version and quit
EOM
exit(1);
}

sub processCmdLine {
   if (!($ARGV[0])) {
      print STDERR "Error: Too few arguments\n";
      helpMessage();
   }
   $nargs = $#ARGV + 1;
   for ($i=0; $i<$nargs; $i++) {
      if (substr($ARGV[$i],0,1) eq "-") {
         $option = substr($ARGV[$i],1);
         if ($option eq "h") {
            helpMessage();
         } elsif ($option eq "d") {
            if ($greyScaleMode) {
               print STDERR "Error: Both -d and -g specified\n";
               helpMessage();
            }
            $ditherMode = 1;
         } elsif ($option eq "g") {
            if ($ditherMode) {
               print STDERR "Error: Both -d and -g specified\n";
               helpMessage();
            }
            $greyScaleMode = 1;
         } elsif ($option eq "v") {
            $verboseMode = 1;
         } elsif ($option eq "V") {
            print STDERR "imgtops: Version 1.0 ...\n";
            print STDERR "Author: Abhijit Das (abhij\@csa.iisc.ernet.in)\n";
            print STDERR "Last modified: June 3 1997\n";
            exit(0);
         } elsif ($option eq "o") {
            if ($i == $nargs - 1) {
               print STDERR "Error: No output file specified for option -o\n";
               helpMessage();
            } else {
               $outputFile = $ARGV[++$i];
            }
         } elsif ($option eq "t") {
            if ($i == $nargs - 1) {
               print STDERR "Error: No temp dir specified for option -t\n";
               helpMessage();
            } else {
               $tempDir = $ARGV[++$i];
            }
         } else {
            print STDERR "Error: Invalid option -$option\n";
            helpMessage();
         }
      } else {
         if ($i == $nargs - 1) {
            $inputFile = $ARGV[$i];
         } else {
            print STDERR "Error: Too many arguments\n";
            helpMessage();
         }
      }
      if (($i == $nargs - 1) && ($inputFile eq "")) {
         print STDERR "ERROR: No input file specified\n";
         helpMessage();
      }
   }
}

sub processNames {
   if ($inputFile =~ /(.*)\.([^\/]*$)/) {
      $fileName = $1;
      $fileExtension = $2;
   } else {
      $fileName = $inputFile;
   }
   if ($fileName =~ /(.*)\/(.*)/) {
      $filePath = $1 . "/";
      $fileName = $2;
   }
   if ($outputFile eq "") {
      $outputFile = $filePath . $fileName . ".ps";
      $outFilePath = $filePath;
   } else {
      if ($outputFile =~ /(.*)\/(.*$)/) {
         $outFilePath = $1 . "/";
      }
   }
   if ($outFilePath eq "") {
      $outFilePath = "./";
   }
   if (!($tempDir =~ /\/$/)) {
      $tempDir = $tempDir . "/";
   }

   if (!(-e $inputFile)) {
      print STDERR "Error: File $inputFile does not exist\n";
      exit(1);
   }
   if (!(-r $inputFile)) {
      print STDERR "Error: File $inputFile is not readable\n";
      exit(1);
   }
   if (!(-f $inputFile)) {
      print STDERR "Error: File $inputFile is not a plain file\n";
      exit(1);
   }
   if (!(-d $tempDir)) {
      print STDERR "Error: $tempDir is not a directory\n";
      exit(1);
   }
   if (!(-w $tempDir)) {
      print STDERR "Error: $tempDir is not writable\n";
      exit(1);
   }
   if ((!(-d $outFilePath)) || (!(-w $outFilePath))) {
      print STDERR "Error: cannot write output file $outputFile\n";
      exit(1);
   }
   if (-e $outputFile) {
      if ($verboseMode) {
         print STDERR "File $outputFile exists. Overwrite (y/n) ? ";
         $answer = <STDIN>; chop($answer);
         if (($answer ne "y") && ($answer ne "Y")) {
            print STDERR "Okay ... quitting !\n";
            exit(1);
         }
      }
      `rm $outputFile`;
   }
}

sub convertImage {
   $timeNow = time();
   $pnmFile = $tempDir . $timeNow . ".pnm";
   $pgmFile = $tempDir . $timeNow . ".pgm";
   $pbmFile = $tempDir . $timeNow . ".pbm";

   $progName = "anytopnm";
   if ((lc($fileExtension) eq "jpg") || (lc($fileExtension) eq "jpeg")
       || (lc($fileExtension) eq "jpe")) {
      $progName = "djpeg";
   } elsif (lc($fileExtension) eq "gif") {
      $progName = "giftopnm";
   } elsif ((lc($fileExtension) eq "tiff") || (lc($fileExtension) eq "tif")) {
      $progName = "tifftopnm";
   } elsif (lc($fileExtension) eq "ras") {
      $progName = "rasttopnm";
   } elsif (lc($fileExtension) eq "xbm") {
      $progName = "xbmtopbm";
   } elsif (lc($fileExtension) eq "xpm") {
      $progName = "xpmtoppm";
   } elsif (lc($fileExtension) eq "xwd") {
      $progName = "xwdtopnm";
   } elsif (lc($fileExtension) eq "bmp") {
      $progName = "bmptoppm";
   } elsif ((lc($fileExtension) eq "pnm") || (lc($fileExtension) eq "ppm")
            || (lc($fileExtension) eq "pgm") || (lc($fileExtension) eq "pbm")) {
      $progName = "cat";
   } else {
     $progName = "anytopnm";
     print STDERR "Unknown image extension .. Trying anyway !\n";
   }
   if ($verboseMode) {
      print STDERR "$progName: $inputFile ---> $pnmFile\n";
   }

   `$progName $inputFile > $pnmFile`;

   $tmpFile = $pnmFile;
   if (($greyScaleMode) || ($ditherMode)) {
      if ($verboseMode) {
         print STDERR "ppmtopgm: $pnmFile ---> $pgmFile\n";
      }
      $tmpFile = $pgmFile;
      `ppmtopgm $pnmFile > $pgmFile`;
   }
   if ($ditherMode) {
      if ($verboseMode) {
         print STDERR "pgmtopbm: $pgmFile ---> $pbmFile\n";
      }
      $tmpFile = $pbmFile;
      `pgmtopbm $pgmFile > $pbmFile`;
   }

   if ($verboseMode) {
         print STDERR "pnmtops: $tmpFile ---> $outputFile\n";
   }
   `pnmtops -noturn $tmpFile > $outputFile`;

   foreach $tmpFile ($pnmFile, $pgmFile, $pbmFile) {
      if (-e $tmpFile) {
         if ($verboseMode) {
            print STDERR "Deleting $tmpFile\n";
         }
         `rm $tmpFile`;
      }
   }
}

$ditherMode = 0;
$greyScaleMode = 0;
$verboseMode = 0;
$inputFile = "";
$outputFile = "";
$tempDir = "/tmp/";

processCmdLine();

$fileExtension = "";
$fileName = "";
$filePath = "";
$outFilePath = "";

processNames();

convertImage();

