ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_rgbe.c
(Generate patch)

Comparing ray/src/px/ra_rgbe.c (file contents):
Revision 2.3 by greg, Mon Sep 21 12:15:13 1992 UTC vs.
Revision 2.17 by schorsch, Sun Mar 28 20:33:14 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1992 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  program to convert from RADIANCE RLE to flat format
6   */
7  
8   #include  <stdio.h>
9 < #ifdef MSDOS
10 < #include  <fcntl.h>
11 < #endif
9 > #include  <math.h>
10 > #include  <time.h>
11 > #include  <string.h>
12  
13 + #include  "platform.h"
14 + #include  "rtprocess.h"
15   #include  "color.h"
16   #include  "resolu.h"
17  
18 < extern char  *malloc();
18 > #define dumpheader(fp)  fwrite(headlines, 1, headlen, fp)
19  
20   int  bradj = 0;                         /* brightness adjustment */
22
21   int  doflat = 1;                        /* produce flat file */
22 + int  force = 0;                         /* force file overwrite? */
23 + int  findframe = 0;                     /* find a specific frame? */
24 + int  frameno = 0;                       /* current frame number */
25 + int  fmterr = 0;                        /* got input format error */
26 + char  *headlines;                       /* current header info. */
27 + int  headlen;                           /* current header length */
28  
29   char  *progname;
30  
31 + static gethfunc addhline;
32 + static int transfer(char *ospec);
33 + static int loadheader(FILE *fp);
34  
35 < main(argc, argv)
36 < int  argc;
37 < char  *argv[];
35 >
36 > int
37 > main(int  argc, char  *argv[])
38   {
39 +        char    *ospec;
40          int  i;
41 < #ifdef MSDOS
34 <        extern int  _fmode;
35 <        _fmode = O_BINARY;
36 <        setmode(fileno(stdin), O_BINARY);
37 <        setmode(fileno(stdout), O_BINARY);
38 < #endif
41 >
42          progname = argv[0];
43  
44          for (i = 1; i < argc; i++)
# Line 49 | Line 52 | char  *argv[];
52                                          goto userr;
53                                  bradj = atoi(argv[++i]);
54                                  break;
55 +                        case 'n':
56 +                                findframe = atoi(argv[++i]);
57 +                                break;
58 +                        case 'f':
59 +                                force++;
60 +                                break;
61 +                        case '\0':
62 +                                goto gotfile;
63                          default:
64                                  goto userr;
65                          }
66                  else
67                          break;
68 <
68 > gotfile:
69          if (i < argc-2)
70                  goto userr;
71 <        if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) {
71 >        if (i <= argc-1 && strcmp(argv[i], "-") &&
72 >                        freopen(argv[i], "r", stdin) == NULL) {
73                  fprintf(stderr, "%s: can't open input \"%s\"\n",
74                                  progname, argv[i]);
75                  exit(1);
76          }
77 <        if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
78 <                fprintf(stderr, "can't open output \"%s\"\n",
79 <                                progname, argv[i+1]);
80 <                exit(1);
69 <        }
70 <        transfer();
77 >        SET_FILE_BINARY(stdin);
78 >        ospec = i==argc-2 ? argv[i+1] : (char *)NULL;
79 >        while (transfer(ospec))
80 >                ;
81          exit(0);
82   userr:
83 <        fprintf(stderr, "Usage: %s [-r][-e +/-stops] [input [output]]\n",
83 >        fprintf(stderr,
84 >        "Usage: %s [-r][-e +/-stops][-f][-n frame] [input [outspec]]\n",
85                          progname);
86          exit(1);
87   }
88  
89  
90 < quiterr(err)            /* print message and exit */
91 < char  *err;
90 > static int
91 > transfer(                       /* transfer a Radiance picture */
92 >        char    *ospec
93 > )
94   {
95 <        if (err != NULL) {
96 <                fprintf(stderr, "%s: %s\n", progname, err);
84 <                exit(1);
85 <        }
86 <        exit(0);
87 < }
88 <
89 <
90 < transfer()              /* transfer Radiance picture */
91 < {
92 <        extern double   pow();
95 >        char    oname[PATH_MAX];
96 >        FILE    *fp;
97          int     order;
98          int     xmax, ymax;
99          COLR    *scanin;
96        register int    x;
100          int     y;
101 <                                /* get header info. */
102 <        if (checkheader(stdin, COLRFMT, stdout) < 0 ||
103 <                        (order = fgetresolu(&xmax, &ymax, stdin)) < 0)
104 <                quiterr("bad picture format");
105 <        fputs(progname, stdout);
106 <        if (bradj)
104 <                printf(" -e %+d", bradj);
105 <        if (doflat)
106 <                fputs("\n", stdout);
107 <        else {
108 <                fputs(" -r\n", stdout);
109 <                fputformat(COLRFMT, stdout);
101 >                                        /* get header info. */
102 >        if (!(y = loadheader(stdin)))
103 >                return(0);
104 >        if (y < 0 || (order = fgetresolu(&xmax, &ymax, stdin)) < 0) {
105 >                fprintf(stderr, "%s: bad input format\n", progname);
106 >                exit(1);
107          }
108 +                                        /* did we pass the target frame? */
109 +        if (findframe && findframe < frameno)
110 +                return(0);
111 +                                        /* allocate scanline */
112 +        scanin = (COLR *)tempbuffer(xmax*sizeof(COLR));
113 +        if (scanin == NULL) {
114 +                perror(progname);
115 +                exit(1);
116 +        }
117 +                                        /* skip frame? */
118 +        if (findframe > frameno) {
119 +                for (y = ymax; y--; )
120 +                        if (freadcolrs(scanin, xmax, stdin) < 0) {
121 +                                fprintf(stderr,
122 +                                        "%s: error reading input picture\n",
123 +                                                progname);
124 +                                exit(1);
125 +                        }
126 +                return(1);
127 +        }
128 +                                        /* open output file/command */
129 +        if (ospec == NULL) {
130 +                strcpy(oname, "<stdout>");
131 +                fp = stdout;
132 +        } else {
133 +                sprintf(oname, ospec, frameno);
134 +                if (oname[0] == '!') {
135 +                        if ((fp = popen(oname+1, "w")) == NULL) {
136 +                                fprintf(stderr, "%s: cannot start \"%s\"\n",
137 +                                                progname, oname);
138 +                                exit(1);
139 +                        }
140 +                } else {
141 +                        if (!force && access(oname, 0) >= 0) {
142 +                                fprintf(stderr,
143 +                                        "%s: output file \"%s\" exists\n",
144 +                                                progname, oname);
145 +                                exit(1);
146 +                        }
147 +                        if ((fp = fopen(oname, "w")) == NULL) {
148 +                                fprintf(stderr, "%s: ", progname);
149 +                                perror(oname);
150 +                                exit(1);
151 +                        }
152 +                }
153 +        }
154 +        SET_FILE_BINARY(fp);
155 +        dumpheader(fp);                 /* put out header */
156 +        fputs(progname, fp);
157          if (bradj)
158 <                fputexpos(pow(2.0, (double)bradj), stdout);
159 <        fputs("\n", stdout);
160 <        fputresolu(order, xmax, ymax, stdout);
161 <                                                /* allocate scanline */
162 <        scanin = (COLR *)malloc(xmax*sizeof(COLR));
163 <        if (scanin == NULL)
164 <                quiterr("out of memory in transfer");
165 <                                                /* convert image */
166 <        for (y = ymax-1; y >= 0; y--) {
167 <                if (freadcolrs(scanin, xmax, stdin) < 0)
168 <                        quiterr("error reading input picture");
158 >                fprintf(fp, " -e %+d", bradj);
159 >        if (!doflat)
160 >                fputs(" -r", fp);
161 >        fputc('\n', fp);
162 >        if (bradj)
163 >                fputexpos(pow(2.0, (double)bradj), fp);
164 >        fputc('\n', fp);
165 >        fputresolu(order, xmax, ymax, fp);
166 >                                        /* transfer picture */
167 >        for (y = ymax; y--; ) {
168 >                if (freadcolrs(scanin, xmax, stdin) < 0) {
169 >                        fprintf(stderr, "%s: error reading input picture\n",
170 >                                        progname);
171 >                        exit(1);
172 >                }
173                  if (bradj)
174                          shiftcolrs(scanin, xmax, bradj);
175                  if (doflat)
176 <                        fwrite((char *)scanin, sizeof(COLR), xmax, stdout);
176 >                        fwrite((char *)scanin, sizeof(COLR), xmax, fp);
177                  else
178 <                        fwritecolrs(scanin, xmax, stdout);
179 <                if (ferror(stdout))
180 <                        quiterr("error writing rasterfile");
178 >                        fwritecolrs(scanin, xmax, fp);
179 >                if (ferror(fp)) {
180 >                        fprintf(stderr, "%s: error writing output to \"%s\"\n",
181 >                                        progname, oname);
182 >                        exit(1);
183 >                }
184          }
185 <                                                /* free scanline */
186 <        free((char *)scanin);
185 >                                        /* clean up */
186 >        if (oname[0] == '!')
187 >                pclose(fp);
188 >        else if (ospec != NULL)
189 >                fclose(fp);
190 >        return(1);
191 > }
192 >
193 >
194 > static int
195 > addhline(                       /* add a line to our info. header */
196 >        char    *s,
197 >        void    *p
198 > )
199 > {
200 >        char    fmt[32];
201 >        int     n;
202 >
203 >        if (formatval(fmt, s))
204 >                fmterr += !globmatch(PICFMT, fmt);
205 >        else if (!strncmp(s, "FRAME=", 6))
206 >                frameno = atoi(s+6);
207 >        n = strlen(s);
208 >        if (headlen)
209 >                headlines = (char *)realloc((void *)headlines, headlen+n+1);
210 >        else
211 >                headlines = (char *)malloc(n+1);
212 >        if (headlines == NULL) {
213 >                perror(progname);
214 >                exit(1);
215 >        }
216 >        strcpy(headlines+headlen, s);
217 >        headlen += n;
218 >        return(0);
219 > }
220 >
221 >
222 > static int
223 > loadheader(                     /* load an info. header into memory */
224 >        FILE    *fp
225 > )
226 > {
227 >        fmterr = 0; frameno = 0;
228 >        if (headlen) {                  /* free old header */
229 >                free(headlines);
230 >                headlen = 0;
231 >        }
232 >        if (getheader(fp, addhline, NULL) < 0)
233 >                return(0);
234 >        if (fmterr)
235 >                return(-1);
236 >        return(1);
237   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines