ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/implot.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

# User Rev Content
1 greg 1.1 #ifndef lint
2     static const char RCSid[] = "$Id$";
3     #endif
4     /*
5     * Impress plotting functions
6     *
7     * 1/2/86
8     */
9    
10    
11     #include "meta.h"
12    
13     #include "plot.h"
14    
15     #include "imPfuncs.h"
16    
17     #include "imPcodes.h"
18    
19     #include <ctype.h>
20    
21    
22     #define mapx(x) CONV(x,dxsize)
23     #define mapy(y) CONV(y,dysize)
24    
25     #define DPI 296 /* dots per inch for imagen */
26    
27     #define TexFamily 90 /* family for texture glyphs */
28    
29     /* operation codes for graphics */
30     #define whiteOp 0
31     #define shadeOp 3
32     #define orOp 7
33     #define blackOp 15
34    
35     /* imagen resident fonts */
36     static struct {
37     char *name; /* font name */
38     int iwspace; /* interword spacing */
39     short loaded; /* boolean true if font loaded */
40     } font[] = {
41     {"cour07", 21, FALSE},
42     {"cour08", 24, FALSE},
43     {"cour10", 30, FALSE},
44     {"cour12", 36, FALSE},
45     {"cour14", 42, FALSE},
46     {"zurm20", 60, FALSE}
47     };
48    
49     /* map from our matrix string types */
50     static int fontmap[16] = {3,4,4,5,2,4,4,5,1,2,2,3,0,2,2,3};
51    
52     int dxsize, dysize; /* page size */
53    
54    
55    
56     imInit() /* initialize imagen */
57     {
58    
59     imout = stdout;
60    
61     fputs("@document(language imPress)", imout);
62     fputs("@document(pagereversal off)", imout);
63    
64     imSetPum(0); /* new path deletes old one */
65     dxsize = dysize = 8 * DPI; /* square on 8.5 X 11 in. paper */
66     imSetAbsH(DPI/4); /* .25 in. on left and right */
67     imSetAbsV(dysize);
68     imSetHVSystem(3, 3, 4); /* conventional orientation */
69    
70     }
71    
72    
73    
74     printstr(p) /* output a string */
75    
76     register PRIMITIVE *p;
77    
78     {
79     static int curfont = -1;
80     int fn;
81     register char *cp;
82    
83     fn = fontmap[(p->arg0 >> 2) & 017]; /* get font number */
84     /* set font */
85     if (fn != curfont) {
86     imSetFamily(fn);
87     if (!font[fn].loaded) {
88     imCreateFamilyTable(fn, 1, 0, font[fn].name);
89     font[fn].loaded = TRUE;
90     }
91     imSetSp(font[fn].iwspace);
92     curfont = fn;
93     }
94    
95     imSetAbsH(mapx(p->xy[XMN])); /* set page position */
96     imSetAbsV(mapy(p->xy[YMN]));
97    
98     for (cp = p->args; *cp; cp++) /* write out the string */
99     if (isspace(*cp))
100     imSp();
101     else
102     im_putbyte(*cp);
103    
104     }
105    
106    
107    
108    
109    
110     plotlseg(p) /* plot a line segment */
111    
112     register PRIMITIVE *p;
113    
114     {
115     int x1, x2, y1, y2;
116     short pp;
117    
118     pp = (p->arg0 >> 4) & 03;
119     if (p->arg0 & 0100 && pp != 0)
120     pp += 03;
121     settex(pp);
122    
123     setpen((p->arg0 >> 2) & 03);
124    
125     x1 = mapx(p->xy[XMN]);
126     x2 = mapx(p->xy[XMX]);
127    
128     if (p->arg0 & 0100) {
129     y1 = mapy(p->xy[YMX]);
130     y2 = mapy(p->xy[YMN]);
131     } else {
132     y1 = mapy(p->xy[YMN]);
133     y2 = mapy(p->xy[YMX]);
134     }
135    
136     imCreatePath(2, x1, y1, x2, y2);
137     imDrawPath(orOp);
138    
139     }
140    
141    
142    
143    
144     setfill(a0) /* set filling mode */
145    
146     register int a0;
147    
148     {
149    
150     settex(pati[(a0 >> 2) & 03]);
151    
152     }
153    
154    
155    
156     setpen(ps) /* set pen size to ps */
157    
158     register int ps;
159    
160     {
161     static int curpsiz = -1; /* current pen size */
162    
163     if (ps == curpsiz)
164     return;
165    
166     curpsiz = ps;
167     ps = WIDTH(ps);
168     ps = CONV(ps, dxsize);
169     if (ps < 2)
170     ps = 2;
171     else if (ps > 20)
172     ps = 20;
173     imSetPen(ps);
174    
175     }
176    
177    
178    
179     settex(pp) /* set texture pattern to pp */
180    
181     int pp;
182    
183     {
184     static int curtex = -1; /* current texture */
185     static short ploaded[NPATS]; /* booleans for loaded patterns */
186     char span[4];
187     int i, k;
188     register int j;
189    
190     if (pp == curtex) /* already set */
191     return;
192    
193     if (pp == 0) { /* all black */
194     imSetTexture(0, 0); /* special case */
195     curtex = 0;
196     return;
197     }
198    
199     if (pp >= NPATS || !ploaded[pp]) { /* download texture glyph */
200     im_77(imP_BGLY, TexFamily, pp); /* family and member */
201     im_putword(32); /* advance-width */
202     im_putword(32); /* width */
203     im_putword(0); /* left-offset */
204     im_putword(32); /* height */
205     im_putword(0); /* top-offset */
206     for (i = PATSIZE-1; i >= 0; i--) {
207     for (j = 0; j < 4; j++)
208     span[j] = 0;
209     for (j = 0; j < 32; j++)
210     span[j>>3] |= ((pattern[pp][i>>3][j/(32/PATSIZE)]
211     >> (i&07)) & 01) << (7-(j&07));
212     for (k = 0; k < 32/PATSIZE; k++)
213     for (j = 0; j < 4; j++)
214     im_putbyte(span[j]);
215     }
216     if (pp < NPATS)
217     ploaded[pp]++;
218     }
219     imSetTexture(TexFamily, pp);
220     curtex = pp;
221    
222     }
223    
224    
225    
226     fillrect(p) /* fill a rectangle */
227    
228     register PRIMITIVE *p;
229    
230     {
231     int left, right, top, bottom;
232    
233     left = mapx(p->xy[XMN]);
234     right = mapx(p->xy[XMX]);
235     top = mapy(p->xy[YMX]);
236     bottom = mapy(p->xy[YMN]);
237    
238     setfill(p->arg0);
239     imCreatePath(4, left, bottom, right, bottom, right, top, left, top);
240     imFillPath(orOp);
241    
242     }
243    
244    
245    
246     filltri(p) /* fill a triangle */
247    
248     register PRIMITIVE *p;
249    
250     {
251     int left, right, top, bottom;
252    
253     left = mapx(p->xy[XMN]);
254     right = mapx(p->xy[XMX]);
255     top = mapy(p->xy[YMX]);
256     bottom = mapy(p->xy[YMN]);
257    
258     setfill(p->arg0);
259    
260     switch (p->arg0 & 060) {
261     case 0: /* right (& down) */
262     imCreatePath(3, left, bottom, right, bottom, right, top);
263     break;
264     case 020: /* up */
265     imCreatePath(3, right, bottom, right, top, left, top);
266     break;
267     case 040: /* left */
268     imCreatePath(3, right, top, left, top, left, bottom);
269     break;
270     case 060: /* down */
271     imCreatePath(3, left, top, left, bottom, right, bottom);
272     break;
273     }
274    
275     imFillPath(orOp);
276    
277     }
278    
279    
280    
281    
282     xform(xp, yp, p) /* transform a point according to p */
283    
284     register int *xp, *yp;
285     register PRIMITIVE *p;
286    
287     {
288     int x, y;
289    
290     switch (p->arg0 & 060) {
291     case 0: /* right */
292     x = *xp;
293     y = *yp;
294     break;
295     case 020: /* up */
296     x = (XYSIZE-1) - *yp;
297     y = *xp;
298     break;
299     case 040: /* left */
300     x = (XYSIZE-1) - *xp;
301     y = (XYSIZE-1) - *yp;
302     break;
303     case 060: /* down */
304     x = *yp;
305     y = (XYSIZE-1) - *xp;
306     break;
307     }
308    
309     *xp = CONV(x, p->xy[XMX] - p->xy[XMN]) + p->xy[XMN];
310     *yp = CONV(y, p->xy[YMX] - p->xy[YMN]) + p->xy[YMN];
311    
312     }
313    
314    
315    
316     fillpoly(p) /* fill a polygon */
317    
318     register PRIMITIVE *p;
319    
320     {
321     int points[128];
322     register int *pp;
323     char *nextscan();
324     register char *s;
325    
326     pp = points;
327    
328     if ((s = nextscan(nextscan(p->args, "%d", pp), "%d", pp+1)) == NULL)
329     error(USER, "illegal polygon spec in fillpoly");
330    
331     xform(pp, pp+1, p);
332     pp[0] = mapx(pp[0]); pp[1] = mapy(pp[1]);
333     pp += 2;
334    
335     while ((s = nextscan(nextscan(s, "%d", pp), "%d", pp+1)) != NULL) {
336     xform(pp, pp+1, p);
337     pp[0] = mapx(pp[0]); pp[1] = mapy(pp[1]);
338     pp += 2;
339     }
340     pp[0] = points[0]; pp[1] = points[1];
341     pp += 2;
342    
343     settex(p->arg0 & 077);
344     imCreatePathV((pp-points)/2, points);
345     imFillPath(orOp);
346    
347     if (p->arg0 & 0100) { /* draw border */
348     settex(0);
349     setpen(0);
350     imDrawPath(orOp);
351     }
352    
353     }