diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2014-01-16 11:45:40 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2014-01-16 11:45:40 +0000 |
commit | d0982ab7a20bec41935e679cda7f27ff4e01df15 (patch) | |
tree | 0b57d73bacf1a3e50a19ebbbd666bc0bcb8325db /Build/source/texk/psutils/psutils-1.23/epsffit.c | |
parent | 0e7e4d3fcb2c0a18212824f21ffb8d8e11415c45 (diff) |
psutils 1.23
git-svn-id: svn://tug.org/texlive/trunk@32688 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/psutils/psutils-1.23/epsffit.c')
-rw-r--r-- | Build/source/texk/psutils/psutils-1.23/epsffit.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/Build/source/texk/psutils/psutils-1.23/epsffit.c b/Build/source/texk/psutils/psutils-1.23/epsffit.c new file mode 100644 index 00000000000..df7e81eb2ae --- /dev/null +++ b/Build/source/texk/psutils/psutils-1.23/epsffit.c @@ -0,0 +1,173 @@ +/* epsffit.c + * Fit EPSF file into constrained size + * + * (c) Reuben Thomas 2012-2014 + * (c) Angus J. C. Duggan 1991-1997 + * See file LICENSE for details. + * + * Added filename spec (from Larry Weissman) 5 Feb 93 + * Accepts double %%BoundingBox input, outputs proper BB, 4 Jun 93. (I don't + * like this; developers should read the Big Red Book before writing code which + * outputs PostScript. + */ + +#include "config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#include "progname.h" +#include "binary-io.h" + +#include "psutil.h" + +const char *syntax = "[-c] [-r] [-a] [-m] [-s] LLX LLY URX URY [INFILE [OUTFILE]]\n"; + +const char *argerr_message = ""; + +int +main(int argc, char **argv) +{ + int bbfound = 0; /* %%BoundingBox: found */ + int urx = 0, ury = 0, llx = 0, lly = 0; + int furx, fury, fllx, flly; + int showpage = 0, centre = 0, rotate = 0, aspect = 0, maximise = 0; + char buf[BUFSIZ]; + FILE *input = stdin; + FILE *output = stdout; + int opt; + + set_program_name(argv[0]); + + while((opt = getopt(argc, argv, "csramv")) != EOF) { + switch(opt) { + case 'c': centre = 1; break; + case 's': showpage = 1; break; + case 'r': rotate = 1; break; + case 'a': aspect = 1; break; + case 'm': maximise = 1; break; + case 'v': + default: + usage(); + break; + } + } + + if ((argc - optind) < 4 || (argc - optind) > 6) usage(); + + fllx = atoi(argv[optind++]); + flly = atoi(argv[optind++]); + furx = atoi(argv[optind++]); + fury = atoi(argv[optind++]); + + /* Be defensive */ + if((argc - optind) < 0 || (argc - optind) > 2) usage(); + + if ((argc - optind) > 0) { + if(!(input = fopen(argv[optind], "rb"))) + die("can't open input file %s", argv[optind]); + optind++; + } else if (set_binary_mode(fileno(stdin), O_BINARY) < 0) + die("can't reset stdin to binary mode"); + + if ((argc - optind) > 0) { + if(!(output = fopen(argv[optind], "wb"))) + die("can't open output file %s", argv[optind]); + optind++; + } else if (set_binary_mode(fileno(stdout), O_BINARY) < 0) + die("can't reset stdout to binary mode"); + + while (fgets(buf, BUFSIZ, input)) { + if (buf[0] == '%' && (buf[1] == '%' || buf[1] == '!')) { + /* still in comment section */ + if (!strncmp(buf, "%%BoundingBox:", 14)) { + double illx, illy, iurx, iury; /* input bbox parameters */ + if (sscanf(buf, "%%%%BoundingBox:%lf %lf %lf %lf\n", + &illx, &illy, &iurx, &iury) == 4) { + bbfound = 1; + llx = (int)illx; /* accept doubles, but convert to int */ + lly = (int)illy; + urx = (int)(iurx+0.5); + ury = (int)(iury+0.5); + } + } else if (!strncmp(buf, "%%EndComments", 13)) { + strcpy(buf, "\n"); /* don't repeat %%EndComments */ + break; + } else fputs(buf, output); + } else break; + } + + if (bbfound) { /* put BB, followed by scale&translate */ + int fwidth, fheight; + double xscale, yscale; + double xoffset = fllx, yoffset = flly; + double width = urx-llx, height = ury-lly; + + if (maximise) + if ((width > height && fury-flly > furx-fllx) || + (width < height && fury-flly < furx-fllx)) + rotate = 1; + + if (rotate) { + fwidth = fury - flly; + fheight = furx - fllx; + } else { + fwidth = furx - fllx; + fheight = fury - flly; + } + + xscale = fwidth/width; + yscale = fheight/height; + + 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; + } + } + fprintf(output, + "%%%%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; + } + fputs("%%EndComments\n", output); + if (showpage) + fputs("save /showpage{}def /copypage{}def /erasepage{}def\n", output); + else + fputs("%%BeginProcSet: epsffit 1 0\n", output); + fputs("gsave\n", output); + fprintf(output, "%.3f %.3f translate\n", xoffset, yoffset); + if (rotate) + fputs("90 rotate\n", output); + fprintf(output, "%.3f %.3f scale\n", xscale, yscale); + if (!showpage) + fputs("%%EndProcSet\n", output); + } + do { + fputs(buf, output); + } while (fgets(buf, BUFSIZ, input)); + if (bbfound) { + fputs("grestore\n", output); + if (showpage) + fputs("restore showpage\n", output); /* just in case */ + } else + die("no %%%%BoundingBox:"); + + return 0; +} |