ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pflip.c
Revision: 2.3
Committed: Wed Oct 28 11:23:22 1992 UTC (31 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +4 -2 lines
Log Message:
fixed minor bug freeing memory that had already been freed

File Contents

# Content
1 /* Copyright (c) 1992 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 #include <stdio.h>
12
13 #ifdef MSDOS
14 #include <fcntl.h>
15 #endif
16
17 #include "color.h"
18
19 #include "resolu.h"
20
21 int order; /* input orientation */
22 int xres, yres; /* resolution (scanlen, nscans) */
23
24 long *scanpos; /* scanline positions */
25
26 int fhoriz=0, fvert=0; /* flip flags */
27
28 int correctorder = 0; /* correcting orientation? */
29
30 FILE *fin; /* input file */
31
32 char *progname;
33
34 extern char *malloc();
35
36
37 int
38 neworder() /* figure out new order from old */
39 {
40 register int no;
41
42 if (correctorder)
43 return(order); /* just leave it */
44 if ((no = order) & YMAJOR) {
45 if (fhoriz) no ^= XDECR;
46 if (fvert) no ^= YDECR;
47 } else {
48 if (fhoriz) no ^= YDECR;
49 if (fvert) no ^= XDECR;
50 }
51 return(no);
52 }
53
54
55 main(argc, argv)
56 int argc;
57 char *argv[];
58 {
59 int i;
60 #ifdef MSDOS
61 extern int _fmode;
62 _fmode = O_BINARY;
63 setmode(fileno(stdout), O_BINARY);
64 #endif
65 progname = argv[0];
66
67 for (i = 1; i < argc; i++)
68 if (!strcmp(argv[i], "-h"))
69 fhoriz++;
70 else if (!strcmp(argv[i], "-v"))
71 fvert++;
72 else if (!strcmp(argv[i], "-c"))
73 correctorder++;
74 else
75 break;
76 if (i >= argc || argv[i][0] == '-') {
77 fprintf(stderr, "Usage: %s [-h][-v][-c] infile [outfile]\n",
78 progname);
79 exit(1);
80 }
81 if ((fin = fopen(argv[i], "r")) == NULL) {
82 fprintf(stderr, "%s: cannot open\n", argv[1]);
83 exit(1);
84 }
85 if (i < argc-1 && freopen(argv[i+1], "w", stdout) == NULL) {
86 fprintf(stderr, "%s: cannot open\n", argv[i+1]);
87 exit(1);
88 }
89 /* transfer header */
90 if (checkheader(fin, COLRFMT, stdout) < 0) {
91 fprintf(stderr, "%s: input not a Radiance picture\n",
92 progname);
93 exit(1);
94 }
95 /* add new header info. */
96 printargs(i, argv, stdout);
97 fputformat(COLRFMT, stdout);
98 putchar('\n');
99 /* get picture size */
100 if ((order = fgetresolu(&xres, &yres, fin)) < 0) {
101 fprintf(stderr, "%s: bad picture size\n", progname);
102 exit(1);
103 }
104 /* write new picture size */
105 fputresolu(neworder(), xres, yres, stdout);
106 /* goto end if vertical flip */
107 if (fvert)
108 scanfile();
109 flip(); /* flip the image */
110 exit(0);
111 }
112
113
114 memerr()
115 {
116 fprintf(stderr, "%s: out of memory\n", progname);
117 exit(1);
118 }
119
120
121 scanfile() /* scan to the end of file */
122 {
123 extern long ftell();
124 COLR *scanin;
125 int y;
126
127 if ((scanpos = (long *)malloc(yres*sizeof(long))) == NULL)
128 memerr();
129 if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
130 memerr();
131 for (y = yres-1; y > 0; y--) {
132 scanpos[y] = ftell(fin);
133 if (freadcolrs(scanin, xres, fin) < 0) {
134 fprintf(stderr, "%s: read error\n", progname);
135 exit(1);
136 }
137 }
138 scanpos[0] = ftell(fin);
139 free((char *)scanin);
140 }
141
142
143 flip() /* flip the picture */
144 {
145 COLR *scanin, *scanout;
146 int y;
147 register int x;
148
149 if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
150 memerr();
151 if (fhoriz) {
152 if ((scanout = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
153 memerr();
154 } else
155 scanout = scanin;
156 for (y = yres-1; y >= 0; y--) {
157 if (fvert && fseek(fin, scanpos[yres-1-y], 0) == EOF) {
158 fprintf(stderr, "%s: seek error\n", progname);
159 exit(1);
160 }
161 if (freadcolrs(scanin, xres, fin) < 0) {
162 fprintf(stderr, "%s: read error\n", progname);
163 exit(1);
164 }
165 if (fhoriz)
166 for (x = 0; x < xres; x++)
167 copycolr(scanout[x], scanin[xres-1-x]);
168 if (fwritecolrs(scanout, xres, stdout) < 0) {
169 fprintf(stderr, "%s: write error\n", progname);
170 exit(1);
171 }
172 }
173 free((char *)scanin);
174 if (fhoriz)
175 free((char *)scanout);
176 }