ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/metacalls.c
Revision: 1.2
Committed: Sun Jun 8 12:03:10 2003 UTC (20 years, 10 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 1.1: +83 -51 lines
Log Message:
Reduced compile warnings/errors on Windows.

File Contents

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