ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pflip.c
Revision: 1.4
Committed: Thu Apr 18 14:35:24 1991 UTC (33 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +6 -1 lines
Log Message:
added format information to headers

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1991 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * flip picture file horizontally and/or vertically
9     */
10    
11 greg 1.3 #include <stdio.h>
12 greg 1.1
13     #include "color.h"
14    
15     int xres, yres; /* input resolution */
16    
17     long *scanpos; /* scanline positions */
18    
19     int fhoriz, fvert; /* flip flags */
20    
21     FILE *fin; /* input file */
22    
23     char *progname;
24    
25    
26     main(argc, argv)
27     int argc;
28     char *argv[];
29     {
30     int i;
31    
32     progname = argv[0];
33    
34     for (i = 1; i < argc; i++)
35     if (!strcmp(argv[i], "-h"))
36     fhoriz++;
37     else if (!strcmp(argv[i], "-v"))
38     fvert++;
39     else
40     break;
41     if (i >= argc || argv[i][0] == '-') {
42     fprintf(stderr, "Usage: %s [-h][-v] infile [outfile]\n",
43     progname);
44     exit(1);
45     }
46     if ((fin = fopen(argv[i], "r")) == NULL) {
47     fprintf(stderr, "%s: cannot open\n", argv[1]);
48     exit(1);
49     }
50     if (i < argc-1 && freopen(argv[i+1], "w", stdout) == NULL) {
51     fprintf(stderr, "%s: cannot open\n", argv[i+1]);
52     exit(1);
53     }
54     /* transfer header */
55 greg 1.4 if (checkheader(fin, COLRFMT, stdout) < 0) {
56     fprintf(stderr, "%s: input not a Radiance picture\n",
57     progname);
58     exit(1);
59     }
60 greg 1.1 /* add new header info. */
61 greg 1.2 printargs(i, argv, stdout);
62 greg 1.4 fputformat(COLRFMT, stdout);
63 greg 1.1 putchar('\n');
64     /* get picture size */
65     if (fgetresolu(&xres, &yres, fin) != (YMAJOR|YDECR)) {
66     fprintf(stderr, "%s: bad picture size\n", progname);
67     exit(1);
68     }
69     /* write new picture size */
70     fputresolu(YMAJOR|YDECR, xres, yres, stdout);
71     /* goto end if vertical flip */
72     if (fvert)
73     scanfile();
74     flip(); /* flip the image */
75     exit(0);
76     }
77    
78    
79     memerr()
80     {
81     fprintf(stderr, "%s: out of memory\n", progname);
82     exit(1);
83     }
84    
85    
86     scanfile() /* scan to the end of file */
87     {
88     extern long ftell();
89     COLR *scanin;
90     int y;
91    
92     if ((scanpos = (long *)malloc(yres*sizeof(long))) == NULL)
93     memerr();
94     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
95     memerr();
96     for (y = yres-1; y >= 0; y--) {
97     scanpos[y] = ftell(fin);
98     if (freadcolrs(scanin, xres, fin) < 0) {
99     fprintf(stderr, "%s: read error\n", progname);
100     exit(1);
101     }
102     }
103     free((char *)scanin);
104     }
105    
106    
107     flip() /* flip the picture */
108     {
109     COLR *scanin, *scanout;
110     int y;
111     register int x;
112    
113     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
114     memerr();
115     if (fhoriz) {
116     if ((scanout = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
117     memerr();
118     } else
119     scanout = scanin;
120     for (y = yres-1; y >= 0; y--) {
121     if (fvert && fseek(fin, scanpos[yres-1-y], 0) == EOF) {
122     fprintf(stderr, "%s: seek error\n", progname);
123     exit(1);
124     }
125     if (freadcolrs(scanin, xres, fin) < 0) {
126     fprintf(stderr, "%s: read error\n", progname);
127     exit(1);
128     }
129     if (fhoriz)
130     for (x = 0; x < xres; x++)
131     copycolr(scanout[x], scanin[xres-1-x]);
132     if (fwritecolrs(scanout, xres, stdout) < 0) {
133     fprintf(stderr, "%s: write error\n", progname);
134     exit(1);
135     }
136     }
137     free((char *)scanin);
138     free((char *)scanout);
139     }