Annotation of OpenXM_contrib/pari/src/graph/plotX.c, Revision 1.1.1.1
1.1 maekawa 1: /*******************************************************************/
2: /* */
3: /* HIGH RESOLUTION PLOT */
4: /* */
5: /*******************************************************************/
6: /* $Id: plotX.c,v 1.1.1.1 1999/09/16 13:47:43 karim Exp $ */
7: #include "pari.h"
8: #include "rect.h"
9: #include "../language/anal.h"
10:
11: void free_graph(void);
12:
13: #ifdef HPPA
14: # ifndef __GNUC__
15: typedef char *caddr_t;
16: # endif
17: #endif
18:
19: BEGINEXTERN
20: #include <X11/Xlib.h>
21: #include <X11/Xutil.h>
22: #include <X11/Xos.h>
23: ENDEXTERN
24:
25: static Colormap PARI_Colormap;
26: static XColor *PARI_Colors;
27: static XColor *PARI_ExactColors;
28:
29: static char *PARI_DefaultColors[MAX_COLORS] =
30: {
31: " ",
32: "black", /* Default */
33: "blue", /* Axes */
34: "sienna", /* Odd numbered curves in ploth */
35: "red", /* Curves, or Even numbered curves in ploth */
36: "cornsilk",
37: "grey",
38: "gainsboro",
39: };
40:
41: static void
42: PARI_ColorSetUp(Display *display, char **Colors, int n)
43: {
44: static int init_done = 0;
45: int i;
46:
47: if (init_done) return;
48: init_done=1;
49:
50: PARI_Colormap = DefaultColormap(display, 0);
51: PARI_Colors = (XColor *) gpmalloc((n+1) * sizeof(XColor));
52: PARI_ExactColors = (XColor *) gpmalloc((n+1) * sizeof(XColor));
53: for (i=1; i<n; i++)
54: XAllocNamedColor(display, PARI_Colormap, Colors[i],
55: &PARI_ExactColors[i], &PARI_Colors[i]);
56: }
57:
58: #ifdef SONY
59: typedef int (*XErrorHandler) (
60: # if NeedFunctionPrototypes
61: Display*,
62: XErrorEvent*
63: # endif
64: );
65:
66: extern XErrorHandler XSetErrorHandler (
67: # if NeedFunctionPrototypes
68: XErrorHandler
69: # endif
70: );
71:
72: typedef int (*XIOErrorHandler) (
73: # if NeedFunctionPrototypes
74: Display*
75: # endif
76: );
77:
78: extern XIOErrorHandler XSetIOErrorHandler (
79: # if NeedFunctionPrototypes
80: XIOErrorHandler
81: # endif
82: );
83: #endif
84:
85: /* after fork(), we don't want the child to recover but to exit */
86: static void
87: exiterr(char *str)
88: {
89: term_color(c_ERR);
90: fprintferr("\n *** X fatal error: %s\n",str);
91: term_color(c_NONE); exit(1);
92: }
93:
94: #define MAX_BUF 256
95:
96: static int
97: Xerror(Display *d, XErrorEvent *err) {
98: char buf[MAX_BUF];
99: XGetErrorText(d,err->error_code,buf,MAX_BUF);
100: exiterr(buf); return 0;
101: }
102:
103: static int
104: IOerror(Display *d) {
105: char buf[MAX_BUF];
106: sprintf(buf, "lost display on %s", DisplayString(d));
107: exiterr(buf); return 0;
108: }
109:
110: static char*
111: zmalloc(size_t x)
112: {
113: return x? gpmalloc(x): NULL;
114: }
115:
116: void
117: rectdraw0(long *w, long *x, long *y, long lw, long do_free)
118: {
119: long *ptx,*pty,*c;
120: long *numpoints[MAX_COLORS],*numtexts[MAX_COLORS];
121: long *xtexts[MAX_COLORS],*ytexts[MAX_COLORS];
122: long rcolcnt[MAX_COLORS][ROt_MAX];
123: long col,i,j,x0,y0,a,b,oldwidth,oldheight,force;
124: long rcnt[ROt_MAX+1];
125: char **texts[MAX_COLORS];
126: PariRect *e;
127: RectObj *p1;
128: double xs=1,ys=1;
129:
130: int screen;
131: Display *display;
132: GC gc;
133: Window win;
134: XEvent event;
135: XSizeHints size_hints;
136: XFontStruct *font_info;
137: XSetWindowAttributes attrib;
138: XPoint *points[MAX_COLORS],**lines[MAX_COLORS];
139: XSegment *seg[MAX_COLORS];
140: XRectangle *rec[MAX_COLORS];
141: Atom wm_delete_window, wm_protocols;
142:
143: if (fork()) return; /* parent process returns */
144:
145: /* child process goes on */
146: freeall(); /* PARI stack isn't needed anymore, keep rectgraph */
147: PARI_get_plot(1);
148: display = XOpenDisplay(NULL);
149: font_info = XLoadQueryFont(display, "9x15");
150: if (!font_info) exiterr("cannot open 9x15 font");
151:
152: XSetErrorHandler(Xerror);
153: XSetIOErrorHandler(IOerror);
154: PARI_ColorSetUp(display,PARI_DefaultColors,MAX_COLORS);
155:
156: for(col=1;col<MAX_COLORS;col++)
157: {
158: rcolcnt[col][ROt_MV]=rcolcnt[col][ROt_PT]=rcolcnt[col][ROt_LN]=0;
159: rcolcnt[col][ROt_BX]=rcolcnt[col][ROt_MP]=rcolcnt[col][ROt_ML]=0;
160: rcolcnt[col][ROt_ST]=rcolcnt[col][ROt_PTT]=rcolcnt[col][ROt_PTS]=rcolcnt[col][ROt_LNT]=0;
161: }
162:
163: for(i=0;i<lw;i++)
164: {
165: e=rectgraph[w[i]]; p1=RHead(e);
166: while(p1)
167: {
168: switch(RoType(p1))
169: {
170: case ROt_MP : rcolcnt[RoCol(p1)][ROt_PT] += RoMPcnt(p1);
171: break; /* Multiple Point */
172: case ROt_PT : /* Point */
173: case ROt_LN : /* Line */
174: case ROt_BX : /* Box */
175: case ROt_ML : /* Multiple lines */
176: case ROt_ST : rcolcnt[RoCol(p1)][RoType(p1)]++;
177: break; /* String */
178: case ROt_MV : /* Move */
179: case ROt_PTT: /* Point type change */
180: case ROt_PTS: /* Point size change */
181: case ROt_LNT: rcnt[RoType(p1)]++; /* Line type change */
182: }
183: p1=RoNext(p1);
184: }
185: }
186: for (col=1; col<MAX_COLORS; col++)
187: {
188: char *m;
189: c = rcolcnt[col];
190: points[col]=(XPoint*)zmalloc(c[ROt_PT]*sizeof(XPoint));
191: seg[col]=(XSegment*)zmalloc(c[ROt_LN]*sizeof(XSegment));
192: rec[col]=(XRectangle*)zmalloc(c[ROt_BX]*sizeof(XRectangle));
193:
194: i = c[ROt_ML]; m = zmalloc(i * (sizeof(long) + sizeof(XPoint*)));
195: numpoints[col]=(long*)m; i *= sizeof(XPoint*);
196: m += i; lines[col]=(XPoint**)m;
197:
198: i = c[ROt_ST]; m = zmalloc(i * (sizeof(char*) + 3*sizeof(long)));
199: texts[col]=(char**)m; i *= sizeof(long);
200: m += i; numtexts[col]=(long*)m;
201: m += i; xtexts[col]=(long*)m;
202: m += i; ytexts[col]=(long*)m;
203:
204: c[ROt_PT]=c[ROt_LN]=c[ROt_BX]=c[ROt_ML]=c[ROt_ST]=0;
205: }
206:
207: screen = DefaultScreen(display);
208: win = XCreateSimpleWindow
209: (display, RootWindow(display, screen), 0, 0, w_width, w_height,
210: 4, BlackPixel(display, screen), WhitePixel(display, screen));
211:
212: size_hints.flags = PPosition | PSize;
213: size_hints.x = 0;
214: size_hints.y = 0;
215: size_hints.width = w_width;
216: size_hints.height = w_height;
217: XSetStandardProperties
218: (display, win, "rectplot", NULL, None, NULL, 0, &size_hints);
219:
220: wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
221: wm_protocols = XInternAtom(display, "WM_PROTOCOLS", False);
222: XSetWMProtocols(display,win,&wm_delete_window, 1);
223:
224: XSelectInput (display, win,
225: ExposureMask | ButtonPressMask | StructureNotifyMask);
226:
227: /* enable backing-store */
228: attrib.backing_store = Always;
229: attrib.backing_planes = AllPlanes;
230: XChangeWindowAttributes(display,win,CWBackingStore|CWBackingPlanes,&attrib);
231:
232: gc = XCreateGC(display, win, 0, NULL);
233: XSetFont(display, gc, font_info->fid);
234:
235: XMapWindow(display, win);
236: oldwidth = w_width;
237: oldheight = w_height; force = 1;
238:
239: for(;;)
240: {
241: XNextEvent(display, &event);
242: switch(event.type)
243: {
244: case ClientMessage:
245: if (event.xclient.message_type != wm_protocols ||
246: event.xclient.data.l[0] != wm_delete_window) break;
247: case ButtonPress:
248: case DestroyNotify:
249: XUnloadFont(display,font_info->fid); XFreeGC(display,gc);
250: #define myfree(x) if (x) free(x)
251: for(col=1;col<MAX_COLORS;col++)
252: {
253: myfree(points[col]); myfree(seg[col]); myfree(rec[col]);
254: for(i=0;i<rcolcnt[col][ROt_ML];i++) myfree(lines[col][i]);
255: myfree(numpoints[col]); myfree(texts[col]);
256: }
257: #undef myfree
258: free_graph(); if (do_free) { free(w); free(x); free(y); }
259: XCloseDisplay(display); exit(0);
260:
261: case ConfigureNotify:
262: {
263: int width = event.xconfigure.width;
264: int height = event.xconfigure.height;
265:
266: if (width == oldwidth && height == oldheight) break;
267: oldwidth = width;
268: oldheight = height; force = 1;
269:
270: /* recompute scale */
271: xs=((double)width)/w_width; ys=((double)height)/w_height;
272: }
273: case Expose: if (!force) break;
274: force = 0;
275: for(i=0; i<lw; i++)
276: {
277: e=rectgraph[w[i]];p1=RHead(e);x0=x[i];y0=y[i];
278: while(p1)
279: {
280: col=RoCol(p1); c=rcolcnt[col];
281: switch(RoType(p1))
282: {
283: case ROt_PT:
284: points[col][c[ROt_PT]].x=(long)((RoPTx(p1)+x0)*xs);
285: points[col][c[ROt_PT]].y=(long)((RoPTy(p1)+y0)*ys);
286: c[ROt_PT]++;break;
287: case ROt_LN:
288: seg[col][c[ROt_LN]].x1= (long)((RoLNx1(p1)+x0)*xs);
289: seg[col][c[ROt_LN]].y1= (long)((RoLNy1(p1)+y0)*ys);
290: seg[col][c[ROt_LN]].x2= (long)((RoLNx2(p1)+x0)*xs);
291: seg[col][c[ROt_LN]].y2= (long)((RoLNy2(p1)+y0)*ys);
292: c[ROt_LN]++;break;
293: case ROt_BX:
294: a=rec[col][c[ROt_BX]].x = (long)((RoBXx1(p1)+x0)*xs);
295: b=rec[col][c[ROt_BX]].y = (long)((RoBXy1(p1)+y0)*ys);
296: rec[col][c[ROt_BX]].width = (long)((RoBXx2(p1)+x0-a)*xs);
297: rec[col][c[ROt_BX]].height = (long)((RoBXy2(p1)+y0-b)*ys);
298: c[ROt_BX]++;break;
299: case ROt_MP:
300: ptx=RoMPxs(p1); pty=RoMPys(p1);
301: for(j=0;j<RoMPcnt(p1);j++)
302: {
303: points[col][c[ROt_PT]+j].x= (long)((ptx[j]+x0)*xs);
304: points[col][c[ROt_PT]+j].y= (long)((pty[j]+y0)*ys);
305: }
306: c[ROt_PT]+=RoMPcnt(p1);break;
307: case ROt_ML:
308: ptx=RoMLxs(p1); pty=RoMLys(p1);
309: numpoints[col][c[ROt_ML]] = RoMLcnt(p1);
310: lines[col][c[ROt_ML]] =
311: (XPoint*)zmalloc(RoMLcnt(p1)*sizeof(XPoint));
312: for(j=0;j<RoMLcnt(p1);j++)
313: {
314: lines[col][c[ROt_ML]][j].x= (long)((ptx[j]+x0)*xs);
315: lines[col][c[ROt_ML]][j].y= (long)((pty[j]+y0)*ys);
316: }
317: c[ROt_ML]++;break;
318: case ROt_ST:
319: texts[col][c[ROt_ST]]=RoSTs(p1);
320: numtexts[col][c[ROt_ST]]=RoSTl(p1);
321: xtexts[col][c[ROt_ST]]= (long)((RoSTx(p1)+x0)*xs);
322: ytexts[col][c[ROt_ST]]= (long)((RoSTy(p1)+y0)*ys);
323: c[ROt_ST]++;break;
324: default: break;
325: }
326: p1=RoNext(p1);
327: }
328: }
329: for(col=1; col<MAX_COLORS; col++)
330: {
331: c = rcolcnt[col];
332: XSetForeground(display, gc, PARI_Colors[col].pixel);
333: if(c[ROt_PT]) XDrawPoints(display,win,gc,points[col],c[ROt_PT],0);
334: if(c[ROt_LN]) XDrawSegments(display,win,gc,seg[col],c[ROt_LN]);
335: if(c[ROt_BX]) XDrawRectangles(display,win,gc,rec[col],c[ROt_BX]);
336: for(i=0;i<c[ROt_ML];i++)
337: XDrawLines(display,win,gc,lines[col][i],numpoints[col][i],0);
338: for(i=0;i<c[ROt_ST];i++)
339: XDrawString(display,win,gc, xtexts[col][i],ytexts[col][i],
340: texts[col][i],numtexts[col][i]);
341:
342: c[ROt_PT]=c[ROt_LN]=c[ROt_BX]=c[ROt_ML]=c[ROt_ST]=0;
343: }
344: }
345: }
346: }
347:
348: void
349: PARI_get_plot(long fatal)
350: {
351: Display *display;
352: int screen;
353:
354: if (pari_plot.init) return;
355: if (!(display = XOpenDisplay(NULL)))
356: {
357: if (fatal) exiterr("no X server");
358: err(talker, "no X server");
359: }
360: screen = DefaultScreen(display);
361: w_width = DisplayWidth(display, screen) - 40;
362: w_height = DisplayHeight(display, screen) - 60;
363: f_height = 15; f_width = 9;
364: h_unit = 5; v_unit = 5;
365: pari_plot.init = 1;
366: XCloseDisplay(display);
367: }
368:
369: long
370: term_set(char *s) { return 1; }
371:
372: long
373: plot_outfile_set(char *s) { return 1; }
374:
375: void
376: set_pointsize(double d)
377: {
378: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>