ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/metacalls.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 * metacalls.c - functional interface to metafile.
6 *
7 * 2/24/86
8 */
9
10 #include "meta.h"
11
12
13 #define RIGHT 0
14 #define UP 1
15 #define LEFT 2
16 #define DOWN 3
17
18 #define pflush() if (inpoly) closepoly()
19
20 #define putdec(v) if (v) decival(v); else *cap++ = '0';
21
22
23 static int curx = 0;
24 static int cury = 0;
25 static int cura0 = 0;
26 static int inpoly = FALSE;
27 static char curargs[MAXARGS] = "";
28 static char *cap;
29
30
31 mendpage() /* end of page */
32 {
33 pflush();
34 pglob(PEOP, 0200, NULL);
35 }
36
37
38 mdone() /* end of graphics metafile */
39 {
40 pflush();
41 pglob(PEOF, 0200, NULL);
42 }
43
44
45 minclude(fname) /* include a file */
46 char *fname;
47 {
48 pflush();
49 pglob(PINCL, 1, fname);
50 }
51
52
53 msetpat(pn, pat) /* set a pattern */
54 int pn;
55 char *pat;
56 {
57 pflush();
58 pglob(PSET, pn+4, pat);
59 }
60
61
62 mopenseg(sname) /* open a segment */
63 char *sname;
64 {
65 pflush();
66 pglob(POPEN, 0, sname);
67 }
68
69
70 mcloseseg() /* close current segment */
71 {
72 pflush();
73 pglob(PCLOSE, 0200, NULL);
74 }
75
76
77 mline(x, y, type, thick, color) /* start a line */
78 int x, y;
79 int type, thick, color;
80 {
81 pflush();
82 cura0 = (type<<4 & 060) | (thick<<2 & 014) | (color & 03);
83 curx = x;
84 cury = y;
85 }
86
87
88 mrectangle(xmin, ymin, xmax, ymax, pat, color) /* fill a rectangle */
89 int xmin, ymin, xmax, ymax;
90 int pat, color;
91 {
92 pflush();
93 cura0 = (pat<<2 & 014) | (color & 03);
94 pprim(PRFILL, cura0, xmin, ymin, xmax, ymax, NULL);
95 }
96
97
98 mtriangle(xmin, ymin, xmax, ymax, d, pat, color) /* fill a triangle */
99 int xmin, ymin, xmax, ymax;
100 int d, pat, color;
101 {
102 pflush();
103 cura0 = (let_dir(d)<<4 & 060) | (pat<<2 & 014) | (color & 03);
104 pprim(PTFILL, cura0, xmin, ymin, xmax, ymax, NULL);
105 }
106
107
108 mpoly(x, y, border, pat, color) /* start a polygon */
109 int x, y;
110 int border, pat, color;
111 {
112 pflush();
113 cura0 = (border<<6 & 0100) | (pat<<2 & 014) | (color & 03);
114 cap = curargs;
115 inpoly = TRUE;
116 putdec(x);
117 *cap++ = ' ';
118 putdec(y);
119 }
120
121
122 mtext(x, y, s, cpi, color) /* matrix string */
123 int x, y;
124 char *s;
125 int cpi;
126 int color;
127 {
128 pflush();
129 cura0 = (color & 03);
130 if (cpi < 10) {
131 cura0 += 04;
132 cpi *= 2;
133 }
134 if (cpi > 11)
135 cura0 += 020;
136 if (cpi > 14)
137 cura0 += 020;
138 if (cpi > 18)
139 cura0 += 020;
140 pprim(PMSTR, cura0, x, y, x, y, s);
141 }
142
143
144 mvstr(xmin, ymin, xmax, ymax, s, d, thick, color) /* vector string */
145 int xmin, ymin, xmax, ymax;
146 char *s;
147 int d, thick, color;
148 {
149 pflush();
150 cura0 = (let_dir(d)<<4 & 060) | (thick<<2 & 014) | (color & 03);
151 pprim(PVSTR, cura0, xmin, ymin, xmax, ymax, s);
152 }
153
154
155 msegment(xmin, ymin, xmax, ymax, sname, d, thick, color) /* segment */
156 int xmin, ymin, xmax, ymax;
157 char *sname;
158 int d, thick, color;
159 {
160 pflush();
161 cura0 = (let_dir(d)<<4 & 060) | (thick<<2 & 014) | (color & 03);
162 pprim(PSEG, cura0, xmin, ymin, xmax, ymax, sname);
163 }
164
165
166 mdraw(x, y) /* draw to next point */
167 int x, y;
168 {
169 if (inpoly) {
170 polyval(x, y);
171 } else if (x != curx || y != cury) {
172 plseg(cura0, curx, cury, x, y);
173 curx = x;
174 cury = y;
175 }
176 }
177
178
179 static
180 decival(v) /* add value to polygon */
181 register int v;
182 {
183 if (!v)
184 return;
185 decival(v/10);
186 *cap++ = v%10 + '0';
187 }
188
189
190 static
191 polyval(x, y) /* add vertex to a polygon */
192 register int x, y;
193 {
194 *cap++ = ' ';
195 putdec(x);
196 *cap++ = ' ';
197 putdec(y);
198 }
199
200
201 static
202 closepoly() /* close current polygon */
203 {
204 *cap = '\0';
205 pprim(PPFILL, cura0, 0, 0, XYSIZE-1, XYSIZE-1, curargs);
206 inpoly = FALSE;
207 }
208
209
210 static int
211 let_dir(c) /* convert letter to corresponding direction */
212 register int c;
213 {
214 switch (c) {
215 case 'R':
216 case 'r':
217 return(RIGHT);
218 case 'U':
219 case 'u':
220 return(UP);
221 case 'L':
222 case 'l':
223 return(LEFT);
224 case 'D':
225 case 'd':
226 return(DOWN);
227 }
228 return(0);
229 }