ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/x11plot.c
Revision: 1.3
Committed: Mon Oct 8 18:07:57 2007 UTC (16 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +27 -17 lines
Log Message:
Compiler warning fixes for Linux release (thanks to Bernd Zeimetz)

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 1.3 static const char RCSid[] = "$Id: x11plot.c,v 1.2 2003/11/17 02:21:53 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 greg 1.3 static void
86     adjustsize()
87     {
88     if (dxsize > dysize)
89     dxsize = dysize;
90     else
91     dysize = dxsize;
92     }
93    
94    
95     void
96 greg 1.1 init(name, geom) /* initialize window */
97     char *name;
98     char *geom;
99     {
100     char defgeom[32];
101     XColor cdef,dum;
102     XEvent evnt;
103    
104     curfont = curfill = curcol = -1;
105     curlinetype = 0;
106    
107     if ((dpy=XOpenDisplay("")) == NULL)
108     error(SYSTEM, "can't open display");
109    
110     /* for debugging so we don't have to flush always */
111     if (debug)
112     (void) XSynchronize(dpy, True);
113    
114     dxsize = DisplayWidth(dpy,0) - 2*BORWIDTH-4;
115 greg 1.3 dysize = DisplayHeight(dpy,0) - 2*BORWIDTH-100;
116 greg 1.1 adjustsize();
117    
118     sprintf(defgeom, "=%dx%d+2+25", dxsize, dysize);
119     /* XUseGeometry(dpy,0,geom,defgeom,BORWIDTH,100,100,100,100,
120     &xoff,&yoff,&dxsize,&dysize); */
121     gc = DefaultGC(dpy,0); /* get default gc */
122     cmap = DefaultColormap(dpy,0); /* and colormap */
123    
124     wind = XCreateSimpleWindow(dpy,DefaultRootWindow(dpy),0,0,dxsize,dysize,
125     BORWIDTH,BlackPix,WhitePix);
126     if (wind == 0)
127     error(SYSTEM, "can't create window");
128     XStoreName(dpy, wind, name);
129     XMapRaised(dpy, wind);
130     XSelectInput(dpy, wind, StructureNotifyMask | ButtonPressMask | ExposureMask);
131     if (DisplayPlanes(dpy,0) < 2) { /* less than 2 color planes, use black */
132     pixel[0] = pixel[1] = pixel[2] = pixel[3] = BlackPix;
133     } else {
134     if (XAllocNamedColor(dpy, cmap, "black", &dum, &cdef)==0)
135     error(USER,"cannot allocate black!");
136     pixel[0] = cdef.pixel;
137     if (XAllocNamedColor(dpy, cmap, "red", &dum, &cdef)==0)
138     {
139     error(WARNING,"cannot allocate red");
140     cdef.pixel = BlackPix;
141     }
142     pixel[1] = cdef.pixel;
143     if (XAllocNamedColor(dpy, cmap, "green", &dum, &cdef)==0)
144     {
145     error(WARNING,"cannot allocate green");
146     cdef.pixel = BlackPix;
147     }
148     pixel[2] = cdef.pixel;
149     if (XAllocNamedColor(dpy, cmap, "blue", &dum, &cdef)==0)
150     {
151     error(WARNING,"cannot allocate blue");
152     cdef.pixel = BlackPix;
153     }
154     pixel[3] = cdef.pixel;
155     }
156    
157     while (1)
158     {
159     XNextEvent(dpy, &evnt);
160     if (evnt.type == ConfigureNotify) /* wait for first ConfigureNotify */
161     break;
162     }
163     dxsize = evnt.xconfigure.width;
164     dysize = evnt.xconfigure.height;
165     adjustsize();
166     while (1)
167     {
168     XNextEvent(dpy, &evnt);
169     if (evnt.type == Expose) /* wait for first Expose */
170     break;
171     }
172     }
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 greg 1.3 void
301     pXFlush()
302     {
303     XFlush(dpy);
304     }
305    
306    
307 greg 1.1 #ifdef nyet
308    
309 greg 1.2 static void
310     fill(xmin,ymin,xmax,ymax,pm)
311     int xmin,ymin,xmax,ymax;
312     Pixmap pm;
313 greg 1.3 {
314 greg 1.2 if (pm != 0 && curpat != pm)
315     {
316     XSetTile(dpy, gc, pm);
317     curpat = pm;
318     }
319     XFillRectangle(dpy, wind, gc, xmin, ymin, xmax-xmin+1, ymax-ymin+1);
320 greg 1.3 }
321    
322 greg 1.2
323 greg 1.3 void
324 greg 1.1 fillrect(p) /* fill a rectangle */
325    
326     register PRIMITIVE *p;
327    
328     {
329     int left, right, top, bottom;
330    
331     left = mapx(p->xy[XMN]);
332     bottom = mapy(p->xy[YMN]);
333     right = mapx(p->xy[XMX]);
334     top = mapy(p->xy[YMX]);
335    
336     fill(left, top, right, bottom, pixpat(pati[(p->arg0>>2)&03],p->arg0&03));
337    
338     }
339    
340    
341    
342    
343 greg 1.3 void
344 greg 1.1 filltri(p) /* fill a triangle */
345    
346     register PRIMITIVE *p;
347    
348     {
349     Vertex v[4];
350     int left, right, top, bottom;
351    
352     left = mapx(p->xy[XMN]);
353     right = mapx(p->xy[XMX]);
354     top = mapy(p->xy[YMX]);
355     bottom = mapy(p->xy[YMN]);
356    
357     switch (p->arg0 & 060) {
358     case 0: /* right (& down) */
359     v[0].x = left; v[0].y = bottom;
360     v[1].x = right; v[1].y = bottom;
361     v[2].x = right; v[2].y = top;
362     break;
363     case 020: /* up */
364     v[0].x = right; v[0].y = bottom;
365     v[1].x = right; v[1].y = top;
366     v[2].x = left; v[2].y = top;
367     break;
368     case 040: /* left */
369     v[0].x = right; v[0].y = top;
370     v[1].x = left; v[1].y = top;
371     v[2].x = left; v[2].y = bottom;
372     break;
373     case 060: /* down */
374     v[0].x = left; v[0].y = top;
375     v[1].x = left; v[1].y = bottom;
376     v[2].x = right; v[2].y = bottom;
377     break;
378     }
379     v[3].x = v[0].x; v[3].y = v[0].y;
380     v[0].flags = v[1].flags = v[2].flags = v[3].flags = 0;
381     if (curfill != FillTiled)
382     {
383     XSetFillStyle(dpy, gc, FillTiled);
384     curfill = FillTiled;
385     XSetTile(dpy, gc, pixpat(pati[(p->arg0>>2)&03],p->arg0&03));
386     }
387     XDrawFIlled(dpy, wind, gc, v, 4);
388     }
389    
390    
391 greg 1.3 vpod
392 greg 1.1 xform(xp, yp, p) /* transform a point according to p */
393    
394     register int *xp, *yp;
395     register PRIMITIVE *p;
396    
397     {
398     int x, y;
399    
400     switch (p->arg0 & 060) {
401     case 0: /* right */
402     x = *xp;
403     y = *yp;
404     break;
405     case 020: /* up */
406     x = (XYSIZE-1) - *yp;
407     y = *xp;
408     break;
409     case 040: /* left */
410     x = (XYSIZE-1) - *xp;
411     y = (XYSIZE-1) - *yp;
412     break;
413     case 060: /* down */
414     x = *yp;
415     y = (XYSIZE-1) - *xp;
416     break;
417     }
418    
419     *xp = CONV(x, p->xy[XMX] - p->xy[XMN]) + p->xy[XMN];
420     *yp = CONV(y, p->xy[YMX] - p->xy[YMN]) + p->xy[YMN];
421    
422     }
423    
424    
425 greg 1.3 void
426 greg 1.1 fillpoly(p) /* fill a polygon */
427    
428     register PRIMITIVE *p;
429    
430     {
431     int x0, y0, curx, cury;
432     PolyHandle polyh;
433     char *nextscan();
434     register char *s;
435    
436     polyh = OpenPoly();
437    
438     if ((s = nextscan(nextscan(p->args, "%d", &x0), "%d", &y0)) == NULL)
439     error(USER, "illegal polygon spec in fillpoly");
440    
441     xform(&x0, &y0, p);
442     x0 = mapx(x0); y0 = mapy(y0);
443     MoveTo(x0, y0);
444    
445     while ((s = nextscan(nextscan(s, "%d", &curx), "%d", &cury)) != NULL) {
446     xform(&curx, &cury, p);
447     curx = mapx(curx); cury = mapy(cury);
448     LineTo(curx, cury);
449     }
450     LineTo(x0, y0);
451    
452     ClosePoly();
453    
454     if (p->arg0 & 0100) { /* draw border */
455     if (curpat != 0) {
456     PenPat(macpat[0]);
457     curpat = 0;
458     }
459     if (curpsiz != 1) {
460     PenSize(1, 1);
461     curpsiz = 1;
462     }
463     if (curpmod != patOr) {
464     PenMode(patOr);
465     curpmod = patOr;
466     }
467     FramePoly(polyh);
468     }
469    
470     setfill(p->arg0 & 077);
471     PaintPoly(polyh);
472     KillPoly(polyh);
473     xpos = -1;
474     ypos = -1;
475    
476     }
477    
478     #else
479    
480 greg 1.2 void filltri(PRIMITIVE *p) {}
481     void fillpoly(PRIMITIVE *p) {}
482     void fillrect(PRIMITIVE *p) {}
483 greg 1.1
484     #endif