ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/plotin.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 plot(5) files to metafiles
6 *
7 * cc -o plotin plotin.c primout.o mfio.o syscalls.o misc.o -lm
8 *
9 * 5/20/85
10 */
11
12 #include "meta.h"
13
14
15 #define getsi(f, m) ICONV(geti(f)-(m), size)
16
17
18
19 char *progname;
20
21 static int xmin = 0, ymin = 0, /* current space settings */
22 size = XYSIZE;
23
24 static int curx = -1, /* current position */
25 cury = -1;
26
27 static short curmod = 0; /* current line drawing mode */
28
29
30
31 main(argc, argv)
32
33 int argc;
34 char **argv;
35
36 {
37 FILE *fp;
38
39 progname = *argv++;
40 argc--;
41
42 while (argc && **argv == '-') {
43 switch (*(*argv+1)) {
44 default:
45 error(WARNING, "unknown option");
46 break;
47 }
48 argv++;
49 argc--;
50 }
51
52 if (argc)
53 while (argc) {
54 fp = efopen(*argv, "r");
55 convert(fp);
56 fclose(fp);
57 argv++;
58 argc--;
59 }
60 else
61 convert(stdin);
62
63 pglob(PEOF, 0200, NULL);
64
65 return(0);
66 }
67
68
69
70
71
72 convert(infp) /* convert to meta-file */
73
74 FILE *infp;
75
76 {
77 char *fgets(), sbuf[BUFSIZ];
78 int command;
79 int a1, a2, a3, a4, a5, a6;
80
81 while ((command = getc(infp)) != EOF)
82 switch (command) {
83 case 'm':
84 a1 = getsi(infp, xmin);
85 a2 = getsi(infp, ymin);
86 move(a1, a2);
87 break;
88 case 'n':
89 a1 = getsi(infp, xmin);
90 a2 = getsi(infp, ymin);
91 cont(a1, a2);
92 break;
93 case 'p':
94 a1 = getsi(infp, xmin);
95 a2 = getsi(infp, ymin);
96 point(a1, a2);
97 break;
98 case 'l':
99 a1 = getsi(infp, xmin);
100 a2 = getsi(infp, ymin);
101 a3 = getsi(infp, xmin);
102 a4 = getsi(infp, ymin);
103 line(a1, a2, a3, a4);
104 break;
105 case 't':
106 fgets(sbuf, sizeof(sbuf), infp);
107 sbuf[strlen(sbuf)-1] = '\0';
108 label(sbuf);
109 break;
110 case 'a':
111 a1 = getsi(infp, xmin);
112 a2 = getsi(infp, ymin);
113 a3 = getsi(infp, xmin);
114 a4 = getsi(infp, ymin);
115 a5 = getsi(infp, xmin);
116 a6 = getsi(infp, ymin);
117 arc(a1, a2, a3, a4, a5, a6);
118 break;
119 case 'c':
120 a1 = getsi(infp, xmin);
121 a2 = getsi(infp, ymin);
122 a3 = getsi(infp, 0);
123 circle(a1, a2, a3);
124 break;
125 case 'e':
126 erase();
127 break;
128 case 'f':
129 fgets(sbuf, sizeof(sbuf), infp);
130 linemod(sbuf);
131 break;
132 case 's':
133 a1 = geti(infp);
134 a2 = geti(infp);
135 a3 = geti(infp);
136 a4 = geti(infp);
137 space(a1, a2, a3, a4);
138 break;
139 default:
140 error(USER, "unknown command in convert");
141 break;
142 }
143 }
144
145
146
147
148 int
149 geti(fp) /* get two-byte integer from file */
150
151 register FILE *fp;
152
153 {
154 register int i;
155
156 i = getc(fp);
157 i |= getc(fp) << 8;
158 if (i & 0100000)
159 i |= ~0177777; /* manual sign extend */
160 if (feof(fp))
161 error(USER, "unexpected end of file in geti");
162
163 return(i);
164 }
165
166
167
168
169 move(x, y) /* move to new position */
170
171 register int x, y;
172
173 {
174
175 curx = x;
176 cury = y;
177
178 }
179
180
181
182
183 cont(x, y) /* draw line to point */
184
185 register int x, y;
186
187 {
188
189 plseg(curmod, curx, cury, x, y);
190 curx = x;
191 cury = y;
192
193 }
194
195
196
197 point(x, y) /* draw a point */
198
199 register int x, y;
200
201 {
202
203 plseg(0, x, y, x, y);
204 curx = x;
205 cury = y;
206
207 }
208
209
210
211
212 line(x0, y0, x1, y1) /* draw a line segment */
213
214 int x0, y0, x1, y1;
215
216 {
217
218 move(x0, y0);
219 cont(x1, y1);
220
221 }
222
223
224
225 label(s) /* print a label */
226
227 register char *s;
228
229 {
230
231 pprim(PMSTR, 0, curx, cury, curx, cury, s);
232
233 }
234
235
236
237
238 static int del = 100;
239 static step(d){
240 del = d;
241 }
242 arc(x,y,x0,y0,x1,y1){
243 double pc;
244 double sqrt();
245 int flg,m,xc,yc,xs,ys,qs,qf;
246 float dx,dy,r;
247 char use;
248 dx = x-x0;
249 dy = y-y0;
250 r = dx*dx+dy*dy;
251 pc = r;
252 pc = sqrt(pc);
253 flg = pc/4;
254 if(flg == 0)step(1);
255 else if(flg < del)step(flg);
256 xc = xs = x0;
257 yc = ys = y0;
258 move(xs,ys);
259 if(x0 == x1 && y0 == y1)flg=0;
260 else flg=1;
261 qs = quadr(x,y,x0,y0);
262 qf = quadr(x,y,x1,y1);
263 if(abs(x-x1) < abs(y-y1)){
264 use = 'x';
265 if(qs == 2 || qs ==3)m = -1;
266 else m=1;
267 }
268 else {
269 use = 'y';
270 if(qs > 2)m= -1;
271 else m= 1;
272 }
273 while(1){
274 switch(use){
275 case 'x':
276 if(qs == 2 || qs == 3)yc -= del;
277 else yc += del;
278 dy = yc-y;
279 pc = r-dy*dy;
280 xc = m*sqrt(pc)+x;
281 if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
282 (y < ys && y >= yc) || ( y > ys && y <= yc) )
283 {
284 if(++qs > 4)qs=1;
285 if(qs == 2 || qs == 3)m= -1;
286 else m=1;
287 flg=1;
288 }
289 cont(xc,yc);
290 xs = xc;
291 ys = yc;
292 if(qs == qf && flg == 1)
293 switch(qf){
294 case 3:
295 case 4:
296 if(xs >= x1)return;
297 continue;
298 case 1:
299 case 2:
300 if(xs <= x1)return;
301 }
302 continue;
303 case 'y':
304 if(qs > 2)xc += del;
305 else xc -= del;
306 dx = xc-x;
307 pc = r-dx*dx;
308 yc = m*sqrt(pc)+y;
309 if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
310 (y < ys && y >= yc) || (y > ys && y <= yc) )
311 {
312 if(++qs > 4)qs=1;
313 if(qs > 2)m = -1;
314 else m = 1;
315 flg=1;
316 }
317 cont(xc,yc);
318 xs = xc;
319 ys = yc;
320 if(qs == qf && flg == 1)
321 switch(qs){
322 case 1:
323 case 4:
324 if(ys >= y1)return;
325 continue;
326 case 2:
327 case 3:
328 if(ys <= y1)return;
329 }
330 }
331 }
332 }
333 quadr(x,y,xp,yp){
334 if(x < xp)
335 if(y <= yp)return(1);
336 else return(4);
337 else if(x > xp)
338 if(y < yp)return(2);
339 else return(3);
340 else if(y < yp)return(2);
341 else return(4);
342 }
343
344
345
346 circle(x,y,r){
347 arc(x,y,x+r,y,x+r,y);
348 }
349
350
351
352
353 erase() /* erase plot */
354
355 {
356
357 pglob(PEOP, 0200, NULL);
358
359 }
360
361
362
363
364
365
366 linemod(s) /* set line mode according to s */
367
368 char s[];
369
370 {
371
372 switch (s[2]) {
373 case 'l': /* solid */
374 curmod = 0;
375 break;
376 case 't': /* dotted */
377 curmod = 1;
378 break;
379 case 'n': /* long dashed */
380 curmod = 2;
381 break;
382 case 'o': /* short dashed (dot dashed) */
383 curmod = 3;
384 break;
385 default:
386 error(WARNING, "unknown line mode in linemod");
387 break;
388 }
389
390 }
391
392
393
394
395 space(xmn, ymn, xmx, ymx) /* change space */
396
397 int xmn, ymn, xmx, ymx;
398
399 {
400
401 if (xmn >= xmx || ymn >= ymx)
402 error(USER, "illegal space specification in space");
403
404 xmin = xmn;
405 ymin = ymn;
406 size = min(xmx-xmn, ymx-ymn);
407
408 }