void circle(double x, double y, double r) { move(x-r, y); hvflush(); printf("\\D'c%.3fi'\n", xsc(2 * r)); flyback(); }
void fillstart(double v) /* this works only for postscript, obviously. */ { /* uses drechsler's dpost conventions... */ hvflush(); printf("\\X'BeginObject %g setgray'\n", v); lastgray = v; flyback(); }
void dot(void) { hvflush(); /* what character to draw here depends on what's available. */ /* on the 202, l. is good but small. */ /* in general, use a smaller, shifted period and hope */ printf("\\&\\f1\\h'-.1m'\\v'.03m'\\s-3.\\s+3\\fP\n"); flyback(); }
void arc(double x, double y, double x0, double y0, double x1, double y1) /* draw arc with center x,y */ { move(x0, y0); hvflush(); printf("\\D'a%.3fi %.3fi %.3fi %.3fi'\n", xsc(x-x0), -ysc(y-y0), xsc(x1-x), -ysc(y1-y)); /* WATCH SIGNS */ flyback(); }
void fillend(int vis, int fill __unused) { hvflush(); printf("\\X'EndObject gsave eofill grestore %g setgray %s'\n", !vis ? lastgray : 0.0, vis ? "stroke" : ""); /* for dashed: [50] 0 setdash just before stroke. */ lastgray = 0; flyback(); }
void ellipse(double x, double y, double r1, double r2) { double ir1, ir2; move(x-r1, y); hvflush(); ir1 = xsc(r1); ir2 = ysc(r2); printf("\\D'e%.3fi %.3fi'\n", 2 * ir1, 2 * fabs(ir2)); flyback(); }
void cont(double x, double y) /* continue line from here to x,y */ { double h1, v1; double dh, dv; h1 = xconv(x); v1 = yconv(y); dh = h1 - hpos; dv = v1 - vpos; hvflush(); printf("\\D'l%.3fi %.3fi'\n", dh, dv); flyback(); /* expensive */ hpos = h1; vpos = v1; }
void spline(double x, double y, double n, ofloat *p, int dashed __unused, double ddval __unused) { int i; double dx, dy; double xerr, yerr; move(x, y); hvflush(); xerr = yerr = 0.0; printf("\\D'~"); for (i = 0; i < 2 * n; i += 2) { dx = xsc(xerr += p[i]); xerr -= dx/xscale; dy = ysc(yerr += p[i+1]); yerr -= dy/yscale; printf(" %.3fi %.3fi", dx, -dy); /* WATCH SIGN */ } printf("'\n"); flyback(); }
void label(char *s, int t, int nh) /* text s of type t nh half-lines up */ { int q; char *p; if (!s) return; hvflush(); dprintf("label: %s %o %d\n", s, t, nh); printf("%s", textshift); /* shift down and left */ if (t & ABOVE) nh++; else if (t & BELOW) nh--; if (nh) printf("\\v'%du*\\n(.vu/2u'", -nh); /* just in case the text contains a quote: */ q = 0; for (p = s; *p; p++) if (*p == '\'') { q = 1; break; } t &= ~(ABOVE|BELOW); if (t & LJUST) { printf("%s", s); } else if (t & RJUST) { if (q) printf("\\h\\(ts-\\w\\(ts%s\\(tsu\\(ts%s", s, s); else printf("\\h'-\\w'%s'u'%s", s, s); } else { /* CENTER */ if (q) printf("\\h\\(ts-\\w\\(ts%s\\(tsu/2u\\(ts%s", s, s); else printf("\\h'-\\w'%s'u/2u'%s", s, s); } printf("\n"); flyback(); }
void cont(double x, double y) /* continue line from here to x,y */ { double h1, v1; double dh, dv; int rh = 0; h1 = xconv(x); v1 = yconv(y); dh = h1 - hpos; dv = v1 - vpos; if (dh > 0 && !dv) { rh = 1; move(x, y); dh = -dh; } hvflush(); printf("\\D'l%.3fi %.3fi'\n", dh, dv); if (rh) move(x, y); flyback(); /* expensive */ hpos = h1; vpos = v1; }