home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume35 / psutils / part04 / epsffit.c next >
C/C++ Source or Header  |  1993-02-04  |  4KB  |  134 lines

  1. /* epsffit.c
  2.  * AJCD 6 Dec 90
  3.  * fit epsf file into constrained size
  4.  * Usage:
  5.  *       epsffit [-c] [-r] [-a] [-s] llx lly urx ury
  6.  *               -c centres the image in the bounding box given
  7.  *               -r rotates the image by 90 degrees anti-clockwise
  8.  *               -a alters the aspect ratio to fit the bounding box
  9.  *               -s adds a showpage at the end of the image
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #include "patchlevel.h"
  15.  
  16. #define min(x,y) ((x) > (y) ? (y) : (x))
  17. #define max(x,y) ((x) > (y) ? (x) : (y))
  18.  
  19. static char *prog;
  20.  
  21. usage()
  22. {
  23.    fprintf(stderr, "%s release %d patchlevel %d\n", prog, RELEASE, PATCHLEVEL);
  24.    fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-s] llx lly urx ury\n", prog);
  25.    exit(1);
  26. }
  27.  
  28. main(argc, argv)
  29.      int argc;
  30.      char **argv;
  31. {
  32.    int fit[4], i;
  33.    int bbfound = 0;              /* %%BoundingBox: found */
  34.    int urx, ury, llx, lly;
  35.    int furx, fury, fllx, flly, fwidth, fheight;
  36.    int showpage = 0, centre = 0, rotate = 0, aspect = 0;
  37.    char buf[BUFSIZ];
  38.  
  39.    prog = *argv++; argc--;
  40.  
  41.    while (argc > 0 && argv[0][0] == '-') {
  42.       switch (argv[0][1]) {
  43.       case 'c': centre = 1; break;
  44.       case 's': showpage = 1; break;
  45.       case 'r': rotate = 1; break;
  46.       case 'a': aspect = 1; break;
  47.       case 'v':
  48.       default:  usage();
  49.       }
  50.       argc--;
  51.       argv++;
  52.    }
  53.  
  54.    if (argc != 4) usage();
  55.    fllx = atoi(argv[0]);
  56.    flly = atoi(argv[1]);
  57.    furx = atoi(argv[2]);
  58.    fury = atoi(argv[3]);
  59.    if (rotate) {
  60.       fwidth = fury - flly;
  61.       fheight = furx - fllx;
  62.    } else {
  63.       fwidth = furx - fllx;
  64.       fheight = fury - flly;
  65.    }
  66.  
  67.    while (fgets(buf, BUFSIZ, stdin)) {
  68.       if (buf[0] == '%' && (buf[1] == '%' || buf[1] == '!')) {
  69.      /* still in comment section */
  70.      if (!strncmp(buf, "%%BoundingBox:", 14)) {
  71.         if (sscanf(buf, "%%%%BoundingBox:%d %d %d %d\n",
  72.                &llx, &lly, &urx, &ury) == 4)
  73.            bbfound = 1;
  74.      } else if (!strncmp(buf, "%%EndComments", 13)) {
  75.         strcpy(buf, "\n"); /* don't repeat %%EndComments */
  76.         break;
  77.      } else fputs(buf,stdout);
  78.       } else break;
  79.    }
  80.    if (bbfound) { /* put BB, followed by scale&translate */
  81.       double width = urx-llx, height = ury-lly;
  82.       double xscale = fwidth/width, yscale = fheight/height;
  83.       double xoffset = fllx, yoffset = flly;
  84.       if (!aspect) {       /* preserve aspect ratio ? */
  85.      xscale = yscale = min(xscale,yscale);
  86.       }
  87.       width *= xscale;     /* actual width and height after scaling */
  88.       height *= yscale;
  89.       if (centre) {
  90.      if (rotate) {
  91.         xoffset += (fheight - height)/2;
  92.         yoffset += (fwidth - width)/2;
  93.      } else {
  94.         xoffset += (fwidth - width)/2;
  95.         yoffset += (fheight - height)/2;
  96.      }
  97.       }
  98.       printf("%%%%BoundingBox: %d %d %d %d\n", (int)xoffset, (int)yoffset,
  99.          (int)(xoffset+(rotate ? height : width)),
  100.          (int)(yoffset+(rotate ? width : height)));
  101.       if (rotate) {  /* compensate for original image shift */
  102.      xoffset += height + lly * yscale;  /* displacement for rotation */
  103.      yoffset -= llx * xscale;
  104.       } else {
  105.      xoffset -= llx * xscale;
  106.      yoffset -= lly * yscale;
  107.       }
  108.       puts("%%EndComments");
  109.       if (showpage)
  110.      puts("save /showpage{}def /copypage{}def /erasepage{}def");
  111.       else
  112.      puts("%%BeginProcSet: epsffit 1 0");
  113.       puts("gsave");
  114.       printf("%.3lf %.3lf translate\n", xoffset, yoffset);
  115.       if (rotate)
  116.      puts("90 rotate");
  117.       printf("%.3lf %.3lf scale\n", xscale, yscale);
  118.       if (!showpage)
  119.      puts("%%EndProcSet");
  120.    }
  121.    do {
  122.       fputs(buf,stdout);
  123.    } while (fgets(buf, BUFSIZ, stdin));
  124.    if (bbfound) {
  125.       puts("grestore");
  126.       if (showpage)
  127.      puts("restore showpage"); /* just in case */
  128.    } else {
  129.       fprintf(stderr, "%s: no %%%%BoundingBox:\n", prog);
  130.       exit(1);
  131.    }
  132.    exit(0);
  133. }
  134.