ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/meta2tga.c
Revision: 1.4
Committed: Mon Oct 27 10:28:59 2003 UTC (20 years, 6 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 1.3: +7 -17 lines
Log Message:
Various compatibility fixes.

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 schorsch 1.4 static const char RCSid[] = "$Id: meta2tga.c,v 1.3 2003/09/16 06:32:21 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * Program to convert meta-files to Targa 8-bit color-mapped format
6     */
7    
8 schorsch 1.4 #include "copyright.h"
9 greg 1.1
10 schorsch 1.4 #include "rtprocess.h"
11 greg 1.1 #include "meta.h"
12     #include "plot.h"
13     #include "rast.h"
14     #include "targa.h"
15    
16 schorsch 1.4 #define MAXALLOC 5000
17     #define DXSIZE 400 /* default x resolution */
18     #define DYSIZE 400 /* default y resolution */
19     #define XCOM "pexpand +vOCImsp -DP %s | psort +y"
20 greg 1.1
21    
22     char *progname;
23    
24     SCANBLOCK outblock;
25    
26     int dxsize = DXSIZE, dysize = DYSIZE;
27    
28     int maxalloc = MAXALLOC;
29    
30     int ydown = 0;
31    
32     static char outname[64];
33     static char *outtack = NULL;
34    
35     static FILE *fout;
36    
37     static int lineno = 0;
38    
39     static short condonly = FALSE,
40     conditioned = FALSE;
41    
42     char *
43     findtack(s) /* find place to tack on suffix */
44     register char *s;
45     {
46     while (*s && *s != '.')
47     s++;
48     return(s);
49     }
50    
51    
52     main(argc, argv)
53    
54     int argc;
55     char **argv;
56    
57     {
58     FILE *fp;
59     char comargs[200], command[300];
60    
61     fout = stdout;
62     progname = *argv++;
63     argc--;
64    
65     condonly = FALSE;
66     conditioned = FALSE;
67    
68     while (argc && **argv == '-') {
69     switch (*(*argv+1)) {
70     case 'c':
71     condonly = TRUE;
72     break;
73     case 'r':
74     conditioned = TRUE;
75     break;
76     case 'm':
77     minwidth = atoi(*++argv);
78     argc--;
79     break;
80     case 'x':
81     dxsize = atoi(*++argv);
82     argc--;
83     break;
84     case 'y':
85     dysize = atoi(*++argv);
86     argc--;
87     break;
88     case 'o':
89     strcpy(outname, *++argv);
90     outtack = findtack(outname);
91     argc--;
92     break;
93     default:
94     error(WARNING, "unknown option");
95     break;
96     }
97     argv++;
98     argc--;
99     }
100    
101     if (conditioned) {
102     if (argc)
103     while (argc) {
104     fp = efopen(*argv, "r");
105     plot(fp);
106     fclose(fp);
107     argv++;
108     argc--;
109     }
110     else
111     plot(stdin);
112     if (lineno)
113     nextpage();
114     } else {
115     comargs[0] = '\0';
116     while (argc) {
117     strcat(comargs, " ");
118     strcat(comargs, *argv);
119     argv++;
120     argc--;
121     }
122     sprintf(command, XCOM, comargs);
123     if (condonly)
124     return(system(command));
125     else {
126     if ((fp = popen(command, "r")) == NULL)
127     error(SYSTEM, "cannot execute input filter");
128     plot(fp);
129     pclose(fp);
130     if (lineno)
131     nextpage();
132     }
133     }
134    
135     return(0);
136     }
137    
138    
139    
140    
141    
142    
143     thispage() /* rewind current file */
144     {
145     if (lineno)
146     error(USER, "cannot restart page in thispage");
147     }
148    
149    
150    
151     initfile() /* initialize this file */
152     {
153     static int filenum = 0;
154 greg 1.3 /*
155 greg 1.1 static unsigned char cmap[24] = {255,255,255, 255,152,0, 0,188,0, 0,0,255,
156     179,179,0, 255,0,255, 0,200,200, 0,0,0};
157 greg 1.3 */
158     static unsigned char cmap[24] = {0,0,0, 0,0,255, 0,188,0, 255,152,0,
159     0,200,200, 255,0,255, 179,179,0, 255,255,255};
160 greg 1.1 struct hdStruct thead;
161     register int i;
162    
163     if (outtack != NULL) {
164     sprintf(outtack, "%d.tga", ++filenum);
165     fout = efopen(outname, "w");
166     }
167     if (fout == NULL)
168     error(USER, "no output file");
169     thead.mapType = CM_HASMAP;
170     thead.dataType = IM_CCMAP;
171     thead.mapOrig = 0;
172     thead.mapLength = 256;
173     thead.CMapBits = 24;
174     thead.XOffset = 0;
175     thead.YOffset = 0;
176     thead.x = dxsize;
177     thead.y = dysize;
178     thead.dataBits = 8;
179     thead.imType = 0;
180     putthead(&thead, NULL, fout);
181     for (i = 0; i < 8*3; i++)
182     putc(cmap[i], fout);
183     while (i++ < 256*3)
184     putc(0, fout);
185     }
186    
187    
188    
189    
190     nextpage() /* advance to next page */
191    
192     {
193    
194     if (lineno == 0)
195     return;
196     if (fout != NULL) {
197     while (lineno < dysize) {
198     nextblock();
199     outputblock();
200     }
201     fclose(fout);
202     fout = NULL;
203     }
204     lineno = 0;
205    
206     }
207    
208    
209    
210     #define MINRUN 4
211    
212    
213     printblock() /* output scanline block to file */
214    
215     {
216     int i, c2;
217     register unsigned char *scanline;
218     register int j, beg, cnt;
219    
220     if (lineno == 0)
221     initfile();
222     for (i = outblock.ybot; i <= outblock.ytop && i < dysize; i++) {
223     scanline = outblock.cols[i-outblock.ybot];
224     for (j = outblock.xleft; j <= outblock.xright; j += cnt) {
225     for (beg = j; beg <= outblock.xright; beg += cnt) {
226     for (cnt = 1; cnt < 128 && beg+cnt <= outblock.xright &&
227     scanline[beg+cnt] == scanline[beg]; cnt++)
228     ;
229     if (cnt >= MINRUN)
230     break; /* long enough */
231     }
232     while (j < beg) { /* write out non-run */
233     if ((c2 = beg-j) > 128) c2 = 128;
234     putc(c2-1, fout);
235     while (c2--)
236     putc(scanline[j++], fout);
237     }
238     if (cnt >= MINRUN) { /* write out run */
239     putc(127+cnt, fout);
240     putc(scanline[beg], fout);
241     } else
242     cnt = 0;
243     }
244     lineno++;
245     }
246    
247     }
248    
249    
250     putint2(i, fp) /* put a 2-byte positive integer */
251     register int i;
252     register FILE *fp;
253     {
254     putc(i&0xff, fp);
255     putc(i>>8&0xff, fp);
256     }
257    
258    
259     putthead(hp, ip, fp) /* write header to output */
260     struct hdStruct *hp;
261     char *ip;
262     register FILE *fp;
263     {
264     if (ip != NULL)
265     putc(strlen(ip), fp);
266     else
267     putc(0, fp);
268     putc(hp->mapType, fp);
269     putc(hp->dataType, fp);
270     putint2(hp->mapOrig, fp);
271     putint2(hp->mapLength, fp);
272     putc(hp->CMapBits, fp);
273     putint2(hp->XOffset, fp);
274     putint2(hp->YOffset, fp);
275     putint2(hp->x, fp);
276     putint2(hp->y, fp);
277     putc(hp->dataBits, fp);
278     putc(hp->imType, fp);
279    
280     if (ip != NULL)
281     fputs(ip, fp);
282    
283     return(ferror(fp) ? -1 : 0);
284     }