Annotation of 3BSD/cmd/plot/vplot.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Reads standard graphics input
                      3:  * Makes a plot on a 200 dot-per-inch 11" wide
                      4:  * Versatek plotter.
                      5:  *
                      6:  * Creates and leaves /usr/tmp/raster (1000 blocks)
                      7:  * which is the bitmap
                      8:  */
                      9: #include "stdio.h"
                     10: #include <signal.h>
                     11: 
                     12: #define        NB      88
                     13: #define BSIZ   512
                     14: #define        mapx(x) ((1536*((x)-botx)/del)+centx)
                     15: #define        mapy(y) ((1536*(del-(y)+boty)/del)-centy)
                     16: #define SOLID -1
                     17: #define DOTTED 014
                     18: #define SHORTDASHED 034
                     19: #define DOTDASHED 054
                     20: #define LONGDASHED 074
                     21: #define        SETSTATE        (('v'<<8)+1)
                     22: 
                     23: int    linmod  = SOLID;
                     24: int    again;
                     25: int    done1;
                     26: char   chrtab[][16];
                     27: int    plotcom[]       = { 0200, 0, 0};
                     28: int    eotcom[]                = { 0210, 0, 0};
                     29: char   blocks  [NB][BSIZ];
                     30: int    obuf[264];
                     31: int    lastx;
                     32: int    lasty;
                     33: double topx    = 1536;
                     34: double topy    = 1536;
                     35: double botx    = 0;
                     36: double boty    = 0;
                     37: int    centx;
                     38: int    centy;
                     39: double delx    = 1536;
                     40: double dely    = 1536;
                     41: double del     = 1536;
                     42: 
                     43: struct buf {
                     44:        int     bno;
                     45:        char    *block;
                     46: };
                     47: struct buf     bufs[NB];
                     48: 
                     49: int    in, out;
                     50: char *picture = "/usr/tmp/raster";
                     51: 
                     52: main(argc, argv)
                     53: char **argv;
                     54: {
                     55:        extern int onintr();
                     56:        register i;
                     57: 
                     58:        if (argc>1) {
                     59:                in = open(argv[1], 0);
                     60:                putpict();
                     61:                exit(0);
                     62:        }
                     63:        signal(SIGTERM, onintr);
                     64:        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                     65:                signal(SIGINT, onintr);
                     66: another:
                     67:        for (i=0; i<NB; i++) {
                     68:                bufs[i].bno = -1;
                     69:                bufs[i].block = blocks[i];
                     70:        }
                     71:        out = creat(picture, 0666);
                     72:        in = open(picture, 0);
                     73:        zseek(out, 32*32);
                     74:        write(out, blocks[0], BSIZ);
                     75: /*delete following code when filsys deals properly with
                     76: holes in files*/
                     77:        for(i=0;i<512;i++)
                     78:                blocks[0][i] = 0;
                     79:        zseek(out, 0);
                     80:        for(i=0;i<32*32;i++)
                     81:                write(out,blocks[0],512);
                     82: /**/
                     83:        getpict();
                     84:        for (i=0; i<NB; i++)
                     85:                if (bufs[i].bno != -1) {
                     86:                        zseek(out, bufs[i].bno);
                     87:                        write(out, bufs[i].block, BSIZ);
                     88:                }
                     89:        putpict();
                     90:        if (again) {
                     91:                close(in);
                     92:                close(out);
                     93:                goto another;
                     94:        }
                     95:        exit(0);
                     96: }
                     97: 
                     98: getpict()
                     99: {
                    100:        register x1, y1;
                    101: 
                    102:        again = 0;
                    103:        for (;;) switch (x1 = getc(stdin)) {
                    104: 
                    105:        case 's':
                    106:                botx = getw(stdin);
                    107:                boty = getw(stdin);
                    108:                topx = getw(stdin);
                    109:                topy = getw(stdin);
                    110:                delx = topx-botx;
                    111:                dely = topy-boty;
                    112:                if (dely/delx > 1536./2048.)
                    113:                        del = dely;
                    114:                else
                    115:                        del = delx * (1566./2048.);
                    116:                centx = 0;
                    117:                centx = (2048 - mapx(topx)) / 2;
                    118:                centy = 0;
                    119:                centy = mapy(topy) / 2;
                    120:                continue;
                    121: 
                    122:        case 'l':
                    123:                done1 |= 01;
                    124:                x1 = mapx(getw(stdin));
                    125:                y1 = mapy(getw(stdin));
                    126:                lastx = mapx(getw(stdin));
                    127:                lasty = mapy(getw(stdin));
                    128:                line(x1, y1, lastx, lasty);
                    129:                continue;
                    130: 
                    131:        case 'm':
                    132:                lastx = mapx(getw(stdin));
                    133:                lasty = mapy(getw(stdin));
                    134:                continue;
                    135: 
                    136:        case 't':
                    137:                done1 |= 01;
                    138:                while ((x1 = getc(stdin)) != '\n')
                    139:                        plotch(x1);
                    140:                continue;
                    141: 
                    142:        case 'e':
                    143:                if (done1) {
                    144:                        again++;
                    145:                        return;
                    146:                }
                    147:                continue;
                    148: 
                    149:        case 'p':
                    150:                done1 |= 01;
                    151:                lastx = mapx(getw(stdin));
                    152:                lasty = mapy(getw(stdin));
                    153:                point(lastx, lasty);
                    154:                point(lastx+1, lasty);
                    155:                point(lastx, lasty+1);
                    156:                point(lastx+1, lasty+1);
                    157:                continue;
                    158: 
                    159:        case 'n':
                    160:                done1 |= 01;
                    161:                x1 = mapx(getw(stdin));
                    162:                y1 = mapy(getw(stdin));
                    163:                line(lastx, lasty, x1, y1);
                    164:                lastx = x1;
                    165:                lasty = y1;
                    166:                continue;
                    167: 
                    168:        case 'f':
                    169:                getw(stdin);
                    170:                getc(stdin);
                    171:                switch(getc(stdin)) {
                    172:                case 't':
                    173:                        linmod = DOTTED;
                    174:                        break;
                    175:                default:
                    176:                case 'i':
                    177:                        linmod = SOLID;
                    178:                        break;
                    179:                case 'g':
                    180:                        linmod = LONGDASHED;
                    181:                        break;
                    182:                case 'r':
                    183:                        linmod = SHORTDASHED;
                    184:                        break;
                    185:                case 'd':
                    186:                        linmod = DOTDASHED;
                    187:                        break;
                    188:                }
                    189:                while((x1=getc(stdin))!='\n')
                    190:                        if(x1==-1) return;
                    191:                continue;
                    192: 
                    193:        case 'd':
                    194:                getw(stdin);
                    195:                getw(stdin);
                    196:                getw(stdin);
                    197:                x1 = getw(stdin);
                    198:                while (--x1 >= 0)
                    199:                        getw(stdin);
                    200:                continue;
                    201: 
                    202:        case -1:
                    203:                return;
                    204: 
                    205:        default:
                    206:                printf("Botch\n");
                    207:                return;
                    208:        }
                    209: }
                    210: 
                    211: plotch(c)
                    212: register c;
                    213: {
                    214:        register j;
                    215:        register char *cp;
                    216:        int i;
                    217: 
                    218:        if (c<' ' || c >0177)
                    219:                return;
                    220:        cp = chrtab[c-' '];
                    221:        for (i = -16; i<16; i += 2) {
                    222:                c = *cp++;
                    223:                for (j=7; j>=0; --j)
                    224:                        if ((c>>j)&1) {
                    225:                                point(lastx+6-j*2, lasty+i);
                    226:                                point(lastx+7-j*2, lasty+i);
                    227:                                point(lastx+6-j*2, lasty+i+1);
                    228:                                point(lastx+7-j*2, lasty+i+1);
                    229:                        }
                    230:        }
                    231:        lastx += 16;
                    232: }
                    233: 
                    234: int    f; /* versatec file number */
                    235: putpict()
                    236: {
                    237:        register x, *ip, *op;
                    238:        int y;
                    239: 
                    240:        if (f==0){
                    241:                f = open("/dev/vp0", 1);
                    242:                if (f < 0) {
                    243:                        printf("Cannot open vp\n");
                    244:                        exit(1);
                    245:                }
                    246:                ioctl(f, SETSTATE, plotcom);
                    247:        }
                    248:        op = obuf;
                    249:        lseek(in, 0L, 0);
                    250:        for (y=0; y<2048; y++) {
                    251:                if ((y&077) == 0)
                    252:                        read(in, blocks[0], 32*BSIZ);
                    253:                for (x=0; x<32; x++)  {
                    254:                        ip = (int *)&blocks[x][(y&077)<<3];
                    255:                        *op++ = *ip++;
                    256:                        *op++ = *ip++;
                    257:                        *op++ = *ip++;
                    258:                        *op++ = *ip++;
                    259:                }
                    260:                *op++ = 0;
                    261:                *op++ = 0;
                    262:                *op++ = 0;
                    263:                *op++ = 0;
                    264:                if (y&1) {
                    265:                        write(f, (char *)obuf, sizeof(obuf));
                    266:                        op = obuf;
                    267:                }
                    268:        }
                    269: }
                    270: 
                    271: line(x0, y0, x1, y1)
                    272: register x0, y0;
                    273: {
                    274:        int dx, dy;
                    275:        int xinc, yinc;
                    276:        register res1;
                    277:        int res2;
                    278:        int slope;
                    279: 
                    280:        xinc = 1;
                    281:        yinc = 1;
                    282:        if ((dx = x1-x0) < 0) {
                    283:                xinc = -1;
                    284:                dx = -dx;
                    285:        }
                    286:        if ((dy = y1-y0) < 0) {
                    287:                yinc = -1;
                    288:                dy = -dy;
                    289:        }
                    290:        slope = xinc*yinc;
                    291:        res1 = 0;
                    292:        res2 = 0;
                    293:        if (dx >= dy) while (x0 != x1) {
                    294:        if((x0+slope*y0)&linmod)
                    295:        if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno)
                    296:                bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07));
                    297:        else
                    298:                point(x0, y0);
                    299:                if (res1 > res2) {
                    300:                        res2 += dx - res1;
                    301:                        res1 = 0;
                    302:                        y0 += yinc;
                    303:                }
                    304:                res1 += dy;
                    305:                x0 += xinc;
                    306:        } else while (y0 != y1) {
                    307:        if((x0+slope*y0)&linmod)
                    308:        if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno)
                    309:                bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07));
                    310:        else
                    311:                point(x0, y0);
                    312:                if (res1 > res2) {
                    313:                        res2 += dy - res1;
                    314:                        res1 = 0;
                    315:                        x0 += xinc;
                    316:                }
                    317:                res1 += dx;
                    318:                y0 += yinc;
                    319:        }
                    320:        if((x1+slope*y1)&linmod)
                    321:        if (((x1>>6) + ((y1&~077)>>1)) == bufs[0].bno)
                    322:                bufs[0].block[((y1&077)<<3)+((x1>>3)&07)] |= 1 << (7-(x1&07));
                    323:        else
                    324:                point(x1, y1);
                    325: }
                    326: 
                    327: point(x, y)
                    328: register x, y;
                    329: {
                    330:        register bno;
                    331: 
                    332:        bno = ((x&03700)>>6) + ((y&03700)>>1);
                    333:        if (bno != bufs[0].bno) {
                    334:                if (bno < 0 || bno >= 1024)
                    335:                        return;
                    336:                getblk(bno);
                    337:        }
                    338:        bufs[0].block[((y&077)<<3)+((x>>3)&07)] |= 1 << (7-(x&07));
                    339: }
                    340: 
                    341: getblk(b)
                    342: register b;
                    343: {
                    344:        register struct buf *bp1, *bp2;
                    345:        register char *tp;
                    346: 
                    347: loop:
                    348:        for (bp1 = bufs; bp1 < &bufs[NB]; bp1++) {
                    349:                if (bp1->bno == b || bp1->bno == -1) {
                    350:                        tp = bp1->block;
                    351:                        for (bp2 = bp1; bp2>bufs; --bp2) {
                    352:                                bp2->bno = (bp2-1)->bno;
                    353:                                bp2->block = (bp2-1)->block;
                    354:                        }
                    355:                        bufs[0].bno = b;
                    356:                        bufs[0].block = tp;
                    357:                        return;
                    358:                }
                    359:        }
                    360:        zseek(out, bufs[NB-1].bno);
                    361:        write(out, bufs[NB-1].block, BSIZ);
                    362:        zseek(in, b);
                    363:        read(in, bufs[NB-1].block, BSIZ);
                    364:        bufs[NB-1].bno = b;
                    365:        goto loop;
                    366: }
                    367: 
                    368: onintr()
                    369: {
                    370:        exit(1);
                    371: }
                    372: 
                    373: zseek(a, b)
                    374: {
                    375:        return(lseek(a, (long)b*512, 0));
                    376: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.