/* pnmpad.c - add border to sides of a portable anymap
 ** (C) 1994 Rolf Mayer, Rolf.Mayer@rz.uni-karlsruhe.de
 ** based on pnmpad (C) 1990 Angus Duggan (C) 1989 Jef Poskanzer
 */

#include <stdio.h>
#include "pnm.h"

int
main(argc, argv)
     int argc;
     char *argv[];
{
   FILE *ifd;
   xel *xelrow, *bgrow, background;
   xelval maxval;
   int rows, cols, newcols, row, col, format;
   int left, right, top, bot, black, factor, framex, framey, minframe;
   char *usage = "[-white|-black] [-l#] [-r#] [-t#] [-b#] [-d#] [-m#] [pnmfile]";


   pnm_init( &argc, argv );

   black = 1;
   left = right = top = bot = factor = framex = framey = minframe = 0;

   while (argc >= 2 && argv[1][0] == '-') {
      if (strcmp(argv[1]+1,"black") == 0) black = 1;
      else if (strcmp(argv[1]+1,"white") == 0) black = 0;
      else switch (argv[1][1]) {
      case 'l':
	 if ((left = atoi(argv[1]+2)) < 0)
	    pm_error("left border too small");
	 break;
      case 'r':
	 if ((right = atoi(argv[1]+2)) < 0)
	    pm_error("right border too small");
	 break;
      case 'b':
	 if ((bot = atoi(argv[1]+2)) < 0)
	    pm_error("bottom border too small");
	 break;
      case 't':
	 if ((top = atoi(argv[1]+2)) < 0)
	    pm_error("top border too small");
	 break;
      case 'd':
	 if ((factor= atoi(argv[1]+2)) < 1)
	    pm_error("denominator to small (must be > 1)");
         break;
      case 'm':
	 if ((minframe= atoi(argv[1]+2)) < 0)
	    pm_error("minimum frame to small");
         break;
      default:
	 pm_usage(usage);
      }
      argc--, argv++;
   }

   if (argc > 2)
      pm_usage(usage);
   
   if (argc == 2)
      ifd = pm_openr(argv[1]);
   else
      ifd = stdin;



   pnm_readpnminit(ifd, &cols, &rows, &maxval, &format);
   if (black)
      background = pnm_blackxel(maxval, format);
   else
      background = pnm_whitexel(maxval, format);

   if (cols == 0 || rows == 0) {
      pm_message("empty bitmap");
      left = right = bot = top = 0;
   }

   if (factor) {
      pm_message("options -l -r -t -b ignored");
      framex=cols/factor;
      framey=cols/factor;
      if (minframe) {
         if (framex<=minframe && framey<=minframe) {
	    framex=minframe;
	    framey=minframe;
	    }
	 }
      if (framex < framey)
	 framey=framex;
      if (framey < framex)
	 framex=framey;
      left = right = top = bot = framex;
   }
   if (minframe && factor==0) {
      if (left<=minframe)
	 left = minframe;
      if (right<=minframe)
	 right = minframe;
      if (bot<=minframe)
         bot= minframe;
      if (top<=minframe)
         top= minframe;
      }
   newcols = cols+left+right;
   xelrow = pnm_allocrow(newcols);
   bgrow = pnm_allocrow(newcols);

   for (col = 0; col < newcols; col++)
      xelrow[col] = bgrow[col] = background;

   pnm_writepnminit(stdout, newcols, rows+top+bot, maxval, format, 0);

   for (row = 0; row < top; row++)
      pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);

   for (row = 0; row < rows; row++) {
      pnm_readpnmrow(ifd, xelrow+left, cols, maxval, format);
      pnm_writepnmrow(stdout, xelrow, newcols, maxval, format, 0);
   }

   for (row = 0; row < bot; row++)
      pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);

   pm_close(ifd);

   exit(0);
}
