source: trunk/Jgraph/draw.c @ 419

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

Jgraph: Debian changes by pzn@…

File size: 24.3 KB
Line 
1/*
2 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/draw.c,v $
3 * $Revision: 8.3 $
4 * $Date: 92/11/30 11:42:10 $
5 * $Author: jsp $
6 */
7
8#include "jgraph.h"
9#include <stdio.h>
10#include <math.h>
11#include <stdlib.h> //by pzn@debian.org
12#include <string.h> //by pzn@debian.org
13
14static char real_eof = EOF;
15
16float ctop(val, axis)
17float val;
18Axis axis;
19{
20  if (axis->is_lg) {
21    if (val <= 0.0) {
22      error_header();
23      fprintf(stderr, 
24              "Value of %f is at negative infinity with logrhythmic %c axis\n", 
25              val, (axis->is_x) ? 'x' : 'y'); 
26       exit(1);
27    }
28    return (log(val) / axis->logfactor - axis->logmin) * axis->factor;
29  } else {
30    return (val - axis->min) * axis->factor;
31  }
32}
33
34float disttop(val, axis)
35float val;
36Axis axis;
37{
38  if (axis->is_lg) {
39    return FCPI * val;
40  } else {
41    return (val) * axis->factor;
42  }
43}
44
45float intop(val)
46float val;
47{
48  return FCPI * val;
49}
50
51#define MAXIMUM(a,b) ((a > b) ? a : b)
52
53draw_axis(a, other)
54Axis a, other;
55{
56  char orientation;
57  Hash h;
58  String s;
59
60  orientation = (a->is_x) ? 'x' : 'y';
61  setlinewidth(1.0);
62  comment("Drawing Axis");
63  if (a->grid_lines) {
64    comment("Drawing Grid lines");
65    gsave();
66    setgray(a->gr_graytype, a->gr_gray);
67    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
68      if (h->major) {
69        printline(h->loc, 0.0, h->loc, other->psize, orientation);
70      }
71    }
72    grestore();
73  }
74  if (a->mgrid_lines) {
75    comment("Drawing Minor Grid lines");
76    gsave();
77    setgray(a->mgr_graytype, a->mgr_gray);
78    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
79      if (!h->major) {
80        printline(h->loc, 0.0, h->loc, other->psize, orientation);
81      }
82    }
83    grestore();
84  }
85  gsave();
86  setgray(a->graytype, a->gray);
87  if (a->draw_axis_line) {
88    printline(0.0, a->draw_at, a->psize, a->draw_at, orientation);
89  }
90  if (a->draw_hash_marks) {
91    comment("Drawing Hash Marks");
92    for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) {
93      printline(h->loc, a->draw_hash_marks_at, h->loc, 
94                a->draw_hash_marks_at + (h->size * a->hash_scale), 
95                orientation);
96    }
97  }
98  if (a->draw_hash_labels) {
99    comment("Drawing Hash Labels");
100    for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) {
101      a->hl->label = s->s->label;
102      if (a->is_x) {
103        a->hl->x = s->s->x;
104      } else {
105        a->hl->y = s->s->y;
106      }
107      draw_label(a->hl);
108    }
109  }
110  if (a->draw_axis_label) {
111    comment("Drawing Axis Label");
112    draw_label(a->label);
113  }
114  grestore();
115  printf("\n");
116}
117
118
119draw_label(l)
120Label l;
121{
122  if (l->label == CNULL) return;
123  comment(l->label);
124  print_label(l);
125}
126
127set_clip(g)
128Graph g;
129{
130  comment("Setting Clip");
131  printf("newpath\n");
132  printf(" 0 0 moveto 0 %f lineto %f %f lineto %f 0 lineto\n",
133           g->y_axis->psize, g->x_axis->psize,
134           g->y_axis->psize, g->x_axis->psize);
135  printf("  closepath clip newpath\n");
136}
137
138draw_curves(g)
139Graph g;
140{
141  Curve c;
142
143  gsave();
144  printf("\n");
145  if (g->clip) set_clip(g);
146  for(c = first(g->curves); c != nil(g->curves); c = next(c)) {
147    draw_curve(c, g);
148  }
149  grestore();
150  printf("\n");
151}
152
153draw_curve(c, g)
154Curve c;
155Graph g;
156{
157  Point p, px, py;
158  int i, j;
159  float this_x, this_y, last_x, last_y, x, y;
160
161  gsave();
162  setgray(c->graytype, c->gray);
163  if (c->clip) set_clip(g);
164  if (first(c->xepts) != nil(c->xepts) ||
165      first(c->yepts) != nil(c->yepts)) {
166    comment("Drawing Epts");
167    px = first(c->xepts);
168    py = first(c->yepts);
169    setlinewidth(c->linethick);
170    setlinestyle('s', (Flist)0);
171    for (p = first(c->pts); p != nil(c->pts); p = next(p)) {
172      if (p->e == 'x') {
173        x = ctop(p->x, g->x_axis);
174        y = ctop(p->y, g->y_axis);
175        print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x');
176        px = next(px);
177        print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x');
178        px = next(px);
179      } else if (p->e == 'y') {
180        x = ctop(p->x, g->x_axis);
181        y = ctop(p->y, g->y_axis);
182        print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y');
183        py = next(py);
184        print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y');
185        py = next(py);
186      }
187    }
188  }
189
190  comment("Drawing Curve");
191  if (c->linetype != '0' || c->poly) {
192    if (c->bezier) {
193      i = 0;
194      j = 0;
195      if (c->poly) printf("newpath ");
196      for (p = first(c->pts); p != nil(c->pts); p = next(p)) {
197        if (j == 0 && i == 0) {
198          start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c);
199          j++;
200        } else if (i != 0) {
201          bezier_control(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
202        } else {
203          bezier_end(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
204          j++;
205        }
206        if (!c->poly && j == 30 && i == 0) {
207          end_line();
208          p = prev(p);
209          j = 0;
210          i = 0;
211        } else i = (i + 1) % 3;
212      }
213      if (j != 0) {
214        if (c->poly) {
215          printf("closepath ");
216          setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg);
217        }
218        end_line();
219      }
220    } else {
221      i = 0;
222      if (c->poly) printf("newpath ");
223      for (p = first(c->pts);
224           p != nil(c->pts);
225           p = next(p)) {
226        if (i == 0) {
227          start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c);
228        } else {
229          cont_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis));
230        } 
231        if (!c->poly && i == 100 && next(p)) {
232          end_line();
233          p = prev(p);
234          i = 0;
235        } else i++;
236      }
237      if (i != 0) {
238        if (c->poly) {
239          printf("closepath ");
240          setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg);
241        }
242        end_line();
243      }
244    }
245  }
246  comment("Drawing Curve points");
247  i = 0;
248  for (p = first(c->pts);
249       p != nil(c->pts);
250       p = next(p)) {
251    this_x = ctop(p->x, g->x_axis);
252    this_y = ctop(p->y, g->y_axis);
253    if (!c->bezier || i == 0) draw_mark(this_x, this_y, c, g);
254    if (p != first(c->pts)) {
255      if (c->rarrows || (c->rarrow && p == last(c->pts))) {
256        if (!c->bezier || i == 0) 
257          draw_arrow(this_x, this_y, last_x, last_y, c);
258      }
259      if (c->larrows || (c->larrow && prev(p) == first(c->pts))) {
260        if (!c->bezier || i == 1) 
261          draw_arrow(last_x, last_y, this_x, this_y, c);
262      }
263    }
264    last_x = this_x; 
265    last_y = this_y; 
266    i = (i + 1) % 3;
267  }
268  grestore();
269  printf("\n");
270}
271
272draw_mark(x, y, c, g)
273float x, y;
274Curve c;
275Graph g;
276{
277  Point p;
278  float ms0, ms1, scx, scy, trx, try;
279  int i, j;
280  FILE *f;
281  char ch;
282  int done, newline;
283  char inp[100];
284  int bb[4];
285
286  if (c->marktype == 'n') return;
287  ms0 = c->marksize[0] / 2.0;
288  ms1 = c->marksize[1] / 2.0;
289
290  gsave();
291  printf(" %f %f translate %f rotate\n", x, y, c->mrotate);
292
293  switch (c->marktype) {
294    case 'n': break;
295    case 'E': if (c->eps == CNULL) break;
296              f = fopen(c->eps, "r");
297              if (f == NULL) {
298                fprintf(stderr, "Error: eps file %s couldn't be opened\n",
299                      c->eps);
300                exit(1);
301              }
302              /* Get bbox */
303              newline = 1;
304              done = 0;
305              while(!done) {
306                while(!newline) {
307                  ch = getc(f);
308                  if (ch == real_eof) {
309                    fprintf(stderr, "Error: Eps file '%s' has %s\n",
310                            c->eps, "no bounding box");
311                    exit(1);
312                  }
313                  newline = (ch == '\n');
314                }
315                fscanf(f, "%s", inp); 
316                if (strcmp(inp, "%%BoundingBox:") == 0) done = 1;
317              }
318              for (i = 0; i < 4; i++) {
319                if (fscanf(f, "%d", &(bb[i])) == NULL) {
320                  fprintf(stderr, "Error: Eps file '%s': eof in %s\n",
321                          c->eps, "bounding box");
322                  exit(1);
323                }
324              }
325              if (bb[2] - bb[0] == 0) {
326                scx = ms0;
327                trx = 0.0;
328              } else {
329                scx = ms0 * 2.0/(float)(bb[2] - bb[0]);
330                trx = -(float)(bb[2] - bb[0])/2.0 - bb[0];
331              }
332              if (bb[3] - bb[1] == 0) {
333                scy = ms1;
334                try = 0.0;
335              } else {
336                scy = ms1 * 2.0/(float)(bb[3] - bb[1]);
337                try = -(float)(bb[3] - bb[1])/2.0 - bb[1];
338              }
339              /* Don't scale if ms == 0 0 */
340              if (ms0 == 0.0 && ms1 == 0.0) {
341                scx = 1.0;
342                scy = 1.0;
343              }
344
345              sprintf(inp, "Including eps file %s", c->eps);
346              comment(inp);
347              /* Use bbox to scale and translate */
348               
349              printf("%f %f scale %f %f translate\n", scx, scy, trx, try);
350              /* Include the rest of the file */
351              for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch);
352              putchar('\n');
353              fclose(f);
354              break;
355    case 'p': if (c->postscript == CNULL) break;
356              if (ms0 != 0.0 || ms1 != 0.0) {
357                printf("%f %f scale\n", ms0, ms1);
358              }
359              if (!c->postfile) {
360                printf("%s\n", c->postscript);
361              } else {
362                f = fopen(c->postscript, "r");
363                if (f == NULL) {
364                  fprintf(stderr, 
365                          "Error: postscript file %s couldn't be opened\n",
366                          c->postscript);
367                  exit(1);
368                }
369                for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch);
370                putchar('\n');
371                fclose(f);
372              }
373              break;
374    case 'c': printline(-ms0, 0.0, ms0, 0.0, 'x');
375              printline(-ms1, 0.0, ms1, 0.0, 'y');
376              break;
377    case 'b': start_poly(-ms0, -ms1);
378              cont_poly(ms0, -ms1);
379              cont_poly(ms0, ms1);
380              cont_poly(-ms0, ms1);
381              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
382              break;
383    case 'd': start_poly(-ms0, 0.0);
384              cont_poly(0.0, -ms1);
385              cont_poly(ms0, 0.0);
386              cont_poly(0.0, ms1);
387              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
388              break;
389    case 'g': p = first(c->general_marks);
390              if (p == nil(c->general_marks)) break;
391              if (next(p) == nil(c->general_marks)) break;
392              start_poly(p->x*ms0, p->y*ms1);
393              for(p = next(p); p != nil(c->general_marks); p = next(p))
394                cont_poly(p->x*ms0, p->y*ms1);
395              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
396              break;
397    case 'G': i = 0;
398              for (p = first(c->general_marks);
399                   p != nil(c->general_marks);
400                   p = next(p)) {
401                if (i == 0) {
402                  printf("%f %f moveto ", p->x*ms0, p->y*ms1);
403                } else {
404                  printf("%f %f lineto\n", p->x*ms0, p->y*ms1);
405                }
406                if (i == 100) {
407                  printf("stroke\n");
408                  p = prev(p);
409                  i = 0;
410                } else i++;
411              }
412              if (i != 0) printf("stroke\n");
413              break;
414    case 'B': i = 0;
415              j = 0;
416              for (p = first(c->general_marks);
417                   p != nil(c->general_marks);
418                   p = next(p)) {
419                if (j == 0 && i == 0) {
420                  printf("%f %f moveto ", p->x*ms0, p->y*ms1);
421                  j++;
422                } else if (i != 0) {
423                  printf("%f %f ", p->x*ms0, p->y*ms1);
424                } else {
425                  printf("%f %f curveto\n", p->x*ms0, p->y*ms1);
426                  j++;
427                }
428                if (j == 30 && i == 0) {
429                  printf(" stroke\n");
430                  p = prev(p);
431                  j = 0;
432                  i = 0;
433                } else i = (i + 1) % 3;
434              }
435              if (j != 0) printf(" stroke\n");
436              if (! ((i == 1) || (i == 0 && j == 0))) {
437                fprintf(stderr, "Error: curve %d, %s\n", c->num,
438                        "wrong number of points for bezier marktype\n");
439                exit(1);
440              }
441              break;
442
443    case 'Z': i = 0;
444              j = 0;
445              for (p = first(c->general_marks);
446                   p != nil(c->general_marks);
447                   p = next(p)) {
448                if (i == 0 && j == 0) {
449                  printf("newpath %f %f moveto ", p->x*ms0, p->y*ms1);
450                  j++;
451                } else if (i != 0) {
452                  printf("%f %f ", p->x*ms0, p->y*ms1);
453                } else {
454                  printf("%f %f curveto\n", p->x*ms0, p->y*ms1);
455                }
456                i = (i + 1) % 3;
457              }
458              printf("closepath ");
459              setfill(x, y, c->filltype, c->fill, c->pattern, c->parg);
460              printf("stroke\n");
461
462              if (i != 1) {
463                fprintf(stderr, "Error: curve %d, %s\n", c->num,
464                        "wrong number of points for bezier marktype\n");
465                exit(1);
466              }
467              break;
468
469    case 'x': printline(-ms0, -ms1, ms0, ms1, 'x');
470              printline(-ms0, ms1, ms0, -ms1, 'x');
471              break;
472    case 'o': printellipse(x, y, ms0, ms0, 
473                           c->filltype, c->fill, c->pattern, c->parg);
474              break;
475    case 'e': printellipse(x, y, ms0, ms1,
476                           c->filltype, c->fill, c->pattern, c->parg);
477              break;
478    case 't': start_poly(ms0, -ms1);
479              cont_poly(0.0, ms1);
480              cont_poly(-ms0, -ms1);
481              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
482              break;
483    case 'X': start_poly(ms0, 0.0);
484              cont_poly(-ms0, 0.0);
485              cont_poly(-ms0, g->x_axis->draw_at - y);
486              cont_poly(ms0, g->x_axis->draw_at - y);
487              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
488              break;
489    case 'Y': start_poly(0.0, ms1);
490              cont_poly(0.0, -ms1);
491              cont_poly(g->y_axis->draw_at - x, -ms1);
492              cont_poly(g->y_axis->draw_at - x, ms1);
493              end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg);
494              break;
495    case 'l': draw_label(c->lmark);
496              break;
497    default: error_header(); 
498             fprintf(stderr, "Unknown mark: %c\n", c->marktype);
499             break;
500  }
501  grestore();
502}
503
504draw_arrow(x1, y1, x2, y2, c)
505float x1, y1, x2, y2;
506Curve c;
507{
508  float dx, dy;
509  float ms0;
510  float theta, ct, st;
511 
512 
513  if (c->marktype == 'o') {
514    dx = x1 - x2;
515    dy = y1 - y2;
516    if (dx == 0.0 && dy == 0.0) return;
517
518    ms0 = c->marksize[0] / 2.0;
519    if (dx == 0.0) theta = asin(1.0); else theta = atan(dy/dx);
520    if (theta < 0.0) theta = -theta;
521    ct = cos(theta)*ms0;
522    st = sin(theta)*ms0;
523    x1 = x1 + ct*(dx > 0.0 ? -1.0 : 1.0);
524    y1 = y1 + st*(dy > 0.0 ? -1.0 : 1.0);
525
526    if ( ((x1 - x2 > 0) != (dx > 0)) || 
527         ((y1 - y2 > 0) != (dy > 0)) ) return;
528  }
529
530  dx = x1 - x2;
531  dy = y1 - y2;
532  if (dx == 0.0 && dy == 0.0) return;
533
534  gsave();
535  printf("%f %f translate %f %f atan rotate\n", x1, y1, dy, dx);
536  start_poly(0.0, 0.0);
537  cont_poly(-(c->asize[0]), (c->asize[1]));
538  cont_poly(-(c->asize[0]), -(c->asize[1]));
539  end_poly(0.0, 0.0, c->afilltype, c->afill, c->apattern, c->aparg);
540  grestore();
541  printf("\n");
542}
543
544draw_legend(g)
545Graph g;
546{
547  Curve c;
548  Legend l;
549  float x, y;
550  char tmpmktype;
551
552  l = g->legend;
553  comment("Drawing legend");
554  if (l->type == 'n' || l->anylines < 0) return;
555  gsave();
556  if (l->type == 'u') {
557    printf("%f %f translate %f rotate\n", l->l->x, l->l->y, l->l->rotate);
558  }
559  for (c = first(g->curves); c != nil(g->curves); c = next(c)) {
560    if (c->l->label != CNULL) {
561      gsave();
562      setgray(c->graytype, c->gray);
563      y = (c->l->ymax + c->l->ymin) / 2.0;
564      if (l->anylines) {
565        if (c->linetype != '0' && l->linelength != 0) {
566          if (l->type == 'c' && c->l->hj == 'r') {
567            x = c->l->x + l->midspace;
568          } else {
569            x = c->l->x - l->midspace - l->linelength;
570          }
571          start_line(x, y, c); 
572          cont_line(x+l->linelength, y);
573          end_line();
574        }
575        tmpmktype = c->marktype;
576        c->marktype = 'n';
577        if (c->larrows || c->larrow) draw_arrow(x, y, x+l->linelength, y, c);
578        if (c->rarrows || c->rarrow) draw_arrow(x+l->linelength, y, x, y, c);
579        c->marktype = tmpmktype;
580        if (l->type == 'c' && c->l->hj == 'r') {
581          x = c->l->x + l->midspace + l->linelength / 2.0;
582        } else {
583          x = c->l->x - l->midspace - l->linelength / 2.0;
584        }
585      } else if (l->type == 'c' && c->l->hj == 'r') {
586        x = c->l->x + l->midspace;
587      } else {
588        x = c->l->x - l->midspace;
589      }
590      if (c->marktype == 'X' || c->marktype == 'Y') {
591        char old;
592        old = c->marktype;
593        c->marktype = 'b'; 
594        draw_mark(x, y, c, g); 
595        c->marktype = old;
596      } else {
597        draw_mark(x, y, c, g);
598      }
599      grestore();
600      printf("\n");
601      draw_label(c->l);
602    }
603  }
604  grestore();
605  printf("\n");
606}
607
608draw_strings(g)
609Graph g;
610{
611  String s;
612
613  comment("Drawing strings");
614  for (s = first(g->strings); s != nil(g->strings); s = next(s))
615    draw_label(s->s);
616}
617
618draw_graph(g)
619Graph g;
620{
621  comment("Drawing New Graph");
622  printf("%f %f translate\n", g->x_translate, g->y_translate);
623  if (g->border) {
624    printline(0.0, 0.0, 0.0, g->y_axis->psize, 'x');
625    printline(0.0, 0.0, 0.0, g->x_axis->psize, 'y');
626    printline(g->x_axis->psize, 0.0, g->x_axis->psize, g->y_axis->psize, 'x');
627    printline(g->y_axis->psize, 0.0, g->y_axis->psize, g->x_axis->psize, 'y');
628  }
629  draw_axis(g->x_axis, g->y_axis);
630  draw_axis(g->y_axis, g->x_axis);
631  draw_label(g->title);
632  draw_curves(g);
633  draw_legend(g);
634  draw_strings(g);
635  printf("%f %f translate\n", - g->x_translate, - g->y_translate);
636
637}
638
639draw_graphs(gs, pp, landscape)
640Graphs gs;
641int pp;
642int landscape;
643{
644  Graphs gs_p;
645  Graph g;
646  int page_counter=0;
647
648  for (gs_p = first(gs); gs_p != nil(gs); gs_p = next(gs_p)) {
649    page_counter++;
650    draw_header(gs_p, pp, landscape);
651    for (g = first(gs_p->g); g != nil(gs_p->g); g = next(g)) {
652      draw_graph(g);
653    }
654    draw_footer(gs_p, pp);
655  }
656  if (pp) {
657      printf("\n%%%%Trailer\n");
658      printf("%%%%Pages: %i\n",page_counter);
659      printf("%%%%EOF\n");
660  }
661}
662
663draw_header(gs, pp, landscape)
664Graphs gs;
665int pp;
666int landscape;
667{
668  FILE *f;
669  char c;
670
671  if (gs->page == 1) {
672      if (pp) {
673          printf("%%!PS-Adobe-3.0\n");
674          printf("%%%%Pages: (atend)\n");
675          printf("%%%%Creator: jgraph\n");
676          printf("%%%%EndComments\n\n");
677          printf("%%%%BeginProlog\n");
678          printf("%%%%EndProlog\n");
679          printf("%%%%BeginSetup\n");
680          printf("%%%%EndSetup\n");
681      } else {
682          printf("%%!PS-Adobe-2.0 EPSF-1.2\n");
683          printf("%%%%Creator: jgraph\n");
684      }
685  }
686
687  if (pp) {
688      printf("\n%%%%Page: %d %d\n", gs->page, gs->page);
689      printf("%%%%BeginPageSetup\n");
690      printf("%%%%EndPageSetup\n\n");
691  }
692
693  if ( (gs->page>1) && !pp ) {
694      /* tring EPS with more than one page */
695      fprintf(stderr, "Error: 'newpage' token is not allowed"
696              " without '-P' command line option.\n");
697      exit(1);
698  }
699
700  /* if (landscape) {
701      printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[1], gs->bb[0],
702             gs->bb[3], gs->bb[2]);
703  } else {
704      printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[0], gs->bb[1],
705             gs->bb[2], gs->bb[3]);
706  }
707  printf("%%%%EndComments\n"); */
708
709  //BEGIN added by pzn@debian.org
710  { // expands the bounding box to fit characters with tilde, acute,...
711    // if user has set JGRAPH_BORDER enviroment variable
712    int expandborder=0;
713    char *s;                          \
714    s=(char *)getenv("JGRAPH_BORDER");
715    if (s!=NULL) {
716        expandborder=atoi(s);
717    }
718   if (!pp) {
719    if (landscape) {
720      printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[1]-expandborder,
721             gs->bb[0]-expandborder, gs->bb[3]+expandborder,
722             gs->bb[2]+expandborder);
723    } else {
724      printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[0]-expandborder,
725             gs->bb[1]-expandborder, gs->bb[2]+expandborder,
726             gs->bb[3]+expandborder);
727    }
728    printf("%%%%EndComments\n\n");
729   }
730  }
731
732  if (gs->page==1)
733  //reencode fonts to ISOLatin1 or other
734  {   //NOTE: this is a preliminary version. It will only work with
735      //      the default fonts, that are Times-Roman and Times-Bold
736      // "export JGRAPH_ENCODING=ISOLatin1Encoding" will work in sh
737      char *s;                          \
738      s=(char *)getenv("JGRAPH_ENCODING");
739      if ((s!=NULL) && (strlen(s)>0)) {
740          comment("Setting font encoding by pzn@debian.org");
741          printf("/Times-Bold findfont\n");
742          printf("dup length dict begin\n");
743          printf(" {1 index /FID ne {def} {pop pop} ifelse} forall\n");
744          printf(" /Encoding %s def\n",s);
745          printf(" currentdict\n");
746          printf("end\n");
747          printf("/Times-Bold exch definefont pop\n");
748          printf("/Times-Roman findfont\n");
749          printf("dup length dict begin\n");
750          printf(" {1 index /FID ne {def} {pop pop} ifelse} forall\n");
751          printf(" /Encoding %s def\n",s);
752          printf(" currentdict\n");
753          printf("end\n");
754          printf("/Times-Roman exch definefont pop\n");
755          comment("End of font encoding");
756          printf("\n");
757      }
758  }
759  //END added by pzn
760
761  if (landscape) {
762    printf("-90 rotate\n");
763  }
764  if (pp) {
765    if (landscape) {
766      printf("%f 0 translate\n", -(11.0 * FCPI));
767      printf("%f %f translate\n",
768        (((11.0 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0],     
769        (((8.5 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]);     
770    } else {
771      printf("%f %f translate\n",
772        (((8.5 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0],     
773        (((11.0 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]);     
774    }
775  } else if (landscape) {
776    printf("%f 0 translate\n", -gs->bb[2] - gs->bb[0]);
777  }
778  printf("1 setlinecap 1 setlinejoin\n");
779  printf("0.700 setlinewidth\n");
780  printf("0.00 setgray\n");
781
782  printf("\n");
783  printf("/Jrnd { exch cvi exch cvi dup 3 1 roll idiv mul } def\n");
784
785  printf("/JDEdict 8 dict def\n");
786  printf("JDEdict /mtrx matrix put\n");
787  printf("/JDE {\n");
788  printf("  JDEdict begin\n");
789  printf("  /yrad exch def\n");
790  printf("  /xrad exch def\n");
791  printf("  /savematrix mtrx currentmatrix def\n");
792  printf("  xrad yrad scale\n");
793  printf("  0 0 1 0 360 arc\n");
794  printf("  savematrix setmatrix\n");
795  printf("  end\n");
796  printf("} def\n");
797
798  printf("/JSTR {\n");
799  printf("  gsave 1 eq { gsave 1 setgray fill grestore } if\n");
800  printf("    exch neg exch neg translate \n");
801  printf("    clip                        \n");
802  printf("    rotate                      \n");
803  printf("    4 dict begin\n");
804  printf("      pathbbox  /&top exch def\n");
805  printf("                /&right exch def\n");
806  printf("                /&bottom exch def\n");
807  printf("                &right sub /&width exch def\n");
808  printf("      newpath\n");
809  printf("      currentlinewidth mul round dup               \n");
810  printf("      &bottom exch Jrnd exch &top             \n");
811  printf("      4 -1 roll currentlinewidth mul setlinewidth  \n");
812  printf("      { &right exch moveto &width 0 rlineto stroke } for    \n");
813  printf("    end\n");
814  printf("  grestore\n");
815  printf("  newpath\n");
816  printf("} bind def\n");
817
818  gsave();
819  setfont("Times-Roman", 9.00);
820  if (gs->preamble != CNULL) {
821    if (gs->prefile) {
822      f = fopen(gs->preamble, "r");
823      if (f == NULL) {
824        fprintf(stderr, "Error: preamble file %s couldn't be opened\n",
825                gs->preamble);
826        exit(1);
827      }
828      for (c = getc(f); c != real_eof; c = getc(f)) putchar(c);
829      putchar('\n');
830      fclose(f);
831    } else {
832      printf("%s\n", gs->preamble);
833    }
834  }
835}
836
837draw_footer(gs, pp)
838Graphs gs;
839int pp;
840{
841  FILE *f;
842  char c;
843
844  if (gs->epilogue != CNULL) {
845    if (gs->epifile) {
846      f = fopen(gs->epilogue, "r");
847      if (f == NULL) {
848        fprintf(stderr, "Error: epilogue file %s couldn't be opened\n",
849                gs->epilogue);
850        exit(1);
851      }
852      for (c = getc(f); c != real_eof; c = getc(f)) putchar(c);
853      putchar('\n');
854      fclose(f);
855    } else {
856      printf("%s\n", gs->epilogue);
857    }
858  }
859  grestore();
860  if (pp) printf("showpage\n"); else printf("\n");
861
862  if (pp) {
863      printf("%%%%PageTrailer\n");
864  }
865
866}
867
Note: See TracBrowser for help on using the repository browser.