Annotation of OpenXM_contrib/pari/src/graph/plotsun.c, Revision 1.1.1.1
1.1 maekawa 1: /*******************************************************************/
2: /* */
3: /* HI-RES PLOT. SUNVIEW INTERFACE */
4: /* */
5: /*******************************************************************/
6: /* $Id: plotsun.c,v 1.1.1.1 1999/09/16 13:47:44 karim Exp $ */
7: #include "pari.h"
8: #include "rect.h"
9: #include <suntool/sunview.h>
10: #include <suntool/canvas.h>
11: #include <suntool/textsw.h>
12: #include <suntool/panel.h>
13:
14: typedef struct spoint {int x,y;} SPoint;
15: typedef struct ssegment {int x1,y1,x2,y2;} SSegment;
16: typedef struct srectangle {int x,y,width,height;} SRectangle;
17:
18: #define ISCR 1120 /* 1400 en haute resolution */
19: #define JSCR 800 /* 1120 en haute resolution */
20:
21: void
22: rectdraw0(long *w, long *x, long *y, long lw, long do_free)
23: {
24: long *ptx,*pty,*numpoints,*numtexts,*xtexts,*ytexts;
25: long n,i,j,x0,y0;
26: long a,b,c,d,ne;
27: long rcnt[ROt_MAX+1];
28: char **texts;
29: PariRect *e;
30: RectObj *p1;
31:
32: Frame ecran;
33: Canvas canevas;
34: Pixwin *pw;
35: Pixfont *font;
36: SPoint *points, **lines, *SLine;
37: SSegment *segments;
38: SRectangle *rectangles, SRec;
39:
40: if (fork()) return; /* parent process returns */
41:
42: /* child process goes on */
43: freeall(); /* PARI stack isn't needed anymore, keep rectgraph */
44: PARI_get_plot(1);
45:
46: rcnt[ROt_MV]=rcnt[ROt_PT]=rcnt[ROt_LN]=0;
47: rcnt[ROt_BX]=rcnt[ROt_MP]=rcnt[ROt_ML]=0;
48: rcnt[ROt_ST]=0;
49:
50: for(i=0;i<lw;i++)
51: {
52: e=rectgraph[w[i]]; p1=RHead(e);
53: while(p1)
54: {
55: if(RoType(p1) != ROt_MP) rcnt[RoType(p1)]++;
56: else rcnt[ROt_PT] += RoMPcnt(p1);
57: p1=RoNext(p1);
58: }
59: }
60: points=(SPoint*)gpmalloc(rcnt[ROt_PT]*sizeof(SPoint));
61: segments=(SSegment*)gpmalloc(rcnt[ROt_LN]*sizeof(SSegment));
62: rectangles=(SRectangle*)gpmalloc(rcnt[ROt_BX]*sizeof(SRectangle));
63: lines=(SPoint**)gpmalloc(rcnt[ROt_ML]*sizeof(SPoint*));
64: numpoints=(long*)gpmalloc(rcnt[ROt_ML]*sizeof(long));
65: texts=(char**)gpmalloc(rcnt[ROt_ST]*sizeof(char*));
66: numtexts=(long*)gpmalloc(rcnt[ROt_ST]*sizeof(long));
67: xtexts=(long*)gpmalloc(rcnt[ROt_ST]*sizeof(long));
68: ytexts=(long*)gpmalloc(rcnt[ROt_ST]*sizeof(long));
69: rcnt[ROt_PT]=rcnt[ROt_LN]=rcnt[ROt_BX]=rcnt[ROt_ML]=rcnt[ROt_ST]=0;
70:
71: for(i=0;i<lw;i++)
72: {
73: e=rectgraph[w[i]];p1=RHead(e);x0=x[i];y0=y[i];
74: while(p1)
75: {
76: switch(RoType(p1))
77: {
78: case ROt_PT:
79: points[rcnt[ROt_PT]].x=RoPTx(p1)+x0;
80: points[rcnt[ROt_PT]].y=RoPTy(p1)+y0;
81: rcnt[ROt_PT]++;break;
82: case ROt_LN:
83: segments[rcnt[ROt_LN]].x1=RoLNx1(p1)+x0;
84: segments[rcnt[ROt_LN]].y1=RoLNy1(p1)+y0;
85: segments[rcnt[ROt_LN]].x2=RoLNx2(p1)+x0;
86: segments[rcnt[ROt_LN]].y2=RoLNy2(p1)+y0;
87: rcnt[ROt_LN]++;break;
88: case ROt_BX:
89: a=rectangles[rcnt[ROt_BX]].x=RoBXx1(p1)+x0;
90: b=rectangles[rcnt[ROt_BX]].y=RoBXy1(p1)+y0;
91: rectangles[rcnt[ROt_BX]].width=RoBXx2(p1)+x0-a;
92: rectangles[rcnt[ROt_BX]].height=RoBXy2(p1)+y0-b;
93: rcnt[ROt_BX]++;break;
94: case ROt_MP:
95: ptx=RoMPxs(p1);pty=RoMPys(p1);
96: for(j=0;j<RoMPcnt(p1);j++)
97: {
98: points[rcnt[ROt_PT]+j].x=ptx[j]+x0;
99: points[rcnt[ROt_PT]+j].y=pty[j]+y0;
100: }
101: rcnt[ROt_PT]+=RoMPcnt(p1);break;
102: case ROt_ML:
103: ptx=RoMLxs(p1);pty=RoMLys(p1);
104: numpoints[rcnt[ROt_ML]]=RoMLcnt(p1);
105: lines[rcnt[ROt_ML]]=(SPoint*)gpmalloc(RoMLcnt(p1)*sizeof(SPoint));
106: for(j=0;j<RoMLcnt(p1);j++)
107: {
108: lines[rcnt[ROt_ML]][j].x=ptx[j]+x0;
109: lines[rcnt[ROt_ML]][j].y=pty[j]+y0;
110: }
111: rcnt[ROt_ML]++;break;
112: case ROt_ST:
113: texts[rcnt[ROt_ST]]=RoSTs(p1); numtexts[rcnt[ROt_ST]]=RoSTl(p1);
114: xtexts[rcnt[ROt_ST]]=RoSTx(p1)+x0; ytexts[rcnt[ROt_ST]]=RoSTy(p1)+y0;
115: rcnt[ROt_ST]++;break;
116: default: break;
117: }
118: p1=RoNext(p1);
119: }
120: }
121: ecran=window_create(NULL,FRAME,FRAME_LABEL,"rectplot",
122: WIN_ERROR_MSG,"you must be in suntools",0);
123: canevas=window_create(ecran,CANVAS,WIN_HEIGHT,JSCR, WIN_WIDTH,ISCR,0);
124: window_fit(ecran);pw=canvas_pixwin(canevas);
125:
126: font=pw_pfsysopen();
127: for(i=0;i<rcnt[ROt_PT];i++) pw_put(pw,points[i].x,points[i].y,1);
128: for(i=0;i<rcnt[ROt_LN];i++)
129: pw_vector(pw,segments[i].x1,segments[i].y1,
130: segments[i].x2,segments[i].y2,PIX_SRC,1);
131: for(i=0;i<rcnt[ROt_BX];i++)
132: {
133: SRec=rectangles[i];a=SRec.x;b=SRec.y;c=a+SRec.width;
134: d=b+SRec.height;
135: pw_vector(pw,a,b,c,b,PIX_SRC,1); pw_vector(pw,c,b,c,d,PIX_SRC,1);
136: pw_vector(pw,a,d,c,d,PIX_SRC,1); pw_vector(pw,a,b,a,d,PIX_SRC,1);
137: }
138: for(i=0;i<rcnt[ROt_ML];i++)
139: {
140: SLine=lines[i];
141: for(j=1;j<numpoints[i];j++)
142: pw_vector(pw,SLine[j-1].x,SLine[j-1].y,SLine[j].x,SLine[j].y,PIX_SRC,1);
143: }
144: for(i=0;i<rcnt[ROt_ST];i++)
145: for(j=0;texts[i][j];j++)
146: pw_char(pw,xtexts[i]+9*j,ytexts[i],PIX_SRC|PIX_DST,font,texts[i][j]);
147:
148: window_main_loop(ecran);
149:
150: free(points);free(segments);free(rectangles);
151: free(numpoints);for(i=0;i<rcnt[ROt_ML];i++) free(lines[i]);
152: free(lines);free(texts);free(numtexts);free(xtexts);free(ytexts);
153: if (do_free) { free(w); free(x); free(y); }
154: free_graph(); exit(0);
155: }
156:
157: void
158: PARI_get_plot(long fatal)
159: {
160: if (pari_plot.init) return;
161:
162: w_width = ISCR; w_height = JSCR;
163: f_height = 15; f_width = 9;
164: h_unit = 5; v_unit = 5;
165: pari_plot.init = 1;
166: }
167:
168: long
169: term_set(char *s)
170: {
171: return 1;
172: }
173:
174: long
175: plot_outfile_set(char *s) { return 1; }
176:
177: void
178: set_pointsize(double d)
179: {
180: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>