?? vplot.c
字號:
/* * Reads standard graphics input * Makes a plot on a 200 dot-per-inch 11" wide * Versatek plotter. * * Creates and leaves /usr/tmp/raster (1000 blocks) * which is the bitmap */#include "stdio.h"#include <signal.h>#define NB 88#define BSIZ 512#define mapx(x) ((1536*((x)-botx)/del)+centx)#define mapy(y) ((1536*(del-(y)+boty)/del)-centy)#define SOLID -1#define DOTTED 014#define SHORTDASHED 034#define DOTDASHED 054#define LONGDASHED 074#define SETSTATE (('v'<<8)+1)int linmod = SOLID;int again;int done1;char chrtab[][16];int plotcom[] { 0200, 0, 0};int eotcom[] { 0210, 0, 0};char blocks [NB][BSIZ];int obuf[264];int lastx;int lasty;double topx = 1536;double topy = 1536;double botx = 0;double boty = 0;int centx;int centy;double delx = 1536;double dely = 1536;double del = 1536;struct buf { int bno; char *block;};struct buf bufs[NB];int in, out;char *picture = "/usr/tmp/raster";main(argc, argv)char **argv;{ extern int onintr(); register i; if (argc>1) { in = open(argv[1], 0); putpict(); exit(0); } signal(SIGTERM, onintr); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr);another: for (i=0; i<NB; i++) { bufs[i].bno = -1; bufs[i].block = blocks[i]; } out = creat(picture, 0666); in = open(picture, 0); zseek(out, 32*32); write(out, blocks[0], BSIZ);/*delete following code when filsys deals properly withholes in files*/ for(i=0;i<512;i++) blocks[0][i] = 0; zseek(out, 0); for(i=0;i<32*32;i++) write(out,blocks[0],512);/**/ getpict(); for (i=0; i<NB; i++) if (bufs[i].bno != -1) { zseek(out, bufs[i].bno); write(out, bufs[i].block, BSIZ); } putpict(); if (again) { close(in); close(out); goto another; } exit(0);}getpict(){ register x1, y1; again = 0; for (;;) switch (x1 = getc(stdin)) { case 's': botx = getw(stdin); boty = getw(stdin); topx = getw(stdin); topy = getw(stdin); delx = topx-botx; dely = topy-boty; if (dely/delx > 1536./2048.) del = dely; else del = delx * (1566./2048.); centx = 0; centx = (2048 - mapx(topx)) / 2; centy = 0; centy = mapy(topy) / 2; continue; case 'l': done1 |= 01; x1 = mapx(getw(stdin)); y1 = mapy(getw(stdin)); lastx = mapx(getw(stdin)); lasty = mapy(getw(stdin)); line(x1, y1, lastx, lasty); continue; case 'm': lastx = mapx(getw(stdin)); lasty = mapy(getw(stdin)); continue; case 't': done1 |= 01; while ((x1 = getc(stdin)) != '\n') plotch(x1); continue; case 'e': if (done1) { again++; return; } continue; case 'p': done1 |= 01; lastx = mapx(getw(stdin)); lasty = mapy(getw(stdin)); point(lastx, lasty); point(lastx+1, lasty); point(lastx, lasty+1); point(lastx+1, lasty+1); continue; case 'n': done1 |= 01; x1 = mapx(getw(stdin)); y1 = mapy(getw(stdin)); line(lastx, lasty, x1, y1); lastx = x1; lasty = y1; continue; case 'f': getw(stdin); getc(stdin); switch(getc(stdin)) { case 't': linmod = DOTTED; break; default: case 'i': linmod = SOLID; break; case 'g': linmod = LONGDASHED; break; case 'r': linmod = SHORTDASHED; break; case 'd': linmod = DOTDASHED; break; } while((x1=getc(stdin))!='\n') if(x1==-1) return; continue; case 'd': getw(stdin); getw(stdin); getw(stdin); x1 = getw(stdin); while (--x1 >= 0) getw(stdin); continue; case -1: return; default: printf("Botch\n"); return; }}plotch(c)register c;{ register j; register char *cp; int i; if (c<' ' || c >0177) return; cp = chrtab[c-' ']; for (i = -16; i<16; i += 2) { c = *cp++; for (j=7; j>=0; --j) if ((c>>j)&1) { point(lastx+6-j*2, lasty+i); point(lastx+7-j*2, lasty+i); point(lastx+6-j*2, lasty+i+1); point(lastx+7-j*2, lasty+i+1); } } lastx += 16;}int f; /* versatec file number */putpict(){ register x, *ip, *op; int y; if (f==0){ f = open("/dev/vp0", 1); if (f < 0) { printf("Cannot open vp\n"); exit(1); } ioctl(f, SETSTATE, plotcom); } op = obuf; lseek(in, 0L, 0); for (y=0; y<2048; y++) { if ((y&077) == 0) read(in, blocks[0], 32*BSIZ); for (x=0; x<32; x++) { ip = (int *)&blocks[x][(y&077)<<3]; *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; } *op++ = 0; *op++ = 0; *op++ = 0; *op++ = 0; if (y&1) { write(f, (char *)obuf, sizeof(obuf)); op = obuf; } }}line(x0, y0, x1, y1)register x0, y0;{ int dx, dy; int xinc, yinc; register res1; int res2; int slope; xinc = 1; yinc = 1; if ((dx = x1-x0) < 0) { xinc = -1; dx = -dx; } if ((dy = y1-y0) < 0) { yinc = -1; dy = -dy; } slope = xinc*yinc; res1 = 0; res2 = 0; if (dx >= dy) while (x0 != x1) { if((x0+slope*y0)&linmod) if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno) bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07)); else point(x0, y0); if (res1 > res2) { res2 += dx - res1; res1 = 0; y0 += yinc; } res1 += dy; x0 += xinc; } else while (y0 != y1) { if((x0+slope*y0)&linmod) if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno) bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07)); else point(x0, y0); if (res1 > res2) { res2 += dy - res1; res1 = 0; x0 += xinc; } res1 += dx; y0 += yinc; } if((x1+slope*y1)&linmod) if (((x1>>6) + ((y1&~077)>>1)) == bufs[0].bno) bufs[0].block[((y1&077)<<3)+((x1>>3)&07)] |= 1 << (7-(x1&07)); else point(x1, y1);}point(x, y)register x, y;{ register bno; bno = ((x&03700)>>6) + ((y&03700)>>1); if (bno != bufs[0].bno) { if (bno < 0 || bno >= 1024) return; getblk(bno); } bufs[0].block[((y&077)<<3)+((x>>3)&07)] |= 1 << (7-(x&07));}getblk(b)register b;{ register struct buf *bp1, *bp2; register char *tp;loop: for (bp1 = bufs; bp1 < &bufs[NB]; bp1++) { if (bp1->bno == b || bp1->bno == -1) { tp = bp1->block; for (bp2 = bp1; bp2>bufs; --bp2) { bp2->bno = (bp2-1)->bno; bp2->block = (bp2-1)->block; } bufs[0].bno = b; bufs[0].block = tp; return; } } zseek(out, bufs[NB-1].bno); write(out, bufs[NB-1].block, BSIZ); zseek(in, b); read(in, bufs[NB-1].block, BSIZ); bufs[NB-1].bno = b; goto loop;}onintr(){ exit(1);}zseek(a, b){ return(lseek(a, (long)b*512, 0));}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -