ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcwarp.c
Revision: 3.4
Committed: Sun Mar 28 20:33:14 2004 UTC (20 years, 1 month ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad3R6, rad3R6P1, rad3R8, rad3R9
Changes since 3.3: +18 -8 lines
Log Message:
Continued ANSIfication, and other fixes and clarifications.

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2 schorsch 3.4 static const char RCSid[] = "$Id: pcwarp.c,v 3.3 2003/02/22 02:07:27 greg Exp $";
3 greg 3.1 #endif
4     /*
5     * Warp colors in Radiance picture to correct for input/output changes.
6     */
7    
8     #include <stdio.h>
9 schorsch 3.4
10     #include "resolu.h"
11 greg 3.1 #include "color.h"
12     #include "warp3d.h"
13    
14     char *progname; /* global argv[0] */
15    
16 gwlarson 3.2 FILE *infp = NULL; /* input stream */
17 greg 3.1 int xres, yres; /* input picture resolution */
18    
19     WARP3D *cwarp; /* our warp map */
20     int iclip = CGAMUT_UPPER; /* input value gamut clipping */
21     int oclip = CGAMUT_LOWER; /* output value gamut clipping */
22    
23 schorsch 3.4 static void syserror(char *s);
24     static void picwarp(void);
25    
26 greg 3.1
27 schorsch 3.4 int
28     main(
29     int argc,
30     char *argv[]
31     )
32 greg 3.1 {
33     static char picfmt[LPICFMT+1] = PICFMT;
34     int cwflags = 0;
35     int rval;
36     int i;
37    
38     progname = argv[0];
39 gwlarson 3.2 infp = stdin;
40 greg 3.1 /* get options */
41     for (i = 1; i < argc && argv[i][0] == '-'; i++)
42     switch (argv[i][1]) {
43     case 'e':
44     cwflags = W3EXACT;
45     break;
46     case 'f':
47     cwflags = W3FAST;
48     break;
49     case 'i':
50     iclip = 0;
51     break;
52     case 'o':
53     oclip = CGAMUT;
54     break;
55     default:
56     goto userr;
57     }
58     /* load warp map */
59     if (i >= argc)
60     goto userr;
61     if ((cwarp = load3dw(argv[i++], NULL)) == NULL)
62     syserror("load3dw");
63     set3dwfl(cwarp, cwflags);
64     /* open input and output pictures */
65     if (i < argc && (infp = fopen(argv[i], "r")) == NULL)
66     syserror(argv[i]);
67     if (i < argc-1 && freopen(argv[i+1], "w", stdout) == NULL)
68     syserror(argv[i+1]);
69     /* transfer header */
70     if ((rval = checkheader(infp, picfmt, stdout)) < 0) {
71     fprintf(stderr, "%s: input not a Radiance picture\n",
72     progname);
73     exit(1);
74     }
75     if (rval)
76     fputformat(picfmt, stdout);
77     /* add new header info. */
78     printargs(i, argv, stdout);
79     putchar('\n');
80     /* get picture size */
81     if ((rval = fgetresolu(&xres, &yres, infp)) < 0) {
82     fprintf(stderr, "%s: bad picture size\n", progname);
83     exit(1);
84     }
85     /* new picture size the same */
86     fputresolu(rval, xres, yres, stdout);
87     /* warp those colors! */
88     picwarp();
89     exit(0);
90     userr:
91     fprintf(stderr,
92     "Usage: %s [-i][-o][-e|-f] map.cwp [input.pic [output.pic]]\n",
93     progname);
94     exit(1);
95     }
96    
97    
98 schorsch 3.4 static void
99     syserror( /* print system error and exit */
100     char *s
101     )
102 greg 3.1 {
103     fprintf(stderr, "%s: ", progname);
104     perror(s);
105     exit(2);
106     }
107    
108    
109 schorsch 3.4 static void
110     picwarp(void) /* warp our picture scanlines */
111 greg 3.1 {
112     register COLOR *scan;
113     long ngamut = 0;
114     int rval;
115     int y;
116     register int x;
117    
118     scan = (COLOR *)malloc(xres*sizeof(COLOR));
119     if (scan == NULL)
120     syserror("picwarp");
121     for (y = 0; y < yres; y++) {
122     if (freadscan(scan, xres, infp) < 0) {
123     fprintf(stderr, "%s: error reading input picture\n",
124     progname);
125     exit(1);
126     }
127     for (x = 0; x < xres; x++) {
128     if (iclip)
129     clipgamut(scan[x], bright(scan[x]), iclip,
130     cblack, cwhite);
131     rval = warp3d(scan[x], scan[x], cwarp);
132     if (rval & W3ERROR)
133     syserror("warp3d");
134     if (rval & W3BADMAP) {
135     fprintf(stderr, "%s: singular color mapping\n",
136     progname);
137     exit(1);
138     }
139     if (rval & W3GAMUT)
140     ngamut++;
141     if (oclip)
142     clipgamut(scan[x], bright(scan[x]), oclip,
143     cblack, cwhite);
144     }
145     if (fwritescan(scan, xres, stdout) < 0) {
146     fprintf(stderr, "%s: error writing output picture\n",
147     progname);
148     exit(1);
149     }
150     }
151     if (ngamut >= (long)xres*yres/100)
152 schorsch 3.4 fprintf(stderr, "%s: warning - %ld%% of pixels out of gamut\n",
153 greg 3.1 progname, 100*ngamut/((long)xres*yres));
154 greg 3.3 free((void *)scan);
155 greg 3.1 }