ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pr24.c
Revision: 1.6
Committed: Mon Apr 29 11:14:10 1991 UTC (33 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +17 -10 lines
Log Message:
added input compatibility with RT_FORMAT_RGB

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1990 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * program to convert between RADIANCE and 24-bit rasterfiles.
9     */
10    
11     #include <stdio.h>
12    
13     #include "rasterfile.h"
14    
15     #include "color.h"
16    
17     extern double atof(), pow();
18    
19     double gamma = 2.0; /* gamma correction */
20    
21     char *progname;
22    
23     int xmax, ymax;
24    
25    
26     main(argc, argv)
27     int argc;
28     char *argv[];
29     {
30     struct rasterfile head;
31     int reverse = 0;
32     int i;
33    
34     progname = argv[0];
35    
36     for (i = 1; i < argc; i++)
37     if (argv[i][0] == '-')
38     switch (argv[i][1]) {
39     case 'g':
40     gamma = atof(argv[++i]);
41     break;
42     case 'r':
43     reverse = !reverse;
44     break;
45     default:
46     goto userr;
47     }
48     else
49     break;
50    
51     if (i < argc-2)
52     goto userr;
53     if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) {
54     fprintf(stderr, "%s: can't open input \"%s\"\n",
55     progname, argv[i]);
56     exit(1);
57     }
58     if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
59     fprintf(stderr, "can't open output \"%s\"\n",
60     progname, argv[i+1]);
61     exit(1);
62     }
63 greg 1.3 setcolrgam(gamma);
64 greg 1.1 if (reverse) {
65     /* get header */
66     if (fread((char *)&head, sizeof(head), 1, stdin) != 1)
67     quiterr("missing header");
68     if (head.ras_magic != RAS_MAGIC)
69     quiterr("bad raster format");
70     xmax = head.ras_width;
71     ymax = head.ras_height;
72 greg 1.6 if ((head.ras_type != RT_STANDARD
73     && head.ras_type != RT_FORMAT_RGB)
74     || head.ras_maptype != RMT_NONE
75     || head.ras_depth != 24)
76 greg 1.1 quiterr("incompatible format");
77     /* put header */
78     printargs(i, argv, stdout);
79 greg 1.5 fputformat(COLRFMT, stdout);
80 greg 1.1 putchar('\n');
81     fputresolu(YMAJOR|YDECR, xmax, ymax, stdout);
82     /* convert file */
83 greg 1.6 pr2ra(head.ras_type);
84 greg 1.1 } else {
85 greg 1.5 /* get header info. */
86     if (checkheader(stdin, COLRFMT, NULL) < 0 ||
87     fgetresolu(&xmax, &ymax, stdin) != (YMAJOR|YDECR))
88     quiterr("bad picture format");
89 greg 1.1 /* write rasterfile header */
90     head.ras_magic = RAS_MAGIC;
91     head.ras_width = xmax;
92     head.ras_height = ymax;
93     head.ras_depth = 24;
94     head.ras_length = xmax*ymax*3;
95     head.ras_type = RT_STANDARD;
96     head.ras_maptype = RMT_NONE;
97     head.ras_maplength = 0;
98     fwrite((char *)&head, sizeof(head), 1, stdout);
99     /* convert file */
100     ra2pr();
101     }
102     exit(0);
103     userr:
104     fprintf(stderr, "Usage: %s [-r][-g gamma] [input [output]]\n",
105     progname);
106     exit(1);
107     }
108    
109    
110     quiterr(err) /* print message and exit */
111     char *err;
112     {
113     if (err != NULL) {
114     fprintf(stderr, "%s: %s\n", progname, err);
115     exit(1);
116     }
117     exit(0);
118     }
119    
120    
121 greg 1.6 pr2ra(rf) /* convert 24-bit scanlines to Radiance picture */
122     int rf;
123 greg 1.1 {
124 greg 1.3 COLR *scanout;
125 greg 1.1 register int x;
126     int y;
127     /* allocate scanline */
128 greg 1.3 scanout = (COLR *)malloc(xmax*sizeof(COLR));
129 greg 1.1 if (scanout == NULL)
130     quiterr("out of memory in pr2ra");
131     /* convert image */
132     for (y = ymax-1; y >= 0; y--) {
133 greg 1.6 for (x = 0; x < xmax; x++)
134     if (rf == RT_FORMAT_RGB) {
135     scanout[x][RED] = getc(stdin);
136     scanout[x][GRN] = getc(stdin);
137     scanout[x][BLU] = getc(stdin);
138     } else {
139     scanout[x][BLU] = getc(stdin);
140     scanout[x][GRN] = getc(stdin);
141     scanout[x][RED] = getc(stdin);
142     }
143 greg 1.3 if (feof(stdin) || ferror(stdin))
144     quiterr("error reading rasterfile");
145     gambs_colrs(scanout, xmax);
146     if (fwritecolrs(scanout, xmax, stdout) < 0)
147 greg 1.1 quiterr("error writing Radiance picture");
148     }
149     /* free scanline */
150     free((char *)scanout);
151     }
152    
153    
154     ra2pr() /* convert Radiance scanlines to 24-bit rasterfile */
155     {
156 greg 1.3 COLR *scanin;
157 greg 1.1 register int x;
158     int y;
159     /* allocate scanline */
160 greg 1.3 scanin = (COLR *)malloc(xmax*sizeof(COLR));
161 greg 1.1 if (scanin == NULL)
162     quiterr("out of memory in pr2ra");
163     /* convert image */
164     for (y = ymax-1; y >= 0; y--) {
165 greg 1.3 if (freadcolrs(scanin, xmax, stdin) < 0)
166 greg 1.1 quiterr("error reading Radiance picture");
167 greg 1.3 colrs_gambs(scanin, xmax);
168 greg 1.1 for (x = 0; x < xmax; x++) {
169 greg 1.4 putc(scanin[x][BLU], stdout);
170     putc(scanin[x][GRN], stdout);
171 greg 1.3 putc(scanin[x][RED], stdout);
172 greg 1.1 }
173     if (ferror(stdout))
174     quiterr("error writing rasterfile");
175     }
176     /* free scanline */
177     free((char *)scanin);
178     }