--- ray/src/px/pflip.c 1991/04/18 14:35:24 1.4 +++ ray/src/px/pflip.c 1992/10/28 11:23:22 2.3 @@ -1,4 +1,4 @@ -/* Copyright (c) 1991 Regents of the University of California */ +/* Copyright (c) 1992 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -10,25 +10,58 @@ static char SCCSid[] = "$SunId$ LBL"; #include +#ifdef MSDOS +#include +#endif + #include "color.h" -int xres, yres; /* input resolution */ +#include "resolu.h" +int order; /* input orientation */ +int xres, yres; /* resolution (scanlen, nscans) */ + long *scanpos; /* scanline positions */ -int fhoriz, fvert; /* flip flags */ +int fhoriz=0, fvert=0; /* flip flags */ +int correctorder = 0; /* correcting orientation? */ + FILE *fin; /* input file */ char *progname; +extern char *malloc(); + +int +neworder() /* figure out new order from old */ +{ + register int no; + + if (correctorder) + return(order); /* just leave it */ + if ((no = order) & YMAJOR) { + if (fhoriz) no ^= XDECR; + if (fvert) no ^= YDECR; + } else { + if (fhoriz) no ^= YDECR; + if (fvert) no ^= XDECR; + } + return(no); +} + + main(argc, argv) int argc; char *argv[]; { int i; - +#ifdef MSDOS + extern int _fmode; + _fmode = O_BINARY; + setmode(fileno(stdout), O_BINARY); +#endif progname = argv[0]; for (i = 1; i < argc; i++) @@ -36,10 +69,12 @@ char *argv[]; fhoriz++; else if (!strcmp(argv[i], "-v")) fvert++; + else if (!strcmp(argv[i], "-c")) + correctorder++; else break; if (i >= argc || argv[i][0] == '-') { - fprintf(stderr, "Usage: %s [-h][-v] infile [outfile]\n", + fprintf(stderr, "Usage: %s [-h][-v][-c] infile [outfile]\n", progname); exit(1); } @@ -62,12 +97,12 @@ char *argv[]; fputformat(COLRFMT, stdout); putchar('\n'); /* get picture size */ - if (fgetresolu(&xres, &yres, fin) != (YMAJOR|YDECR)) { + if ((order = fgetresolu(&xres, &yres, fin)) < 0) { fprintf(stderr, "%s: bad picture size\n", progname); exit(1); } /* write new picture size */ - fputresolu(YMAJOR|YDECR, xres, yres, stdout); + fputresolu(neworder(), xres, yres, stdout); /* goto end if vertical flip */ if (fvert) scanfile(); @@ -93,13 +128,14 @@ scanfile() /* scan to the end of file */ memerr(); if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL) memerr(); - for (y = yres-1; y >= 0; y--) { + for (y = yres-1; y > 0; y--) { scanpos[y] = ftell(fin); if (freadcolrs(scanin, xres, fin) < 0) { fprintf(stderr, "%s: read error\n", progname); exit(1); } } + scanpos[0] = ftell(fin); free((char *)scanin); } @@ -135,5 +171,6 @@ flip() /* flip the picture */ } } free((char *)scanin); - free((char *)scanout); + if (fhoriz) + free((char *)scanout); }