source: trunk/Jgraph/printline.c@ 418

Last change on this file since 418 was 418, checked in by Nicholas Riley, 16 years ago

Jgraph 8.3 from http://www.cs.utk.edu/~plank/plank/jgraph/jgraph.tar.gz

File size: 6.6 KB
Line 
1/*
2 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/printline.c,v $
3 * $Revision: 8.3 $
4 * $Date: 92/11/30 11:42:31 $
5 * $Author: jsp $
6 */
7
8#include "jgraph.h"
9#include <stdio.h>
10
11#define LINEWIDTHFACTOR 0.700
12#define MAX(a, b) ((a > b) ? (a) : (b))
13
14typedef struct fontlist {
15 struct fontlist *flink;
16 struct fontlist *blink;
17 int level;
18 float s;
19 char *f;
20} *Fontlist;
21
22static Fontlist Jgraph_fonts;
23static int Jgraph_gsave_level = -100;
24static int Jgraph_comment;
25
26gsave()
27{
28 if (Jgraph_gsave_level == -100) {
29 Jgraph_gsave_level = 0;
30 Jgraph_fonts = (Fontlist) make_list(sizeof(struct fontlist));
31 }
32 Jgraph_gsave_level++;
33 printf(" gsave ");
34}
35
36grestore()
37{
38 Fontlist l;
39
40 if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
41 l = last(Jgraph_fonts);
42 if (l->level == Jgraph_gsave_level) {
43 delete_item(l);
44 free_node(l, Jgraph_fonts);
45 }
46 }
47 Jgraph_gsave_level--;
48 printf(" grestore ");
49}
50
51setfont(f, s)
52char *f;
53float s;
54{
55 Fontlist l;
56 int ins;
57
58 if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
59 l = last(Jgraph_fonts);
60 ins = (strcmp(l->f, f) != 0 || s != l->s);
61 if (ins) {
62 delete_item(l);
63 free_node(l, Jgraph_fonts);
64 }
65 } else {
66 ins = 1;
67 }
68 if (ins) {
69 l = (Fontlist) get_node(Jgraph_fonts);
70 l->level = Jgraph_gsave_level;
71 l->s = s;
72 l->f = f;
73 insert(l, Jgraph_fonts);
74 printf("/%s findfont %f scalefont setfont\n", f, s);
75 }
76}
77
78setfill( x, y, t, f, p, a)
79char t, p ;
80float x, y;
81float f[], a ;
82{
83/* fprintf(stderr, "Hello? %c %f %c %f\n", t, f[0], p, a); */
84 if (t == 'g' && f[0] < 0.0) return;
85 printf("gsave ");
86
87 if ( t == 'g' ) {
88 if( f[0] >= 0.0 ) printf("%f setgray ", f[0] );
89 } else if ( t == 'c' ) {
90 printf("%f %f %f setrgbcolor ", f[0], f[1], f[2] );
91 }
92
93 if (p == 's') {
94 printf(" fill");
95 } else if (p == '/') {
96 printf(" 6.1 10 %f %f %f 1 JSTR", a, x, y);
97 } else if (p == 'e') {
98 printf(" 6.1 10 %f %f %f 0 JSTR", a, x, y);
99 }
100 printf(" grestore\n");
101}
102
103setgray( t, f)
104char t ;
105float f[] ;
106{
107 if ( t == 'g' ) {
108 if( f[0] >= 0.0 ) printf("%f setgray\n", f[0] );
109 } else if ( t == 'c' ) {
110 printf("%f %f %f setrgbcolor\n", f[0], f[1], f[2] );
111 }
112}
113
114printline(x1, y1,x2, y2, orientation)
115float x1, y1, x2, y2;
116char orientation;
117{
118 if (orientation == 'x')
119 printf("newpath %f %f moveto %f %f lineto stroke\n", x1, y1, x2, y2);
120 else
121 printf("newpath %f %f moveto %f %f lineto stroke\n", y1, x1, y2, x2);
122 fflush(stdout);
123}
124
125print_ebar(x1, y1, x2, ms, orientation)
126float x1, y1, x2, ms;
127char orientation;
128{
129 printline(x1, y1, x2, y1, orientation);
130 printline(x2, y1-ms, x2, y1+ms, orientation);
131}
132
133start_line(x1, y1, c)
134float x1, y1;
135Curve c;
136{
137 setlinewidth(c->linethick);
138 setlinestyle(c->linetype, c->gen_linetype);
139 printf("%f %f moveto ", x1, y1);
140}
141
142cont_line(x1, y1)
143float x1, y1;
144{
145 printf(" %f %f lineto\n", x1, y1);
146}
147
148end_line()
149{
150 printf("stroke\n");
151 setlinewidth(1.0);
152 setlinestyle('s', (Flist) 0);
153 fflush(stdout);
154
155}
156
157bezier_control(x1, y1)
158float x1, y1;
159{
160 printf(" %f %f ", x1, y1);
161}
162
163bezier_end(x1, y1)
164float x1, y1;
165{
166 printf(" %f %f curveto\n", x1, y1);
167}
168
169
170start_poly(x1, y1)
171float x1, y1;
172{
173 printf(" newpath %f %f moveto", x1, y1);
174}
175
176cont_poly(x1, y1)
177float x1, y1;
178{
179 printf(" %f %f lineto\n", x1, y1);
180}
181
182end_poly(x, y, ftype, fill, pattern, parg)
183float x, y;
184char ftype, pattern ;
185float fill[], parg;
186{
187 printf("closepath ");
188 setfill( x, y, ftype, fill, pattern, parg );
189 printf("stroke\n");
190 fflush(stdout);
191}
192
193/* Ellipse at 0, 0 -- assumes that you've already translated to x, y */
194
195printellipse(x, y, radius1, radius2, ftype, fill, pattern, parg)
196char ftype, pattern;
197float x, y, radius1, radius2, fill[], parg;
198{
199 printf("newpath %f %f JDE\n", radius1, radius2);
200 setfill( x, y, ftype, fill, pattern, parg );
201 printf("stroke\n");
202 fflush(stdout);
203}
204
205set_comment(c)
206int c;
207{
208 Jgraph_comment = c;
209}
210
211comment(s)
212char *s;
213{
214 if (Jgraph_comment) printf("%% %s\n", s);
215}
216
217printline_c(x1, y1, x2, y2, g)
218float x1, y1, x2, y2;
219Graph g;
220{
221 printline(ctop(x1, g->x_axis), ctop(y1, g->y_axis),
222 ctop(x2, g->x_axis), ctop(y2, g->y_axis), 'x');
223}
224
225print_label(l)
226Label l;
227{
228 int f, i, nlines;
229 float fnl;
230 char *s;
231
232 if (l->label == CNULL) return;
233
234 nlines = 0;
235 for (i = 0; l->label[i] != '\0'; i++) {
236 if (l->label[i] == '\n') {
237 l->label[i] = '\0';
238 nlines++;
239 }
240 }
241 fnl = (float) nlines;
242
243 setfont(l->font, l->fontsize);
244 printf("gsave %f %f translate %f rotate\n", l->x, l->y, l->rotate);
245 if (l->graytype == 'g') {
246 printf(" %f setgray\n", l->gray[0]);
247 } else if (l->graytype == 'c') {
248 printf(" %f %f %f setrgbcolor\n", l->gray[0], l->gray[1],
249 l->gray[2]);
250 }
251
252 if (l->vj == 'b') {
253 printf("0 %f translate ", fnl * (l->fontsize + l->linesep) * FCPI / FPPI);
254 } else if (l->vj == 'c') {
255 if (nlines % 2 == 0) {
256 printf("0 %f translate ",
257 (fnl/2.0*(l->fontsize + l->linesep) - l->fontsize/2.0)
258 * FCPI / FPPI);
259 } else {
260 printf("0 %f translate ",
261 ((fnl-1.0)/2.0*(l->fontsize + l->linesep) + l->linesep/2.0)
262 * FCPI / FPPI);
263 }
264 } else {
265 printf("0 %f translate ", -l->fontsize * FCPI / FPPI);
266 }
267
268 s = l->label;
269 for (i = 0; i <= nlines; i++) {
270 printf("(%s) dup stringwidth pop ", s);
271 if (l->hj == 'c') {
272 printf("2 div neg 0 moveto\n");
273 } else if (l->hj == 'r') {
274 printf("neg 0 moveto\n");
275 } else {
276 printf("pop 0 0 moveto\n");
277 }
278 /* I would put string blanking in here if I had the time... */
279
280 if (i != nlines) {
281 f = strlen(s);
282 s[f] = '\n';
283 s = &(s[f+1]);
284 printf("show 0 %f translate\n",
285 - (l->fontsize + l->linesep) * FCPI / FPPI);
286 } else {
287 printf("show\n");
288 }
289 }
290 printf("grestore\n");
291}
292
293setlinewidth(size)
294float size;
295{
296 printf("%f setlinewidth ", size * LINEWIDTHFACTOR);
297}
298
299setlinestyle(style, glist)
300char style;
301Flist glist;
302{
303 Flist fl;
304
305 switch(style) {
306 case '0': printf(" [0 2] setdash\n"); break;
307 case 's': printf(" [] 0 setdash\n"); break;
308 case '.': printf(" [1 3.200000] 0 setdash\n"); break;
309 case '-': printf(" [4.00000] 0 setdash\n"); break;
310 case 'l': printf(" [7 2] 0 setdash\n"); break;
311 case 'd': printf(" [5 3 1 3] 0 setdash\n"); break;
312 case 'D': printf(" [5 3 1 2 1 3] 0 setdash\n"); break;
313 case '2': printf(" [5 3 5 3 1 2 1 3] 0 setdash\n"); break;
314 case 'g':
315 printf(" [");
316 for (fl = first(glist); fl != nil(glist); fl = next(fl))
317 printf("%f ", fl->f);
318 printf("] 0 setdash\n");
319 break;
320 default: fprintf(stderr, "Error: Unknown line type: %c\n", style);
321 exit(1);
322 break;
323 }
324}
325
Note: See TracBrowser for help on using the repository browser.