summaryrefslogtreecommitdiff
path: root/Build/source/utils/psutils/epsffit.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:16:42 +0000
commita3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (patch)
treef4a8a34f904c1bb86adcc3ae0e14434badc6dbe4 /Build/source/utils/psutils/epsffit.c
parent6c0eafbb1395d426a72a74538e0b2a95e8344ca6 (diff)
utils 1
git-svn-id: svn://tug.org/texlive/trunk@1484 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/psutils/epsffit.c')
-rw-r--r--Build/source/utils/psutils/epsffit.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/Build/source/utils/psutils/epsffit.c b/Build/source/utils/psutils/epsffit.c
new file mode 100644
index 00000000000..c31eaece28f
--- /dev/null
+++ b/Build/source/utils/psutils/epsffit.c
@@ -0,0 +1,190 @@
+/* epsffit.c
+ * Copyright (C) Angus J. C. Duggan 1991-1995
+ * See file LICENSE for details.
+ *
+ * fit epsf file into constrained size
+ * Usage:
+ * epsffit [-c] [-r] [-a] [-s] llx lly urx ury [infile [outfile]]
+ * -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
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "psutil.h"
+#include "pserror.h"
+#include "patchlev.h"
+#include "config.h"
+
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+char *program;
+
+static void usage(void)
+{
+ fprintf(stderr, "%s release %d patchlevel %d\n", program, RELEASE, PATCHLEVEL);
+ fprintf(stderr, "Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.\n");
+ fprintf(stderr, "Usage: %s [-c] [-r] [-a] [-s] llx lly urx ury [infile [outfile]]\n",
+ program);
+ exit(1);
+}
+
+void main(int argc, char **argv)
+{
+ int bbfound = 0; /* %%BoundingBox: found */
+ int urx, ury, llx, lly;
+ int furx, fury, fllx, flly;
+ int showpage = 0, centre = 0, rotate = 0, aspect = 0, maximise = 0;
+ char buf[BUFSIZ];
+ FILE *input;
+ FILE *output;
+
+ program = *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;
+ case 'm': maximise = 1; break;
+ case 'v':
+ default: usage();
+ }
+ argc--;
+ argv++;
+ }
+
+ if (argc < 4 || argc > 6) usage();
+ fllx = atoi(argv[0]);
+ flly = atoi(argv[1]);
+ furx = atoi(argv[2]);
+ fury = atoi(argv[3]);
+
+ if (argc > 4) {
+ if(!(input = fopen(argv[4], OPEN_READ)))
+ message(FATAL, "can't open input file %s\n", argv[4]);
+ } else {
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ int fd = fileno(stdin) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdin to binary mode\n");
+#endif
+ input = stdin ;
+ }
+
+ if (argc > 5) {
+ if(!(output = fopen(argv[5], OPEN_WRITE)))
+ message(FATAL, "can't open output file %s\n", argv[5]);
+ } else {
+#if defined(MSDOS) || defined(WINNT) || defined(WIN32)
+ int fd = fileno(stdout) ;
+ if ( setmode(fd, O_BINARY) < 0 )
+ message(FATAL, "can't reset stdout to binary mode\n");
+#endif
+ output = stdout ;
+ }
+
+ 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
+ message(FATAL, "no %%%%BoundingBox:\n");
+
+ exit(0);
+}