ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/meta2tga.c
Revision: 1.1
Committed: Sat Feb 22 02:07:26 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
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 #ifdef UNIX
69 FILE *popen();
70 #endif
71 char comargs[200], command[300];
72
73 #ifdef CPM
74 fixargs("meta2tga", &argc, &argv);
75 #endif
76
77 fout = stdout;
78 progname = *argv++;
79 argc--;
80
81 condonly = FALSE;
82 #ifdef CPM
83 conditioned = TRUE;
84 #else
85 conditioned = FALSE;
86 #endif
87
88 while (argc && **argv == '-') {
89 switch (*(*argv+1)) {
90 #ifdef UNIX
91 case 'c':
92 condonly = TRUE;
93 break;
94 case 'r':
95 conditioned = TRUE;
96 break;
97 #endif
98 case 'm':
99 minwidth = atoi(*++argv);
100 argc--;
101 break;
102 case 'x':
103 dxsize = atoi(*++argv);
104 argc--;
105 break;
106 case 'y':
107 dysize = atoi(*++argv);
108 argc--;
109 break;
110 case 'o':
111 strcpy(outname, *++argv);
112 outtack = findtack(outname);
113 argc--;
114 break;
115 default:
116 error(WARNING, "unknown option");
117 break;
118 }
119 argv++;
120 argc--;
121 }
122
123 if (conditioned) {
124 if (argc)
125 while (argc) {
126 fp = efopen(*argv, "r");
127 plot(fp);
128 fclose(fp);
129 argv++;
130 argc--;
131 }
132 else
133 plot(stdin);
134 if (lineno)
135 nextpage();
136 } else {
137 comargs[0] = '\0';
138 while (argc) {
139 strcat(comargs, " ");
140 strcat(comargs, *argv);
141 argv++;
142 argc--;
143 }
144 sprintf(command, XCOM, comargs);
145 #ifdef UNIX
146 if (condonly)
147 return(system(command));
148 else {
149 if ((fp = popen(command, "r")) == NULL)
150 error(SYSTEM, "cannot execute input filter");
151 plot(fp);
152 pclose(fp);
153 if (lineno)
154 nextpage();
155 }
156 #endif
157 }
158
159 return(0);
160 }
161
162
163
164
165
166
167 thispage() /* rewind current file */
168 {
169 if (lineno)
170 error(USER, "cannot restart page in thispage");
171 }
172
173
174
175 initfile() /* initialize this file */
176 {
177 static int filenum = 0;
178 static unsigned char cmap[24] = {255,255,255, 255,152,0, 0,188,0, 0,0,255,
179 179,179,0, 255,0,255, 0,200,200, 0,0,0};
180 struct hdStruct thead;
181 register int i;
182
183 if (outtack != NULL) {
184 sprintf(outtack, "%d.tga", ++filenum);
185 fout = efopen(outname, "w");
186 }
187 if (fout == NULL)
188 error(USER, "no output file");
189 thead.mapType = CM_HASMAP;
190 thead.dataType = IM_CCMAP;
191 thead.mapOrig = 0;
192 thead.mapLength = 256;
193 thead.CMapBits = 24;
194 thead.XOffset = 0;
195 thead.YOffset = 0;
196 thead.x = dxsize;
197 thead.y = dysize;
198 thead.dataBits = 8;
199 thead.imType = 0;
200 putthead(&thead, NULL, fout);
201 for (i = 0; i < 8*3; i++)
202 putc(cmap[i], fout);
203 while (i++ < 256*3)
204 putc(0, fout);
205 }
206
207
208
209
210 nextpage() /* advance to next page */
211
212 {
213
214 if (lineno == 0)
215 return;
216 if (fout != NULL) {
217 while (lineno < dysize) {
218 nextblock();
219 outputblock();
220 }
221 fclose(fout);
222 fout = NULL;
223 }
224 lineno = 0;
225
226 }
227
228
229
230 #define MINRUN 4
231
232
233 printblock() /* output scanline block to file */
234
235 {
236 int i, c2;
237 register unsigned char *scanline;
238 register int j, beg, cnt;
239
240 if (lineno == 0)
241 initfile();
242 for (i = outblock.ybot; i <= outblock.ytop && i < dysize; i++) {
243 scanline = outblock.cols[i-outblock.ybot];
244 for (j = outblock.xleft; j <= outblock.xright; j += cnt) {
245 for (beg = j; beg <= outblock.xright; beg += cnt) {
246 for (cnt = 1; cnt < 128 && beg+cnt <= outblock.xright &&
247 scanline[beg+cnt] == scanline[beg]; cnt++)
248 ;
249 if (cnt >= MINRUN)
250 break; /* long enough */
251 }
252 while (j < beg) { /* write out non-run */
253 if ((c2 = beg-j) > 128) c2 = 128;
254 putc(c2-1, fout);
255 while (c2--)
256 putc(scanline[j++], fout);
257 }
258 if (cnt >= MINRUN) { /* write out run */
259 putc(127+cnt, fout);
260 putc(scanline[beg], fout);
261 } else
262 cnt = 0;
263 }
264 lineno++;
265 }
266
267 }
268
269
270 putint2(i, fp) /* put a 2-byte positive integer */
271 register int i;
272 register FILE *fp;
273 {
274 putc(i&0xff, fp);
275 putc(i>>8&0xff, fp);
276 }
277
278
279 putthead(hp, ip, fp) /* write header to output */
280 struct hdStruct *hp;
281 char *ip;
282 register FILE *fp;
283 {
284 if (ip != NULL)
285 putc(strlen(ip), fp);
286 else
287 putc(0, fp);
288 putc(hp->mapType, fp);
289 putc(hp->dataType, fp);
290 putint2(hp->mapOrig, fp);
291 putint2(hp->mapLength, fp);
292 putc(hp->CMapBits, fp);
293 putint2(hp->XOffset, fp);
294 putint2(hp->YOffset, fp);
295 putint2(hp->x, fp);
296 putint2(hp->y, fp);
297 putc(hp->dataBits, fp);
298 putc(hp->imType, fp);
299
300 if (ip != NULL)
301 fputs(ip, fp);
302
303 return(ferror(fp) ? -1 : 0);
304 }