ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/meta2tga.c
Revision: 1.3
Committed: Tue Sep 16 06:32:21 2003 UTC (20 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +5 -1 lines
Log Message:
Changed meta2tga so it outputs correct colors

File Contents

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