ftp.nice.ch/pub/next/unix/graphics/psutils.5Nov92.N.bs.tar.gz#/psutils/epsffit.c

This is epsffit.c in view mode; [Download] [Up]

/* epsffit.c
 * AJCD 6 Dec 90
 * fit epsf file into constrained size
 * Usage:
 *       epsffit [-c] [-r] [-a] [-s] llx lly urx ury
 *               -c centres the image in the bounding box given
 *               -r rotates the image by 90 degrees anti-clockwise
 *               -a alters the aspect ratio to fit the bounding box
 *               -s adds a showpage at the end of the image
 */

#include <stdio.h>
#include <ctype.h>

#define min(x,y) ((x) > (y) ? (y) : (x))
#define max(x,y) ((x) > (y) ? (x) : (y))

static char *prog;

usage()
{
   fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-s] llx lly urx ury\n", prog);
   exit(1);
}

main(argc, argv)
     int argc;
     char **argv;
{
   int fit[4], i;
   int bbfound = 0;              /* %%BoundingBox: found */
   int urx, ury, llx, lly;
   int furx, fury, fllx, flly, fwidth, fheight;
   int showpage = 0, centre = 0, rotate = 0, aspect = 0;
   char buf[BUFSIZ];

   prog = *argv++; argc--;

   while (argc > 0 && argv[0][0] == '-') {
      switch (argv[0][1]) {
      case 'c': centre = 1; break;
      case 's': showpage = 1; break;
      case 'r': rotate = 1; break;
      case 'a': aspect = 1; break;
      default:  usage();
      }
      argc--;
      argv++;
   }

   if (argc != 4) usage();
   fllx = atoi(argv[0]);
   flly = atoi(argv[1]);
   furx = atoi(argv[2]);
   fury = atoi(argv[3]);
   if (rotate) {
      fwidth = fury - flly;
      fheight = furx - fllx;
   } else {
      fwidth = furx - fllx;
      fheight = fury - flly;
   }

   while (fgets(buf, BUFSIZ, stdin)) {
      if (buf[0] == '%' && (buf[1] == '%' || buf[1] == '!')) {
	 /* still in comment section */
	 if (!strncmp(buf, "%%BoundingBox:", 14)) {
	    if (sscanf(buf, "%%%%BoundingBox:%d %d %d %d\n",
		       &llx, &lly, &urx, &ury) == 4)
	       bbfound = 1;
	 } else if (!strncmp(buf, "%%EndComments", 13)) {
	    strcpy(buf, "\n"); /* don't repeat %%EndComments */
	    break;
	 } else fputs(buf,stdout);
      } else break;
   }
   if (bbfound) { /* put BB, followed by scale&translate */
      double width = urx-llx, height = ury-lly;
      double xscale = fwidth/width, yscale = fheight/height;
      double xoffset = fllx, yoffset = flly;
      if (!aspect) {       /* preserve aspect ratio ? */
	 xscale = yscale = min(xscale,yscale);
      }
      width *= xscale;     /* actual width and height after scaling */
      height *= yscale;
      if (centre) {
	 if (rotate) {
	    xoffset += (fheight - height)/2;
	    yoffset += (fwidth - width)/2;
	 } else {
	    xoffset += (fwidth - width)/2;
	    yoffset += (fheight - height)/2;
	 }
      }
      printf("%%%%BoundingBox: %d %d %d %d\n", (int)xoffset, (int)yoffset,
	     (int)(xoffset+(rotate ? height : width)),
	     (int)(yoffset+(rotate ? width : height)));
      if (rotate) {  /* compensate for original image shift */
	 xoffset += height + lly * yscale;  /* displacement for rotation */
	 yoffset -= llx * xscale;
      } else {
	 xoffset -= llx * xscale;
	 yoffset -= lly * yscale;
      }
      puts("%%EndComments");
      if (showpage)
	 puts("save /showpage{}def /copypage{}def /erasepage{}def");
      else
	 puts("%%BeginProcSet: epsffit 1 0");
      puts("gsave");
      printf("%.3lf %.3lf translate\n", xoffset, yoffset);
      if (rotate)
	 puts("90 rotate");
      printf("%.3lf %.3lf scale\n", xscale, yscale);
      if (!showpage)
	 puts("%%EndProcSet");
   }
   do {
      fputs(buf,stdout);
   } while (fgets(buf, BUFSIZ, stdin));
   if (bbfound) {
      puts("grestore");
      if (showpage)
	 puts("restore showpage"); /* just in case */
   } else {
      fprintf(stderr, "%s: no %%%%BoundingBox:\n", prog);
      exit(1);
   }
   exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.