| /* replacement for pltroff.c to produce a TeX file that makes a box */ |
| |
| #include <stdio.h> |
| #include <math.h> |
| #include "pic.h" |
| |
| double rangex, rangey; /* probably already available inside pic somewhere */ |
| extern int dbg; |
| int frameno; |
| |
| /*-----------copied from old version----------*/ |
| |
| void |
| arrow(double x0, double y0, double x1, double y1, double w, double h, double ang, int nhead) /* draw arrow (without shaft) */ |
| /* head wid w, len h, rotated ang */ |
| /* and drawn with nhead lines */ |
| { |
| double alpha, rot, drot, hyp; |
| float dx, dy; |
| int i; |
| |
| rot = atan2(w / 2, h); |
| hyp = sqrt(w/2 * w/2 + h * h); |
| alpha = atan2(y1-y0, x1-x0) + ang; |
| if (nhead < 2) |
| nhead = 2; |
| for (i = nhead-1; i >= 0; i--) { |
| drot = 2 * rot / (double) (nhead-1) * (double) i; |
| dx = hyp * cos(alpha + PI - rot + drot); |
| dy = hyp * sin(alpha + PI - rot + drot); |
| line(x1+dx, y1+dy, x1, y1); |
| } |
| } |
| |
| |
| /*-----------new code----------*/ |
| |
| void |
| printlf(int line, char *name) |
| { |
| } |
| |
| void |
| fillstart(double v) /* only choose black, light grey (.75), or white, for now */ |
| { |
| if (v<.05) |
| fprintf(TEXFILE, " \\special{bk}%%\n"); |
| else if (v>.95) |
| fprintf(TEXFILE, " \\special{wh}%%\n"); |
| else |
| fprintf(TEXFILE, " \\special{sh}%%\n"); |
| } |
| |
| void |
| fillend(void) |
| { |
| } |
| |
| void |
| troff(char *s) |
| { |
| int size; |
| |
| if (strncmp(s, ".ps", 3) == 0) { |
| if (sscanf(&s[3], " %d ", &size) > 0) { |
| fprintf(TEXFILE, " \\special{pn %d}%%\n", size); |
| e1->pdiam = size; |
| } else fprintf(stderr, "Malformed .ps command: %s\n", s); |
| } |
| } |
| |
| |
| void |
| space(double x0, double y0, double x1, double y1) /* set limits of page */ |
| { |
| e0->sidex = e1->sidex = deltx*1000; |
| e0->sidey = e1->sidey = e0->bottom = e1->bottom = delty*1000; |
| range(x0, y0, x1, y1); |
| } |
| |
| void |
| dot(void) |
| { |
| /* use .005" radius at nominal 9pt pen size */ |
| disc(e1->copyx,e1->copyy,(e1->pdiam/9.0)*(4.3/e1->scalex)); |
| } |
| |
| void |
| label(char *s, int t, int nh) /* text s of type t nh half-lines up */ |
| { |
| double nem; |
| |
| if (t & ABOVE) |
| nh++; |
| else if (t & BELOW) |
| nh--; |
| nem = .2 - nh*.6; |
| fprintf(TEXFILE," \\rlap{\\kern %6.3fin\\lower%6.3fin\\hbox{\\lower%5.2fem\\hbox to 0pt{", |
| INCHES(DTRX(e1->copyx)), INCHES(DTRY(e1->copyy)), nem); |
| fprintf(TEXFILE,t&LJUST?"%s\\hss":(t&RJUST?"\\hss %s":"\\hss %s\\hss"),s); |
| fprintf(TEXFILE,"}}}%%\n"); |
| } |
| |
| void |
| spline(double x, double y, double/*sic*/ n, float *p, int dashed, double ddval) |
| { |
| int k, j; |
| |
| fprintf(TEXFILE," \\special{pa %d %d}%%\n",TRX(x),TRY(y)); |
| for(k=0, j=0; k<n; k++, j+=2){ |
| x += p[j]; |
| y += p[j+1]; |
| fprintf(TEXFILE," \\special{pa %d %d}%%\n",TRX(x),TRY(y)); |
| } |
| fprintf(TEXFILE," \\special{sp}%%\n"); |
| } |
| |
| void |
| ellipse(double x, double y, double r1, double r2) |
| { |
| fprintf(TEXFILE, " \\special{ar %d %d %d %d 0.0 6.2832}%%\n", |
| TRX(x), TRY(y), SCX(r1), -SCY(r2)); |
| } |
| |
| void |
| arc(double xc, double yc, double x0, double y0, double x1, double y1) /* draw arc with center xc,yc */ |
| { |
| devarc(x0, y0, x1, y1, xc, yc, 1 ); /* radius=1 means counterclockwise */ |
| } |
| |
| /* If NOEXPANDDASH is defined, use this instead of the normal dotline |
| * in print(). This dotline relies on vec() noticing that e1->pen |
| * is not SOLIDPEN, and putting out a call to a different postscript |
| * routine. |
| */ |
| #ifdef NOEXPANDDASH |
| |
| void |
| dotline(double x0, double y0, double x1, double y1, int ddtype, double ddval) |
| { |
| if (ddval != 0) |
| e1->dashlen = ddval; |
| e1->pen = (ddtype&DOTBIT)? DOTPEN : DASHPEN; |
| move(x0, y0); |
| vec(x1, y1); |
| e1->pen = SOLIDPEN; |
| e1->dashlen = e0->dashlen; |
| } |
| #endif |