ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/x11plot.c
Revision: 1.2
Committed: Mon Nov 17 02:21:53 2003 UTC (20 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad3R6, rad3R6P1, rad3R8
Changes since 1.1: +20 -17 lines
Log Message:
Unix compile fixes for previous change

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 1.2 static const char RCSid[] = "$Id: x11plot.c,v 1.1 2003/02/22 02:07:26 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * X window plotting functions
6     *
7     * 2/26/86
8     */
9    
10    
11     #include "meta.h"
12    
13     #include "plot.h"
14    
15     #undef TRUE
16    
17     #undef FALSE
18    
19     #include <X11/Xlib.h>
20    
21    
22     #define BORWIDTH 5
23    
24     #define BlackPix BlackPixel(dpy,0 )
25     #define WhitePix WhitePixel(dpy,0 )
26    
27     #define mapx(x) CONV(x,dxsize)
28     #define mapy(y) CONV((XYSIZE-1)-(y),dysize)
29    
30     #define MAXVERT 128
31    
32     #define MAXCOLOR 65535
33    
34     /* X window fonts */
35     static struct {
36     char *name; /* font name */
37     Font id; /* font id */
38     } font[] = {
39     {"9x15", 0},
40     {"8x13", 0},
41     {"6x13", 0},
42     {"vtdwidth", 0},
43     {"accordbfx", 0}
44     };
45    
46     /* map to our matrix string types */
47     static int fontmap[16] = {0,3,0,3,1,3,1,3,2,4,2,4,2,4,2,4};
48    
49     #define LONG_DASHED_LIST_LENGTH 2
50     #define SHORT_DASHED_LIST_LENGTH 2
51     #define DOTTED_LIST_LENGTH 2
52    
53     int dash_list_length[] = {
54     0,
55     LONG_DASHED_LIST_LENGTH,
56     SHORT_DASHED_LIST_LENGTH,
57     DOTTED_LIST_LENGTH,
58     };
59    
60     unsigned char long_dashed[LONG_DASHED_LIST_LENGTH] = {4,7};
61     unsigned char short_dashed[SHORT_DASHED_LIST_LENGTH] = {4,3};
62     unsigned char dotted[DOTTED_LIST_LENGTH] = {5,2};
63    
64     unsigned char *Linetypes[] = {
65     0,
66     long_dashed,
67     short_dashed,
68     dotted,
69     };
70    
71     Display *dpy;
72     Window wind; /* our window */
73     Colormap cmap;
74     GC gc;
75     Font curfont; /* current font */
76     int curwidth; /* current width of lines */
77     int curfill; /* current fill style (FillTiled or FillSolid) */
78     int curcol; /* current color */
79     int curlinetype; /* current line style */
80     XGCValues gcval;
81     int pixel[4];
82     int dxsize, dysize; /* window size */
83     int debug = False; /* use XSynchronize if true */
84    
85     init(name, geom) /* initialize window */
86     char *name;
87     char *geom;
88     {
89     char defgeom[32];
90     XColor cdef,dum;
91     XEvent evnt;
92     int dummy;
93    
94     curfont = curfill = curcol = -1;
95     curlinetype = 0;
96    
97     if ((dpy=XOpenDisplay("")) == NULL)
98     error(SYSTEM, "can't open display");
99    
100     /* for debugging so we don't have to flush always */
101     if (debug)
102     (void) XSynchronize(dpy, True);
103    
104     dxsize = DisplayWidth(dpy,0) - 2*BORWIDTH-4;
105     dysize = DisplayHeight(dpy,0) - 2*BORWIDTH-26;
106    
107     /* temporary */
108     dxsize = dxsize = 800;
109     adjustsize();
110    
111     sprintf(defgeom, "=%dx%d+2+25", dxsize, dysize);
112     /* XUseGeometry(dpy,0,geom,defgeom,BORWIDTH,100,100,100,100,
113     &xoff,&yoff,&dxsize,&dysize); */
114     gc = DefaultGC(dpy,0); /* get default gc */
115     cmap = DefaultColormap(dpy,0); /* and colormap */
116    
117     wind = XCreateSimpleWindow(dpy,DefaultRootWindow(dpy),0,0,dxsize,dysize,
118     BORWIDTH,BlackPix,WhitePix);
119     if (wind == 0)
120     error(SYSTEM, "can't create window");
121     XStoreName(dpy, wind, name);
122     XMapRaised(dpy, wind);
123     XSelectInput(dpy, wind, StructureNotifyMask | ButtonPressMask | ExposureMask);
124     if (DisplayPlanes(dpy,0) < 2) { /* less than 2 color planes, use black */
125     pixel[0] = pixel[1] = pixel[2] = pixel[3] = BlackPix;
126     } else {
127     if (XAllocNamedColor(dpy, cmap, "black", &dum, &cdef)==0)
128     error(USER,"cannot allocate black!");
129     pixel[0] = cdef.pixel;
130     if (XAllocNamedColor(dpy, cmap, "red", &dum, &cdef)==0)
131     {
132     error(WARNING,"cannot allocate red");
133     cdef.pixel = BlackPix;
134     }
135     pixel[1] = cdef.pixel;
136     if (XAllocNamedColor(dpy, cmap, "green", &dum, &cdef)==0)
137     {
138     error(WARNING,"cannot allocate green");
139     cdef.pixel = BlackPix;
140     }
141     pixel[2] = cdef.pixel;
142     if (XAllocNamedColor(dpy, cmap, "blue", &dum, &cdef)==0)
143     {
144     error(WARNING,"cannot allocate blue");
145     cdef.pixel = BlackPix;
146     }
147     pixel[3] = cdef.pixel;
148     }
149    
150     while (1)
151     {
152     XNextEvent(dpy, &evnt);
153     if (evnt.type == ConfigureNotify) /* wait for first ConfigureNotify */
154     break;
155     }
156     dxsize = evnt.xconfigure.width;
157     dysize = evnt.xconfigure.height;
158     adjustsize();
159     while (1)
160     {
161     XNextEvent(dpy, &evnt);
162     if (evnt.type == Expose) /* wait for first Expose */
163     break;
164     }
165     }
166    
167     adjustsize()
168     {
169     if (dxsize > dysize)
170     dxsize = dysize;
171     else
172     dysize = dxsize;
173     }
174    
175 greg 1.2 void
176 greg 1.1 endpage() /* end of this graph */
177     {
178     XEvent evnt;
179     int quit=False;
180    
181     XFlush(dpy);
182     XBell(dpy, 0);
183     while ( !quit ) {
184     XNextEvent(dpy, &evnt);
185     switch (evnt.type) {
186     case ConfigureNotify:
187     dxsize = evnt.xconfigure.width;
188     dysize = evnt.xconfigure.height;
189     adjustsize();
190     break;
191     case Expose:
192     replay((int)((long)XYSIZE*evnt.xexpose.x/dxsize),
193     (int)((long)XYSIZE*(dysize-evnt.xexpose.y-evnt.xexpose.height)/dysize),
194     (int)((long)XYSIZE*(evnt.xexpose.x+evnt.xexpose.width)/dxsize),
195     (int)((long)XYSIZE*(dysize-evnt.xexpose.y)/dysize));
196     break;
197     case ButtonPress:
198     quit = True;
199     break;
200     } /* switch */
201     } /* for */
202     XClearWindow(dpy, wind);
203    
204     }
205    
206    
207    
208 greg 1.2 void
209 greg 1.1 printstr(p) /* output a string */
210    
211     register PRIMITIVE *p;
212    
213     {
214     int fn;
215     int col;
216    
217     fn = fontmap[(p->arg0 >> 2) & 017]; /* get font number */
218     /* set font */
219     if (font[fn].id == 0)
220     {
221     font[fn].id = XLoadFont(dpy, font[fn].name);
222     if (font[fn].id == 0)
223     {
224     sprintf(errmsg, "can't open font \"%s\"", font[fn].name);
225     error(SYSTEM, errmsg);
226     }
227     }
228     col = p->arg0 & 03;
229     if (curcol != col)
230     {
231     curcol = col;
232     XSetForeground(dpy, gc, pixel[col]);
233     }
234     if (curfont != font[fn].id)
235     {
236     curfont = font[fn].id;
237     XSetFont(dpy, gc, curfont);
238     }
239    
240     XDrawImageString(dpy, wind, gc, mapx(p->xy[XMN]), mapy(p->xy[YMN]),
241     p->args, strlen(p->args));
242     }
243    
244    
245    
246    
247    
248 greg 1.2 void
249 greg 1.1 plotlseg(p) /* plot a line segment */
250    
251     register PRIMITIVE *p;
252    
253     {
254     int x1, y1, x2, y2;
255     int linetype, ps, pw;
256     int col;
257    
258     linetype = (p->arg0 >> 4) & 03; /* line style (solid, dashed, etc) */
259    
260     col = p->arg0 & 03; /* color */
261    
262     ps = WIDTH((p->arg0 >> 2) & 03);
263     pw = CONV((ps)/2, dxsize);
264    
265     x1 = mapx(p->xy[XMN]);
266     x2 = mapx(p->xy[XMX]);
267     if (p->arg0 & 0100) { /* reverse slope */
268     y1 = mapy(p->xy[YMX]);
269     y2 = mapy(p->xy[YMN]);
270     } else {
271     y1 = mapy(p->xy[YMN]);
272     y2 = mapy(p->xy[YMX]);
273     }
274    
275     if (curcol != col || curwidth != pw)
276     {
277     curcol = col;
278     gcval.foreground = pixel[col];
279     curwidth = pw;
280     gcval.line_width = pw*2+1; /* convert to thickness in pixels */
281     gcval.join_style = JoinRound;
282     XChangeGC(dpy, gc, GCJoinStyle|GCLineWidth|GCForeground, &gcval);
283     }
284     if (curlinetype != linetype)
285     {
286     curlinetype = linetype;
287     if (linetype==0)
288     gcval.line_style = LineSolid;
289     else
290     {
291     gcval.line_style = LineOnOffDash;
292     XSetDashes(dpy, gc, 0, Linetypes[linetype], dash_list_length[linetype]);
293     }
294     XChangeGC(dpy, gc, GCLineStyle, &gcval);
295     }
296     XDrawLine(dpy,wind,gc,x1,y1,x2,y2);
297     }
298    
299    
300     #ifdef nyet
301    
302 greg 1.2 static void
303     fill(xmin,ymin,xmax,ymax,pm)
304     int xmin,ymin,xmax,ymax;
305     Pixmap pm;
306     {
307     if (pm != 0 && curpat != pm)
308     {
309     XSetTile(dpy, gc, pm);
310     curpat = pm;
311     }
312     XFillRectangle(dpy, wind, gc, xmin, ymin, xmax-xmin+1, ymax-ymin+1);
313     }
314    
315 greg 1.1 fillrect(p) /* fill a rectangle */
316    
317     register PRIMITIVE *p;
318    
319     {
320     int left, right, top, bottom;
321    
322     left = mapx(p->xy[XMN]);
323     bottom = mapy(p->xy[YMN]);
324     right = mapx(p->xy[XMX]);
325     top = mapy(p->xy[YMX]);
326    
327     fill(left, top, right, bottom, pixpat(pati[(p->arg0>>2)&03],p->arg0&03));
328    
329     }
330    
331    
332    
333    
334     filltri(p) /* fill a triangle */
335    
336     register PRIMITIVE *p;
337    
338     {
339     Vertex v[4];
340     int left, right, top, bottom;
341    
342     left = mapx(p->xy[XMN]);
343     right = mapx(p->xy[XMX]);
344     top = mapy(p->xy[YMX]);
345     bottom = mapy(p->xy[YMN]);
346    
347     switch (p->arg0 & 060) {
348     case 0: /* right (& down) */
349     v[0].x = left; v[0].y = bottom;
350     v[1].x = right; v[1].y = bottom;
351     v[2].x = right; v[2].y = top;
352     break;
353     case 020: /* up */
354     v[0].x = right; v[0].y = bottom;
355     v[1].x = right; v[1].y = top;
356     v[2].x = left; v[2].y = top;
357     break;
358     case 040: /* left */
359     v[0].x = right; v[0].y = top;
360     v[1].x = left; v[1].y = top;
361     v[2].x = left; v[2].y = bottom;
362     break;
363     case 060: /* down */
364     v[0].x = left; v[0].y = top;
365     v[1].x = left; v[1].y = bottom;
366     v[2].x = right; v[2].y = bottom;
367     break;
368     }
369     v[3].x = v[0].x; v[3].y = v[0].y;
370     v[0].flags = v[1].flags = v[2].flags = v[3].flags = 0;
371     if (curfill != FillTiled)
372     {
373     XSetFillStyle(dpy, gc, FillTiled);
374     curfill = FillTiled;
375     XSetTile(dpy, gc, pixpat(pati[(p->arg0>>2)&03],p->arg0&03));
376     }
377     XDrawFIlled(dpy, wind, gc, v, 4);
378     }
379    
380    
381    
382     xform(xp, yp, p) /* transform a point according to p */
383    
384     register int *xp, *yp;
385     register PRIMITIVE *p;
386    
387     {
388     int x, y;
389    
390     switch (p->arg0 & 060) {
391     case 0: /* right */
392     x = *xp;
393     y = *yp;
394     break;
395     case 020: /* up */
396     x = (XYSIZE-1) - *yp;
397     y = *xp;
398     break;
399     case 040: /* left */
400     x = (XYSIZE-1) - *xp;
401     y = (XYSIZE-1) - *yp;
402     break;
403     case 060: /* down */
404     x = *yp;
405     y = (XYSIZE-1) - *xp;
406     break;
407     }
408    
409     *xp = CONV(x, p->xy[XMX] - p->xy[XMN]) + p->xy[XMN];
410     *yp = CONV(y, p->xy[YMX] - p->xy[YMN]) + p->xy[YMN];
411    
412     }
413    
414    
415    
416     fillpoly(p) /* fill a polygon */
417    
418     register PRIMITIVE *p;
419    
420     {
421     int x0, y0, curx, cury;
422     PolyHandle polyh;
423     char *nextscan();
424     register char *s;
425    
426     polyh = OpenPoly();
427    
428     if ((s = nextscan(nextscan(p->args, "%d", &x0), "%d", &y0)) == NULL)
429     error(USER, "illegal polygon spec in fillpoly");
430    
431     xform(&x0, &y0, p);
432     x0 = mapx(x0); y0 = mapy(y0);
433     MoveTo(x0, y0);
434    
435     while ((s = nextscan(nextscan(s, "%d", &curx), "%d", &cury)) != NULL) {
436     xform(&curx, &cury, p);
437     curx = mapx(curx); cury = mapy(cury);
438     LineTo(curx, cury);
439     }
440     LineTo(x0, y0);
441    
442     ClosePoly();
443    
444     if (p->arg0 & 0100) { /* draw border */
445     if (curpat != 0) {
446     PenPat(macpat[0]);
447     curpat = 0;
448     }
449     if (curpsiz != 1) {
450     PenSize(1, 1);
451     curpsiz = 1;
452     }
453     if (curpmod != patOr) {
454     PenMode(patOr);
455     curpmod = patOr;
456     }
457     FramePoly(polyh);
458     }
459    
460     setfill(p->arg0 & 077);
461     PaintPoly(polyh);
462     KillPoly(polyh);
463     xpos = -1;
464     ypos = -1;
465    
466     }
467    
468     #else
469    
470 greg 1.2 void filltri(PRIMITIVE *p) {}
471     void fillpoly(PRIMITIVE *p) {}
472     void fillrect(PRIMITIVE *p) {}
473 greg 1.1
474     #endif