ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pflip.c
Revision: 2.10
Committed: Thu May 17 17:36:14 2012 UTC (11 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R2P1
Changes since 2.9: +14 -6 lines
Log Message:
Permitted pflip to pipe from stdin for horizontal-only flip

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.10 static const char RCSid[] = "$Id: pflip.c,v 2.9 2006/08/08 18:04:41 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * flip picture file horizontally and/or vertically
6     */
7    
8 greg 1.3 #include <stdio.h>
9 greg 2.5 #include <time.h>
10 schorsch 2.7 #include <string.h>
11 greg 2.5
12 schorsch 2.6 #include "platform.h"
13 greg 1.1 #include "color.h"
14 greg 1.5 #include "resolu.h"
15 greg 1.1
16 greg 1.5 int order; /* input orientation */
17     int xres, yres; /* resolution (scanlen, nscans) */
18    
19 greg 1.1 long *scanpos; /* scanline positions */
20    
21 greg 1.5 int fhoriz=0, fvert=0; /* flip flags */
22 greg 1.1
23 greg 1.5 int correctorder = 0; /* correcting orientation? */
24    
25 greg 1.1 FILE *fin; /* input file */
26    
27     char *progname;
28    
29 greg 2.2
30 schorsch 2.8 static void memerr(void);
31     static void scanfile(void);
32     static void flip(void);
33    
34    
35     static int
36     neworder(void) /* figure out new order from old */
37 greg 1.5 {
38     register int no;
39    
40     if (correctorder)
41     return(order); /* just leave it */
42     if ((no = order) & YMAJOR) {
43     if (fhoriz) no ^= XDECR;
44     if (fvert) no ^= YDECR;
45     } else {
46     if (fhoriz) no ^= YDECR;
47     if (fvert) no ^= XDECR;
48     }
49     return(no);
50     }
51    
52 schorsch 2.8 int
53     main(
54     int argc,
55     char *argv[]
56     )
57 greg 1.1 {
58 greg 2.4 static char picfmt[LPICFMT+1] = PICFMT;
59     int i, rval;
60 schorsch 2.6 SET_DEFAULT_BINARY();
61     SET_FILE_BINARY(stdout);
62 greg 1.1 progname = argv[0];
63    
64     for (i = 1; i < argc; i++)
65     if (!strcmp(argv[i], "-h"))
66     fhoriz++;
67     else if (!strcmp(argv[i], "-v"))
68     fvert++;
69 greg 1.5 else if (!strcmp(argv[i], "-c"))
70     correctorder++;
71 greg 1.1 else
72     break;
73 greg 2.10 if (i < argc-2)
74     goto userr;
75     if (!fhoriz && !fvert)
76     fprintf(stderr, "%s: warning - no operation\n", argv[0]);
77 greg 1.1 if (i >= argc || argv[i][0] == '-') {
78 greg 2.10 if (fvert)
79     goto userr;
80     SET_FILE_BINARY(stdin);
81     fin = stdin;
82     } else if ((fin = fopen(argv[i], "r")) == NULL) {
83 greg 2.9 fprintf(stderr, "%s: cannot open\n", argv[i]);
84 greg 1.1 exit(1);
85     }
86     if (i < argc-1 && freopen(argv[i+1], "w", stdout) == NULL) {
87     fprintf(stderr, "%s: cannot open\n", argv[i+1]);
88     exit(1);
89     }
90     /* transfer header */
91 greg 2.4 if ((rval = checkheader(fin, picfmt, stdout)) < 0) {
92 greg 1.4 fprintf(stderr, "%s: input not a Radiance picture\n",
93     progname);
94     exit(1);
95     }
96 greg 2.4 if (rval)
97     fputformat(picfmt, stdout);
98 greg 1.1 /* add new header info. */
99 greg 1.2 printargs(i, argv, stdout);
100 greg 1.1 putchar('\n');
101     /* get picture size */
102 greg 1.5 if ((order = fgetresolu(&xres, &yres, fin)) < 0) {
103 greg 1.1 fprintf(stderr, "%s: bad picture size\n", progname);
104     exit(1);
105     }
106     /* write new picture size */
107 greg 1.5 fputresolu(neworder(), xres, yres, stdout);
108 greg 1.1 /* goto end if vertical flip */
109     if (fvert)
110     scanfile();
111     flip(); /* flip the image */
112     exit(0);
113 greg 2.10 userr:
114     fprintf(stderr, "Usage: %s [-h][-v][-c] infile [outfile]\n",
115     progname);
116     exit(1);
117 greg 1.1 }
118    
119    
120 schorsch 2.8 static void
121     memerr(void)
122 greg 1.1 {
123     fprintf(stderr, "%s: out of memory\n", progname);
124     exit(1);
125     }
126    
127    
128 schorsch 2.8 static void
129     scanfile(void) /* scan to the end of file */
130 greg 1.1 {
131     extern long ftell();
132     COLR *scanin;
133     int y;
134    
135     if ((scanpos = (long *)malloc(yres*sizeof(long))) == NULL)
136     memerr();
137     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
138     memerr();
139 greg 2.3 for (y = yres-1; y > 0; y--) {
140 greg 1.1 scanpos[y] = ftell(fin);
141     if (freadcolrs(scanin, xres, fin) < 0) {
142     fprintf(stderr, "%s: read error\n", progname);
143     exit(1);
144     }
145     }
146 greg 2.3 scanpos[0] = ftell(fin);
147 greg 2.5 free((void *)scanin);
148 greg 1.1 }
149    
150    
151 schorsch 2.8 static void
152     flip(void) /* flip the picture */
153 greg 1.1 {
154     COLR *scanin, *scanout;
155     int y;
156     register int x;
157    
158     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
159     memerr();
160     if (fhoriz) {
161     if ((scanout = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
162     memerr();
163     } else
164     scanout = scanin;
165     for (y = yres-1; y >= 0; y--) {
166     if (fvert && fseek(fin, scanpos[yres-1-y], 0) == EOF) {
167     fprintf(stderr, "%s: seek error\n", progname);
168     exit(1);
169     }
170     if (freadcolrs(scanin, xres, fin) < 0) {
171     fprintf(stderr, "%s: read error\n", progname);
172     exit(1);
173     }
174     if (fhoriz)
175     for (x = 0; x < xres; x++)
176     copycolr(scanout[x], scanin[xres-1-x]);
177     if (fwritecolrs(scanout, xres, stdout) < 0) {
178     fprintf(stderr, "%s: write error\n", progname);
179     exit(1);
180     }
181     }
182 greg 2.5 free((void *)scanin);
183 greg 2.3 if (fhoriz)
184 greg 2.5 free((void *)scanout);
185 greg 1.1 }