source: trunk/Jgraph/printline.c@ 419

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

Jgraph: Debian changes by pzn@…

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