#include "misc.h" #include "iisfv.h" static char iisbuf[512]; /* One line buffer */ mkbox (ppos, window) int ppos[2]; int window; { int color, rec[4]; rec[0] = ppos[0]; rec[1] = ppos[1]; rec[2] = ppos[0] + 250; rec[3] = ppos[1] + 260; switch (iisdev) { case 1: case 2: color = 255; break; case 3: color = 204; } iisrct (window, rec, color); return (0); } nfont (letters, size, xpos, ypos, orient, window) char letters[100]; float size; int xpos; int ypos; char orient; int window; { int i, j, k; int color, xposi, yposi, rct[4]; #include "iisfonts.h" switch (iisdev) { case 1: case 2: color = 255; break; case 3: color = 204; } switch (orient) { case 'h': /* horizontal */ xposi = (.875 * size); yposi = 0; break; case 'v': /* vertical */ xposi = 0; yposi = (1.375 * size); break; case 'u': /* diagnol upwards */ xposi = (.875 * size); yposi = -(1.375 * size); break; case 'd': /* diagnol down */ xposi = (.875 * size); yposi = (1.375 * size); break; default: /* horizontal */ xposi = (.875 * size); yposi = 0; break; } for (i = 0; letters[i] != '\0'; i++) { j = letters[i]; if (xpos >= (iisxsize - xposi)) xpos = 0; if (ypos >= (iisysize - yposi)) ypos = 0; for (k = font1[j][0]; k < font1[j][1]; k += 4) { rct[0] = (font2[k] * size) + xpos; rct[1] = (font2[k+1] * size) + ypos; rct[2] = (font2[k+2] * size) + xpos; rct[3] = (font2[k+3] * size) + ypos; iisvec (window, rct, color); } xpos += xposi; ypos += yposi; } } /* Contributed from Bell Labs: Untested */ mktics (cur0, smallest, scalefactor, sfactor, ppos, window) int cur0; float smallest; float scalefactor; float sfactor; int ppos[2]; int window; { int i, j, offset, xpos, ypos, ivalue, rct[4], mv, color; char cvalue[10]; float deltadata, datab, dataa, fvalue; int deltatic, yoffset; switch (iisdev) { case 1: case 2: color = 255; break; case 3: color = 204; } for (i = 1; i < 25; i++) { xpos = ppos[0] + (i * 10); rct[0] = rct[2] = xpos; rct[1] = ppos[1] + 260 - 2; rct[3] = ppos[1] + 260; iisvec (window, rct, color); } for (i = 1; i < 25; i++) { xpos = ppos[0] + (i * 10); rct[0] = rct[2] = xpos; rct[1] = ppos[1]; rct[3] = ppos[1] + 2; iisvec (window, rct, color); } offset = (5 * ((int) ((cur0 / 5.) + 1) - 1)) - cur0; if (offset < 0) offset += 5; xpos = ppos[0] + (offset * 10); ivalue = cur0 + offset; for (i = 1; i < 6; i++) { sprintf (cvalue, "%d", ivalue); if (ivalue < 100) mv = 6; else mv = 9; rct[0] = rct[2] = xpos; rct[1] = ppos[1] + 260 - 5; rct[3] = ppos[1] + 260; iisvec (window, rct, color); rct[1] = ppos[1]; rct[3] = ppos[1] + 5; iisvec (window, rct, color); nfont (cvalue, 6.0, xpos - mv, ppos[1] + 260 + 3, 'h', window); xpos += 50; ivalue += 5; } rct[0] = rct[2] = ppos[0] + 120; rct[1] = ppos[1] + 250; rct[3] = ppos[1] + 260; iisvec (window, rct, color); rct[1] = ppos[1]; rct[3] = ppos[1] + 10; iisvec (window, rct, color); dataa = ((float) (ppos[1] + 250 + smallest - (ppos[1] + 260)) / scalefactor) - sfactor; datab = ((float) (ppos[1] + 250 + smallest - ppos[1]) / scalefactor) - sfactor; deltadata = datab - dataa; deltatic = (int) (deltadata / 5.); deltatic = ((int) ((float) (deltatic + 5) / 10.) * 10); yoffset = (deltatic * ((int) (((int) dataa / deltatic) + 1) - 1)) - (int) dataa; if (yoffset < 0) yoffset += deltatic; fvalue = dataa + (float) yoffset; ypos = ppos[1] + 250 - (int) ((fvalue + sfactor) * scalefactor) + smallest; for (i = 1; i < 6; i++) { sprintf (cvalue, "%d", (int) fvalue); mv = 0; if ((fvalue < 100.) && (fvalue > -100.)) mv = 0; else if ((fvalue < 1000.) && (fvalue > -1000.)) mv = 6; else if ((fvalue < 10000.) && (fvalue > -10000.)) mv = 12; else mv = 18; if (fvalue < 0.) mv += 6; rct[1] = rct[3] = ypos; rct[0] = ppos[0]; rct[2] = ppos[0] + 5; iisvec (window, rct, color); rct[0] = ppos[0] + 250 - 5; rct[2] = ppos[0] + 250; iisvec (window, rct, color); nfont (cvalue, 6.0, ppos[0] - 15 - mv, ypos - 3, 'h', window); ypos -= 50; fvalue += (float) deltatic; } } /*Write text at x and y and return x position of the next print character*/ iistxt (window, X, Y, text) int X, Y; char *text; int window; { /* if (font == NULL) { fprintf (stderr, "iistxt: Font is undefined\n"); return (X); } int x, y; int i, j, k, l, m, H, W, chars; char *c; chars = strlen (text); x = X; y = Y; for (i = 0; i < chars; i++) switch (text[i]) { case ' ': x += fonthdr.maxx; break; case '\n': x = X; y += fonthdr.maxy; break; default: if ((j = text[i]) > 255) break; c = font + j * fontsize; H = disptable[j].up + disptable[j].down; W = disptable[j].left + disptable[j].right; for (k = 0, l = y + disptable[j].left, m = x - disptable[j].up; k < W; k++, c += H, l--) iisline (window, m, l, H, c); x += disptable[j].width; } return (x); */ } /*Load vfont*/ iisfont (s, bright) char *s; int bright; /* Brightness of font */ { int i, j, k, fbase, H, W, WB, maxx, maxy; FILE *fd; char s1[30]; char charbits[4000], *pchar; /* sprintf (s1, "/usr/lib/vfont/%s", s); if ((fd = fopen (s1, FOPEN_RO)) == NULL) { if ((fd = fopen (s, FOPEN_RO)) == NULL) { fprintf (stderr, "iisfont: Can't find font %s\n", s); return (1); } } if (fread (&fonthdr, sizeof fonthdr, 1, fd) != 1) { fprintf (stderr, "iisfont: Bad font header in %s\n", s); return (1); } if (fread (&disptable[0], sizeof disptable, 1, fd) != 1) { fprintf (stderr, "iisfont: Bad dispatch table in %s\n", s); return (1); } fontsize = fonthdr.maxx * fonthdr.maxy; font = (char *) calloc (256, fontsize); fbase = sizeof fonthdr + sizeof disptable; maxx = maxy = 0; for (i = 0; i < 256; i++) { if (disptable[i].nbytes != 0) { fseek (fd, fbase + disptable[i].addr, 0); fread (charbits, (int) disptable[i].nbytes, 1, fd); H = disptable[i].up + disptable[i].down; W = disptable[i].left + disptable[i].right; if (maxx < W) maxx = W; if (maxy < H) maxy = H; WB = (W + 7) / 8; pchar = font + i * fontsize; for (k = 0; k < H; k++) for (j = 0; j < W; j++) *(pchar + H * j + k) = (bright * fbit (k, j, charbits, H, WB)) & 0377; } } fonthdr.maxx = maxx; fonthdr.maxy = maxy; fclose (fd); */ return (0); } int fbit (row, col, charbits, H, WB) int row, col; char *charbits; int H, WB; { int thisbyte, thisbit, ret; if (row >= H) return 0; thisbyte = charbits[row * WB + (col >> 3)] & 0xff; thisbit = 0x80 >> (col & 7); ret = thisbyte & thisbit; return (ret != 0); } /*Draw a point*/ iispnt (window, x, y, bright) int x, y; int bright; int window; { iisbuf[0] = bright; iisline (window, x, y, 1, iisbuf); } /*Draw a rectangle*/ iisrct (window, rct, bright) int rct[4]; int bright; int window; { int v[4]; v[0] = v[2] = rct[0]; v[1] = rct[1]; v[3] = rct[3]; iisvec (window, v, bright); v[1] = v[3] = rct[1]; v[0] = rct[0]; v[2] = rct[2]; iisvec (window, v, bright); v[0] = v[2] = rct[2]; v[1] = rct[1]; v[3] = rct[3]; iisvec (window, v, bright); v[1] = v[3] = rct[3]; v[0] = rct[0]; v[2] = rct[2]; iisvec (window, v, bright); } /*Draw a vector*/ iisvec (window, v, bright) int v[4]; int bright; int window; { register int x, y; int dx, dy; float m; dx = v[2] - v[0]; dy = v[3] - v[1]; iisbuf[0] = bright; if ((dx == 0) && (dy == 0)) iisline (window, v[0], v[1], 1, iisbuf); else if (abs (dx) >= abs (dy)) { m = (float) dy / dx; if (dx < 0) { for (x = v[2]; x <= v[0]; x++) { y = m * (x - v[2]) + v[3] +.5; iisline (window, x, y, 1, iisbuf); } } else { for (x = v[0]; x <= v[2]; x++) { y = m * (x - v[0]) + v[1] +.5; iisline (window, x, y, 1, iisbuf); } } } else { m = (float) dx / dy; if (dy < 0) { for (y = v[3]; y <= v[1]; y++) { x = m * (y - v[3]) + v[2] +.5; iisline (window, x, y, 1, iisbuf); } } else { for (y = v[1]; y <= v[3]; y++) { x = m * (y - v[1]) + v[0] +.5; iisline (window, x, y, 1, iisbuf); } } } }