void HGPrintElt(ELT *element, int /* baseline */) { register POINT *p1; register POINT *p2; register int length; register int graylevel; if (!DBNullelt(element) && !Nullpoint((p1 = element->ptlist))) { /* p1 always has first point */ if (TEXT(element->type)) { HGSetFont(element->brushf, element->size); switch (element->size) { case 1: p1->y += adj1; break; case 2: p1->y += adj2; break; case 3: p1->y += adj3; break; case 4: p1->y += adj4; break; default: break; } HGPutText(element->type, *p1, element->textpt); } else { if (element->brushf) /* if there is a brush, the */ HGSetBrush(element->brushf); /* graphics need it set */ switch (element->type) { case ARC: p2 = PTNextPoint(p1); tmove(p2); doarc(*p1, *p2, element->size); cr(); break; case CURVE: length = 0; /* keep track of line length */ drawwig(p1, CURVE); cr(); break; case BSPLINE: length = 0; /* keep track of line length */ drawwig(p1, BSPLINE); cr(); break; case VECTOR: length = 0; /* keep track of line length so */ tmove(p1); /* single lines don't get long */ while (!Nullpoint((p1 = PTNextPoint(p1)))) { HGtline((int) (p1->x * troffscale), (int) (p1->y * troffscale)); if (length++ > LINELENGTH) { length = 0; printf("\\\n"); } } /* end while */ cr(); break; case POLYGON: { /* brushf = style of outline; size = color of fill: * on first pass (polyfill=FILL), do the interior using 'P' * unless size=0 * on second pass (polyfill=OUTLINE), do the outline using a series * of vectors. It might make more sense to use \D'p ...', * but there is no uniform way to specify a 'fill character' * that prints as 'no fill' on all output devices (and * stipple fonts). * If polyfill=BOTH, just use the \D'p ...' command. */ double firstx = p1->x; double firsty = p1->y; length = 0; /* keep track of line length so */ /* single lines don't get long */ if (polyfill == FILL || polyfill == BOTH) { /* do the interior */ char command = (polyfill == BOTH && element->brushf) ? 'p' : 'P'; /* include outline, if there is one and */ /* the -p flag was set */ /* switch based on what gremlin gives */ switch (element->size) { case 1: graylevel = 1; break; case 3: graylevel = 2; break; case 12: graylevel = 3; break; case 14: graylevel = 4; break; case 16: graylevel = 5; break; case 19: graylevel = 6; break; case 21: graylevel = 7; break; case 23: graylevel = 8; break; default: /* who's giving something else? */ graylevel = NSTIPPLES; break; } /* int graylevel = element->size; */ if (graylevel < 0) break; if (graylevel > NSTIPPLES) graylevel = NSTIPPLES; printf("\\D'Fg %.3f'", double(1000 - stipple_index[graylevel]) / 1000.0); cr(); tmove(p1); printf("\\D'%c", command); while (!Nullpoint((PTNextPoint(p1)))) { p1 = PTNextPoint(p1); deltax((double) p1->x); deltay((double) p1->y); if (length++ > LINELENGTH) { length = 0; printf("\\\n"); } } /* end while */ /* close polygon if not done so by user */ if ((firstx != p1->x) || (firsty != p1->y)) { deltax((double) firstx); deltay((double) firsty); } putchar('\''); cr(); break; } /* else polyfill == OUTLINE; only draw the outline */ if (!(element->brushf)) break; length = 0; /* keep track of line length */ tmove(p1); while (!Nullpoint((PTNextPoint(p1)))) { p1 = PTNextPoint(p1); HGtline((int) (p1->x * troffscale), (int) (p1->y * troffscale)); if (length++ > LINELENGTH) { length = 0; printf("\\\n"); } } /* end while */ /* close polygon if not done so by user */ if ((firstx != p1->x) || (firsty != p1->y)) { HGtline((int) (firstx * troffscale), (int) (firsty * troffscale)); } cr(); break; } /* end case POLYGON */ } /* end switch */ } /* end else Text */ } /* end if */ } /* end PrintElt */
void conv(register FILE *fp) { register int c, k; int m, n, n1, m1; char str[4096], buf[4096]; while ((c = getc(fp)) != EOF) { switch (c) { case '\n': /* when input is text */ case ' ': case 0: /* occasional noise creeps in */ break; case '{': /* push down current environment */ t_push(); break; case '}': t_pop(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* two motion digits plus a character */ hmot((c-'0')*10 + getc(fp)-'0'); put1(getc(fp)); break; case 'c': /* single ascii character */ put1(getc(fp)); break; case 'C': sget(str, sizeof str, fp); put1s(str); break; case 't': /* straight text */ fgets(buf, sizeof(buf), fp); t_text(buf); break; case 'D': /* draw function */ fgets(buf, sizeof(buf), fp); switch (buf[0]) { case 'l': /* draw a line */ sscanf(buf+1, "%d %d", &n, &m); drawline(n, m, "."); break; case 'c': /* circle */ sscanf(buf+1, "%d", &n); drawcirc(n); break; case 'e': /* ellipse */ sscanf(buf+1, "%d %d", &m, &n); drawellip(m, n); break; case 'a': /* arc */ sscanf(buf+1, "%d %d %d %d", &n, &m, &n1, &m1); drawarc(n, m, n1, m1); break; case '~': /* wiggly line */ drawwig(buf+1); break; default: error(FATAL, "unknown drawing function %s\n", buf); break; } break; case 's': fscanf(fp, "%d", &n); if (n == -23) { float f; fscanf(fp, "%f", &f); setsize(f); } else setsize(t_size(n));/* ignore fractional sizes */ break; case 'f': sget(str, sizeof str, fp); setfont(t_font(str)); break; case 'H': /* absolute horizontal motion */ /* fscanf(fp, "%d", &n); */ while ((c = getc(fp)) == ' ') ; k = 0; do { k = 10 * k + c - '0'; } while (isdigit(c = getc(fp))); ungetc(c, fp); hgoto(k); break; case 'h': /* relative horizontal motion */ /* fscanf(fp, "%d", &n); */ while ((c = getc(fp)) == ' ') ; k = 0; do { k = 10 * k + c - '0'; } while (isdigit(c = getc(fp))); ungetc(c, fp); hmot(k); break; case 'w': /* word space */ putc(' ', stdout); break; case 'V': fscanf(fp, "%d", &n); vgoto(n); break; case 'v': fscanf(fp, "%d", &n); vmot(n); break; case 'p': /* new page */ fscanf(fp, "%d", &n); t_page(n); break; case 'n': /* end of line */ while (getc(fp) != '\n') ; t_newline(); break; case '#': /* comment */ while (getc(fp) != '\n') ; break; case 'x': /* device control */ devcntrl(fp); break; default: error(!FATAL, "unknown input character %o %c\n", c, c); done(); } } }